Install
$ agentstack add skill-borjablm-claude-skills-wordpress-publish ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
WordPress Publish
You publish articles to a configured WordPress site using the REST API. Multi-site setup — pick the target site with --site on every call.
Configured sites
Run python scripts/publish.py list-sites to see what's set up. Each site is identified by a lowercase slug (e.g. azvai, quecafe, ecomm). Slug is derived from the env vars WP__URL, _USER, _APP_PASSWORD.
The research-writing-assistant brand profile slug should match the site slug (so azvai brand → --site azvai). For ecomm.design the convention is ecomm.
Inputs
The user points you at an article. Typically one of:
- A directory from
research-writing-assistantcontainingarticle.html+meta.json+titles.md - A single HTML or Markdown file
- An explicit title + body
Ask if any of these are missing: target site (slug), title, status (draft or publish, default draft), featured image (optional path), categories/tags (optional names).
If the working dir is from research-writing-assistant, infer the site from brief.json.brand_profile (which equals the brand slug, which equals the site slug). Confirm with the user before publishing.
Workflow
- Resolve site. Run
scripts/publish.py list-sitesif unclear. Confirm slug with user. - Resolve source. If directory: read
article.htmlas content, pick title fromtitles.md(the one marked recommended — ask if ambiguous), read meta description frommeta.json. - Confirm. Show the user: site URL, title, status, featured image (if any), categories, tags. Wait for approval.
- Upload featured image (if provided): run
scripts/publish.py --site upload-media --file. Capture the returned media ID. - Resolve taxonomy IDs (if category/tag names given): run
scripts/publish.py --site resolve-terms --categories "A,B" --tags "X,Y". Script creates any missing terms. - Create post. Run
scripts/publish.py --site createwith the resolved inputs. Script writes the response to stdout as JSON. - Report back. Show the user the post ID, edit URL (
{site_url}/wp-admin/post.php?post=&action=edit) and preview URL.
Updating an existing post
If the user asks to update a post they previously published, use scripts/publish.py --site update --id with whichever fields changed. Do not re-upload media unless the image itself changed.
Rules
- Always pass
--site. The legacy single-site fallback (WP_URL/WP_USER/WP_APP_PASSWORDwithout prefix) still works for backwards compat, but for multi-site setups always pass an explicit slug to avoid publishing to the wrong site. - Default to draft. Only
--status publishwhen the user explicitly says "publish live" / "publish it" / "go live". - Never publish without showing the user the final title + meta description first.
- Strip
//wrappers if present before sending — WP expects a content fragment (seeresearch-writing-assistant/references/wordpress-output.md). - Preserve the `` block if the article uses per-article CSS mode.
Script reference
All commands below read credentials from the project .env file. The --site flag goes BEFORE the subcommand.
# Discover what's configured
python scripts/publish.py list-sites
# Per-site operations
python scripts/publish.py --site azvai create \
--title "Post title" \
--content-file path/to/article.html \
--status draft \
--excerpt "Meta description here" \
--slug "post-slug" \
--featured-media 123 \
--categories 5,12 \
--tags 7,8
python scripts/publish.py --site ecomm update --id 456 --status publish
python scripts/publish.py --site quecafe upload-media --file path/to/image.jpg --alt "Alt text"
python scripts/publish.py --site azvai resolve-terms --categories "SEO,Guides" --tags "beginner"
python scripts/publish.py --site ecomm list --per-page 10
python scripts/publish.py --site azvai get --id 456
All commands exit non-zero on API error and print the WP error body to stderr.
Adding a new site
- Generate a WordPress Application Password:
Users → Profile → Application Passwordson the WP admin - Add three lines to
.env:
`` WP__URL=https://example.com WP__USER=username WP__APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx ``
- Confirm with
python scripts/publish.py list-sites - (If the article-images skill needs it) create a matching brand profile in
.claude/skills/article-images/brands/.json
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Borjablm
- Source: Borjablm/claude-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.