egebese/suparank/publish
Claude Code and agent skill by egebese/suparank
- community
Checking that the SKILL.md file is still in the repository.
Publishing phase - publish articles to WordPress, Ghost, generate images, and send webhooks.
Install
npx vskill@latest install egebese/suparank/publishSKILL.md
Suparank Publishing Phase
You handle publishing content to CMS platforms, generating images, and sending webhooks. All publishing uses curl commands via the Bash tool.
Before Starting
- Read credentials from
~/.claude/suparank-credentials.json - If it doesn't exist, check the legacy path
~/.suparank/credentials.jsonas fallback - If neither exists, tell the user:
- "No publishing credentials found. Run
/suparank/setupto configure WordPress, Ghost, or image generation." - They can still save content locally without credentials.
- Read the project config from
.claude/suparank.jsonfor site context
Detect Publishing Action
Publish to WordPress
Triggers: "publish to WordPress", "post to WordPress", "send to WordPress"
Requirements: ~/.claude/suparank-credentials.json must have a wordpress section with:
site_url: WordPress site URLusername: WordPress usernameapp_password: WordPress application password
Steps:
- Get the article to publish:
- Read from
.claude/suparank-session.jsonfor the latest saved article - Or let the user specify which article (by number or title)
- Read the article content from
.claude/suparank-content/[folder]/article.md - Read metadata from
metadata.json
- Convert markdown content to HTML:
- Convert the markdown article to clean HTML
- Preserve heading hierarchy (h1, h2, h3)
- Convert lists, bold, italic, links, code blocks
- Convert images to
<img>tags
- Publish via WordPress REST API using curl:
- Parse the response to get:
- Post ID
- Post URL
- Edit URL
- If a featured image URL is available (from image generation), set it:
- First, upload the image via media endpoint
- Then set as featured_media on the post
- Report success:
- "Published to WordPress as draft!"
- "Title: [title]"
- "URL: [url]"
- "Edit: [edit_url]"
- Update session: mark article as published_to: ["wordpress"]
Status options: Ask the user: "Publish as draft (default) or live?"
draft(default, safer)publish(immediately live)
Publish to Ghost
Triggers: "publish to Ghost", "post to Ghost", "send to Ghost"
Requirements: ~/.claude/suparank-credentials.json must have a ghost section with:
api_url: Ghost site API URLadmin_api_key: Ghost Admin API key (format:id:secret)
Steps:
- Get the article (same as WordPress flow above)
- Convert markdown to HTML
- Generate a Ghost Admin API JWT token using a Node.js one-liner:
- Create the Ghost mobiledoc payload:
- Publish via Ghost Admin API:
- Parse response and report success
- Update session: mark article as published_to: ["ghost"]
Generate Images
Triggers: "generate images", "create images", "generate hero image", "make images for article"
Requirements: ~/.claude/suparank-credentials.json must have image provider config:
image_provider: "fal" (currently the only supported provider)fal.api_key: fal.ai API key
If `image_provider` is missing or set to an unsupported value (anything other than "fal"):
- Skip image generation with message: "Skipped images (unsupported provider '[value]', only 'fal' is currently supported)"
- Do NOT block the rest of publishing
Steps:
- Read the article from session to understand content
- Read image prompt template from
~/.claude/skills/suparank/templates/image-prompt-designer.md - Generate image prompts based on article content and visual style from config
- For each image, call fal.ai via curl:
- Parse response to get image URL from
result.images[0].url - Store image URLs in session metadata
- Report: "Generated [N] images. Cover: [url]. Ready to publish."
Image count calculation:
- 1 cover/hero image (always)
- 1 inline image per 300 words of content (if config.content.include_images is true)
Send Webhook
Triggers: "send webhook", "notify Slack", "send to Make", "trigger webhook"
Requirements: ~/.claude/suparank-credentials.json must have webhooks section
Steps:
- Determine webhook type: slack / make / n8n / zapier / default
- Build the payload:
For Slack:
For Make/n8n/Zapier:
- Report success: "Webhook sent to [type]!"
Batch Publishing
When publishing multiple articles (from multi-article pipeline):
- Read all articles from session
- Publish each one sequentially
- Track progress: "Publishing article 1 of 3..."
- Report summary: "Published 3 articles to WordPress as drafts."
When Called from Pipeline
When invoked by the pipeline orchestrator:
- Generate images first (if enabled and credentials available)
- Then publish to all configured platforms
- Use draft status by default
- Report results but don't ask questions - the pipeline is automated
Graceful Degradation
If credentials are missing for a specific platform:
- Skip that platform silently
- Report which platforms were skipped and why
- Never fail the entire publish phase because one platform is missing
Example: "Published to WordPress. Skipped Ghost (not configured). Skipped images (no fal.ai key)."
Image Generation Error Handling
If image generation fails, handle gracefully:
- Timeout (>60s): "Image generation timed out. Publishing without images."
- Rate limiting: "Image provider rate limited. You can retry with
/suparank/publishlater." - Invalid prompt: Try a simplified prompt. If it still fails, skip that image.
- API key invalid: "fal.ai API key is invalid. Update with
/suparank/setup."
Never block the entire publishing phase because image generation failed.
Security Notes
- Credentials are read from
~/.claude/suparank-credentials.json(or legacy~/.suparank/credentials.json) - NEVER log or display full API keys, passwords, or tokens in output
- When showing curl commands to the user, ALWAYS mask sensitive values:
- API keys: show first 4 chars only →
sk_l**** - Passwords: replace entirely →
**** - Tokens: show first 10 chars →
eyJhbGci... - Example:
Authorization: Basic ****(never the actual base64 string) - Application passwords are safer than regular WordPress passwords
- If an error message contains credentials, sanitize before displaying
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/publish/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/egebese/suparank/publish)