kit/plugins/social-media-tools/skills/blog-share/SKILL.md
Creates social media copy and a dark-mode card for a blog post. Formats content for LinkedIn, Twitter, and Bluesky with appropriate tone and length. Use when asked to share or post a blog post on LinkedIn, Twitter, or Bluesky.
npx skillsauth add shawn-sandy/agentics blog-shareInstall 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.
Draft platform-aware social media copy and generate a styled dark-mode card image for a blog post URL or local markdown file.
| Phase | Action |
|-------|--------|
| 0 — Locate | Locate templates/ and derive PLUGIN_DIR |
| 1 — Collect Input | Detect URL vs local file; resolve relative paths; ask platform + tone |
| 1c — Reuse check | Scan docs/media/social/ for existing blog posts; offer reuse |
| 2 — Fetch Metadata | WebFetch OG tags (URL) or Read front matter (local); HTML-escape all values |
| 3 — Draft Copy | Write platform-aware copy |
| 4 — Populate Template | Fill blog-card.html; inject conditional elements + {{COPY_PANELS}} |
| 4b — Save | Persistent save to docs/media/social/ |
| 5 — Screenshot | Serve HTML locally; Playwright screenshot |
| 6 — Deliver | Present copy + attach PNG + show saved path |
Run silently:
ls ~/devbox/agentics/kit/plugins/social-media-tools/templates 2>/dev/null && \
echo "$HOME/devbox/agentics/kit/plugins/social-media-tools/templates"
find ~/.claude/plugins -path "*/social-media-tools/templates" -type d 2>/dev/null | head -1
find ~/.claude -path "*/social-media-tools/templates" -type d 2>/dev/null | head -1
Use the first non-empty result as TEMPLATES_DIR. Derive:
PLUGIN_DIR=$(dirname "$TEMPLATES_DIR")
If not found: output "Templates not found. Install the plugin or load it with --plugin-dir." and STOP.
Detect the source type:
http:// or https://.md, .mdx, or .markdownIf the user provides a relative path, resolve it:
realpath "$USER_PATH" 2>/dev/null || echo "$PWD/$USER_PATH"
Use AskUserQuestion to collect whatever is missing. Batch all questions in one call:
| Input | Options | Notes |
|-------|---------|-------|
| SOURCE | URL or file path | Required |
| PLATFORM | LinkedIn, Twitter/X, Bluesky, All sites | Required |
| TONE | Professional, Casual, Punchy | Default: Professional (LinkedIn), Punchy (Twitter/Bluesky) |
| HOOK_ANGLE | Free text | Optional |
FILE_PREFIX=blog
Read $PLUGIN_DIR/references/reuse-check.md and follow its procedure.
Use ToolSearch with select:WebFetch first (silent, no user output), then call WebFetch.
Both steps happen silently.
Call WebFetch on SOURCE. Extract:
| Variable | Source |
|----------|--------|
| TITLE | <meta property="og:title"> → <title> fallback |
| EXCERPT | <meta property="og:description"> → first <p>, truncated to 280 chars |
| AUTHOR | <meta property="article:author"> → "" if not found |
| DATE | <meta property="article:published_time"> → MMM D, YYYY → "" if not found |
| SOURCE_DOMAIN | Hostname, strip www. |
| TAGS | <meta property="article:tag">, up to 5 |
| READ_TIME | "" — do not compute for URL sources |
Call Read on the resolved absolute path. Extract:
| Variable | Source |
|----------|--------|
| TITLE | YAML front matter title: → first # H1 |
| EXCERPT | YAML description: → first non-heading paragraph, truncated to 280 chars |
| AUTHOR | YAML author: → "" |
| DATE | YAML date: → MMM D, YYYY → "" |
| SOURCE_DOMAIN | YAML site: or url: hostname → "local file" |
| TAGS | YAML tags: array, up to 5 |
| READ_TIME | Word count of body (excl. front matter + headings) / 200 wpm, rounded |
Before any template substitution, apply to every text value:
& → & (must be first)< → <> → >For character limits and universal copy rules, read $PLUGIN_DIR/references/platforms.md.
For copy format and filled examples per platform, read references/platforms.md.
Present drafted copy in a fenced code block labelled with the platform name. Wait for approval.
\n---\n as POST_COPY_TEXT_RAWLINKEDIN_COPY, TWITTER_COPY, BLUESKY_COPY){{READ_TIME_BADGE}}
READ_TIME is non-empty: <span class="read-time">N min read</span>""{{TAGS_FOOTER}}
TAGS has at least one value:
<div class="card-footer"><span class="tag">tag1</span><span class="tag">tag2</span></div>
(each tag value HTML-escaped)""Read $PLUGIN_DIR/references/copy-panels.md for markup and escaping rules.
Replace all {{VARIABLE}} placeholders. Write to ~/.claude/tmp/blog-share-card.html:
mkdir -p ~/.claude/tmp
TEMP_HTML=blog-share-card.html
FILE_PREFIX=blog
SLUG_INPUT=$TITLE
Read $PLUGIN_DIR/references/saving-and-delivery.md — Persistent Save section.
Read $PLUGIN_DIR/references/rendering-pipeline.md and follow the full pipeline.
Read $PLUGIN_DIR/references/saving-and-delivery.md — Deliver section.
development
Checks whether the branch's PR is ready and merges it when green. Runs the readiness gate, lint, and an approval prompt. Use when the user asks "merge?" or if a PR is ready to merge.
development
Implements a plan file that already exists. Walks its steps, ticks the spec, re-renders, and runs the completion gates. Use when asked to implement an existing plan.
development
Audits and optimizes CLAUDE.md project memory files. Checks adherence to Claude Code best practices and produces actionable fixes. Use when the user asks to audit, optimize, or diagnose a CLAUDE.md.
development
Converts an HTML artifact or Markdown file into a draft post for a static site. Scopes CSS to keep interactive blocks alive and escapes prose for MDX. Use when asked to turn an artifact into a post.