skills/blogger/SKILL.md
Create, edit, and publish blog posts with consistent voice and style. Helps build and maintain a style guide, write drafts, edit for quality, optimize SEO, and fact-check claims before publishing.
npx skillsauth add shaunandrews/agent-skills bloggerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A writing companion for maintaining a blog with consistent voice and quality.
Before doing anything else, check if a style guide exists:
# Check for style guide (adjust path as needed)
STYLE_GUIDE="${PROJECT_ROOT}/.blog-style/voice.md"
if [ ! -f "$STYLE_GUIDE" ]; then
echo "NO_STYLE_GUIDE"
else
echo "STYLE_GUIDE_EXISTS"
fi
If no style guide exists:
Style guides live in the project root:
{project-root}/
├── .blog-style/
│ ├── voice.md # Voice & tone document
│ ├── examples.md # Links to exemplar posts
│ └── terminology.md # Brand terms, jargon preferences
└── .credentials/
└── wordpress.json # API credentials (gitignored)
Why project root? The style guide is project-specific, not personal. It can be committed to git (it's not sensitive) and shared with collaborators or other tools.
Run the analyzer to sample existing posts and extract patterns:
# Authenticated mode (recommended for your own blog - richer analysis)
node "{baseDir}/scripts/analyze-posts.js" \
--site="https://example.com" \
--credentials="${PROJECT_ROOT}/.credentials/wordpress.json" \
--output="${PROJECT_ROOT}/.blog-style/"
# Public mode (any WordPress site - no auth required)
node "{baseDir}/scripts/analyze-posts.js" \
--site="https://any-wordpress-site.com" \
--output="${PROJECT_ROOT}/.blog-style/" \
--public
Modes:
context=edit API, gets raw block content, analyzes block types usedThe analyzer will:
voice.md for reviewIf starting fresh or preferring manual setup, use the template:
cp "{baseDir}/templates/style-guide.md.template" "${PROJECT_ROOT}/.blog-style/voice.md"
Then fill in:
See {baseDir}/references/writing-guide.md for guidance on each section.
Input needed: Topic, target audience, key points (optional)
Process:
Output: Draft post ready for editing
/blogger write "Topic: Why I switched to Neovim"
Input needed: Draft content (pasted or file path)
Process:
Output: Edited draft with change suggestions and confidence notes
/blogger edit [paste draft or provide file path]
Input needed: Draft content, target keyword
Process:
Output: SEO report with specific recommendations
/blogger seo "target keyword" [draft content]
Input needed: Draft content
Process:
Output: Fact-check report with confidence levels
/blogger fact-check [draft content]
Input needed: Final draft, WordPress credentials
Process:
Never auto-publish. Always create as draft first.
/blogger publish [final draft]
// .credentials/wordpress.json
{
"site": "https://example.com",
"rest_api": {
"username": "your-username",
"app_password": "xxxx xxxx xxxx xxxx xxxx xxxx"
}
}
Generate an application password in WordPress: Users → Profile → Application Passwords
# Load credentials
CREDS=$(cat "${PROJECT_ROOT}/.credentials/wordpress.json")
SITE=$(echo $CREDS | jq -r '.site')
USER=$(echo $CREDS | jq -r '.rest_api.username')
PASS=$(echo $CREDS | jq -r '.rest_api.app_password')
AUTH="$USER:$PASS"
# List recent posts
curl -s -u "$AUTH" "$SITE/wp-json/wp/v2/posts?per_page=10" | jq '.[] | {id, title: .title.rendered, status, date}'
# Create draft
curl -s -u "$AUTH" -X POST "$SITE/wp-json/wp/v2/posts" \
-H "Content-Type: application/json" \
-d '{"title":"Post Title","content":"...","status":"draft"}'
# Update post
curl -s -u "$AUTH" -X POST "$SITE/wp-json/wp/v2/posts/{id}" \
-H "Content-Type: application/json" \
-d '{"content":"Updated content..."}'
# Publish
curl -s -u "$AUTH" -X POST "$SITE/wp-json/wp/v2/posts/{id}" \
-H "Content-Type: application/json" \
-d '{"status":"publish"}'
# Get categories
curl -s "$SITE/wp-json/wp/v2/categories" | jq '.[] | {id, name, slug}'
# Get tags
curl -s "$SITE/wp-json/wp/v2/tags" | jq '.[] | {id, name, slug}'
WordPress uses Gutenberg blocks. Wrap content appropriately:
<!-- wp:paragraph -->
<p>Regular paragraph text.</p>
<!-- /wp:paragraph -->
<!-- wp:heading {"level":2} -->
<h2>Section Heading</h2>
<!-- /wp:heading -->
<!-- wp:list -->
<ul>
<li>List item one</li>
<li>List item two</li>
</ul>
<!-- /wp:list -->
<!-- wp:quote -->
<blockquote class="wp-block-quote"><p>Quote text here.</p><cite>Attribution</cite></blockquote>
<!-- /wp:quote -->
<!-- wp:code -->
<pre class="wp-block-code"><code>code here</code></pre>
<!-- /wp:code -->
<!-- wp:image {"id":123} -->
<figure class="wp-block-image"><img src="..." alt="..." class="wp-image-123"/></figure>
<!-- /wp:image -->
{baseDir}/references/writing-guide.md — Writing best practices, structure, hooks{baseDir}/references/editing-checklist.md — Multi-pass editing workflow{baseDir}/references/seo-checklist.md — SEO optimization reference{baseDir}/references/headline-formulas.md — Proven headline patterns{baseDir}/references/fact-checking.md — Verification workflow and sources{baseDir}/templates/style-guide.md.template — Empty style guide to fill in{baseDir}/templates/post-outline.md.template — Blog post outline structuredevelopment
Build accurate WordPress/Gutenberg UI mockups using pre-extracted design tokens, icons, and components. Use when prototyping WordPress admin interfaces or Site Editor concepts.
data-ai
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
development
Set up a new project with standard structure, git, README, CLAUDE.md, and dev server config. Use when starting a new project or bootstrapping a workspace for a new initiative.
tools
Manage Pressable WordPress hosting via API. Use when creating/cloning sites, managing backups, purging cache, updating PHP versions, managing plugins, checking site status, or any Pressable hosting operations.