# Media Publish

> |

- **Type:** Skill
- **Install:** `agentstack add skill-minara-ai-media-agent-media-publish`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [Minara-AI](https://agentstack.voostack.com/s/minara-ai)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [Minara-AI](https://github.com/Minara-AI)
- **Source:** https://github.com/Minara-AI/media-agent/tree/main/skills/media-publish

## Install

```sh
agentstack add skill-minara-ai-media-agent-media-publish
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# /media-publish — Multi-Platform Publishing

Publish your content to all configured platforms in one go.

## Prerequisites

Before starting, read these shared library files:
- Read `lib/adapter-discovery.md` for adapter invocation patterns
- Read `lib/manifest-ops.md` for manifest format and validation

## Step 1: Locate the Post

If the user specifies a post path, use it. Otherwise, find the most recent post:

```bash
ls -dt content/posts/*/ 2>/dev/null | head -1
```

Verify the post directory contains:
- `source.md` (canonical content)
- `manifest.yaml` (content manifest)
- `variants/` directory with at least one variant file

If any are missing, report what's missing and stop.

## Step 2: Pre-Publish Validation

Read `manifest.yaml` and validate:

1. **Source exists and is non-empty:**
   ```bash
   [ -s "/source.md" ] || echo "ERROR: source.md is empty or missing"
   ```

2. **Each variant file exists and is non-empty:**
   For each variant in the manifest, check the file exists:
   ```bash
   [ -s "/" ] || echo "ERROR:  missing"
   ```

3. **Asset files exist** (if referenced in manifest):
   ```bash
   [ -f "/" ] || echo "WARN: asset  missing"
   ```

4. **Filter publishable variants:**
   Only attempt platforms with status: `draft`, `pending`, or `failed`.
   Skip: `published`, `skipped`.

If no platforms are publishable, tell the user: "All platforms are already published or skipped. Nothing to do."

## Step 3: Check Platform Configuration

For each publishable platform, verify:

1. The adapter directory exists: `adapters//`
2. The adapter's `publish.sh` is executable
3. The required env var is set in `.env` (for API-based adapters)
4. For git-push adapters, the configured repo path exists

Report any missing configuration and offer to run `/media-setup`.

## Step 4: Confirm with User

Show what will be published:

```
Ready to publish "":

  [PUBLISH] Dev.to — variants/devto.md (draft)
  [PUBLISH] Hashnode — variants/hashnode.md (draft)
  [SKIP]    GitHub Pages — already published
```

Use AskUserQuestion to confirm. Options:
- A) Publish all
- B) Dry run first (preview without publishing)
- C) Select specific platforms
- D) Cancel

## Step 5: Publish

For each platform, invoke the adapter's `publish.sh` with credential isolation.

Read the adapter's `auth_env_var` from `adapter.yaml`, then invoke:

```bash
AUTH_VAR=$(python3 -c "import yaml; print(yaml.safe_load(open('adapters//adapter.yaml')).get('auth_env_var', ''))")
AUTH_VAL=$(grep "^${AUTH_VAR}=" .env | cut -d= -f2-)

env -i PATH="$PATH" HOME="$HOME" \
  "${AUTH_VAR}=${AUTH_VAL}" \
  ./adapters//publish.sh "/variants/.md" "/assets" [--dry-run]
```

For git-push adapters (no auth_env_var):
```bash
env -i PATH="$PATH" HOME="$HOME" GIT_DIR="$(git rev-parse --git-dir)" \
  ./adapters//publish.sh "/variants/.md" "/assets" [--dry-run]
```

## Step 6: Update Manifest

After each platform publish attempt, update the manifest atomically:

**On success (exit 0):**
Parse the JSON stdout to get `url` and `id`. Update the variant:
```yaml
status: published
published_at: 
url: 
id: 
error: null
```

**On failure (exit 1-4):**
```yaml
status: failed
error: ""
```

Use the atomic write pattern from `lib/manifest-ops.md`:
1. Write to `.manifest.yaml.tmp`
2. Validate YAML
3. Backup original, then `mv` temp to `manifest.yaml`

## Step 7: Report Results

After all platforms are attempted, report:

```
Published "":

  [OK]   Dev.to → https://dev.to/user/post-slug
  [OK]   Hashnode → https://hashnode.com/post/xyz
  [FAIL] GitHub Pages — git push failed (exit 1)

2/3 platforms succeeded. Run /media-publish again to retry failed platforms.
```

If all succeeded:
```
All platforms published successfully!
```

If `--dry-run` was used:
```
Dry run complete. No content was actually published.
Run /media-publish again without --dry-run to publish for real.
```

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [Minara-AI](https://github.com/Minara-AI)
- **Source:** [Minara-AI/media-agent](https://github.com/Minara-AI/media-agent)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** yes
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-minara-ai-media-agent-media-publish
- Seller: https://agentstack.voostack.com/s/minara-ai
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
