pulumi/draft-social-post
Draft (or revise) the X / LinkedIn / Bluesky social copy in a blog post's frontmatter, looping with self-critique until it would pass review.
npx skills add https://github.com/pulumi/docs --skill draft-social-post
Read a blog post, write or revise social copy into its frontmatter social: block, and loop with self-critique until each platform passes review. Preserve existing copy that already works — only repair or draft fresh when there's a real problem.
git status --porcelain and pick the single modified content/blog/*/index.md. If zero or more than one match, ask the user which file.social: block. The blog body is the source of truth for every specific you'll use — read it before drafting, not after. Title, URL slug, meta_desc, and tags are not authoritative; the body is.""), missing key, or LLM-fill junk — draft fresh from the blog body using .claude/commands/social-media-review/references/writing-guide.md (see "Drafting from a blank social: block" — it includes the verify-specifics-against-body checklist). Honor platform structure: X = 2 paragraphs, LinkedIn = multiple short paragraphs, Bluesky = 2 paragraphs. Voice: if a single named author wrote a personal-experience post, name them in third person; otherwise corporate "we"..claude/commands/social-media-review/references/critique-rubric.md) — minimum-change repair. Drop the hashtag, swap the "I" to "we", trim the over-limit tail. Don't recast paragraphs or "improve" the voice. The original specifics and structure stay.For LLM-fill recognition (staccato fragments as drama, em-dash chains, generic openers like "In today's cloud landscape…", buzzword stacks), see .claude/commands/social-media-review/references/writing-guide.md "Spotting and replacing LLM-fill copy". Don't try to patch around LLM patterns; throw them out and draft fresh from the article.
For any platform you draft fresh, verify each specific against the blog body before moving on. Every number, name, and attribution must appear in the body — not the title, slug, or meta_desc. If a claim doesn't trace, drop it or replace it.
python3 -c "import sys; print(len(sys.stdin.read().rstrip('\n')))" (avoids quoting/escaping problems with apostrophes or triple quotes in copy). Body limits: X = 255, LinkedIn = 2950, Bluesky = 300. Revise any over-limit copy here.general-purpose subagent_type) with a clean slate. Brief: read .claude/commands/social-media-review/references/critique-rubric.md, evaluate the copy only (not the blog post), return PASS or FAIL per platform. Default verdict is PASS — only FAIL on hard-rule breaks.kept platforms. For each platform whose existing copy passed hard rules and you left untouched, spawn a sub-agent against .claude/commands/social-media-review/references/suggestions-rubric.md to surface stylistic notes (weak opener, summarizes article, missing pointer, etc.). Do NOT modify the kept copy — surface the notes in step 8's report so the user can decide whether to apply them. PASS stays PASS. Skip this pass on platforms you repaired or drafted — the new copy is the actionable feedback already; layering advisory notes on top is noise.social: block. Use 4-space indent and | block-literal style for multi-line copy — see content/blog/neo-integration-catalog/index.md for a well-formatted example. Only touch platforms whose copy actually changed.PASS, kept — critic passed the original; preserved as-isFAIL, repaired (N chars changed) — critic failed the original; minimum-change fixmissing, drafted — no original (or unsalvageable LLM-fill); wrote freshPASS, kept platform with advisory notes, list them under "Suggestions for kept platforms (advisory — not applied)" so the user can decide whether to address them in a follow-up. Omit the section if all kept platforms returned "no suggestions".kept, report that and exit without writing — no edit is needed.Take pulumi/draft-social-post from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.