media-setup — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited media-setup (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Configure your media-agent installation. This skill detects available tools, walks you through API key setup for each platform, tests connections, and writes the config files.
Before starting, read the shared library files:
lib/adapter-discovery.md for how adapters worklib/manifest-ops.md for manifest formatCheck for required and optional tools:
echo "=== media-agent Setup ==="
echo ""
# Required
echo "Checking dependencies..."
which git >/dev/null 2>&1 && echo " [OK] git" || echo " [MISSING] git — required"
which python3 >/dev/null 2>&1 && echo " [OK] python3" || echo " [MISSING] python3 — required for YAML parsing"
which curl >/dev/null 2>&1 && echo " [OK] curl" || echo " [MISSING] curl — required for API calls"
# Optional
echo ""
echo "Optional tools:"
which convert >/dev/null 2>&1 && echo " [OK] ImageMagick" || echo " [MISSING] ImageMagick — needed for image resizing (brew install imagemagick)"
which gh >/dev/null 2>&1 && echo " [OK] GitHub CLI" || echo " [MISSING] GitHub CLI — optional, for GitHub Pages"If python3 or curl is missing, stop and tell the user how to install them.
If ImageMagick is missing, warn the user but continue — it's only needed for /media-image.
echo ""
echo "Available platform adapters:"
for adapter in adapters/*/; do
name=$(basename "$adapter")
display=$(python3 -c "import yaml; print(yaml.safe_load(open('${adapter}adapter.yaml'))['display_name'])" 2>/dev/null || echo "$name")
auth_type=$(python3 -c "import yaml; print(yaml.safe_load(open('${adapter}adapter.yaml'))['auth_type'])" 2>/dev/null || echo "unknown")
echo " - $display ($auth_type)"
doneUse AskUserQuestion to ask which platforms the user wants to configure. Then for each selected platform:
Ask the user:
~/myblog)main)https://username.github.io)_posts)Verify the repo exists:
[ -d "<repo_path>/.git" ] && echo "OK: Git repo found" || echo "ERROR: Not a git repo"Ask the user for their Dev.to API key. They can get one at https://dev.to/settings/extensions.
Test the connection:
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" \
-H "api-key: <API_KEY>" \
"https://dev.to/api/users/me")
[ "$RESPONSE" = "200" ] && echo "OK: Dev.to connected" || echo "ERROR: Auth failed (HTTP $RESPONSE)"Ask the user for:
Test the connection:
RESPONSE=$(curl -s -w "\n%{http_code}" \
-X POST "https://gql.hashnode.com" \
-H "Authorization: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{"query":"{ me { username } }"}')Ask if the user wants to set up image generation.
If yes, ask for their OpenAI API key (for DALL-E 3).
Test:
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer <API_KEY>" \
"https://api.openai.com/v1/models")
[ "$RESPONSE" = "200" ] && echo "OK: OpenAI connected" || echo "ERROR: Auth failed"Ask the user if they want to set up their personal writing style.
Use AskUserQuestion: "Want to set up your writing voice? This helps the system match your personal style instead of sounding like AI."
Ask the user to paste 2-3 paragraphs of their own writing (blog posts, READMEs, tweets, etc.).
Use AskUserQuestion: "Paste a writing sample — anything you've written that sounds like you. Blog post, README, email, tweet thread, 公众号文章 — all work. (Paste one now, I'll ask for more after.)"
Collect 1-3 samples. For each, extract voice traits:
Show the extracted traits to the user for confirmation:
Based on your samples, here's your voice profile:
sentence_length: short
vocabulary: conversational
humor: dry
perspective: first_person
formality: informal
Does this look right? I can adjust any of these.Use AskUserQuestion to walk through each trait:
Write the voice config to content/config/voice.yaml:
# Generated by /media-setup
samples:
- |
<pasted sample 1>
- |
<pasted sample 2>
traits:
sentence_length: <extracted or chosen>
vocabulary: <extracted or chosen>
humor: <extracted or chosen>
perspective: <extracted or chosen>
formality: <extracted or chosen>Tell the user: "Voice profile saved. The writing skills will match this style automatically. You can update it anytime by editing content/config/voice.yaml or running /media-setup again."
Write credentials to .env (gitignored):
cat > .env << EOF
# Generated by /media-setup on $(date -u +%Y-%m-%dT%H:%M:%SZ)
DEVTO_API_KEY=<value>
HASHNODE_API_KEY=<value>
HASHNODE_PUBLICATION_ID=<value>
OPENAI_API_KEY=<value>
EOF
chmod 600 .envWrite platform config to content/config/platforms.yaml (non-sensitive, git-tracked):
# Generated by /media-setup
github_pages:
repo_path: "<path>"
branch: "<branch>"
site_url: "<url>"
posts_dir: "<dir>"
platforms:
- devto
- hashnode
- github-pagesIf the user expects to publish many posts with images:
which git-lfs >/dev/null 2>&1 && echo "[OK] git-lfs available" || echo "[INFO] git-lfs not installed — recommended for repos with >50 posts"If git-lfs is available, offer to configure it:
git lfs install
git lfs track "content/**/assets/*.png"
git lfs track "content/**/assets/*.jpg"
git add .gitattributesPrint a summary of what was configured:
=== media-agent configured! ===
Platforms:
[OK] GitHub Pages → https://username.github.io
[OK] Dev.to → connected as @username
[OK] Hashnode → connected to publication xyz
Image generation:
[OK] OpenAI DALL-E 3
Writing voice:
[OK] Voice profile configured (informal, conversational, first person)
Next steps:
- Run /media-idea to brainstorm your first post
- Run /media to start the full guided workflow
- Or write markdown manually and use /media-publish~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.