Create LinkedIn Content
The drafting is yours (the agent is the model). This skill is mostly instructions plus
a tiny deterministic linter (lint_post.py) enforcing the LinkedIn format conventions.
When to use
- "Write LinkedIn posts about [topic/launch]."
- After a build/launch/insight when you want several framings to choose from.
- As the LinkedIn 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-sounding posts are the failure mode.
- Parse the brief; decide variant count by richness (LinkedIn skews toward 3).
- Draft each variant under a distinct framing (builder-story, product-launch,
problem-first, ecosystem-map, contrarian-insight, workflow-tutorial), applying LinkedIn
defaults: 150–500 words,
→ arrow bullets for any list, a "why this matters" beat,
0–2 hashtags, a "link in comments"-style CTA. Quote the brief's specifics verbatim.
Avoid "I'm humbled" / "Grateful for…" performative openers.
- Self-check each variant with the linter, then your own voice-match + press-release-tone
judgement. Rewrite ≤2× or drop.
- Save one file per variant (
linkedin-<letter>-<framing>.md) with frontmatter
(platform: linkedin, framing, status: draft) and the post body.
Linter
python3 ${SKILL_DIR}/scripts/lint_post.py --file ${WORKSPACE}/linkedin-a-builder-story.md \
--voice-guide ${WORKSPACE}/voice-linkedin.md
| Flag |
Meaning |
--file |
Post file (default stdin; frontmatter is stripped). |
--banned |
Comma-separated extra banned phrases. |
--voice-guide |
Voice-guide file; pulls its "Banned phrases" section. |
--word-min / --word-max |
LinkedIn word band (default 150 / 500). |
--max-hashtags |
Hashtag ceiling (default 2). |
Emits JSON: {word_count, length_ok, banned_hits, has_arrow_bullets, has_why_this_matters, hashtag_count, hashtags_ok, has_concrete_token, pass}. pass
requires no banned hits, in-band length, a "why this matters" beat, and ≤2 hashtags →
otherwise rewrite or drop. has_arrow_bullets=false is a nudge to use → for any list.
python3 ${SKILL_DIR}/scripts/lint_post.py --help lists all flags.
Outputs
One markdown file per variant + a short summary of the framings used.
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
- Arrow bullets are a LinkedIn signal; prefer them for any list.
- Quote the brief's specifics verbatim (numbers, tool names, prices) — paraphrasing kills it.
- Prefer fewer strong variants over many watered-down ones.
- Mirrors
create-x-content; the difference is the LinkedIn defaults above.
1---2name: create-linkedin-content3description: Draft 2–5 voice-tuned LinkedIn post variants from a free-form brief, each with a distinct framing, applying LinkedIn-native conventions (arrow bullets, a "why this matters" beat, 150–500 words, 0–2 hashtags) and self-checking against a personal voice guide before returning. The agent does the drafting; a bundled deterministic linter enforces banned-phrase / length / arrow-bullet / "why this matters" rules. Invoked standalone or by social-kit.4---56# Create LinkedIn Content78The drafting is **yours** (the agent is the model). This skill is mostly instructions plus9a tiny deterministic linter (`lint_post.py`) enforcing the LinkedIn format conventions.1011## When to use1213- "Write LinkedIn posts about [topic/launch]."14- After a build/launch/insight when you want several framings to choose from.15- As the LinkedIn 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-sounding posts are the failure mode.222. **Parse the brief; decide variant count** by richness (LinkedIn skews toward 3).233. **Draft each variant** under a distinct framing (builder-story, product-launch,24 problem-first, ecosystem-map, contrarian-insight, workflow-tutorial), applying LinkedIn25 defaults: 150–500 words, `→` arrow bullets for any list, a "why this matters" beat,26 0–2 hashtags, a "link in comments"-style CTA. Quote the brief's specifics verbatim.27 Avoid "I'm humbled" / "Grateful for…" performative openers.284. **Self-check each variant** with the linter, then your own voice-match + press-release-tone29 judgement. Rewrite ≤2× or drop.305. **Save one file per variant** (`linkedin-<letter>-<framing>.md`) with frontmatter31 (`platform: linkedin`, `framing`, `status: draft`) and the post body.3233## Linter3435```bash36python3 ${SKILL_DIR}/scripts/lint_post.py --file ${WORKSPACE}/linkedin-a-builder-story.md \37 --voice-guide ${WORKSPACE}/voice-linkedin.md38```3940| Flag | Meaning |41|---|---|42| `--file` | Post file (default stdin; frontmatter is stripped). |43| `--banned` | Comma-separated extra banned phrases. |44| `--voice-guide` | Voice-guide file; pulls its "Banned phrases" section. |45| `--word-min` / `--word-max` | LinkedIn word band (default 150 / 500). |46| `--max-hashtags` | Hashtag ceiling (default 2). |4748Emits JSON: `{word_count, length_ok, banned_hits, has_arrow_bullets,49has_why_this_matters, hashtag_count, hashtags_ok, has_concrete_token, pass}`. `pass`50requires no banned hits, in-band length, a "why this matters" beat, and ≤2 hashtags →51otherwise rewrite or drop. `has_arrow_bullets=false` is a nudge to use `→` for any list.5253`python3 ${SKILL_DIR}/scripts/lint_post.py --help` lists all flags.5455## Outputs5657One markdown file per variant + a short summary of the framings used.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- Arrow bullets are a LinkedIn signal; prefer them for any list.68- Quote the brief's specifics verbatim (numbers, tool names, prices) — paraphrasing kills it.69- Prefer fewer strong variants over many watered-down ones.70- Mirrors `create-x-content`; the difference is the LinkedIn defaults above.