Create X Content
The drafting is yours (the agent is the model). This skill is mostly instructions plus
a tiny deterministic linter (lint_post.py) that mechanically checks each variant.
When to use
- "Write X posts about [topic/launch/build]."
- When you want several genuinely different angles on one idea.
- As the X arm of
social-kit. Pairs with generate-voice-guide and graphics-studio.
How to draft
- Resolve the voice guide: explicit path → stored config / Memory → default location →
else prompt to generate one (
generate-voice-guide) or proceed with a warned generic
default. Never silently skip it — generic AI tweets are the failure mode.
- Parse the brief; decide variant count by richness (2 = single-angle; 5 = mechanism-rich).
- Draft each variant under a distinct framing the voice guide's hook patterns support
(simple-howto, howto-plus-mechanism, problem-first, hype, mechanism-breakdown,
ecosystem-map, contrarian, personal-experience). Quote the brief's specifics verbatim
(numbers, tool names, prices) — that's the "meat". For rich briefs with a field-notes
hook pattern, include one long-form variant.
- Self-check each variant with the linter, then your own voice-match judgement. Rewrite
≤2× or drop. Prefer fewer strong variants over many weak ones.
- Save one file per variant (
variant-<letter>-<framing>.md) with frontmatter
(platform: x, format: short|long, framing, status: draft) and just the post text.
Linter
python3 ${SKILL_DIR}/scripts/lint_post.py --file ${WORKSPACE}/variant-a-howto.md \
--voice-guide ${WORKSPACE}/voice-x.md --format auto
| Flag |
Meaning |
--file |
Post file (default stdin; frontmatter is stripped). |
--banned |
Comma-separated extra banned phrases (added to the built-in list). |
--voice-guide |
Voice-guide file; pulls its "Banned phrases" section. |
--format |
short (<280) / long (280–4000) / auto. |
--max-hashtags |
Hashtag ceiling (default 2). |
Emits JSON: {format, char_count, length_ok, banned_hits, hashtag_count, hashtags_ok, link_count, has_concrete_token, pass}. pass=false (banned hit, length, or hashtags) →
rewrite or drop. has_concrete_token=false is your cue to check the variant has real "meat".
python3 ${SKILL_DIR}/scripts/lint_post.py --help lists all flags.
Outputs
One markdown file per variant + a short summary of framings used and a suggested next step
(e.g. pair with a graphics-studio visual). No index file.
Credentials / env
- Required: none. The agent is the drafting engine; no script needs a key.
- Optional: none. No paid service is applicable — this is pure LLM drafting with no
external-data step. A missing voice guide degrades gracefully (prompt or warned-generic).
Notes & edge cases
- Default to fewer variants — two strong beats five weak. Framings must genuinely differ.
- Never silently skip the voice guide.
- Mirrors
create-linkedin-content; the difference is the platform defaults (length, no
arrow-bullet / "why this matters" requirement here).
1---2name: create-x-content3description: Draft 2–5 voice-tuned X post variants from a free-form brief, each with a distinct framing (how-to, mechanism, problem-first, hype, contrarian…), and self-check each against a personal voice guide's banned phrases and format rules before returning — so posts sound like the user, not like an AI. The agent does the drafting; a bundled deterministic linter enforces banned-phrase / length / hashtag rules. Invoked standalone or by social-kit.4---56# Create X Content78The drafting is **yours** (the agent is the model). This skill is mostly instructions plus9a tiny deterministic linter (`lint_post.py`) that mechanically checks each variant.1011## When to use1213- "Write X posts about [topic/launch/build]."14- When you want several genuinely different angles on one idea.15- As the X arm of `social-kit`. Pairs with `generate-voice-guide` and `graphics-studio`.1617## How to draft18191. **Resolve the voice guide**: explicit path → stored config / Memory → default location →20 else prompt to generate one (`generate-voice-guide`) or proceed with a *warned* generic21 default. Never silently skip it — generic AI tweets are the failure mode.222. **Parse the brief; decide variant count** by richness (2 = single-angle; 5 = mechanism-rich).233. **Draft each variant** under a distinct framing the voice guide's hook patterns support24 (simple-howto, howto-plus-mechanism, problem-first, hype, mechanism-breakdown,25 ecosystem-map, contrarian, personal-experience). Quote the brief's specifics verbatim26 (numbers, tool names, prices) — that's the "meat". For rich briefs with a field-notes27 hook pattern, include one long-form variant.284. **Self-check each variant** with the linter, then your own voice-match judgement. Rewrite29 ≤2× or drop. Prefer fewer strong variants over many weak ones.305. **Save one file per variant** (`variant-<letter>-<framing>.md`) with frontmatter31 (`platform: x`, `format: short|long`, `framing`, `status: draft`) and just the post text.3233## Linter3435```bash36python3 ${SKILL_DIR}/scripts/lint_post.py --file ${WORKSPACE}/variant-a-howto.md \37 --voice-guide ${WORKSPACE}/voice-x.md --format auto38```3940| Flag | Meaning |41|---|---|42| `--file` | Post file (default stdin; frontmatter is stripped). |43| `--banned` | Comma-separated extra banned phrases (added to the built-in list). |44| `--voice-guide` | Voice-guide file; pulls its "Banned phrases" section. |45| `--format` | `short` (<280) / `long` (280–4000) / `auto`. |46| `--max-hashtags` | Hashtag ceiling (default 2). |4748Emits JSON: `{format, char_count, length_ok, banned_hits, hashtag_count, hashtags_ok,49link_count, has_concrete_token, pass}`. `pass=false` (banned hit, length, or hashtags) →50rewrite or drop. `has_concrete_token=false` is your cue to check the variant has real "meat".5152`python3 ${SKILL_DIR}/scripts/lint_post.py --help` lists all flags.5354## Outputs5556One markdown file per variant + a short summary of framings used and a suggested next step57(e.g. pair with a `graphics-studio` visual). No index file.5859## Credentials / env6061- **Required:** none. The agent is the drafting engine; no script needs a key.62- **Optional:** none. **No paid service is applicable** — this is pure LLM drafting with no63 external-data step. A missing voice guide degrades gracefully (prompt or warned-generic).6465## Notes & edge cases6667- Default to fewer variants — two strong beats five weak. Framings must genuinely differ.68- Never silently skip the voice guide.69- Mirrors `create-linkedin-content`; the difference is the platform defaults (length, no70 arrow-bullet / "why this matters" requirement here).