bloglisted
Install: claude install-skill mkreindel/seo-toolkit-template
# `/blog` — Blog post generator
Creates a production-ready blog post end-to-end for any site managed in `sites/`.
## Inputs
Required (asked at start if not given):
- **Site** — must match a folder under `sites/[name]/`. The skill reads its `site-info.md`.
Optional (per-run overrides):
- **Primary keyword** — if not given, picks the highest-priority unused keyword from `keywords.csv`.
- **Image source** — overrides the site's default. Options: Pexels, Unsplash, site-library, AI-generated, client-supplied, none.
- **Keyword tool** — overrides the site's default for any keyword research the skill performs.
- **Length target** — bypasses the SERP-median-derived target (rare; only when the user has a specific reason).
## Workflow
### Step 0 — Cron-mode detection (if invoked with `--cron`)
If the invocation contains `--cron`, this skill runs in cron mode (no user available). Required behavior:
1. **Idempotency check:** see this skill's "Routine versioning + idempotency contract" section. If today's output already exists, exit cleanly with `exit: "idempotent-skip"`. Write one line to the audit log via `scripts/lib/audit-log.mjs` `appendRun({ exit: "idempotent-skip", ... })`.
2. **Escalation contract:** any decision that would normally prompt the user (missing required file, voice anti-AI failure, schema validation failure, keyword cannibalization, etc.) MUST be escalated by writing an item to `sites/{site}/_inbox/` via `scripts/lib/cron-mode.mjs` `writeInboxItem(...)`. Afte