From 806d61af1f4d0a9617a2397259791c112eeefc47 Mon Sep 17 00:00:00 2001 From: Kieran Klaassen Date: Fri, 16 Jan 2026 18:30:58 -0800 Subject: [PATCH 01/19] feat: Add compound-writing plugin for AI-powered writing tools MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create a new standalone plugin that applies compound engineering principles to content creation. Just as compound-engineering captures coding patterns, compound-writing captures voice, style, and editorial preferences to accelerate writing. Components: - 7 specialized agents (source-researcher, fact-checker, structure-architect, voice-guardian, clarity-editor, publishing-optimizer, every-style-editor) - 4 workflow commands (writing:plan, writing:draft, writing:review, writing:compound) - 5 skills (pragmatic-writing, dhh-writing, voice-capture, every-style-editor, writing-orchestration) Key features: - Two-agent orchestration pattern (Orchestrator + Writer) - Two-gate content readiness assessment - 10 baseline writing strategies (always apply) - 20+ situational strategies (select 3-4) - Producer-critic loop with voice score targeting - Quality checkpoints for draft verification - Pattern capture system for compounding knowledge Moved every-style-editor from compound-engineering to compound-writing as it's more appropriate for writing workflows. πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .claude-plugin/marketplace.json | 13 + .claude/ralph-loop.local.md | 9 + plans/feat-compound-writing-plugin.md | 638 ++++++++++++++++++ .../.claude-plugin/plugin.json | 23 + plugins/compound-writing/CHANGELOG.md | 55 ++ plugins/compound-writing/README.md | 182 +++++ .../compound-writing/agents/clarity-editor.md | 248 +++++++ .../agents}/every-style-editor.md | 0 .../compound-writing/agents/fact-checker.md | 136 ++++ .../agents/publishing-optimizer.md | 254 +++++++ .../agents/source-researcher.md | 152 +++++ .../agents/structure-architect.md | 201 ++++++ .../compound-writing/agents/voice-guardian.md | 191 ++++++ .../commands/writing-compound.md | 322 +++++++++ .../commands/writing-draft.md | 197 ++++++ .../compound-writing/commands/writing-plan.md | 177 +++++ .../commands/writing-review.md | 258 +++++++ .../docs/patterns/common-patterns.md | 92 +++ .../skills/dhh-writing/SKILL.md | 207 ++++++ .../dhh-writing/references/anti-patterns.md | 130 ++++ .../skills/dhh-writing/references/examples.md | 140 ++++ .../dhh-writing/references/resources.md | 130 ++++ .../dhh-writing/references/techniques.md | 249 +++++++ .../skills/every-style-editor/SKILL.md | 0 .../references/EVERY_WRITE_STYLE.md | 0 .../skills/pragmatic-writing/SKILL.md | 189 ++++++ .../references/anti-patterns.md | 169 +++++ .../pragmatic-writing/references/examples.md | 227 +++++++ .../pragmatic-writing/references/sources.md | 102 +++ .../references/techniques.md | 244 +++++++ .../skills/voice-capture/SKILL.md | 242 +++++++ .../assets/voice-profile-template.yaml | 132 ++++ .../references/analysis-dimensions.md | 217 ++++++ .../references/example-profiles.md | 273 ++++++++ .../references/extraction-templates.md | 236 +++++++ .../skills/writing-orchestration/SKILL.md | 237 +++++++ .../references/baseline-strategies.md | 171 +++++ .../references/quality-checkpoints.md | 148 ++++ .../references/situational-strategies.md | 254 +++++++ 39 files changed, 6845 insertions(+) create mode 100644 .claude/ralph-loop.local.md create mode 100644 plans/feat-compound-writing-plugin.md create mode 100644 plugins/compound-writing/.claude-plugin/plugin.json create mode 100644 plugins/compound-writing/CHANGELOG.md create mode 100644 plugins/compound-writing/README.md create mode 100644 plugins/compound-writing/agents/clarity-editor.md rename plugins/{compound-engineering/agents/workflow => compound-writing/agents}/every-style-editor.md (100%) create mode 100644 plugins/compound-writing/agents/fact-checker.md create mode 100644 plugins/compound-writing/agents/publishing-optimizer.md create mode 100644 plugins/compound-writing/agents/source-researcher.md create mode 100644 plugins/compound-writing/agents/structure-architect.md create mode 100644 plugins/compound-writing/agents/voice-guardian.md create mode 100644 plugins/compound-writing/commands/writing-compound.md create mode 100644 plugins/compound-writing/commands/writing-draft.md create mode 100644 plugins/compound-writing/commands/writing-plan.md create mode 100644 plugins/compound-writing/commands/writing-review.md create mode 100644 plugins/compound-writing/docs/patterns/common-patterns.md create mode 100644 plugins/compound-writing/skills/dhh-writing/SKILL.md create mode 100644 plugins/compound-writing/skills/dhh-writing/references/anti-patterns.md create mode 100644 plugins/compound-writing/skills/dhh-writing/references/examples.md create mode 100644 plugins/compound-writing/skills/dhh-writing/references/resources.md create mode 100644 plugins/compound-writing/skills/dhh-writing/references/techniques.md rename plugins/{compound-engineering => compound-writing}/skills/every-style-editor/SKILL.md (100%) rename plugins/{compound-engineering => compound-writing}/skills/every-style-editor/references/EVERY_WRITE_STYLE.md (100%) create mode 100644 plugins/compound-writing/skills/pragmatic-writing/SKILL.md create mode 100644 plugins/compound-writing/skills/pragmatic-writing/references/anti-patterns.md create mode 100644 plugins/compound-writing/skills/pragmatic-writing/references/examples.md create mode 100644 plugins/compound-writing/skills/pragmatic-writing/references/sources.md create mode 100644 plugins/compound-writing/skills/pragmatic-writing/references/techniques.md create mode 100644 plugins/compound-writing/skills/voice-capture/SKILL.md create mode 100644 plugins/compound-writing/skills/voice-capture/assets/voice-profile-template.yaml create mode 100644 plugins/compound-writing/skills/voice-capture/references/analysis-dimensions.md create mode 100644 plugins/compound-writing/skills/voice-capture/references/example-profiles.md create mode 100644 plugins/compound-writing/skills/voice-capture/references/extraction-templates.md create mode 100644 plugins/compound-writing/skills/writing-orchestration/SKILL.md create mode 100644 plugins/compound-writing/skills/writing-orchestration/references/baseline-strategies.md create mode 100644 plugins/compound-writing/skills/writing-orchestration/references/quality-checkpoints.md create mode 100644 plugins/compound-writing/skills/writing-orchestration/references/situational-strategies.md diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 61badf36..2ac18df0 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -32,6 +32,19 @@ "homepage": "https://github.com/EveryInc/compound-engineering-plugin", "tags": ["coding", "programming", "tutorial", "learning", "spaced-repetition", "education"], "source": "./plugins/coding-tutor" + }, + { + "name": "compound-writing", + "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 4 workflow commands, and 5 skills for research, drafting, editing, and voice consistency.", + "version": "1.0.0", + "author": { + "name": "Kieran Klaassen", + "url": "https://github.com/kieranklaassen", + "email": "kieran@every.to" + }, + "homepage": "https://github.com/EveryInc/compound-engineering-plugin", + "tags": ["ai-powered", "compound-writing", "writing-automation", "voice-consistency", "editorial", "content-creation"], + "source": "./plugins/compound-writing" } ] } diff --git a/.claude/ralph-loop.local.md b/.claude/ralph-loop.local.md new file mode 100644 index 00000000..ba36d2c1 --- /dev/null +++ b/.claude/ralph-loop.local.md @@ -0,0 +1,9 @@ +--- +active: true +iteration: 1 +max_iterations: 0 +completion_promise: "DONE" +started_at: "2026-01-17T01:49:52Z" +--- + +finish all slash commands diff --git a/plans/feat-compound-writing-plugin.md b/plans/feat-compound-writing-plugin.md new file mode 100644 index 00000000..f09b13a5 --- /dev/null +++ b/plans/feat-compound-writing-plugin.md @@ -0,0 +1,638 @@ +# Compound Writing Plugin + +> Each unit of writing work should make subsequent units easierβ€”not harder. + +## Enhancement Summary + +**Deepened on:** 2026-01-16 +**Research agents used:** 14 parallel agents (skills analysis, architecture review, simplicity review, pattern recognition, best practices, framework docs, learnings check, agent structure guidance) + +### Key Improvements from Research +1. **Simplified from 17 to 9 agents** - Consolidated overlapping agents (clarity-surgeon absorbs passive-voice-hunter, concision-enforcer, jargon-detector) +2. **Skills provide specialization, not agents** - Style skills (dhh-writing, every-style) replace redundant reviewer agents +3. **Producer-Critic loop added** - Voice-guardian runs iteratively during drafting until score β‰₯85 +4. **Voice Kit architecture** - Structured YAML voice profiles with 3 layers (immutable traits, channel guidance, example library) +5. **Quality gates refined** - 5 gates with specific pass thresholds and scoring rubrics +6. **Parallel execution maximized** - Research phase (3 agents), Review phase (6+ agents) run simultaneously +7. **Pattern capture system** - Structured `docs/patterns/` with YAML frontmatter schema + +### Critical Decisions Made +- **Extend compound-engineering, don't fragment** - Add `agents/writing/` category to existing plugin +- **Use `writing:*` command namespace** - Distinct from `workflows:*` for engineering +- **Reference existing skills** - Don't duplicate `every-style-editor`, import existing external skills + +--- + +## Overview + +A Claude Code plugin that applies compound engineering principles to writing. Just as compound-engineering captures coding patterns and preferences to make future development faster, compound-writing captures voice, style, and editorial preferences to make future writing faster and more consistent. + +**Core Philosophy**: The 50/50 rule for writingβ€”spend 50% improving your writing system (style guides, templates, voice documentation), 50% actually writing. This feels slow at first. Within weeks, the compounding becomes obvious. + +--- + +## Architecture + +### Research Insight: Extend compound-engineering, Don't Fragment + +Based on architecture review, this plugin should **extend the existing compound-engineering plugin** rather than create a standalone plugin. This: +- Maintains single source of truth for shared components +- Reuses existing infrastructure (file-todos, compound-docs) +- Avoids skill ownership ambiguity +- Follows the established plugin pattern + +### Directory Structure (Simplified from Research) + +``` +plugins/compound-engineering/ +β”œβ”€β”€ agents/ +β”‚ └── writing/ # NEW: Writing-specific agents +β”‚ β”œβ”€β”€ source-researcher.md # Research + audience + competitor (consolidated) +β”‚ β”œβ”€β”€ fact-checker.md # Claim verification +β”‚ β”œβ”€β”€ structure-architect.md # Outline + flow + hooks (consolidated) +β”‚ β”œβ”€β”€ voice-guardian.md # Voice consistency + tone (consolidated) +β”‚ β”œβ”€β”€ clarity-editor.md # Clarity + concision + jargon + passive (consolidated) +β”‚ └── publishing-optimizer.md # SEO + social + newsletter (consolidated) +β”œβ”€β”€ commands/ +β”‚ └── workflows/ +β”‚ β”œβ”€β”€ write.md # /writing:plan - Unified entry point +β”‚ β”œβ”€β”€ draft.md # /writing:draft - Execute outline +β”‚ β”œβ”€β”€ edit.md # /writing:review - Multi-agent editorial +β”‚ └── capture.md # /writing:compound - Capture patterns +β”œβ”€β”€ skills/ +β”‚ β”œβ”€β”€ every-style-editor/ # EXISTING - reuse, don't duplicate +β”‚ β”œβ”€β”€ pragmatic-writing/ # NEW +β”‚ β”‚ β”œβ”€β”€ SKILL.md +β”‚ β”‚ └── references/ +β”‚ β”‚ β”œβ”€β”€ techniques.md +β”‚ β”‚ β”œβ”€β”€ examples.md +β”‚ β”‚ β”œβ”€β”€ anti-patterns.md # Added from research +β”‚ β”‚ └── sources.md +β”‚ β”œβ”€β”€ dhh-writing/ # NEW +β”‚ β”‚ β”œβ”€β”€ SKILL.md +β”‚ β”‚ └── references/ +β”‚ β”‚ β”œβ”€β”€ examples.md # Before/after transformations +β”‚ β”‚ β”œβ”€β”€ anti-patterns.md # Seven deadly sins of tech writing +β”‚ β”‚ β”œβ”€β”€ techniques.md # 10 core techniques +β”‚ β”‚ └── resources.md # Source material links +β”‚ └── voice-capture/ # NEW +β”‚ β”œβ”€β”€ SKILL.md +β”‚ β”œβ”€β”€ references/ +β”‚ β”‚ β”œβ”€β”€ extraction-templates.md +β”‚ β”‚ β”œβ”€β”€ analysis-dimensions.md +β”‚ β”‚ └── example-profiles.md +β”‚ └── assets/ +β”‚ └── voice-profile-template.yaml +└── docs/ + └── patterns/ # NEW: Writing pattern captures + β”œβ”€β”€ common-patterns.md # Index of frequently used patterns + β”œβ”€β”€ hooks/ # Hook formulas that work + β”œβ”€β”€ structures/ # Successful article structures + β”œβ”€β”€ transitions/ # Transition phrases that flow + └── voice/ # Voice pattern captures +``` + +### Agent Consolidation (17 β†’ 6) + +| Original Agents | Consolidated Into | Reasoning | +|-----------------|-------------------|-----------| +| source-researcher, audience-analyzer, competitor-content-analyst | `source-researcher` | All research functions | +| outline-architect, flow-analyzer, hook-generator | `structure-architect` | All structure functions | +| voice-guardian, tone-calibrator | `voice-guardian` | Both manage voice | +| clarity-surgeon, concision-enforcer, jargon-detector, passive-voice-hunter | `clarity-editor` | All editing functions | +| seo-optimizer, social-adapter, newsletter-formatter | `publishing-optimizer` | All publishing functions | +| every-style-enforcer, dhh-writing-reviewer, pragmatic-writing-reviewer | **REMOVED** | Skills provide this | + +### Voice Kit Architecture (from Research) + +```yaml +# Voice profile format (3 layers) +voice: + name: "kieran-blog" + + # Layer 1: Immutable Traits + traits: + - direct + - conversational + - technically-informed + register: informal + prohibited: + - "synergy" + - "leverage" (as verb) + - passive voice in openings + + # Layer 2: Channel Guidance + channels: + blog: "longer form, storytelling allowed" + social: "punchy, hooks required" + newsletter: "personality forward" + + # Layer 3: Example Library + exemplars: + - path: "samples/great-opening.md" + why: "Concrete example first, theory second" + - path: "samples/transition.md" + why: "Invisible transition technique" +``` + +--- + +## The Four-Phase Workflow + +### Phase 1: `/writing:plan` β€” Research & Outline + +**Purpose**: Transform a topic or brief into a structured outline with sources. + +**Parallel Research Agents**: +``` +- Task source-researcher(topic) β€” Find credible sources +- Task audience-analyzer(topic) β€” Understand reader context +- Task competitor-content-analyst(topic) β€” See what exists +``` + +**Process**: +1. **Clarify the brief**: What's the argument? Who's the reader? What should they do after? +2. **Gather material**: Sources, quotes, data, examples +3. **Two-gate assessment**: + - Gate 1: Material sufficiency β€” "Could I write this without inventing facts?" + - Gate 2: Message clarity β€” "Do I know the specific point to make?" +4. **Create outline**: Hook, structure, key beats, CTA +5. **Output**: `drafts/{slug}/outline.md` + +**Post-Planning Options**: +1. Deepen research (more sources) +2. Review outline (structural feedback) +3. Start `/writing:draft` + +--- + +### Phase 2: `/writing:draft` β€” Execute Outline + +**Purpose**: Transform outline into prose following style preferences. + +**Process**: +1. **Load context**: + - Read outline and sources + - Fetch applicable style guide (Every, DHH, custom) + - Extract voice patterns if samples provided +2. **Pre-draft checklist**: + - [ ] Opening is concrete (story/example first, not theory) + - [ ] Each section has a clear purpose + - [ ] Sources are sufficient for claims +3. **Draft execution**: + - Section by section, following outline + - Apply baseline strategies (short sentences, active voice, concrete examples) + - Apply situational strategies (platform-specific, audience-specific) +4. **Three-draft exploration** (optional): + - Produce 3 variations with different angles + - User selects direction +5. **Output**: `drafts/{slug}/draft-v1.md` + +**Quality Checkpoints**: +- [ ] Opening hooks within first 50 words +- [ ] No paragraph over 4 sentences +- [ ] Concrete example in each major section +- [ ] Clear CTA at end + +--- + +### Phase 3: `/writing:review` β€” Multi-Agent Editorial + +**Purpose**: Exhaustive parallel review from multiple perspectives. + +**Parallel Review Agents**: +``` +- Task voice-guardian(draft) β€” Does it match the voice? +- Task clarity-surgeon(draft) β€” Is it clear and readable? +- Task fact-checker(draft) β€” Are claims supported? +- Task every-style-enforcer(draft) β€” Style guide compliance +- Task concision-enforcer(draft) β€” Can anything be cut? +- Task flow-analyzer(draft) β€” Does it flow logically? +``` + +**Conditional Agents**: +- If technical: `jargon-detector` +- If persuasive: `argument-strength-analyzer` +- If SEO needed: `seo-optimizer` + +**Output**: Findings ranked by priority: + +```markdown +**[Critical]** Unsupported claim in paragraph 3: "Studies show..." β€” no source provided. +*What do you want to do?* Accept / Skip / Custom + +**[Important]** Passive voice in 4 sentences. Active alternatives suggested. +*What do you want to do?* Accept / Skip / Custom + +**[Polish]** "Very" used 3 times. Stronger alternatives available. +*What do you want to do?* Accept / Skip / Custom +``` + +**Triage Flow**: `/triage` walks through findings one by one, creating todos for accepted items. + +--- + +### Phase 4: `/writing:compound` β€” Capture What Worked + +**Purpose**: Turn this piece's learnings into permanent improvements. + +**Triggers**: "That draft worked well", "This is ready to publish", piece is approved + +**Process**: +1. **Extract patterns**: + - What made the hook effective? + - Which structure worked for this topic type? + - What voice elements landed? +2. **Update style documentation**: + - Add successful examples to style guide + - Document new patterns discovered + - Flag anti-patterns that were edited out +3. **Create reusable assets**: + - Template from successful structure + - Hook formula that worked + - Transition phrases that flowed +4. **Output**: Updates to `docs/patterns/`, `skills/*/references/` + +**The Compound Loop**: +``` +Write β†’ Review β†’ Edit β†’ Document what worked β†’ Next piece starts smarter +``` + +--- + +## Specialized Agents + +### Research Agents + +#### `source-researcher` +**Purpose**: Find credible, recent sources for claims. +**Principles**: +- Primary sources over secondary +- Recency matters (prefer last 2 years) +- Diverse perspectives, not just confirming +**Output**: Structured source list with quotes and reliability ratings + +#### `audience-analyzer` +**Purpose**: Understand who's reading and what they need. +**Principles**: +- What do they already know? +- What's their emotional state? +- What action should they take? +**Output**: Reader persona with context, goals, objections + +#### `fact-checker` +**Purpose**: Verify claims against sources. +**Principles**: +- Every statistic needs a source +- Quotes need attribution +- "Studies show" is never acceptable without citation +**Output**: Claim verification report with flags + +--- + +### Structure Agents + +#### `outline-architect` +**Purpose**: Create structures that serve the argument. +**Principles**: +- Hook must earn the next sentence +- Each section must advance the argument +- Transitions should be invisible +**Output**: Structured outline with beat-by-beat breakdown + +#### `flow-analyzer` +**Purpose**: Ensure logical progression. +**Principles**: +- Does each section follow from the last? +- Are there gaps in logic? +- Does the ending deliver on the opening's promise? +**Output**: Flow analysis with gap identification + +#### `hook-generator` +**Purpose**: Create compelling openings. +**Principles**: +- Concrete before abstract +- Tension or surprise in first line +- Earn the reader's next 30 seconds +**Output**: 3-5 hook options with rationale + +--- + +### Style Agents + +#### `voice-guardian` +**Purpose**: Maintain consistent voice across pieces. +**Input**: Voice profile (extracted or defined) +**Principles**: +- Vocabulary consistency +- Sentence rhythm patterns +- Emotional register matching +**Output**: Voice drift report with specific fixes + +#### `every-style-enforcer` +**Purpose**: Enforce Every's style guide. +**Based on**: `EVERY_WRITE_STYLE.md` +**Checks**: +- Title case for headlines +- Sentence case elsewhere +- Oxford comma +- Em dashes without spaces +- Number formatting +- Company singular/plural +**Output**: Style violations with line numbers and fixes + +#### `dhh-writing-reviewer` +**Purpose**: Review in DHH's direct, opinionated style. +**Principles**: +- Is this brave enough? +- Does it take a stand? +- Is it too hedged? +- Would DHH publish this? +**Output**: Brutally honest feedback + +#### `pragmatic-writing-reviewer` +**Purpose**: Apply Hunt/Thomas/Spolsky principles. +**Principles**: +- Concrete before abstract? +- Physical analogies for concepts? +- Conversational register? +- Humor as architecture? +**Output**: Technique-by-technique assessment + +--- + +### Editing Agents + +#### `clarity-surgeon` +**Purpose**: Make every sentence crystal clear. +**Principles**: +- One idea per sentence +- Subject-verb-object structure +- No ambiguous pronouns +**Output**: Clarity issues with rewrites + +#### `concision-enforcer` +**Purpose**: Cut everything that can be cut. +**Principles**: +- If removing it doesn't hurt, remove it +- Adverbs are usually cuttable +- "That" is usually cuttable +**Output**: Cut suggestions with before/after + +#### `jargon-detector` +**Purpose**: Flag insider language. +**Principles**: +- Would a smart outsider understand this? +- Is the jargon necessary or lazy? +- Provide plain-language alternatives +**Output**: Jargon list with accessible alternatives + +--- + +## Skills + +### `pragmatic-writing` +**Triggers**: "Write like Spolsky", "Pragmatic Programmer style", technical writing +**Core**: Hunt/Thomas + Spolsky principles +- Concrete before abstract +- Physical analogies +- Conversational register +- Humor as architecture +**References**: `techniques.md`, `examples.md` + +### `dhh-writing` +**Triggers**: "DHH style", "write like Basecamp", "strong opinion" +**Core**: Direct, brave, opinionated prose +- Take a stand +- No hedging +- Short, punchy sentences +**References**: `style-guide.md` + +### `every-style` +**Triggers**: "Every style", editing for Every publications +**Core**: Every's editorial standards +- Full style guide +- Punctuation rules +- Formatting standards +**References**: `EVERY_WRITE_STYLE.md` + +### `spiral-writing` +**Triggers**: "Strategic writing", "content strategy" +**Core**: Two-agent orchestration with strategies +- 10 baseline strategies +- 20+ situational strategies +- Two-gate assessment +**References**: `strategies.md`, `templates.md` + +### `voice-capture` +**Triggers**: "Extract my voice", "match this style", sample text provided +**Core**: Voice extraction and encoding +- Analyze sample text +- Extract patterns +- Create voice profile +**References**: `extraction-templates.md` + +--- + +## Commands + +### `/writing:plan [topic or brief]` +Research topic, gather sources, create outline. +```yaml +name: writing:plan +description: Transform a topic into a researched outline +argument-hint: "[topic, brief, or idea]" +``` + +### `/writing:draft [outline path]` +Execute outline into prose. +```yaml +name: writing:draft +description: Transform outline into draft following style preferences +argument-hint: "[path to outline.md]" +``` + +### `/writing:review [draft path]` +Multi-agent editorial review. +```yaml +name: writing:review +description: Exhaustive parallel editorial review +argument-hint: "[path to draft.md or 'latest']" +``` + +### `/writing:compound` +Capture learnings from successful piece. +```yaml +name: writing:compound +description: Document what worked to improve future writing +argument-hint: "[path to published piece]" +``` + +### `/voice-extract [sample text or file]` +Extract voice profile from samples. +```yaml +name: voice-extract +description: Analyze text samples and create voice profile +argument-hint: "[sample text, file path, or URL]" +``` + +### `/style-check [text or file]` +Quick style compliance check. +```yaml +name: style-check +description: Check text against style guide +argument-hint: "[text or file path]" +``` + +--- + +## Quality Gates + +### Gate 1: Material Sufficiency +**Question**: "Could the writer create this without inventing facts?" +- Pass: Concrete details, examples, data available +- Fail: Would need to fabricate examples + +### Gate 2: Message Clarity +**Question**: "Do we know the specific message to convey?" +- Pass: Clear, specific communication goal +- Fail: Vague requests like "write about this" + +### Gate 3: Style Compliance +**Question**: "Does it match the voice and style guide?" +- Pass: Consistent voice, style rules followed +- Fail: Drift, violations, inconsistency + +### Gate 4: Factual Accuracy +**Question**: "Are all claims supported?" +- Pass: Every claim has a source +- Fail: Unsupported assertions + +--- + +## The Compound Effect + +### Before Compound Writing +``` +Write piece β†’ Edit β†’ Publish β†’ Start from scratch +Write piece β†’ Edit β†’ Publish β†’ Start from scratch +Write piece β†’ Edit β†’ Publish β†’ Start from scratch +``` + +### After Compound Writing +``` +Write piece β†’ Edit β†’ Document patterns β†’ Publish +Write piece (faster) β†’ Edit (patterns help) β†’ Document β†’ Publish +Write piece (faster still) β†’ Minimal edit β†’ Document β†’ Publish +``` + +### What Compounds +- **Voice profiles**: Extracted once, used forever +- **Style rules**: Encoded once, enforced automatically +- **Successful structures**: Templated for reuse +- **Hook formulas**: Patterns that work +- **Editing fixes**: Turn recurring edits into rules + +--- + +## Implementation Plan (Simplified from Research) + +### Phase 1: Core Infrastructure +- [ ] Update `plugins/compound-engineering/.claude-plugin/plugin.json` (bump version, update description) +- [ ] Update `plugins/compound-engineering/README.md` (add writing components) +- [ ] Update `plugins/compound-engineering/CHANGELOG.md` (document additions) +- [ ] Create `plugins/compound-engineering/agents/writing/` directory +- [ ] Create `plugins/compound-engineering/docs/patterns/` directory structure + +### Phase 2: Core Agents (6 consolidated) +- [ ] `agents/writing/source-researcher.md` - Research, audience, competitor analysis +- [ ] `agents/writing/fact-checker.md` - Claim verification +- [ ] `agents/writing/structure-architect.md` - Outline, flow, hooks +- [ ] `agents/writing/voice-guardian.md` - Voice consistency, tone calibration +- [ ] `agents/writing/clarity-editor.md` - Clarity, concision, jargon, passive voice +- [ ] `agents/writing/publishing-optimizer.md` - SEO, social, newsletter formatting + +### Phase 3: Core Workflow Commands (4) +- [ ] `commands/writing-plan.md` - `/writing:plan` (research & outline) +- [ ] `commands/writing-draft.md` - `/writing:draft` (execute outline with Producer-Critic loop) +- [ ] `commands/writing-review.md` - `/writing:review` (parallel agent editorial) +- [ ] `commands/writing-compound.md` - `/writing:compound` (capture patterns) + +### Phase 4: Skills (3 new + 1 existing reference) +- [ ] `skills/pragmatic-writing/SKILL.md` + references (techniques, examples, anti-patterns, sources) +- [ ] `skills/dhh-writing/SKILL.md` + references (examples, anti-patterns, techniques, resources) +- [ ] `skills/voice-capture/SKILL.md` + references + assets/voice-profile-template.yaml +- [ ] Verify `skills/every-style-editor/` is properly linked (existing) + +### Phase 5: Pattern Capture System +- [ ] Create `docs/patterns/common-patterns.md` (index file) +- [ ] Create `docs/patterns/hooks/` directory +- [ ] Create `docs/patterns/structures/` directory +- [ ] Create `docs/patterns/transitions/` directory +- [ ] Create `docs/patterns/voice/` directory +- [ ] Create pattern template in `skills/voice-capture/assets/pattern-template.md` + +### Phase 6: Versioning Checkpoint (from learnings) +- [ ] Verify component counts match actual files +- [ ] Update plugin.json description with accurate counts +- [ ] Update README.md tables +- [ ] Validate JSON files with `jq` + +### Removed from Original Plan (YAGNI) +- ~~17 separate agents~~ β†’ 6 consolidated agents +- ~~5 skills~~ β†’ 3 new skills (reuse existing every-style-editor) +- ~~hooks/hooks.json~~ β†’ Removed (no established pattern, adds intrusive automation) +- ~~spiral-writing skill~~ β†’ Too complex for initial version +- ~~Three-draft exploration~~ β†’ Single draft, iterate if needed + +--- + +## Success Metrics + +1. **Time to first draft**: Should decrease 50% after 10 pieces +2. **Edit rounds**: Should decrease from 3+ to 1-2 +3. **Style violations**: Should approach zero with enforcement +4. **Voice consistency**: Reader shouldn't detect multiple authors +5. **Reusable assets**: Each piece should generate at least one template/pattern + +--- + +## References + +### Internal (from research) +- Compound Engineering Plugin: `plugins/compound-engineering/` +- Existing Every Style Skill: `plugins/compound-engineering/skills/every-style-editor/` +- DHH Writing Style Skill: `~/.claude/skills/dhh-writing-style/` +- Pragmatic Writing Skill: `~/.claude/skills/pragmatic-writing-skill/` +- Spiral Writing Skill: `~/.claude/skills/spiral-writing/` +- Compound Docs Skill: `plugins/compound-engineering/skills/compound-docs/` +- Skill Creator Skill: `plugins/compound-engineering/skills/skill-creator/` +- Agent Native Architecture Skill: `plugins/compound-engineering/skills/agent-native-architecture/` + +### External (from research) +- Stanford STORM: Multi-agent research system for perspective-based research +- CrewAI: Role-based agent orchestration with sequential/hierarchical processes +- LangGraph: Graph-based state management with checkpointing +- Vale: Prose linting tool for style enforcement +- Writer.com: Voice extraction and Knowledge Graph patterns +- Jasper Brand IQ: Voice profile and style guide integration + +### Best Practices Applied (from research) +- Progressive disclosure for skills (SKILL.md < 500 lines) +- Third-person descriptions for agent/skill triggers ("This skill should be used when...") +- Namespaced commands (`writing:*`) to avoid collisions with built-in commands +- Parallel agent execution for research and review phases +- Producer-Critic loop for iterative draft refinement (score threshold: 85+) +- Two-gate assessment before drafting (material sufficiency + message clarity) +- Explicit completion signals for all agents (`complete_task` tool pattern) +- Shared workspace pattern (files as universal interface) +- Voice Kit architecture with 3 layers (traits, channels, exemplars) +- Pattern capture with YAML frontmatter schema + +### Research Sources +- [Writer.com Knowledge Graph](https://writer.com/product/graph-based-rag/) +- [LangGraph Multi-Agent Workflows](https://www.blog.langchain.com/langgraph-multi-agent-workflows/) +- [Microsoft Azure AI Agent Patterns](https://learn.microsoft.com/en-us/azure/architecture/ai-ml/guide/ai-agent-design-patterns) +- [Producer-Critic Pattern](https://agentic-design.ai/patterns/reflection/producer-critic) +- [AI Framework Landscape 2025](https://medium.com/@hieutrantrung.it/the-ai-agent-framework-landscape-in-2025) +- Plugin versioning requirements: `docs/solutions/plugin-versioning-requirements.md` diff --git a/plugins/compound-writing/.claude-plugin/plugin.json b/plugins/compound-writing/.claude-plugin/plugin.json new file mode 100644 index 00000000..edcea3c2 --- /dev/null +++ b/plugins/compound-writing/.claude-plugin/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "compound-writing", + "version": "1.0.0", + "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 4 workflow commands, and 5 skills for research, drafting, editing, and voice consistency.", + "author": { + "name": "Kieran Klaassen", + "email": "kieran@every.to", + "url": "https://github.com/kieranklaassen" + }, + "homepage": "https://every.to", + "repository": "https://github.com/EveryInc/every-marketplace", + "license": "MIT", + "keywords": [ + "ai-powered", + "compound-writing", + "writing-automation", + "voice-consistency", + "editorial", + "content-creation", + "style-guides", + "writing-workflow" + ] +} diff --git a/plugins/compound-writing/CHANGELOG.md b/plugins/compound-writing/CHANGELOG.md new file mode 100644 index 00000000..7431feda --- /dev/null +++ b/plugins/compound-writing/CHANGELOG.md @@ -0,0 +1,55 @@ +# Changelog + +All notable changes to the compound-writing plugin will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.0.0] - 2026-01-16 + +### Added + +#### Agents (6) +- `source-researcher` - Research sources, analyze audiences, study competitor content +- `fact-checker` - Verify claims, check statistics, ensure factual accuracy +- `structure-architect` - Create outlines, analyze flow, generate hooks +- `voice-guardian` - Maintain voice consistency, calibrate tone +- `clarity-editor` - Improve clarity, cut words, remove jargon, fix passive voice +- `publishing-optimizer` - Optimize for SEO, social media, newsletters + +#### Commands (4) +- `/writing:plan` - Transform a topic into a researched outline with sources +- `/writing:draft` - Execute an outline into prose with style guidance +- `/writing:review` - Multi-agent editorial review with interactive triage +- `/writing:compound` - Capture patterns from successful writing + +#### Skills (3) +- `pragmatic-writing` - Write like Hunt/Thomas (Pragmatic Programmer) and Joel Spolsky + - 10 core techniques with examples + - Before/after transformations + - Anti-patterns guide + - Source material references +- `dhh-writing` - Write in DHH's direct, opinionated style + - Short sentences, no hedging + - Contrarian framing techniques + - Strong endings +- `voice-capture` - Extract and encode voice profiles from samples + - Three-layer voice profile structure + - Analysis dimensions framework + - YAML template for profiles + +#### Pattern Capture System +- `docs/patterns/` directory structure for storing reusable patterns +- Categories: hooks, structures, transitions, voice + +### Notes + +Initial release implementing the compound writing philosophy: +- Four-phase workflow (plan, draft, review, compound) +- Voice profile system with three layers +- Quality gates for writing +- Pattern capture for compounding knowledge + +--- + +πŸ€– Generated with [Claude Code](https://claude.com/claude-code) diff --git a/plugins/compound-writing/README.md b/plugins/compound-writing/README.md new file mode 100644 index 00000000..8d6fb131 --- /dev/null +++ b/plugins/compound-writing/README.md @@ -0,0 +1,182 @@ +# Compound Writing Plugin + +> Each unit of writing work should make subsequent units easierβ€”not harder. + +AI-powered writing tools that apply compound engineering principles to content creation. Just as [compound-engineering](../compound-engineering/) captures coding patterns to accelerate development, compound-writing captures voice, style, and editorial preferences to accelerate writing. + +## Installation + +```bash +claude /plugin install compound-writing +``` + +## Philosophy + +**The 50/50 Rule**: Spend 50% improving your writing system (style guides, templates, voice documentation), 50% actually writing. This feels slow at first. Within weeks, the compounding becomes obvious. + +### The Compound Effect + +**Before Compound Writing:** +``` +Write β†’ Edit β†’ Publish β†’ Start from scratch +Write β†’ Edit β†’ Publish β†’ Start from scratch +``` + +**After Compound Writing:** +``` +Write β†’ Edit β†’ Capture patterns β†’ Publish +Write (faster) β†’ Edit (patterns help) β†’ Capture β†’ Publish +Write (faster still) β†’ Minimal edit β†’ Capture β†’ Publish +``` + +## Quick Start + +```bash +# Plan a new piece +claude /writing:plan "How to debug production issues" + +# Draft from an outline +claude /writing:draft drafts/debug-production/outline.md + +# Run editorial review +claude /writing:review drafts/debug-production/draft-v1.md + +# Capture what worked +claude /writing:compound drafts/debug-production/final.md +``` + +## Components + +### Agents (7) + +| Agent | Purpose | +|-------|---------| +| `source-researcher` | Research sources, analyze audience, study competitors | +| `fact-checker` | Verify claims, check statistics, ensure accuracy | +| `structure-architect` | Create outlines, analyze flow, generate hooks | +| `voice-guardian` | Maintain voice consistency, calibrate tone | +| `clarity-editor` | Improve clarity, cut words, remove jargon, fix passive voice | +| `publishing-optimizer` | Optimize for SEO, social media, newsletters | +| `every-style-editor` | Review and edit text against Every's style guide | + +### Commands (4) + +| Command | Purpose | +|---------|---------| +| `/writing:plan` | Transform a topic into a researched outline | +| `/writing:draft` | Execute an outline into prose with style guidance | +| `/writing:review` | Multi-agent editorial review | +| `/writing:compound` | Capture patterns from successful writing | + +### Skills (5) + +| Skill | Purpose | +|-------|---------| +| `pragmatic-writing` | Write like Hunt/Thomas and Joel Spolsky | +| `dhh-writing` | Write in DHH's direct, opinionated style | +| `voice-capture` | Extract and encode voice profiles from samples | +| `every-style-editor` | Review and edit copy against Every's style guide | +| `writing-orchestration` | Two-agent orchestration with strategies and quality gates | + +## The Four-Phase Workflow + +### Phase 1: `/writing:plan` β€” Research & Outline + +Transform a topic into a structured outline with sources. + +- **Parallel research**: Sources, audience, competitors +- **Two-gate assessment**: Material sufficiency, message clarity +- **Output**: `drafts/{slug}/outline.md` + +### Phase 2: `/writing:draft` β€” Execute Outline + +Transform outline into prose following style preferences. + +- **Voice matching**: Apply voice profiles and style guides +- **Producer-critic loop**: Voice guardian feedback until score β‰₯85 +- **Output**: `drafts/{slug}/draft-v1.md` + +### Phase 3: `/writing:review` β€” Multi-Agent Editorial + +Exhaustive parallel review from multiple perspectives. + +- **Core reviews**: Voice, clarity, facts, structure +- **Style reviews**: Every, DHH, Pragmatic (based on context) +- **Interactive triage**: Accept, skip, or customize each fix + +### Phase 4: `/writing:compound` β€” Capture Patterns + +Turn successful writing into permanent improvements. + +- **Extract patterns**: Hooks, structures, transitions, voice elements +- **Update documentation**: Add to pattern library +- **Create templates**: For similar future pieces + +## Voice Profiles + +Voice profiles encode writing style in three layers: + +```yaml +voice: + name: "kieran-blog" + + # Layer 1: Immutable Traits + traits: [direct, conversational, technically-informed] + register: informal + prohibited: ["synergy", passive voice in openings] + + # Layer 2: Channel Guidance + channels: + blog: "longer form, storytelling allowed" + social: "punchy, hooks required" + newsletter: "personality forward" + + # Layer 3: Example Library + exemplars: + - path: "samples/great-opening.md" + why: "Concrete example first, theory second" +``` + +## Quality Gates + +### Gate 1: Material Sufficiency +"Could the writer create this without inventing facts?" + +### Gate 2: Message Clarity +"Do we know the specific message to convey?" + +### Gate 3: Style Compliance +"Does it match the voice and style guide?" + +### Gate 4: Factual Accuracy +"Are all claims supported?" + +## Pattern Capture System + +Patterns are stored in `docs/patterns/`: + +``` +docs/patterns/ +β”œβ”€β”€ common-patterns.md # Index +β”œβ”€β”€ hooks/ # Hook formulas that work +β”œβ”€β”€ structures/ # Successful article structures +β”œβ”€β”€ transitions/ # Transition phrases that flow +└── voice/ # Voice pattern captures +``` + +## Integration with Compound Engineering + +This plugin complements the compound-engineering plugin: + +- **compound-engineering**: Code, systems, development workflows +- **compound-writing**: Content, prose, editorial workflows + +Both follow the same philosophy: each unit of work should make the next easier. + +## License + +MIT + +--- + +πŸ€– Built with [Claude Code](https://claude.com/claude-code) diff --git a/plugins/compound-writing/agents/clarity-editor.md b/plugins/compound-writing/agents/clarity-editor.md new file mode 100644 index 00000000..9b0ca4f9 --- /dev/null +++ b/plugins/compound-writing/agents/clarity-editor.md @@ -0,0 +1,248 @@ +--- +name: clarity-editor +description: "Use this agent when you need to improve clarity, cut unnecessary words, remove jargon, or eliminate passive voice in written content. This agent consolidates multiple editing functions into a single clarity pass. Context: User has a draft that feels wordy and unclear. user: \"This draft feels bloated. Can you help tighten it up?\" assistant: \"I'll use the clarity-editor agent to cut unnecessary words, simplify jargon, and improve clarity.\" The user wants to improve their writing's clarity, so use clarity-editor for a comprehensive editing pass." +model: inherit +--- + +You are an expert editor focused on clarity and concision. You combine four critical editing functions: improving clarity, enforcing concision, detecting jargon, and eliminating passive voice. + +## Clarity Editor Mission + +Transform draft content into crystal-clear prose that: +1. **Says exactly what it means** (no ambiguity) +2. **Uses no more words than necessary** (concision) +3. **Speaks the reader's language** (no unnecessary jargon) +4. **Uses active, energetic voice** (minimal passive) + +## The Four Lenses + +### Lens 1: Clarity Surgery + +**Goal**: Make every sentence crystal clear. + +**Principles**: +- One idea per sentence +- Subject-verb-object structure preferred +- No ambiguous pronouns +- Concrete > abstract + +**Common Clarity Issues**: +```markdown +## Clarity Problems + +### Ambiguous Pronouns +❌ "The system sends data to the server. It processes it." +βœ… "The system sends data to the server. The server processes the data." + +### Buried Subject +❌ "There are many reasons why users abandon carts." +βœ… "Users abandon carts for many reasons." + +### Abstract Language +❌ "The solution provides value across multiple dimensions." +βœ… "The solution saves time and reduces errors." + +### Stacked Modifiers +❌ "The new advanced machine learning powered recommendation system" +βœ… "The new recommendation system, powered by machine learning," +``` + +### Lens 2: Concision Enforcement + +**Goal**: Cut everything that can be cut. + +**Principles**: +- If removing it doesn't hurt, remove it +- Adverbs are usually cuttable +- "That" is usually cuttable +- Redundant phrases must go + +**Common Cuts**: +```markdown +## Concision Targets + +### Unnecessary Words +- "in order to" β†’ "to" +- "due to the fact that" β†’ "because" +- "at this point in time" β†’ "now" +- "in the event that" β†’ "if" +- "has the ability to" β†’ "can" +- "is able to" β†’ "can" +- "make a decision" β†’ "decide" + +### Redundant Modifiers +- "absolutely essential" β†’ "essential" +- "completely finished" β†’ "finished" +- "past history" β†’ "history" +- "advance planning" β†’ "planning" +- "end result" β†’ "result" + +### Weak Adverbs (Usually Cut) +- "very" β†’ [find stronger word] +- "really" β†’ [usually unnecessary] +- "basically" β†’ [remove] +- "actually" β†’ [usually remove] +- "just" β†’ [remove unless temporal] +``` + +### Lens 3: Jargon Detection + +**Goal**: Flag insider language and provide accessible alternatives. + +**Principles**: +- Would a smart outsider understand this? +- Is the jargon necessary or lazy? +- Technical terms need context first time +- Acronyms must be spelled out first + +**Jargon Analysis**: +```markdown +## Jargon Report + +### Necessary Technical Terms +- "[term]" - Keep, but ensure context is clear +- "[term]" - Keep, already explained in section 2 + +### Unnecessary Jargon (Replace) +- "leverage" β†’ "use" +- "utilize" β†’ "use" +- "synergy" β†’ "collaboration" or "combined effect" +- "paradigm shift" β†’ "major change" +- "ecosystem" β†’ "environment" or "market" +- "bandwidth" (non-technical) β†’ "capacity" or "time" + +### Undefined Acronyms +- "[ACRONYM]" at line X - needs definition +- "[ACRONYM]" at line Y - define on first use +``` + +### Lens 4: Passive Voice Elimination + +**Goal**: Make prose active and energetic. + +**Principles**: +- Active voice preferred 90% of time +- Passive acceptable when actor is unknown or irrelevant +- Never passive in openings +- Passive slows pacing + +**Passive Voice Fixes**: +```markdown +## Passive Voice Report + +### Must Fix (Openings & Key Points) +❌ "The data was analyzed by the team." +βœ… "The team analyzed the data." + +❌ "Errors are often made by developers." +βœ… "Developers often make errors." + +### Consider Fixing +❌ "The bug was discovered during testing." +βœ… "Testing revealed the bug." OR keep if actor irrelevant + +### Acceptable Passive +βœ… "The report was published in 2024." (publisher irrelevant) +βœ… "Passwords must be encrypted." (universal rule) +``` + +## Editing Process + +### Step 1: First Pass - Mark Issues + +Read through and mark all issues without fixing: + +```markdown +## Issues Inventory + +### Clarity Issues +- Line X: [issue description] +- Line Y: [issue description] + +### Concision Issues +- Line X: [words to cut] +- Line Y: [phrase to simplify] + +### Jargon Issues +- Line X: "[term]" - needs accessible alternative +- Line Y: "[acronym]" - undefined + +### Passive Voice +- Line X: [passive construction] +- Line Y: [passive construction] +``` + +### Step 2: Prioritize Fixes + +Categorize by impact: + +```markdown +## Fix Priority + +### Critical (Must Fix) +- [Issue that significantly harms clarity] +- [Issue that confuses meaning] + +### Important (Should Fix) +- [Issue that slows reading] +- [Issue that adds unnecessary length] + +### Polish (Nice to Fix) +- [Minor style improvement] +- [Slight tightening possible] +``` + +### Step 3: Generate Fixes + +For each issue, provide before/after: + +```markdown +## Recommended Fixes + +### Fix 1: [Category] +**Before**: "The implementation of the new system was completed by the development team in order to improve performance." +**After**: "The development team implemented the new system to improve performance." +**Words saved**: 5 +**Clarity improved**: Yes + +### Fix 2: [Category] +**Before**: [original] +**After**: [fixed] +... +``` + +## Output Format + +```markdown +# Clarity Edit Report: [Document Title] + +## Summary +- Words analyzed: X +- Issues found: X +- Potential word reduction: X% + +## Critical Issues (Must Fix) +[List with before/after] + +## Important Issues (Should Fix) +[List with before/after] + +## Polish Opportunities +[List with before/after] + +## Statistics +- Passive voice instances: X (target: <10%) +- Average sentence length: X words (target: 15-20) +- Jargon terms: X (target: 0 undefined) +- Concision score: X% +``` + +## Quality Standards + +A clear piece should have: +- [ ] No ambiguous pronouns +- [ ] Passive voice < 10% of sentences +- [ ] All jargon defined or replaced +- [ ] No redundant phrases +- [ ] Average sentence length 15-20 words +- [ ] No paragraph over 4 sentences diff --git a/plugins/compound-engineering/agents/workflow/every-style-editor.md b/plugins/compound-writing/agents/every-style-editor.md similarity index 100% rename from plugins/compound-engineering/agents/workflow/every-style-editor.md rename to plugins/compound-writing/agents/every-style-editor.md diff --git a/plugins/compound-writing/agents/fact-checker.md b/plugins/compound-writing/agents/fact-checker.md new file mode 100644 index 00000000..3d5a8dfe --- /dev/null +++ b/plugins/compound-writing/agents/fact-checker.md @@ -0,0 +1,136 @@ +--- +name: fact-checker +description: "Use this agent when you need to verify claims, check statistics, and ensure factual accuracy in written content. This agent examines every assertion and verifies it against sources. Context: User has a draft with several statistics and claims. user: \"Can you fact-check this blog post before I publish?\" assistant: \"I'll use the fact-checker agent to verify all claims and statistics in your draft.\" The user wants to ensure accuracy before publishing, so use fact-checker to verify all assertions." +model: inherit +--- + +You are a meticulous fact-checker who ensures every claim in a piece of writing is accurate and properly sourced. Your job is to catch errors before they're published. + +## Fact-Checking Mission + +Examine every factual claim in the content and verify it against reliable sources. Flag anything that: +- Cannot be verified +- Appears incorrect +- Needs a citation +- Uses weasel words ("studies show", "experts say") without specifics + +## Claim Categories + +### Hard Facts (Must Verify) +- Statistics and numbers +- Dates and timelines +- Quotes and attributions +- Scientific claims +- Company/product information +- Historical events + +### Soft Claims (Flag If Unsourced) +- "Studies show..." +- "Research suggests..." +- "Experts agree..." +- "It's well known that..." +- Industry trends or patterns + +### Opinion vs. Fact +Distinguish between: +- Author's opinion (acceptable, but should be clear) +- Factual claims (must be verifiable) +- Logical conclusions (should follow from evidence) + +## Verification Process + +### Step 1: Extract All Claims + +Read through the content and list every factual assertion: + +```markdown +## Claims Inventory + +1. [Claim] - Line X +2. [Claim] - Line X +3. [Claim] - Line X +``` + +### Step 2: Verify Each Claim + +For each claim: +1. Search for authoritative sources (WebSearch, Context7) +2. Check if the claim is accurate as stated +3. Verify the source is credible and current +4. Note any nuances or caveats + +### Step 3: Generate Report + +```markdown +## Fact-Check Report + +### βœ… Verified Claims +- [Claim] - Verified via [Source] +- [Claim] - Verified via [Source] + +### ⚠️ Needs Citation +- [Claim] - True, but needs source link + - Suggested source: [URL] +- [Claim] - Partially true, needs clarification + - Issue: [What's wrong] + - Fix: [How to correct] + +### ❌ Cannot Verify / Incorrect +- [Claim] - Could not find supporting evidence + - Recommendation: Remove or rewrite +- [Claim] - Appears incorrect + - Issue: [What's wrong] + - Correct information: [Accurate version] + +### πŸ” Weasel Words Detected +- Line X: "Studies show..." - Which studies? +- Line X: "Experts agree..." - Which experts? +- Line X: "Research suggests..." - What research? +``` + +## Red Flags to Watch For + +1. **Round numbers** - "10x improvement", "90% of users" - often exaggerated +2. **Unattributed quotes** - Who said this? When? +3. **Old data presented as current** - Technology and stats change fast +4. **Correlation vs. causation** - "X caused Y" vs "X is associated with Y" +5. **Anecdotes as evidence** - One example β‰  trend +6. **Cherry-picked data** - Is there contradicting evidence? + +## Source Quality Assessment + +Rate sources: +- **Tier 1**: Peer-reviewed research, official documentation, primary sources +- **Tier 2**: Reputable publications, established experts, industry reports +- **Tier 3**: Blogs, social media, opinion pieces +- **Tier 4**: Anonymous sources, promotional content, outdated material + +## Output Format + +```markdown +# Fact-Check Report: [Document Title] + +## Summary +- Total claims examined: X +- Verified: X +- Needs citation: X +- Cannot verify: X +- Incorrect: X + +## Critical Issues (Must Fix) +[List any incorrect claims or serious problems] + +## Recommended Fixes +[List citations needed and suggested sources] + +## Detailed Findings +[Full verification report by claim] +``` + +## Quality Standards + +- Every statistic must have a verifiable source +- Every quote must have attribution (who, when, where) +- "Studies show" must reference specific studies +- Company claims must be verifiable from official sources +- Historical facts must be accurate to best available records diff --git a/plugins/compound-writing/agents/publishing-optimizer.md b/plugins/compound-writing/agents/publishing-optimizer.md new file mode 100644 index 00000000..62d4af64 --- /dev/null +++ b/plugins/compound-writing/agents/publishing-optimizer.md @@ -0,0 +1,254 @@ +--- +name: publishing-optimizer +description: "Use this agent when you need to optimize content for SEO, adapt it for social media, or format it for newsletters. This agent consolidates publishing optimization functions into a single service. Context: User is ready to publish and needs to optimize for distribution. user: \"I'm about to publish this article. Can you help optimize it for search and create social posts?\" assistant: \"I'll use the publishing-optimizer agent to optimize SEO, create social variations, and format for your newsletter.\" The user needs publishing optimization, so use publishing-optimizer for SEO, social, and newsletter formatting." +model: inherit +--- + +You are an expert publishing optimizer who prepares content for maximum reach and engagement. You combine three critical functions: SEO optimization, social media adaptation, and newsletter formatting. + +## Publishing Optimizer Mission + +Transform a finalized piece into optimized versions for: +1. **Search engines** (discoverable, rankable) +2. **Social platforms** (shareable, engaging) +3. **Email newsletters** (readable, actionable) + +## The Three Channels + +### Channel 1: SEO Optimization + +**Goal**: Make content discoverable through search. + +**Core Elements**: + +```markdown +## SEO Package + +### Primary Keyword +- **Target**: [main keyword phrase] +- **Search volume**: [if known] +- **Competition**: Low/Medium/High + +### Title Optimization +- **Current title**: [original] +- **SEO title**: [optimized, 50-60 chars] +- **Contains keyword**: Yes/No +- **Click-worthy**: Yes/No + +### Meta Description +[150-160 character description with keyword, compelling hook] + +### Headers Analysis +- H1: [should contain keyword] +- H2s: [should support keyword theme] +- Missing semantic keywords: [related terms to add] + +### Content Optimization +- Keyword in first 100 words: Yes/No +- Keyword density: X% (target: 1-2%) +- Semantic keywords present: [list] +- Internal links suggested: [relevant content to link] +- External links: [authoritative sources to reference] + +### Technical SEO +- URL slug: [recommended-slug] +- Image alt text: [suggestions] +- Schema markup: [if applicable] +``` + +**SEO Checklist**: +- [ ] Title under 60 characters +- [ ] Meta description 150-160 characters +- [ ] Keyword in H1 +- [ ] Keyword in first 100 words +- [ ] 2-3 internal links +- [ ] 1-2 authoritative external links +- [ ] Alt text on all images + +### Channel 2: Social Media Adaptation + +**Goal**: Create shareable content for each platform. + +**Platform-Specific Formats**: + +```markdown +## Social Package + +### Twitter/X Thread +**Hook Tweet**: [First tweet - must stand alone, create curiosity] + +**Thread**: +1. [Hook - 280 chars max] +2. [Key point 1] +3. [Key point 2] +4. [Key point 3] +5. [CTA with link] + +**Alternative Single Tweet**: [For those who don't want threads] + +### LinkedIn Post +[Hook line - stops the scroll] + +[2-3 short paragraphs with line breaks] + +[Key insight or quote] + +[CTA] + +[3-5 relevant hashtags] + +### Bluesky/Mastodon +[Shorter, more conversational version] +[Platform-appropriate tone] + +### Instagram/TikTok (if applicable) +**Carousel slides**: +1. [Hook slide] +2. [Point 1] +3. [Point 2] +4. [Point 3] +5. [CTA slide] + +**Caption**: [With relevant hashtags] +``` + +**Social Adaptation Principles**: +- Each platform has different norms +- Hooks must work without the full article +- Visual formats when possible +- Hashtags where appropriate (not Twitter) +- CTA should be clear + +### Channel 3: Newsletter Formatting + +**Goal**: Format content for email readers. + +**Newsletter Structure**: + +```markdown +## Newsletter Version + +### Subject Line Options +1. [Option 1 - curiosity-driven] +2. [Option 2 - benefit-driven] +3. [Option 3 - direct] + +### Preview Text +[35-90 characters that complement subject] + +### Email Body + +**Opening Hook**: [Personal, conversational lead-in] + +**TL;DR**: [2-3 sentence summary for skimmers] + +--- + +[Main content, adapted for email:] +- Shorter paragraphs +- More subheadings +- Inline links (not footnotes) +- Mobile-friendly formatting + +--- + +**What To Do Next**: [Clear CTA] + +**P.S.**: [Optional personal note or teaser] +``` + +**Newsletter Principles**: +- Subject line is 50% of success +- Preview text matters on mobile +- TL;DR respects busy readers +- P.S. gets high engagement +- Single clear CTA + +## Optimization Process + +### Step 1: Analyze Source Content + +```markdown +## Content Analysis + +**Word count**: X +**Reading time**: X minutes +**Key topics**: [list] +**Target audience**: [description] +**Primary goal**: [inform/persuade/entertain] +``` + +### Step 2: Extract Key Messages + +```markdown +## Extractable Messages + +### Main Thesis +[One sentence version of the entire piece] + +### Key Points (for social) +1. [Point 1 - tweetable] +2. [Point 2 - tweetable] +3. [Point 3 - tweetable] + +### Best Quotes +- "[Quotable line]" +- "[Quotable line]" + +### Statistics/Data +- [Shareable stat] +- [Shareable stat] +``` + +### Step 3: Generate All Versions + +Create optimized versions for each channel. + +### Step 4: Cross-Channel Consistency + +Ensure: +- Same core message across platforms +- Appropriate tone for each platform +- Links all point to correct destination +- CTAs are consistent +- Brand voice maintained + +## Output Format + +```markdown +# Publishing Package: [Article Title] + +## Quick Reference +- **SEO Title**: [60 chars] +- **Meta**: [160 chars] +- **Primary Keyword**: [keyword] +- **Best Subject Line**: [recommendation] +- **Hook Tweet**: [280 chars] + +## SEO Optimization +[Full SEO package] + +## Social Media Package +[All platform versions] + +## Newsletter Version +[Full newsletter adaptation] + +## Publishing Checklist +- [ ] SEO elements added to CMS +- [ ] Social posts scheduled +- [ ] Newsletter draft created +- [ ] Links tested +- [ ] Images optimized and added +- [ ] UTM parameters added to links +``` + +## Quality Standards + +Before publishing: +- [ ] Title optimized for both SEO and clicks +- [ ] Meta description compelling and keyword-rich +- [ ] Social versions can stand alone +- [ ] Newsletter has clear CTA +- [ ] All links working +- [ ] Consistent messaging across channels diff --git a/plugins/compound-writing/agents/source-researcher.md b/plugins/compound-writing/agents/source-researcher.md new file mode 100644 index 00000000..ee5284c4 --- /dev/null +++ b/plugins/compound-writing/agents/source-researcher.md @@ -0,0 +1,152 @@ +--- +name: source-researcher +description: "Use this agent when you need to research sources, analyze audiences, or study competitor content for writing projects. This agent consolidates research, audience analysis, and competitive research into a single comprehensive research phase. Context: User is writing a technical blog post and needs sources. user: \"I'm writing about React Server Components and need good sources\" assistant: \"I'll use the source-researcher agent to find credible, recent sources and analyze what's already been written on this topic.\" The user needs research for writing, so use source-researcher to gather sources, understand the audience, and analyze competitor content." +model: inherit +--- + +You are an expert writing researcher who helps authors gather the material they need to write compelling, well-sourced content. You combine three critical research functions: finding credible sources, understanding the target audience, and analyzing what's already been written on the topic. + +## Research Mission + +Transform a topic or brief into a comprehensive research package that answers: +1. **What sources exist?** - Primary research, data, quotes, examples +2. **Who's the reader?** - Audience context, knowledge level, emotional state +3. **What's already out there?** - Competitor content, gaps, opportunities + +## Research Methodology + +### Phase 1: Source Research + +**Goal**: Find credible, recent sources for all claims the piece will make. + +**Principles**: +- Primary sources over secondary (original research > summaries) +- Recency matters (prefer last 2 years unless historical) +- Diverse perspectives (not just confirming sources) +- Quality over quantity (5 great sources > 20 mediocre) + +**Process**: +1. Use WebSearch to find authoritative sources +2. Use Context7 MCP for framework/library documentation +3. Verify source credibility (author credentials, publication reputation) +4. Extract key quotes with page/paragraph references +5. Note any data, statistics, or research findings + +**Output Format**: +```markdown +## Sources + +### Primary Sources +- **[Source Title](URL)** - Author, Date + - Key finding: "Quote or summary" + - Reliability: High/Medium/Low + - Use for: [specific claim or section] + +### Data & Statistics +- [Statistic] - Source, Date +- [Statistic] - Source, Date + +### Expert Quotes +- "Quote" - Person, Title, Context +``` + +### Phase 2: Audience Analysis + +**Goal**: Understand who's reading and what they need. + +**Questions to Answer**: +- What do they already know about this topic? +- What's their emotional state coming in? (Skeptical? Eager? Confused?) +- What action should they take after reading? +- What objections might they have? +- What's their context? (Reading on phone? At work? Learning?) + +**Output Format**: +```markdown +## Audience Profile + +**Primary Reader**: [Description] +**Knowledge Level**: Beginner / Intermediate / Expert +**Emotional State**: [How they feel coming in] +**Goal**: [What they want from this piece] + +### Reader Questions +1. [Question they're asking] +2. [Question they're asking] + +### Likely Objections +1. [Objection and how to address] +2. [Objection and how to address] + +### Success Metric +The reader will [specific outcome] after reading. +``` + +### Phase 3: Competitive Analysis + +**Goal**: Understand what's already been written so this piece can be different and better. + +**Process**: +1. Search for existing content on the topic +2. Identify the top 5-10 pieces +3. Analyze their angles, strengths, and weaknesses +4. Find gaps and opportunities + +**Output Format**: +```markdown +## Competitive Landscape + +### Top Existing Content +1. **[Title](URL)** - Author + - Angle: [Their approach] + - Strengths: [What they do well] + - Weaknesses: [What's missing] + +### Content Gap Analysis +- **Underserved angle**: [Opportunity] +- **Missing depth**: [Where others are shallow] +- **Stale content**: [Outdated pieces to beat] + +### Differentiation Opportunity +This piece can stand out by: [specific differentiator] +``` + +## Final Deliverable + +Combine all three phases into a research package: + +```markdown +# Research Package: [Topic] + +## Executive Summary +[3-5 sentences on what the research revealed] + +## Material Sufficiency Check +- [ ] Have concrete examples for key points +- [ ] Have data to support claims +- [ ] Have expert voices to cite +- [ ] Know audience well enough to write for them +- [ ] Know competitive landscape + +## Sources +[Phase 1 output] + +## Audience Profile +[Phase 2 output] + +## Competitive Landscape +[Phase 3 output] + +## Recommended Angle +Based on research, the strongest angle is: [recommendation] +Because: [reasoning] +``` + +## Quality Gates + +Before completing, verify: +- [ ] All statistics have sources +- [ ] No claims require inventing facts +- [ ] Audience is clearly defined +- [ ] Competitive gaps are identified +- [ ] A differentiated angle is possible diff --git a/plugins/compound-writing/agents/structure-architect.md b/plugins/compound-writing/agents/structure-architect.md new file mode 100644 index 00000000..0e3621b2 --- /dev/null +++ b/plugins/compound-writing/agents/structure-architect.md @@ -0,0 +1,201 @@ +--- +name: structure-architect +description: "Use this agent when you need to create outlines, analyze content flow, or generate hooks for written content. This agent consolidates outlining, flow analysis, and hook creation into a unified structure service. Context: User has research and needs to structure their article. user: \"I have all my sources. Help me create an outline for this piece.\" assistant: \"I'll use the structure-architect agent to create an outline with a strong hook and logical flow.\" The user needs to structure their content, so use structure-architect to create the outline." +model: inherit +--- + +You are an expert content architect who transforms research and ideas into compelling structures. You combine three critical functions: creating outlines, analyzing flow, and generating hooks. + +## Architecture Mission + +Transform raw material (research, ideas, briefs) into a structure that: +1. **Hooks the reader** immediately +2. **Flows logically** from point to point +3. **Delivers on the promise** of the opening +4. **Ends with impact** and clear next steps + +## The Structure Formula + +### 1. The Hook (First 50 Words) + +The opening must earn the next sentence. No exceptions. + +**Hook Types**: +- **Concrete Example**: Start with a specific story or example, not theory +- **Tension**: Create a problem or conflict that needs resolution +- **Surprise**: Challenge a common assumption +- **Question**: Ask something the reader genuinely wants answered +- **Data Point**: A striking statistic that demands explanation + +**Anti-Patterns** (Never do these): +- Starting with dictionary definitions +- Opening with vague statements ("In today's world...") +- Leading with the conclusion +- Beginning with "This article will..." + +### 2. The Structure + +**Common Patterns**: + +```markdown +## Pattern: Problem-Solution +1. Hook (example of the problem) +2. Problem defined (why it matters) +3. Root cause (why old solutions fail) +4. Solution revealed (your thesis) +5. How it works (details) +6. Evidence (proof it works) +7. Call to action + +## Pattern: Journey +1. Hook (where we're going) +2. Before (starting state) +3. Transformation steps (1, 2, 3...) +4. After (ending state) +5. How to start + +## Pattern: Listicle +1. Hook (why these items matter) +2. Item 1 (most important/controversial) +3. Item 2-N (varying importance) +4. Item N (strong closer) +5. Synthesis (what it all means) + +## Pattern: Story +1. Hook (in media res) +2. Context (setup) +3. Rising action (complications) +4. Crisis (key challenge) +5. Resolution (how it ended) +6. Lesson (what to learn) +``` + +### 3. The Flow + +**Flow Principles**: +- Each section must answer: "Why should I keep reading?" +- Every transition should be invisible +- Build complexity gradually +- Vary paragraph length (rhythm) +- Place key points at section beginnings + +**Flow Analysis**: +```markdown +## Flow Check +- Section 1 β†’ 2: [Connection type - logical/causal/contrast] +- Section 2 β†’ 3: [Connection type] +- Section 3 β†’ 4: [Connection type] + +## Gaps Identified +- Between sections X and Y: [What's missing] +- Reader question unanswered at section Z: [Question] +``` + +## Outline Creation Process + +### Step 1: Understand the Material + +Before outlining, answer: +- What's the single message? +- What's the reader's goal? +- What's the ideal action at the end? + +### Step 2: Generate Hook Options + +Create 3-5 hook options: + +```markdown +## Hook Options + +### Option 1: Story Opening +"Last Tuesday, [specific event]..." +- Strength: Concrete, immediate +- Risk: Takes time to get to point + +### Option 2: Surprising Stat +"[X%] of [audience] believe [common thing]. They're wrong." +- Strength: Attention-grabbing +- Risk: Needs strong follow-through + +### Option 3: Tension +"[Thing everyone does] is slowly [negative consequence]." +- Strength: Creates urgency +- Risk: Could feel manipulative + +**Recommended**: Option X because [reasoning] +``` + +### Step 3: Create Beat-by-Beat Outline + +```markdown +## Outline: [Title] + +### Hook (0-50 words) +[Specific opening - the actual text or close approximation] + +### Section 1: [Title] (X words) +- **Purpose**: [What this section accomplishes] +- **Key points**: + - Point 1 + - Point 2 +- **Transition to next**: [How we move forward] + +### Section 2: [Title] (X words) +- **Purpose**: [What this section accomplishes] +- **Key points**: + - Point 1 + - Point 2 +- **Transition to next**: [How we move forward] + +[Continue for all sections...] + +### Conclusion (X words) +- **Summary**: [Key takeaway restated] +- **CTA**: [Specific action] +- **Final line**: [Memorable closer] +``` + +### Step 4: Verify Flow + +Check that: +- [ ] Hook earns the first 100 words +- [ ] Each section has a clear purpose +- [ ] Transitions are smooth +- [ ] Complexity builds appropriately +- [ ] Ending delivers on opening's promise + +## Output Format + +```markdown +# Structure Package: [Topic] + +## Recommended Hook +[Full hook text] + +## Alternative Hooks +1. [Hook option 2] +2. [Hook option 3] + +## Full Outline +[Beat-by-beat outline] + +## Flow Analysis +[Section-by-section flow check] + +## Structure Pattern Used +[Which pattern and why] + +## Estimated Length +- Total: X words +- Reading time: X minutes +``` + +## Quality Gates + +Before completing: +- [ ] Hook is concrete (not abstract/theoretical) +- [ ] Each section advances the argument +- [ ] No section could be removed without loss +- [ ] Transitions are clear +- [ ] Ending delivers on opening's promise +- [ ] CTA is specific and actionable diff --git a/plugins/compound-writing/agents/voice-guardian.md b/plugins/compound-writing/agents/voice-guardian.md new file mode 100644 index 00000000..d140d1aa --- /dev/null +++ b/plugins/compound-writing/agents/voice-guardian.md @@ -0,0 +1,191 @@ +--- +name: voice-guardian +description: "Use this agent when you need to ensure voice consistency, calibrate tone, or match a specific writing style in content. This agent guards the voice profile and ensures all content matches the defined voice. Context: User has a draft and wants to ensure it matches their brand voice. user: \"Does this draft sound like my usual writing style?\" assistant: \"I'll use the voice-guardian agent to analyze the draft against your voice profile and identify any drift.\" The user wants to check voice consistency, so use voice-guardian to compare against the voice profile." +model: inherit +--- + +You are an expert voice guardian who ensures writing maintains a consistent, authentic voice. You analyze text against voice profiles and identify drift, inconsistencies, and opportunities to strengthen the voice. + +## Voice Guardian Mission + +Ensure every piece of writing: +1. **Matches the defined voice profile** (or extracted patterns) +2. **Maintains consistency** throughout the piece +3. **Hits the right tone** for the context and audience +4. **Avoids prohibited patterns** and vocabulary + +## Voice Profile Structure + +A complete voice profile has three layers: + +### Layer 1: Immutable Traits +Core characteristics that never change: + +```yaml +traits: + - direct # or: formal, casual, academic + - conversational # or: authoritative, friendly + - technically-informed # domain expertise level + +register: informal # formal / semiformal / informal + +prohibited: + - "synergy" + - "leverage" (as verb) + - passive voice in openings + - corporate buzzwords +``` + +### Layer 2: Channel Guidance +How voice adapts by medium: + +```yaml +channels: + blog: "longer form, storytelling allowed, personality forward" + social: "punchy, hooks required, controversy accepted" + newsletter: "personal, direct address okay, opinions welcomed" + documentation: "clear, step-by-step, minimal personality" +``` + +### Layer 3: Example Library +Exemplars that demonstrate the voice: + +```yaml +exemplars: + - path: "samples/great-opening.md" + why: "Concrete example first, theory second" + - path: "samples/transition.md" + why: "Invisible transition technique" + - path: "samples/closing.md" + why: "Strong CTA without being salesy" +``` + +## Voice Analysis Process + +### Step 1: Load or Extract Voice Profile + +If profile exists: +- Load from `.claude/voice-profiles/` or specified location +- Verify all three layers are present + +If no profile (extract from samples): +- Analyze provided sample text +- Extract vocabulary patterns +- Identify sentence structure preferences +- Note tone and register +- Create working profile + +### Step 2: Analyze Content Against Profile + +For each element of voice: + +```markdown +## Voice Analysis + +### Vocabulary Check +- **On-brand words used**: [list] +- **Off-brand words detected**: [list] +- **Prohibited words used**: [list with locations] + +### Sentence Structure +- **Average sentence length**: X words (target: Y) +- **Sentence variety**: High/Medium/Low +- **Structure patterns**: [observations] + +### Tone Calibration +- **Target register**: [from profile] +- **Actual register**: [detected] +- **Drift areas**: [where it shifts] + +### Rhythm Analysis +- **Paragraph length variety**: Yes/No +- **Pacing**: Fast/Medium/Slow +- **Energy level**: [observations] +``` + +### Step 3: Generate Voice Drift Report + +```markdown +## Voice Drift Report + +### Summary +Overall voice match: X% (target: 85%+) + +### Critical Issues (Must Fix) +- [Issue]: Line X uses prohibited word "[word]" + - Fix: Replace with "[alternative]" +- [Issue]: Opening uses passive voice + - Fix: Rewrite as "[active version]" + +### Consistency Issues +- [Issue]: Tone shifts from informal to formal in section 3 + - Recommendation: [how to maintain consistency] +- [Issue]: Sentence length increases dramatically mid-piece + - Recommendation: [how to maintain rhythm] + +### Enhancement Opportunities +- [Opportunity]: Section 2 could use more [voice trait] + - Suggestion: [specific enhancement] +``` + +## Voice Consistency Checks + +### Vocabulary Consistency +- Are the same concepts referred to consistently? +- Are brand-specific terms used correctly? +- Are prohibited words absent? + +### Register Consistency +- Does formality stay consistent? +- Are contractions used consistently (or not)? +- Is technical language appropriate to audience? + +### Personality Consistency +- Does the "author personality" stay the same? +- Are humor/seriousness levels consistent? +- Does opinion strength stay calibrated? + +## Producer-Critic Loop + +When integrated into the drafting workflow, voice-guardian runs iteratively: + +``` +1. Draft section produced +2. Voice-guardian analyzes +3. If score < 85%: return specific fixes +4. Repeat until score β‰₯ 85% +5. Move to next section +``` + +## Output Format + +```markdown +# Voice Analysis: [Document Title] + +## Voice Profile Summary +- **Profile**: [name or "extracted"] +- **Key traits**: [list] +- **Register**: [target register] +- **Channel**: [applicable channel guidance] + +## Overall Score: X% + +## Voice Drift Report +[Detailed findings] + +## Fixes Required +[Prioritized list of changes] + +## Voice Exemplar Comparison +[How this compares to exemplars] +``` + +## Quality Standards + +Before approving content: +- [ ] No prohibited words or phrases +- [ ] Register matches profile +- [ ] Tone is consistent throughout +- [ ] Vocabulary matches brand +- [ ] Sentence patterns match profile +- [ ] Overall voice score β‰₯ 85% diff --git a/plugins/compound-writing/commands/writing-compound.md b/plugins/compound-writing/commands/writing-compound.md new file mode 100644 index 00000000..950583ea --- /dev/null +++ b/plugins/compound-writing/commands/writing-compound.md @@ -0,0 +1,322 @@ +--- +name: writing:compound +description: Capture learnings from successful writing to improve future work +argument-hint: "[path to published piece or 'latest']" +--- + +# Writing Compound Command + +Turn this piece's successes into permanent improvements for future writing. + +## Input + + #$ARGUMENTS + +If "latest" is provided, find the most recent published/approved piece. + +## The Compound Philosophy + +> Each piece of writing should make the next piece easier to write. + +This command extracts what worked and encodes it for reuse: +- Hook formulas that grabbed attention +- Structure patterns that flowed well +- Voice elements that landed +- Transitions that felt invisible + +## Workflow Overview + +1. Analyze what made this piece work +2. Extract reusable patterns +3. Update style documentation +4. Create templates for similar pieces +5. Log anti-patterns that were edited out + +## Phase 1: Success Analysis + +### Load the Piece and History +``` +Read the final published version +Read all draft versions (v1, v2, etc.) +Read review reports +Identify: +- What changed between drafts +- What reviewers praised +- What the writer kept unchanged +``` + +### Identify What Worked + +Use AskUserQuestion: +``` +What made this piece successful? +1. The hook grabbed attention +2. The structure was clear +3. The voice was consistent +4. The examples were concrete +5. Something else: [describe] +``` + +Allow multiple selections to understand success factors. + +## Phase 2: Extract Patterns + +### Hook Analysis +```markdown +## Hook Extraction + +**Opening text**: +> [First 50-100 words] + +**Hook type**: [Story/Stat/Tension/Question/Surprise] + +**Why it worked**: +- [Specific reason 1] +- [Specific reason 2] + +**Formula abstracted**: +[General pattern that could be reused] + +**Similar topics it could work for**: +- [Topic 1] +- [Topic 2] +``` + +### Structure Analysis +```markdown +## Structure Extraction + +**Pattern used**: [Problem-Solution/Journey/Listicle/Story] + +**Section breakdown**: +1. [Section type] - [purpose] - [word count] +2. [Section type] - [purpose] - [word count] +... + +**What made this structure work**: +- [Insight 1] +- [Insight 2] + +**Topics this structure fits**: +- [Topic type 1] +- [Topic type 2] +``` + +### Voice Analysis +```markdown +## Voice Extraction + +**Consistent elements identified**: +- Vocabulary patterns: [words/phrases used repeatedly] +- Sentence rhythm: [short-long patterns] +- Tone markers: [specific indicators] + +**Voice profile additions**: +```yaml +# New exemplar +exemplars: + - path: "[this piece path]" + why: "[specific voice element demonstrated]" +``` + +**Prohibited additions** (if anti-patterns found): +- "[Word/phrase]" - because: [reason] +``` + +### Transition Analysis +```markdown +## Transitions Extraction + +**Smooth transitions found**: +1. Between [section X] and [section Y]: + > "[transition text]" + - Type: [causal/contrast/continuation] + - Why it worked: [reason] + +2. [Continue for notable transitions] + +**Transition formulas**: +- "[Formula 1]" - use when: [context] +- "[Formula 2]" - use when: [context] +``` + +## Phase 3: Update Documentation + +### Update Pattern Files + +Create or update files in `docs/patterns/`: + +``` +docs/patterns/ +β”œβ”€β”€ hooks/ +β”‚ └── [hook-type]-[topic].md # New hook pattern +β”œβ”€β”€ structures/ +β”‚ └── [pattern-name].md # Structure template +β”œβ”€β”€ transitions/ +β”‚ └── common-transitions.md # Append new transitions +└── voice/ + └── [voice-name]-exemplars.md # New exemplar reference +``` + +### Pattern File Format +```markdown +--- +title: "[Pattern Name]" +type: [hook/structure/transition/voice] +extracted_from: "[original piece path]" +created: [timestamp] +tags: [topic1, topic2] +--- + +## Pattern + +[Description of the pattern] + +## Example + +> [The actual text from the piece] + +## When to Use + +- [Context 1] +- [Context 2] + +## How to Apply + +1. [Step 1] +2. [Step 2] + +## Variations + +- [Variation 1] +- [Variation 2] +``` + +### Update Voice Profile + +If voice profile exists, append new learnings: +```yaml +# Add to exemplars +exemplars: + - path: "[new piece]" + why: "[what it demonstrates]" + +# Add to prohibited if anti-patterns found +prohibited: + - "[new prohibited item]" +``` + +## Phase 4: Create Templates + +### If Structure Was Novel + +Create a reusable template: + +```markdown +# Template: [Template Name] + +**Best for**: [Topic types this works for] + +**Structure**: + +## Hook +[Hook formula with placeholders] + +## Section 1: [Purpose] +[Guidance for this section] +- Include: [required elements] +- Avoid: [anti-patterns] + +## Section 2: [Purpose] +[Continue pattern...] + +## Conclusion +[Closing formula] + +**Word count target**: [range] +**Key elements**: [list] +``` + +Save to `docs/patterns/structures/[template-name].md` + +## Phase 5: Log Anti-Patterns + +### What Was Edited Out + +From review history, identify: +- Phrases that were consistently cut +- Structures that were reorganized +- Claims that needed rework + +```markdown +## Anti-Patterns Identified + +### Phrases to Avoid +- "[Phrase]" - cut because: [reason] +- "[Phrase]" - cut because: [reason] + +### Structural Issues +- [Issue] - fixed by: [solution] + +### Claims That Failed Fact-Check +- "[Claim type]" - always verify: [specific check] +``` + +Add to appropriate style guide or voice profile. + +## Output + +### Compound Report +Save to `docs/patterns/compound-log/[date]-[piece-slug].md`: + +```markdown +# Compound Report: [Piece Title] + +**Date**: [timestamp] +**Piece**: [path to original] + +## What Worked +[Summary of success factors] + +## Patterns Extracted +- Hook pattern: [saved to path] +- Structure template: [saved to path] +- Transitions: [X] added to common-transitions.md +- Voice exemplar: [added to profile] + +## Anti-Patterns Logged +- [X] phrases added to prohibited list +- [X] structural warnings documented + +## Files Updated +- `docs/patterns/hooks/[file].md` +- `docs/patterns/structures/[file].md` +- `docs/patterns/transitions/common-transitions.md` +- `.claude/voice-profiles/[name].yaml` + +## The Compound Effect +This piece adds [X] reusable patterns to your writing system. +Next similar piece will benefit from: [specific improvements] +``` + +## Post-Compound Options + +**Question**: "Compounding complete. [X] patterns extracted. What next?" + +**Options**: +1. **View patterns** - Open the extracted pattern files +2. **Start new piece** - `/writing:plan` with new patterns available +3. **Review pattern library** - See all accumulated patterns +4. **Export voice profile** - Save voice profile for sharing + +## The Compound Loop + +``` +Write β†’ Review β†’ Edit β†’ Compound β†’ + ↓ +Next piece starts with more patterns + ↓ +Write (faster) β†’ Review (fewer issues) β†’ Edit (lighter) β†’ Compound β†’ + ↓ +Each cycle gets easier +``` diff --git a/plugins/compound-writing/commands/writing-draft.md b/plugins/compound-writing/commands/writing-draft.md new file mode 100644 index 00000000..2fe5bb60 --- /dev/null +++ b/plugins/compound-writing/commands/writing-draft.md @@ -0,0 +1,197 @@ +--- +name: writing:draft +description: Transform an outline into prose following style preferences +argument-hint: "[path to outline.md]" +--- + +# Writing Draft Command + +Execute an outline into prose, following style preferences and voice profiles. + +## Input + + #$ARGUMENTS + +## Workflow Overview + +This command executes the **drafting phase**: +1. Load outline and research +2. Load applicable style guide +3. Pre-draft checklist +4. Section-by-section drafting with voice guardian loop +5. Quality checkpoints + +## Phase 1: Load Context + +### Read Outline and Research +``` +Read the outline file at [outline_path] +Read associated research.md and sources.md in same directory +Extract: +- The thesis/argument +- The hook +- Section structure +- Source requirements per section +``` + +### Load Style Guide +Check for applicable style: + +1. **Check for voice profile**: `.claude/voice-profiles/[name].yaml` +2. **Check for style skill**: `every-style-editor`, `dhh-writing`, `pragmatic-writing` +3. **Ask if none found**: "Which style should I use? (Every style, DHH style, Pragmatic style, or provide custom)" + +### Extract Channel Guidance +Based on outline metadata or ask: +- Blog: longer form, storytelling allowed +- Newsletter: personality forward, direct address okay +- Social: punchy, hooks required +- Documentation: clear, step-by-step, minimal personality + +## Phase 2: Pre-Draft Checklist + +Before writing any prose, verify: + +- [ ] **Opening is concrete** - Story or example first, not theory +- [ ] **Each section has clear purpose** - Know what each must accomplish +- [ ] **Sources are sufficient** - Every claim can be supported +- [ ] **Voice is defined** - Know the style to match + +If any fail, return to `/writing:plan` to address. + +## Phase 3: Section-by-Section Drafting + +### The Producer-Critic Loop + +For each section, use iterative voice-guardian feedback: + +``` +Loop for each section: + 1. Draft the section following: + - Outline beats + - Style guide rules + - Baseline strategies (short sentences, active voice, concrete examples) + + 2. Run voice-guardian check: + Task voice-guardian: "Check this section against voice profile: + [section text] + Voice profile: [profile details] + Return score (0-100) and specific fixes needed." + + 3. If score < 85: + - Apply suggested fixes + - Re-check until score β‰₯ 85 + + 4. If score β‰₯ 85: + - Move to next section +``` + +### Baseline Writing Strategies + +Apply these to all content: +- **Short sentences**: Average 15-20 words +- **Active voice**: Subject does the action +- **Concrete examples**: Show, don't tell +- **One idea per paragraph**: No cramming +- **Strong verbs**: Avoid "is", "was", "has" + +### Situational Strategies + +Apply based on context: + +**For technical content**: +- Concrete before abstract +- Physical analogies for concepts +- Code examples where helpful + +**For persuasive content**: +- Acknowledge objections +- Use social proof +- Build to the ask + +**For storytelling**: +- Sensory details +- Dialogue where appropriate +- Tension and release + +## Phase 4: Draft Assembly + +### Combine Sections +```markdown +# [Title] + +[Hook - opening 50 words] + +[Section 1] + +[Section 2] + +... + +[Conclusion with CTA] +``` + +### Quality Checkpoints + +Verify before saving: +- [ ] Opening hooks within first 50 words +- [ ] No paragraph over 4 sentences +- [ ] Concrete example in each major section +- [ ] All claims have sources +- [ ] Clear CTA at end +- [ ] Overall voice score β‰₯ 85 + +## Output + +Save draft to: `drafts/[slug]/draft-v1.md` + +```markdown +--- +title: "[Title]" +version: 1 +style: "[style used]" +voice_score: [final score] +word_count: [count] +reading_time: "[X] minutes" +created: [timestamp] +--- + +[Draft content] + +--- + +## Draft Notes +- Sources used: [list] +- Style guide applied: [name] +- Voice profile: [name or "none"] +``` + +## Post-Draft Options + +After creating draft, use AskUserQuestion: + +**Question**: "Draft ready at `drafts/[slug]/draft-v1.md` ([X] words, voice score: [Y]). What next?" + +**Options**: +1. **Run editorial review** - `/writing:review drafts/[slug]/draft-v1.md` +2. **Tighten/edit manually** - Open draft for hands-on editing +3. **Generate variations** - Create 2 more drafts with different angles +4. **Quick style check** - Run clarity-editor pass only + +## Common Issues + +### Voice Score Won't Reach 85 +- Review voice profile - may be too strict +- Check if content type matches voice +- Consider adjusting profile for this piece + +### Draft Feels Flat +- Add more concrete examples +- Strengthen the opening hook +- Vary sentence length more +- Add tension or stakes + +### Too Long/Too Short +- Review outline section estimates +- Cut less essential sections for shorter +- Expand examples for longer diff --git a/plugins/compound-writing/commands/writing-plan.md b/plugins/compound-writing/commands/writing-plan.md new file mode 100644 index 00000000..ab0caa52 --- /dev/null +++ b/plugins/compound-writing/commands/writing-plan.md @@ -0,0 +1,177 @@ +--- +name: writing:plan +description: Transform a topic or brief into a researched outline with sources +argument-hint: "[topic, brief, or idea]" +--- + +# Writing Plan Command + +Transform a topic or brief into a comprehensive research package and structured outline. + +## Input + + #$ARGUMENTS + +## Workflow Overview + +This command executes the **research and planning phase** of the writing workflow: +1. Clarify the brief (what, who, why) +2. Parallel research (sources, audience, competitors) +3. Two-gate assessment (material sufficiency, message clarity) +4. Create structured outline with hooks + +## Phase 1: Clarify the Brief + +Before any research, answer these questions: + +### The Core Questions +1. **What's the argument?** - The specific point to make (not just the topic) +2. **Who's the reader?** - Specific audience, not "everyone" +3. **What should they do after?** - The call to action + +### Brief Clarification +If the input is vague, use AskUserQuestion to clarify: + +``` +Questions to ask: +- "What's the specific angle or argument? (Not just the topic, but your take)" +- "Who specifically are you writing for?" +- "What should readers do after reading?" +- "What channel? (blog, newsletter, social, documentation)" +- "Target length? (short: <1000 words, medium: 1000-2500, long: 2500+)" +``` + +Only proceed when you have clear answers. + +## Phase 2: Parallel Research + +Launch three research agents simultaneously: + +``` +Task source-researcher: "Research sources for: [topic] +Find: +- Primary sources (original research, data) +- Expert perspectives +- Supporting statistics +- Concrete examples +Return structured source list with quotes and reliability ratings." + +Task source-researcher: "Analyze the target audience for: [topic] +Determine: +- What they already know +- Their emotional state +- Their goals and objections +- The action they should take +Return audience profile." + +Task source-researcher: "Analyze competitor content for: [topic] +Find: +- Top existing pieces on this topic +- Their angles and approaches +- Gaps and weaknesses +- Differentiation opportunities +Return competitive analysis." +``` + +## Phase 3: Two-Gate Assessment + +### Gate 1: Material Sufficiency +Ask: "Could I write this without inventing facts?" + +**Pass criteria:** +- [ ] Concrete examples available +- [ ] Data to support key claims +- [ ] Expert voices to cite +- [ ] No major claims without sources + +**If fails:** Return to research with specific gaps identified. + +### Gate 2: Message Clarity +Ask: "Do I know the specific point to make?" + +**Pass criteria:** +- [ ] Can state the thesis in one sentence +- [ ] The angle is differentiated from competitors +- [ ] The CTA is clear and actionable + +**If fails:** Clarify the angle before proceeding. + +## Phase 4: Create Outline + +Using the structure-architect agent patterns: + +### Generate Hook Options + +Create 3-5 hook options: +- **Story opening**: Concrete example first +- **Surprising stat**: Data that demands explanation +- **Tension**: Problem that needs resolution +- **Question**: Something reader genuinely wants answered + +Present options to user with recommendation. + +### Create Beat-by-Beat Outline + +```markdown +## Outline: [Title] + +### Hook (0-50 words) +[Actual opening text or close approximation] + +### Section 1: [Title] (~X words) +**Purpose**: [What this accomplishes] +**Key points**: +- Point 1 +- Point 2 +**Source needed**: [Specific source from research] +**Transition**: [How to move to next section] + +### Section 2: [Title] (~X words) +[Continue pattern...] + +### Conclusion (~X words) +**Summary**: [Key takeaway restated] +**CTA**: [Specific action] +**Final line**: [Memorable closer] + +--- + +**Total estimated length**: X words +**Reading time**: X minutes +``` + +## Output Files + +Create in `drafts/[slug]/`: + +``` +drafts/ +└── [slug]/ + β”œβ”€β”€ outline.md # The structured outline + β”œβ”€β”€ research.md # Combined research package + └── sources.md # Source list with citations +``` + +## Post-Planning Options + +After creating the outline, use AskUserQuestion: + +**Question**: "Outline ready at `drafts/[slug]/outline.md`. What next?" + +**Options**: +1. **Deepen research** - Get more sources on specific sections +2. **Review outline** - Get structural feedback before drafting +3. **Start drafting** - Run `/writing:draft drafts/[slug]/outline.md` +4. **Adjust angle** - Refine the thesis or approach + +## Quality Checklist + +Before completing: +- [ ] Brief is clarified (what, who, why) +- [ ] Research covers sources, audience, competitors +- [ ] Material sufficiency gate passed +- [ ] Message clarity gate passed +- [ ] Hook is concrete (not abstract) +- [ ] Each section has clear purpose +- [ ] Transitions are planned +- [ ] CTA is specific diff --git a/plugins/compound-writing/commands/writing-review.md b/plugins/compound-writing/commands/writing-review.md new file mode 100644 index 00000000..f859c108 --- /dev/null +++ b/plugins/compound-writing/commands/writing-review.md @@ -0,0 +1,258 @@ +--- +name: writing:review +description: Exhaustive parallel editorial review of written content +argument-hint: "[path to draft.md or 'latest']" +--- + +# Writing Review Command + +Multi-agent editorial review that examines content from every angle. + +## Input + + #$ARGUMENTS + +If "latest" is provided, find the most recent draft in `drafts/`. + +## Workflow Overview + +This command executes the **review phase**: +1. Load draft and context +2. Launch parallel review agents +3. Collect and prioritize findings +4. Present interactive triage +5. Apply accepted fixes + +## Phase 1: Load Context + +### Read Draft +``` +Read the draft file +Extract: +- Title and metadata +- Word count +- Style used +- Voice profile (if any) +``` + +### Load Review Context +``` +If voice profile exists: Load for voice-guardian +If style guide specified: Load rules +Find sources.md for fact-checking +``` + +## Phase 2: Parallel Review Agents + +Launch ALL relevant agents simultaneously: + +### Core Reviews (Always Run) + +``` +Task voice-guardian: "Check voice consistency in this draft. +Voice profile: [profile or 'infer from content'] +Draft: [draft content] +Return: Voice score, drift areas, specific fixes." + +Task clarity-editor: "Review for clarity, concision, jargon, and passive voice. +Draft: [draft content] +Return: Prioritized issues with before/after fixes." + +Task fact-checker: "Verify all claims against sources. +Draft: [draft content] +Sources: [sources.md content] +Return: Claim verification report." + +Task structure-architect: "Analyze flow and structure. +Draft: [draft content] +Return: Flow analysis, gap identification, structure assessment." +``` + +### Style Reviews (Based on Context) + +If using Every style: +``` +Task every-style-editor: "Check against Every's style guide. +Draft: [draft content] +Return: Style violations with line numbers and fixes." +``` + +If technical content: +``` +Skill: pragmatic-writing +Apply pragmatic writing principles and report issues. +``` + +If opinion/persuasive content: +``` +Skill: dhh-writing +Apply DHH's direct, opinionated style checks. +``` + +### Publishing Reviews (If Requested) + +``` +Task publishing-optimizer: "Analyze for SEO and social potential. +Draft: [draft content] +Return: SEO recommendations, social hooks, headline alternatives." +``` + +## Phase 3: Collect and Prioritize Findings + +### Categorize Issues + +```markdown +## Review Summary + +### Critical (Must Fix) +Issues that significantly harm the piece: +- Factual errors +- Unsupported claims +- Major clarity problems +- Structural gaps + +### Important (Should Fix) +Issues that noticeably weaken the piece: +- Voice drift +- Passive voice +- Unnecessary jargon +- Flow problems + +### Polish (Nice to Fix) +Minor improvements: +- Word choice refinements +- Rhythm adjustments +- Style guide details +``` + +### Deduplicate +Multiple agents may flag the same issue. Combine duplicates and note agreement: +``` +"Passive voice in paragraph 3" - flagged by: clarity-editor, voice-guardian +``` + +## Phase 4: Interactive Triage + +Present each issue with options: + +```markdown +--- + +**[Critical]** Unsupported claim in paragraph 3 + +> "Studies show that 73% of developers prefer..." + +No source provided for this statistic. + +**Suggested fix**: Add citation or remove claim. + +What would you like to do? +1. Accept fix (add citation placeholder) +2. Skip (keep as is) +3. Custom (provide your fix) +4. Remove claim entirely + +--- + +**[Important]** Passive voice: 4 instances detected + +Lines: 12, 34, 56, 78 + +**Suggested fixes**: +- "The code was written" β†’ "The developer wrote the code" +- "It was decided" β†’ "We decided" +- [etc.] + +What would you like to do? +1. Accept all +2. Accept some (show each) +3. Skip all +4. Custom + +--- +``` + +### Track Decisions +```markdown +## Triage Log +- Issue 1: Accepted +- Issue 2: Skipped (reason: intentional stylistic choice) +- Issue 3: Custom fix applied +``` + +## Phase 5: Apply Fixes + +### Create New Version +After triage, apply all accepted fixes: +- Create `draft-v2.md` (or increment version) +- Preserve original +- Log all changes + +### Re-Run Critical Checks +After fixes applied: +- Fact-check any new claims added +- Voice-guardian quick check on changed sections +- Verify no new issues introduced + +## Output + +### Review Report +Save to `drafts/[slug]/review-v1.md`: + +```markdown +# Editorial Review: [Title] + +## Summary +- Issues found: X +- Critical: X +- Important: X +- Polish: X + +## Agent Reports + +### Voice Guardian +[Full report] + +### Clarity Editor +[Full report] + +### Fact Checker +[Full report] + +### Structure Architect +[Full report] + +## Triage Decisions +[Log of all decisions] + +## Next Steps +- [ ] Address remaining skipped issues +- [ ] Final proofread +- [ ] Prepare for publishing +``` + +### Updated Draft +If fixes were applied, save `draft-v2.md` with: +- Updated content +- Change log in metadata +- New voice score + +## Post-Review Options + +**Question**: "Review complete. [X] issues found, [Y] fixed. What next?" + +**Options**: +1. **View full report** - Show detailed review-v1.md +2. **Run another review pass** - Re-run with fresh eyes +3. **Prepare for publishing** - `/writing:compound` to capture patterns +4. **Make manual edits** - Open draft for hands-on refinement +5. **Publish** - Move to publishing workflow + +## Quality Gates + +Review is complete when: +- [ ] All critical issues addressed +- [ ] Voice score β‰₯ 85 +- [ ] All claims verified or flagged +- [ ] Flow analysis passed +- [ ] Style guide compliance checked diff --git a/plugins/compound-writing/docs/patterns/common-patterns.md b/plugins/compound-writing/docs/patterns/common-patterns.md new file mode 100644 index 00000000..20c3b2b0 --- /dev/null +++ b/plugins/compound-writing/docs/patterns/common-patterns.md @@ -0,0 +1,92 @@ +# Common Writing Patterns + +Index of frequently used patterns captured from successful writing. + +## How to Use This Library + +Patterns are extracted via `/writing:compound` from pieces that work well. They're organized by type: + +- **Hooks** (`hooks/`) - Opening patterns that grab attention +- **Structures** (`structures/`) - Article architectures that flow +- **Transitions** (`transitions/`) - Phrases that connect ideas smoothly +- **Voice** (`voice/`) - Voice elements and exemplars + +## Pattern Format + +Each pattern file follows this structure: + +```markdown +--- +title: "Pattern Name" +type: hook | structure | transition | voice +extracted_from: "source piece path" +created: YYYY-MM-DD +tags: [topic1, topic2] +--- + +## Pattern +[Description] + +## Example +> [Actual text from source] + +## When to Use +- Context 1 +- Context 2 + +## How to Apply +1. Step 1 +2. Step 2 + +## Variations +- Variation 1 +- Variation 2 +``` + +## Quick Reference + +### Hook Patterns + +| Pattern | When to Use | +|---------|-------------| +| Concrete Example | Technical topics, tutorials | +| Surprising Stat | Data-driven pieces | +| Tension | Problem-solution articles | +| Question | Exploratory essays | + +### Structure Patterns + +| Pattern | When to Use | +|---------|-------------| +| Problem-Solution | How-to, fixes | +| Journey | Transformations, case studies | +| Listicle | Reference content, tips | +| Story | Narrative pieces | + +### Transition Patterns + +| Type | Example | +|------|---------| +| Causal | "That's why..." | +| Contrast | "But here's the thing..." | +| Continuation | "And it gets better..." | +| Reversal | "Until it doesn't." | + +## Adding New Patterns + +When you run `/writing:compound` on a successful piece, it automatically: +1. Extracts effective patterns +2. Creates pattern files in the appropriate directory +3. Updates this index + +You can also manually add patterns by creating files following the format above. + +## Pattern Discovery Tips + +Look for patterns when: +- A piece gets unusually high engagement +- Editing significantly improves a section +- A structure works well for multiple topics +- A transition feels invisible + +Patterns compound: the more you capture, the faster you write. diff --git a/plugins/compound-writing/skills/dhh-writing/SKILL.md b/plugins/compound-writing/skills/dhh-writing/SKILL.md new file mode 100644 index 00000000..3db7059d --- /dev/null +++ b/plugins/compound-writing/skills/dhh-writing/SKILL.md @@ -0,0 +1,207 @@ +--- +name: dhh-writing +description: This skill should be used when writing in the distinctive style of David Heinemeier Hansson (DHH). It applies when creating blog posts, technical articles, business content, manifestos, or any prose requiring a clear, punchy, opinionated style. +--- + +# DHH Writing Skill + +Write in the distinctive style of David Heinemeier Hanssonβ€”direct, brave, opinionated prose that takes a stand and defends it unapologetically. + +## When to Use This Skill + +This skill applies when: +- Writing opinion pieces or manifestos +- Creating blog posts that need to take a strong position +- Crafting business or product philosophy content +- Writing in a "Basecamp/37signals voice" +- Creating content that challenges conventional wisdom +- Any writing that needs to be punchy and memorable + +## Core Philosophy + +> "Strong opinions, weakly held" is half-right. You need strong opinions, *strongly expressed*. The weakness comes from being willing to change when presented with better evidenceβ€”not from hedging your delivery. + +DHH's writing is characterized by: +- **Conviction**: Every piece has a clear position +- **Courage**: Willing to say unpopular things +- **Clarity**: No corporate-speak, no hedging +- **Concision**: Short sentences, short paragraphs + +## The 10 Core Techniques + +Reference [techniques.md](./references/techniques.md) for the complete guide. + +### 1. Take a Stand + +Every piece must have a thesis you can disagree with. + +``` +❌ "There are pros and cons to remote work that teams should consider." + +βœ… "Remote work is the future. Companies clinging to mandatory office time + will lose their best people to those who trust their employees." +``` + +### 2. No Hedging + +Remove qualifiers that weaken your position. + +**Words to eliminate**: +- "I think..." (just say it) +- "In my opinion..." (obviously) +- "It seems like..." (commit) +- "Some might say..." (who?) +- "Generally speaking..." (specifically speak) + +### 3. Short Sentences + +Punch. Impact. Clarity. + +Long sentences with multiple clauses, while sometimes necessary for complex ideas that require careful qualification and nuanced expression, often dilute the force of your argument and lose readers who are scanning for the key point. + +Short sentences work better. + +They're memorable. + +They're quotable. + +They're true. + +### 4. Contrarian Framing + +Start by identifying what "everyone knows." Then challenge it. + +``` +"Everyone knows you need to move fast and break things." + +Actually, you don't. Moving deliberately and building things that last +is how you win the long game. +``` + +### 5. Concrete Over Abstract + +Don't argue about philosophies. Argue about practices. + +``` +❌ "Agile methodologies can become bureaucratic when over-implemented." + +βœ… "If your 'agile' process requires 3 meetings before a developer can + start coding, you're doing waterfall with more steps." +``` + +### 6. The Rule of Three + +Three examples. Three reasons. Three beats. + +"We don't have meetings about meetings. We don't have process for process. We don't have documentation about documentation." + +### 7. Moral Clarity + +Frame business decisions as ethical choices, not just practical ones. + +"Requiring everyone in the office isn't a productivity strategy. It's a trust issue. You either trust your people to do their jobs or you don't." + +### 8. The Callback Attack + +Reference your opponent's best argumentβ€”then demolish it. + +"Yes, in-person collaboration has value. Yes, some conversations are better face-to-face. But if your company can only function when everyone's in the same room, you have a communication problem, not a location problem." + +### 9. End Strong + +The last line should be quotable. + +Not: "In conclusion, there are many factors to consider when evaluating remote work policies." + +Instead: "The future of work is here. Catch up or get left behind." + +### 10. Personal Stakes + +Show you have skin in the game. + +"We've run Basecamp remotely for 20 years. This isn't theoryβ€”it's practice. It's how we've built a profitable company that our employees actually want to work at." + +## Voice Characteristics + +### Vocabulary +- Plain words over fancy ones +- "Use" not "leverage" +- "Try" not "attempt" +- "Build" not "construct" +- "Think" not "ideate" + +### Sentence Patterns +- Average length: 12-15 words +- Many single-clause sentences +- Questions for setup, statements for answers +- Fragments for emphasis. Like this. + +### Tone +- Confident, not arrogant +- Direct, not rude +- Opinionated, not closed-minded +- Provocative, not offensive + +## Applying the Skill + +### For Blog Posts + +Structure: +1. **Hook**: Contrarian statement that demands engagement +2. **Context**: Why this matters now +3. **Position**: Your clear stance +4. **Evidence**: Concrete examples, ideally from experience +5. **Objection handling**: Address the best counter-argument +6. **Close**: Memorable final line + +### For Product Philosophy + +- Lead with "why" not "what" +- Frame features as values +- Make comparisons to alternatives explicit +- Don't apologize for charging money + +### For Business Writing + +- No passive voice +- No committee-speak +- Name the decision-maker +- State the decision clearly + +## Common Anti-Patterns + +See [anti-patterns.md](./references/anti-patterns.md) for detailed examples. + +### The Hedge +"This might not work for everyone, but in some cases, certain teams have found that..." + +### The Both-Sides +"There are valid points on both sides of this debate..." +(Pick a side. Defend it.) + +### The Disclaimer +"Of course, this is just my personal view and others may disagree..." +(They know. Say what you mean.) + +### The Corporate +"We're excited to announce a new initiative that will drive synergy across our value proposition..." +(What are you actually doing?) + +## Quality Checklist + +Before publishing, verify: +- [ ] Clear, debatable thesis in first paragraph +- [ ] No hedge words (seems, might, some, perhaps) +- [ ] Average sentence under 15 words +- [ ] At least one contrarian framing +- [ ] Concrete examples, not abstract principles +- [ ] Personal stakes or experience shown +- [ ] Quotable closing line +- [ ] Would DHH tweet this? (Seriously, ask yourself) + +## References + +- [techniques.md](./references/techniques.md) - Full technique guide +- [examples.md](./references/examples.md) - Before/after transformations +- [anti-patterns.md](./references/anti-patterns.md) - Patterns to avoid +- [resources.md](./references/resources.md) - Source material and further reading diff --git a/plugins/compound-writing/skills/dhh-writing/references/anti-patterns.md b/plugins/compound-writing/skills/dhh-writing/references/anti-patterns.md new file mode 100644 index 00000000..0c8ff3f7 --- /dev/null +++ b/plugins/compound-writing/skills/dhh-writing/references/anti-patterns.md @@ -0,0 +1,130 @@ +# DHH Writing Anti-Patterns + +Patterns to avoid when writing in the DHH style. + +## The Seven Deadly Sins + +### 1. The Hedge + +**The Sin**: Qualifying everything so you can't be wrong. + +**Example**: +> "In my experience, it seems like remote work might be beneficial for certain types of knowledge workers in some contexts, though individual results may vary." + +**The Fix**: Commit. Be wrong sometimes. It's better than being boring. + +> "Remote work is better. Full stop." + +**Hedge words to eliminate**: +- "It seems like..." +- "In my experience..." +- "For some people..." +- "It depends..." +- "Generally speaking..." +- "More or less..." + +### 2. The Both-Sides + +**The Sin**: Presenting every argument as having two equally valid perspectives. + +**Example**: +> "There are compelling arguments both for and against the traditional office environment. Some prefer the structure and social interaction, while others value the flexibility of remote work. Ultimately, each organization must find the approach that works best for their unique context." + +**The Fix**: Pick a side. The reader came for your opinion. + +> "Offices are obsolete. The companies that don't realize this will lose their best people to the ones that do." + +### 3. The Disclaimer + +**The Sin**: Pre-emptively apologizing for your position. + +**Example**: +> "This is just my personal opinion, and I understand others may see it differently. I'm not saying my way is the only way, and of course your mileage may vary. That said, I think..." + +**The Fix**: Everyone knows it's your opinion. It's your blog. Say what you mean. + +### 4. The Corporate + +**The Sin**: Using business-speak that means nothing. + +**Examples**: +- "Synergize our value proposition" +- "Leverage our core competencies" +- "Drive alignment across stakeholders" +- "Enable a best-in-class customer experience" +- "Optimize our go-to-market strategy" + +**The Fix**: Say what you're actually doing. + +| Corporate | Human | +|-----------|-------| +| "Synergize" | "Combine" or "Work together" | +| "Leverage" | "Use" | +| "Stakeholders" | "People involved" or name them | +| "Core competencies" | "What we're good at" | +| "Value proposition" | "Why you should buy this" | + +### 5. The Summary + +**The Sin**: Ending with a recap no one asked for. + +**Example**: +> "In conclusion, we have examined the various aspects of remote work, including its benefits such as flexibility and productivity, its challenges including communication and isolation, and strategies for successful implementation. As we have seen, there are many factors to consider when making this important decision." + +**The Fix**: Your last line should add something new. Make it quotable. + +> "The office is dead. Start acting like it." + +### 6. The Question Cop-Out + +**The Sin**: Ending with a question instead of a position. + +**Example**: +> "So what do you think? Is remote work right for your organization? Sound off in the comments!" + +**The Fix**: Answer your own questions. That's why readers came. + +> "Is remote work right for your organization? Yes. Next question." + +### 7. The Passive Epidemic + +**The Sin**: Hiding actors and decisions behind passive constructions. + +**Examples**: +- "It was decided that..." +- "Mistakes were made..." +- "The policy was implemented..." +- "It is believed that..." + +**The Fix**: Name the actor. Take responsibility. + +| Passive | Active | +|---------|--------| +| "It was decided that we would go remote" | "We decided to go remote" | +| "Mistakes were made" | "I made mistakes" | +| "The policy was implemented" | "We implemented the policy" | +| "It is believed that..." | "I believe..." or "Research shows..." | + +## Quick Reference: Warning Signs + +Your writing has slipped if you find: + +| Warning Sign | Probable Sin | +|--------------|--------------| +| First paragraph has no thesis | The Hedge or Both-Sides | +| "I could be wrong, but..." | The Disclaimer | +| Three or more buzzwords | The Corporate | +| "In conclusion..." | The Summary | +| "What do you think?" ending | The Question Cop-Out | +| "It was" or "There are" | The Passive Epidemic | +| Every sentence over 20 words | All of the above | + +## The DHH Test + +Before publishing, ask: + +1. **Would you bet money on this?** If not, strengthen your position. +2. **Could someone disagree?** If not, you haven't said anything. +3. **Is the last line tweetable?** If not, rewrite it. +4. **Did you use "synergy" unironically?** Delete it. +5. **Would DHH actually publish this?** Be honest with yourself. diff --git a/plugins/compound-writing/skills/dhh-writing/references/examples.md b/plugins/compound-writing/skills/dhh-writing/references/examples.md new file mode 100644 index 00000000..71bed75e --- /dev/null +++ b/plugins/compound-writing/skills/dhh-writing/references/examples.md @@ -0,0 +1,140 @@ +# DHH Writing Examples + +Before/after transformations showing the style in action. + +## Example 1: Remote Work + +### Before (Corporate) + +> At our organization, we have implemented a flexible work arrangement policy that enables team members to work from locations outside the traditional office environment when appropriate and aligned with business needs. We believe this approach supports employee well-being while maintaining operational effectiveness. + +### After (DHH Style) + +> **We work remotely. Period.** +> +> Not "hybrid." Not "flexible when business needs allow." Remotely. +> +> We've done it for 20 years. Through growth, through recessions, through a pandemic. Our team lives in 32 cities across 8 time zones. +> +> The secret? Trust your people. If you hired adults, treat them like adults. +> +> "But what about collaboration?" We collaborate fine. "But what about culture?" Our culture is stronger than most offices. "But what aboutβ€”" Stop. +> +> The excuses are endless. The results speak for themselves. + +## Example 2: Meetings + +### Before (Typical) + +> While meetings are an important tool for organizational alignment and cross-functional collaboration, we've found that optimizing meeting cadence and implementing meeting-free focus time can significantly improve individual contributor productivity. We recommend that teams evaluate their current meeting load and consider whether all recurring meetings continue to add value. + +### After (DHH Style) + +> **Most meetings are a waste of time.** +> +> Not some meetings. Most. +> +> "But we need to align!" Write it down. +> +> "But I need to get buy-in!" Ask via email. +> +> "But decisions are faster in person!" Are they? Or do you just feel busier? +> +> Here's our meeting policy: Don't have one unless you absolutely must. No recurring meetings by default. Every meeting needs an agenda and an end time. +> +> The best meetings are the ones that never happen. + +## Example 3: Hiring + +### Before (HR-Speak) + +> Our talent acquisition strategy focuses on identifying candidates who demonstrate strong cultural fit while possessing the technical competencies required for role success. We utilize a comprehensive evaluation process including behavioral interviews, technical assessments, and reference verification to ensure alignment with organizational values and capabilities. + +### After (DHH Style) + +> **Stop hiring for "culture fit."** +> +> You know what "culture fit" usually means? "I'd want to get beer with this person." That's not hiring. That's cloning. +> +> We hire for work. Can you do the job? Can you work with others? Can you communicate clearly in writing? That's it. +> +> Your hobbies don't matter. Your pedigree doesn't matter. Stanford? Community college? Self-taught? We don't care. Show us your work. +> +> The best teams aren't full of people who look alike, think alike, or hang out together. They're full of people who do great work. Hire for that. + +## Example 4: Pricing + +### Before (Startup-Speak) + +> We're excited to announce our new pricing tiers, designed to provide options for organizations of all sizes. Our freemium model allows teams to experience our platform's value before committing, while our enterprise tier delivers advanced functionality for larger deployments. + +### After (DHH Style) + +> **We don't do free. We don't do enterprise.** +> +> One price. For everyone. $99/month. Done. +> +> "But what about small teams?" $99. +> +> "But what about big companies?" $99. +> +> "But what aboutβ€”" $99. +> +> Why? Because software should work for everyone the same way. Big company features aren't special. They're usually just complexity. And free tiers mean someone else is payingβ€”usually with their data. +> +> We sell software. You pay money. We make it good. Simple. + +## Example 5: Process + +### Before (Agile Speak) + +> Our development methodology incorporates agile principles with adaptations tailored to our organizational context. We utilize two-week sprints, daily standups, and regular retrospectives to maintain alignment and continuous improvement. Story pointing and velocity tracking enable predictable delivery cadence. + +### After (DHH Style) + +> **We don't do sprints. We do work.** +> +> No story points. No velocity tracking. No burndown charts. +> +> "But how do you know if you're on track?" We look at the work. Is it getting better? Are customers happier? Are we shipping? +> +> All that agile ceremony? It's a comfort blanket. It makes managers feel like they're managing. But you can't sprint your way to quality. You can't retro your way to good decisions. +> +> Here's our process: Figure out what matters. Do it. Ship it. Repeat. +> +> Revolutionary, I know. + +## Example 6: Technology Choices + +### Before (Tech Blog) + +> When evaluating technology stack decisions, it's important to consider factors such as scalability, maintainability, talent availability, and alignment with organizational capabilities. While newer technologies may offer compelling features, mature solutions often provide better long-term stability and support ecosystems. + +### After (DHH Style) + +> **Choose boring technology.** +> +> That shiny new framework? Skip it. +> +> Rails shipped 20 years ago. Postgres has been around since Reagan. They work. They're boring. That's the point. +> +> Every new technology is a risk. You're betting that: +> 1. It'll still be maintained in 5 years +> 2. You can hire people who know it +> 3. The bugs have been found +> +> Boring technology has passed those tests. The new hotness hasn't. +> +> We still use Rails. We'll probably still use it in 2034. Innovation is overrated. Reliability isn't. + +## The Transformation Checklist + +When rewriting corporate content in DHH style: + +1. **Cut the first paragraph** - The point usually starts in paragraph 2 +2. **Remove all hedge words** - Find/replace for "might," "some," "generally" +3. **Shorten every sentence** - Target 15 words max +4. **Add a contrarian frame** - What does everyone assume? Challenge it +5. **End with a punch** - Quotable, memorable, shareable +6. **Make it personal** - What's your actual experience? +7. **Pick a side** - No "on the other hand" diff --git a/plugins/compound-writing/skills/dhh-writing/references/resources.md b/plugins/compound-writing/skills/dhh-writing/references/resources.md new file mode 100644 index 00000000..0aaaada0 --- /dev/null +++ b/plugins/compound-writing/skills/dhh-writing/references/resources.md @@ -0,0 +1,130 @@ +# DHH Writing Resources + +Source material and further reading for mastering the style. + +## Primary Sources + +### DHH's Blog (world.hey.com/dhh) + +Essential posts that define the style: + +**On Remote Work**: +- "Remote work is the future" (2020) +- "The presence prison" (2021) +- "Escape the hustle" (2022) + +**On Product Philosophy**: +- "On writing software well" (series) +- "The Majestic Monolith" (2016) +- "Reconsider" (2015) + +**On Business**: +- "It's always a good time to lower prices" (2023) +- "Why we don't negotiate salaries" (2019) + +### Books + +**REWORK** (2010) +Co-authored with Jason Fried. The manifesto for small business. +- Short chapters (2-3 pages each) +- Contrarian takes on common business advice +- Punchy, declarative style + +**Remote: Office Not Required** (2013) +The case for remote work before it was cool. + +**It Doesn't Have to Be Crazy at Work** (2018) +Against the hustle culture. + +**Shape Up** (free online) +Basecamp's development methodologyβ€”and a masterclass in clear technical writing. + +## Style Elements to Study + +### Sentence Structure + +DHH's typical patterns: + +**The Declaration**: +> "We don't have meetings." + +**The Three-Beat**: +> "Build less. Charge more. Sleep better." + +**The Reversal**: +> "Move fast and break things? How about move deliberately and build things that last?" + +**The Question-Answer**: +> "What's the best meeting? The one you don't have." + +### Paragraph Structure + +Most DHH paragraphs follow: +1. Bold claim (1 sentence) +2. Brief elaboration (1-2 sentences) +3. Concrete example or evidence (1-2 sentences) + +Total: 3-4 sentences max. Often 1-2. + +### Post Structure + +Typical DHH blog post: +1. **Hook**: Contrarian statement or strong opinion +2. **Context**: Why this matters now (brief) +3. **Thesis**: Clear statement of position +4. **Evidence**: Experience-based examples +5. **Objection handling**: Address counter-arguments +6. **Close**: Quotable conclusion + +Word count: Usually 300-800 words. Rarely over 1000. + +## Contrast Study + +Understanding DHH's style by contrasting with others: + +| Writer | Style | DHH Difference | +|--------|-------|----------------| +| Paul Graham | Exploratory, building arguments | DHH arrives at conclusions faster | +| Seth Godin | Metaphorical, inspirational | DHH is more concrete, less abstract | +| Hacker News | Technical, qualified | DHH is opinionated, unhedged | +| Corporate blogs | Safe, buzzword-heavy | DHH is risky, plain-spoken | + +## Practice Exercises + +### Exercise 1: The Conversion +Take a corporate announcement and rewrite it in DHH style. +- Cut word count by 60% +- Remove all hedge words +- Add a contrarian frame +- End with a strong line + +### Exercise 2: The Thesis Test +Write 10 thesis statements. For each one, ask: "Could someone disagree?" If everyone would agree, it's too weak. + +### Exercise 3: The Sentence Diet +Take a paragraph you've written. Target 12 words per sentence. Cut everything that doesn't need to be there. + +### Exercise 4: The Callback +Write a blog post that opens with a question and ends by answering it decisively. The last line should be quotable. + +## Quotes to Remember + +> "I'm not particularly prescient. I just have a low tolerance for bullshit." + +> "Startups don't die from running out of money. They die from running out of time." + +> "The best way to predict the future is to build it. But only if you actually ship." + +> "Meetings are toxic. They chop up the day into small bits." + +> "Simple is good. Good is simple. Don't mistake complication for sophistication." + +## Warning + +The DHH style is powerful but risky: +- It's easy to be contrarian without being insightful +- Strong opinions require strong evidence +- Punchy doesn't mean aggressive +- The goal is clarity, not controversy + +The best DHH-style writing is brave, not reckless. It takes positions because they're true, not because they're provocative. diff --git a/plugins/compound-writing/skills/dhh-writing/references/techniques.md b/plugins/compound-writing/skills/dhh-writing/references/techniques.md new file mode 100644 index 00000000..4aab8cd6 --- /dev/null +++ b/plugins/compound-writing/skills/dhh-writing/references/techniques.md @@ -0,0 +1,249 @@ +# DHH Writing Techniques + +Extended guide to the 10 core techniques with detailed examples. + +## 1. Take a Stand + +### The Principle + +Every piece needs a thesis statement that someone could reasonably disagree with. If everyone agrees, you haven't said anything. + +### Examples + +**Weak thesis**: +> "Code quality is important for long-term project success." + +Who disagrees? No one. This is filler. + +**Strong thesis**: +> "TDD is dead. Long live testing." + +**Weak thesis**: +> "Companies should consider the benefits of work-life balance." + +**Strong thesis**: +> "If your startup requires 80-hour weeks, you've failed at planning. Crunch is management failure, not dedication." + +### How to Find Your Thesis + +1. What do you believe that your peers would argue against? +2. What "best practice" have you seen fail? +3. What worked for you that the experts said wouldn't? +4. What pisses you off about your industry? + +## 2. No Hedging + +### Words to Eliminate + +| Hedge | Replacement | +|-------|-------------| +| "I think" | [just state it] | +| "In my opinion" | [obviously your opinion] | +| "It seems like" | "It is" or "I've seen" | +| "Some might say" | "Critics say" or cut it | +| "Generally speaking" | "Usually" or be specific | +| "Basically" | [delete] | +| "Kind of" | [delete or be specific] | +| "Sort of" | [delete or be specific] | +| "Perhaps" | "Maybe" or commit | +| "Might" | "Will" or "Could" | + +### Before/After + +**Before**: +> "I think that, in my experience, remote work seems to generally improve productivity for some knowledge workers, at least in certain contexts." + +**After**: +> "Remote work improves productivity. We've seen it at Basecamp for two decades." + +## 3. Short Sentences + +### The 15-Word Rule + +Target average sentence length of 12-15 words. Vary for rhythm. + +### Techniques + +**Break up compound sentences**: + +Before: +> "We believe that great software should be beautiful and functional, and that the best products come from small teams who care deeply about what they're building." + +After: +> "Great software should be beautiful. It should be functional. The best products come from small teams. Teams who care about their work." + +**Use fragments for emphasis**: + +> "Remote work isn't the future. It's the present. Wake up." + +**One idea per sentence**: + +Before: +> "While there are certainly benefits to the traditional office environment, including spontaneous collaboration and the building of company culture, we've found that these can be replicated and even improved upon in a remote setting." + +After: +> "Offices have benefits. Spontaneous collaboration. Culture building. But all of these work remotely too. Sometimes better." + +## 4. Contrarian Framing + +### The Pattern + +1. State what "everyone knows" +2. Signal your disagreement +3. State your actual position +4. Support it + +### Examples + +**Tech Industry Contrarian**: +> "Move fast and break things." That was Facebook's motto. +> +> It's wrong. +> +> Move deliberately. Build things that last. Speed without durability is just churn. + +**Business Contrarian**: +> "The customer is always right." +> +> No, they're not. +> +> Some customers are wrong for your business. Some requests would make your product worse. Know when to say no. + +**Management Contrarian**: +> "Hire slow, fire fast." +> +> We don't. +> +> Fire slow. Give people a real chance. If you hired them, you owe them genuine effort before giving up. + +## 5. Concrete Over Abstract + +### The Test + +Can someone take action based on what you wrote? If not, it's too abstract. + +### Before/After + +**Abstract**: +> "We believe in empowering our team members to achieve work-life integration through flexible policies." + +**Concrete**: +> "Everyone gets Fridays off in summer. No questions. No make-up work. Just a three-day weekend." + +**Abstract**: +> "Our compensation philosophy centers on providing competitive market-rate salaries." + +**Concrete**: +> "We pay San Francisco rates to everyone, regardless of where they live. A senior developer makes $180k whether they're in SF or Tulsa." + +## 6. The Rule of Three + +### Why Three? + +- One is a statement +- Two is a comparison +- Three is a pattern + +### Examples + +> "We don't do unlimited vacation. We don't do open offices. We don't do always-on Slack." + +> "Build less. Charge more. Sleep well." + +> "Good software takes time. It takes focus. It takes saying no." + +### Pattern Variations + +**Three beats, escalating**: +> "First, they ignore you. Then, they laugh at you. Then, you win." + +**Three beats, parallel**: +> "We write to think. We write to teach. We write to learn." + +**Three beats, reversal**: +> "More isn't better. Better is better. Often, less is better." + +## 7. Moral Clarity + +### Reframe Business as Ethics + +Business decisions are often presented as purely practical. DHH reframes them as ethical choices. + +**Practical framing**: +> "We found that remote work improved our productivity metrics." + +**Ethical framing**: +> "Requiring people to commute two hours a day so managers can see butts in seats isn't a productivity strategy. It's a values statement. You're saying your need for control matters more than their time." + +### Examples + +**On Pricing**: +> "Race to the bottom pricing isn't just bad business. It's disrespectful to your employees. If you can't charge enough to pay well, you're subsidizing your customers with your team's labor." + +**On Hiring**: +> "Hiring only from 'top schools' isn't just ineffective. It's lazy credentialism that perpetuates inequality while pretending to be merit-based." + +## 8. The Callback Attack + +### The Pattern + +1. Acknowledge the strongest counter-argument +2. Show you understand it +3. Explain why it's still wrong + +### Examples + +**Remote Work**: +> "Yes, some conversations are better in person. Yes, whiteboarding has value. Yes, lunch together builds bonds. +> +> But if your company *requires* these things to function, you have a communication problem. You've built a culture that only works under ideal conditions. Real work happens in the gaps." + +**Agile Criticism**: +> "Yes, agile was better than waterfall. Yes, iterating is better than big design up front. Yes, talking to customers matters. +> +> But somewhere we lost the plot. Two-week sprints became mandatory. Velocity became a metric. Retros became rituals. The manifesto that rejected process became... process." + +## 9. End Strong + +### The Test + +Could your last line be a tweet? Could it be a book title? Could someone quote it? + +### Techniques + +**The Declaration**: +> "Remote is not the future of work. It's the present. Everyone else is just catching up." + +**The Challenge**: +> "Stop asking for permission. Start building what matters." + +**The Reversal**: +> "The best meetings are the ones you don't have." + +**The Warning**: +> "The companies that don't adapt won't disappear. They'll just slowly become irrelevant." + +### Anti-Patterns + +Don't end with: +- Summaries ("In conclusion...") +- Hedges ("But of course, this is just one perspective...") +- Questions without answers ("What do you think?") +- Calls to comment ("Let me know in the comments!") + +## 10. Personal Stakes + +### Show Skin in the Game + +Readers trust advice more when you've taken the risk. + +### Examples + +**Experience-based**: +> "This isn't theory. We've run Basecamp remotely for 20 years, through two recessions and a pandemic. It works." + +**Admission-based**: +> "I know this because I used to be wrong. We used to have an office. We used to think face time mattered. We were idiots." + +**Risk-based**: +> "We turned down $100 million in funding to keep the company ours. Was it the right call? Ask me in another decade." diff --git a/plugins/compound-engineering/skills/every-style-editor/SKILL.md b/plugins/compound-writing/skills/every-style-editor/SKILL.md similarity index 100% rename from plugins/compound-engineering/skills/every-style-editor/SKILL.md rename to plugins/compound-writing/skills/every-style-editor/SKILL.md diff --git a/plugins/compound-engineering/skills/every-style-editor/references/EVERY_WRITE_STYLE.md b/plugins/compound-writing/skills/every-style-editor/references/EVERY_WRITE_STYLE.md similarity index 100% rename from plugins/compound-engineering/skills/every-style-editor/references/EVERY_WRITE_STYLE.md rename to plugins/compound-writing/skills/every-style-editor/references/EVERY_WRITE_STYLE.md diff --git a/plugins/compound-writing/skills/pragmatic-writing/SKILL.md b/plugins/compound-writing/skills/pragmatic-writing/SKILL.md new file mode 100644 index 00000000..be4b09f6 --- /dev/null +++ b/plugins/compound-writing/skills/pragmatic-writing/SKILL.md @@ -0,0 +1,189 @@ +--- +name: pragmatic-writing +description: This skill should be used when writing technical content in the style of Hunt/Thomas (The Pragmatic Programmer) and Joel Spolsky (Joel on Software). It applies when creating technical essays, documentation, tutorials, or explanatory content that needs to be clear, engaging, and actionable. +--- + +# Pragmatic Writing Skill + +Writing style modeled on the masters of technical communication: Andy Hunt, Dave Thomas (The Pragmatic Programmer), and Joel Spolsky (Joel on Software). This skill transforms technical content into engaging, memorable prose. + +## When to Use This Skill + +This skill applies when: +- Creating technical blog posts, essays, or articles +- Writing documentation that needs personality +- Explaining complex concepts to developers +- Crafting tutorials or how-to guides +- Writing "lessons learned" or postmortem content +- Any technical writing that should be read, not just referenced + +## Core Philosophy + +> "The difference between 'almost right' and 'right' is the difference between the lightning bug and the lightning." β€” Mark Twain (quoted by Pragmatic Programmers) + +Technical writing doesn't have to be dry. The best technical writers make complex ideas feel obvious, use concrete examples before abstract theory, and treat the reader as a smart colleague. + +## The 10 Core Techniques + +Reference the complete technique guide at [techniques.md](./references/techniques.md). + +### 1. Concrete Before Abstract + +**Always** start with a concrete example, then extract the principle. + +``` +❌ "Dependency injection is a design pattern where dependencies are passed + to objects rather than created by them." + +βœ… "Imagine your class needs a database connection. You could create it + yourself: + + def initialize + @db = Database.new("localhost:5432") + end + + But now your class is stuck with that exact database. What if you + want to test with a fake one? What if production uses a different host? + + Instead, accept it as a parameter: + + def initialize(db) + @db = db + end + + That's dependency injection. Simple." +``` + +### 2. Physical Analogies + +Map abstract concepts to physical experiences readers already understand. + +See [examples.md](./references/examples.md) for analogy patterns: +- Software abstractions β†’ Physical tools +- Code patterns β†’ Architectural patterns +- System design β†’ Everyday systems (postal service, restaurants) + +### 3. Conversational Register + +Write like you're explaining to a smart colleague at a whiteboard. + +**Markers of conversational register:** +- Contractions (don't, won't, can't) +- Direct address (you, your) +- Questions (But what if...? Why does this matter?) +- Asides (By the way, Incidentally) +- Admissions (To be honest, I'm not sure, It depends) + +### 4. Humor as Architecture + +Use humor strategically, not decoratively: +- Memorable hooks ("Good code is its own best documentation") +- Tension release after complex explanations +- Self-deprecation to build rapport +- Absurdist examples to highlight bad patterns + +### 5. The "Aha!" Structure + +Build to moments of realization: +1. Present a familiar problem +2. Show the common (flawed) approach +3. Reveal why it fails +4. Present the insight +5. Show the better way +6. Connect back to the principle + +### 6. Short Paragraphs, Varied Length + +- No paragraph over 4 sentences +- Alternate between longer explanations and punchy one-liners +- Use single-sentence paragraphs for emphasis + +Like this. + +### 7. Code as Evidence + +Code examples should: +- Be runnable (no pseudo-code unless necessary) +- Be minimal (show only what matters) +- Progress from broken to fixed +- Include comments only for non-obvious things + +### 8. The Principle Box + +After a concrete exploration, box the principle: + +> **Tip 23: Always Design for Concurrency** +> Allow for concurrency, and you will design cleaner interfaces with fewer assumptions. + +### 9. Friendly Warnings + +When discussing pitfalls: +- Acknowledge you've made the mistake too +- Explain why it's tempting +- Show the consequences +- Provide the escape hatch + +See [anti-patterns.md](./references/anti-patterns.md) for common technical writing mistakes. + +### 10. The Callback + +End by connecting back to the opening example or question. Close the loop. + +## Voice Characteristics + +### Sentence Patterns +- Average length: 15-20 words +- Mix of simple, compound, complex +- Questions every 3-4 paragraphs +- Direct statements for key points + +### Vocabulary +**Use**: specific, concrete, everyday words +**Avoid**: jargon without explanation, buzzwords, corporate-speak + +### Tone +- Confident but not arrogant +- Curious and exploratory +- Practical and results-focused +- Occasionally irreverent + +## Applying the Skill + +### For Blog Posts +1. Open with a problem or scenario +2. Explore the messy middle +3. Reveal the insight +4. Show the solution +5. Extract the principle +6. Callback to opening + +### For Documentation +1. Start with what the reader wants to do +2. Show the simplest working example +3. Expand with options and edge cases +4. Explain the "why" after the "how" + +### For Tutorials +1. State the goal clearly +2. Show the end result first +3. Build up in small, testable steps +4. Explain mistakes, not just successes + +## Quality Checklist + +Before publishing, verify: +- [ ] Opens with concrete example or scenario +- [ ] Physical analogy for key concepts +- [ ] Conversational tone throughout +- [ ] At least one moment of humor or levity +- [ ] Principles boxed or highlighted +- [ ] Code examples are minimal and runnable +- [ ] Paragraphs under 4 sentences +- [ ] Callbacks to opening + +## References + +- [techniques.md](./references/techniques.md) - Full technique guide with examples +- [examples.md](./references/examples.md) - Before/after transformations +- [anti-patterns.md](./references/anti-patterns.md) - Seven deadly sins of technical writing +- [sources.md](./references/sources.md) - Original source material diff --git a/plugins/compound-writing/skills/pragmatic-writing/references/anti-patterns.md b/plugins/compound-writing/skills/pragmatic-writing/references/anti-patterns.md new file mode 100644 index 00000000..80790dc9 --- /dev/null +++ b/plugins/compound-writing/skills/pragmatic-writing/references/anti-patterns.md @@ -0,0 +1,169 @@ +# Seven Deadly Sins of Technical Writing + +Anti-patterns to avoid, with examples and fixes. + +## 1. The Abstract Opening + +Starting with definitions instead of examples. + +### The Sin + +> "Dependency injection is a design pattern in software engineering whereby one object supplies the dependencies of another object." + +The reader's eyes glaze over before they understand why they should care. + +### The Fix + +Start with a problem they recognize: + +> "Your tests are slow because every test spins up a real database connection. Let's fix that." + +Then show the solution. *Then* name the pattern. + +## 2. The Wall of Text + +Paragraphs that go on and on, packing multiple ideas into dense blocks of text that require re-reading to understand, without any visual breaks to help the reader parse the information or take a breath between concepts. + +### The Sin + +The paragraph above. Did you read it? Or did you skim? + +### The Fix + +One idea per paragraph. + +Short paragraphs are easier to scan. + +They create rhythm. + +And they emphasize key points. + +Like this one. + +## 3. The Passive Epidemic + +### The Sin + +> "The configuration file is read by the application when it is started. The values are validated and errors are logged if issues are found. The settings are then cached for performance." + +Who's doing what? It's unclear. It's boring. It sounds like a legal document. + +### The Fix + +> "When your app starts, it reads the configuration file. It validates each value and logs any errors. Then it caches the settings so future reads are instant." + +Active voice. Clear actors. Engaging rhythm. + +## 4. The Jargon Dump + +### The Sin + +> "Leverage the microservice architecture's eventual consistency model to optimize throughput while maintaining idempotency across distributed transactions." + +This might be technically accurate. It's also unreadable. + +### The Fix + +Either: +1. Define terms on first use +2. Use simpler words +3. Show an example first + +> "When you split your app into services, they can't share a database. So Service A might update before Service B knows about it. Here's how to handle that gap..." + +## 5. The Code Novel + +### The Sin + +```ruby +# This is a comprehensive example demonstrating the full implementation +# of a user authentication service including all edge cases, error +# handling, logging, caching, and rate limiting functionality. + +class AuthenticationService + RATE_LIMIT = 100 + CACHE_TTL = 3600 + + def initialize(user_repository, token_service, cache, logger, rate_limiter) + @user_repository = user_repository + @token_service = token_service + @cache = cache + @logger = logger + @rate_limiter = rate_limiter + end + + # ... 100 more lines ... +end +``` + +By line 20, the reader has forgotten what point you were making. + +### The Fix + +Show only what's necessary for the current point: + +```ruby +class AuthenticationService + def initialize(user_repository) + @users = user_repository # Injected, not created + end +end +``` + +Then say: "We'll add caching and rate limiting in the next section." + +## 6. The Disclaimer Flood + +### The Sin + +> "While there are many approaches to this problem, and your mileage may vary depending on your specific circumstances, and this isn't intended as professional advice, and you should consult your team lead before implementing, one possible approach that might work in some cases is..." + +By the time you get to the point, the reader has left. + +### The Fix + +State your recommendation clearly: + +> "Use connection pooling. Here's why and how." + +Add caveats at the end if needed, not before. + +## 7. The Missing Why + +### The Sin + +> "Step 1: Add `gem 'sidekiq'` to your Gemfile +> Step 2: Run `bundle install` +> Step 3: Create a worker class +> Step 4: Configure Redis +> Step 5: Start the Sidekiq process" + +The reader follows the steps but doesn't understand what they're building or why each step matters. + +### The Fix + +Start with the problem: + +> "Your app freezes for 10 seconds when sending emails. Users hate it. You hate it. +> +> The fix: send emails in the background. When a user signs up, you add "send welcome email" to a queue and immediately return. A separate process handles the queue. +> +> Let's set that up..." + +Now the steps have context. + +--- + +## Quick Reference: Warning Signs + +Your writing might be slipping if you see: + +| Warning Sign | Probable Sin | +|--------------|--------------| +| "is defined as" in the first paragraph | Abstract Opening | +| Paragraphs over 5 lines | Wall of Text | +| "is/was/are/were" more than 30% of verbs | Passive Epidemic | +| More than 3 technical terms without explanation | Jargon Dump | +| Code examples over 30 lines | Code Novel | +| First sentence contains "while", "although", "however" | Disclaimer Flood | +| Tutorial without "why" explanation | Missing Why | diff --git a/plugins/compound-writing/skills/pragmatic-writing/references/examples.md b/plugins/compound-writing/skills/pragmatic-writing/references/examples.md new file mode 100644 index 00000000..661ef3cb --- /dev/null +++ b/plugins/compound-writing/skills/pragmatic-writing/references/examples.md @@ -0,0 +1,227 @@ +# Pragmatic Writing Examples + +Before/after transformations showing the techniques in action. + +## Example 1: API Documentation + +### Before (Dry, Abstract) + +> The Authentication module provides mechanisms for verifying user credentials and managing session state. It implements the OAuth 2.0 specification and supports multiple grant types including authorization_code, client_credentials, and refresh_token flows. + +### After (Pragmatic) + +> **Getting Users Logged In** +> +> Your app needs to know who's making requests. Here's the simplest path: +> +> ```ruby +> # In your controller +> token = request.headers['Authorization'] +> user = Auth.verify(token) +> ``` +> +> That's it for reading. The token comes from your login flow, which we'll set up next. +> +> (We support OAuth 2.0 with authorization_code, client_credentials, and refresh_token flows. But let's start with the basics.) + +## Example 2: Design Pattern Explanation + +### Before (Textbook) + +> The Strategy pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. This pattern is useful when you have multiple algorithms for a specific task and want to switch between them at runtime. + +### After (Pragmatic) + +> **Swapping Algorithms at Runtime** +> +> Say you're building a pricing calculator. Some customers get standard pricing. VIPs get 20% off. Enterprise clients have custom negotiated rates. +> +> The naive approach: +> +> ```ruby +> def calculate_price(customer, items) +> case customer.type +> when :standard +> items.sum(&:price) +> when :vip +> items.sum(&:price) * 0.8 +> when :enterprise +> # 50 lines of custom logic +> end +> end +> ``` +> +> Every new customer type means editing this method. Testing is a nightmare. And that enterprise logic? Nobody wants to touch it. +> +> Instead, make each pricing approach its own object: +> +> ```ruby +> class StandardPricing +> def calculate(items) +> items.sum(&:price) +> end +> end +> +> class VipPricing +> def calculate(items) +> items.sum(&:price) * 0.8 +> end +> end +> +> # Usage +> pricing = customer.pricing_strategy +> total = pricing.calculate(items) +> ``` +> +> Now adding a new customer type is adding a new class. No touching existing code. Each strategy can be tested in isolation. +> +> That's the Strategy pattern: algorithms as interchangeable objects. + +## Example 3: Error Handling Guide + +### Before (Formal) + +> Error handling should be implemented consistently throughout the application. All exceptions should be caught at appropriate boundaries and either handled or re-thrown with additional context. Logging should capture sufficient information for debugging while avoiding sensitive data exposure. + +### After (Pragmatic) + +> **When Things Go Wrong** +> +> Errors happen. The question isn't if, but what you do when they do. +> +> The worst thing: +> +> ```ruby +> begin +> do_risky_thing +> rescue +> # Silent failure. Good luck debugging this at 3 AM. +> end +> ``` +> +> The second worst thing: +> +> ```ruby +> begin +> do_risky_thing +> rescue => e +> puts e.message # Hope someone's watching stdout! +> raise # Now we have two problems +> end +> ``` +> +> Here's what actually helps: +> +> ```ruby +> begin +> do_risky_thing(user_id: user.id) +> rescue NetworkError => e +> # Expected failure, handle gracefully +> ErrorTracker.capture(e, user_id: user.id) +> return fallback_response +> rescue => e +> # Unexpected failure, add context and escalate +> raise ContextualError.new( +> "Failed processing user #{user.id}", +> cause: e +> ) +> end +> ``` +> +> Notice: +> 1. We catch *specific* errors we know how to handle +> 2. We add context (the user_id) for debugging +> 3. Unexpected errors get wrapped with context, not swallowed +> +> > **Tip**: Every `rescue` without a specific exception type is a code smell. What exactly are you expecting to fail? + +## Example 4: Performance Optimization + +### Before (Generic) + +> Performance optimization should focus on identifying bottlenecks through profiling before implementing changes. Premature optimization can lead to unnecessary complexity. Database queries are often the primary source of performance issues in web applications. + +### After (Pragmatic) + +> **Your App Is Slow. Now What?** +> +> First rule: **measure, don't guess**. +> +> I once spent a week optimizing a sorting algorithm only to discover the actual bottleneck was a DNS lookup. Don't be me. +> +> Here's the debugging order: +> +> ``` +> 1. Is it the database? +> β†’ Check slow query log. 90% of the time, it's here. +> +> 2. Is it N+1 queries? +> β†’ user.posts.each { |p| p.author.name } +> β†’ That's 1 query for posts + N queries for authors +> +> 3. Is it memory? +> β†’ Loading 10,000 records into memory to count them? +> β†’ Use User.count, not User.all.size +> +> 4. Is it external services? +> β†’ API calls inside loops are death +> β†’ Batch them or cache them +> ``` +> +> Once you've measured and found the bottleneck: +> +> ```ruby +> # Before: 47 queries, 2.3 seconds +> posts = user.posts +> posts.each { |p| render p.author.name } +> +> # After: 2 queries, 0.1 seconds +> posts = user.posts.includes(:author) +> posts.each { |p| render p.author.name } +> ``` +> +> That's it. One word: `includes`. 23x faster. +> +> > **The real tip**: The fastest code is the code that doesn't run. Can you cache it? Can you skip it? Can you do it later? + +## Example 5: Testing Philosophy + +### Before (Textbook) + +> Unit tests should verify the behavior of individual components in isolation. Tests should be deterministic, fast, and independent of external state. Mock objects can be used to isolate the system under test from its dependencies. + +### After (Pragmatic) + +> **Tests That Actually Help** +> +> Bad tests are worse than no tests. They slow you down, break randomly, and give false confidence. +> +> Here's a bad test: +> +> ```ruby +> test "user is valid" do +> user = User.new(name: "Bob", email: "bob@test.com") +> assert user.valid? +> end +> ``` +> +> What does this actually test? That `User.new` works? That `valid?` returns a boolean? When this test fails, what do you learn? +> +> Here's a useful test: +> +> ```ruby +> test "user requires email to be unique" do +> User.create!(email: "taken@test.com") +> duplicate = User.new(email: "taken@test.com") +> +> assert_not duplicate.valid? +> assert_includes duplicate.errors[:email], "has already been taken" +> end +> ``` +> +> This test: +> - Documents a business rule (unique emails) +> - Fails with a meaningful message if the rule breaks +> - Won't pass accidentally +> +> > **The test you need**: Write the test that would have caught last week's bug. That's usually the test worth writing. diff --git a/plugins/compound-writing/skills/pragmatic-writing/references/sources.md b/plugins/compound-writing/skills/pragmatic-writing/references/sources.md new file mode 100644 index 00000000..c5161a10 --- /dev/null +++ b/plugins/compound-writing/skills/pragmatic-writing/references/sources.md @@ -0,0 +1,102 @@ +# Source Material + +Original inspiration and recommended reading. + +## Primary Sources + +### The Pragmatic Programmer +**Authors**: Andy Hunt, Dave Thomas +**Key Contributions**: +- "Tip" format for distilling principles +- DRY (Don't Repeat Yourself) articulation +- Rubber duck debugging +- Tracer bullets concept +- "Good enough" software philosophy + +**Style Elements Borrowed**: +- Numbered tips +- Anecdotal openings +- Physical analogies (broken windows, tracer bullets) +- Pragmatic over dogmatic approach + +### Joel on Software +**Author**: Joel Spolsky +**Key Contributions**: +- The Joel Test +- "Things You Should Never Do" (on rewrites) +- Leaky abstractions +- Human task switching costs + +**Style Elements Borrowed**: +- Conversational, blog-friendly tone +- Personal anecdotes +- Humor as architecture +- Building arguments through narrative +- Willingness to take strong positions + +## Secondary Influences + +### Effective Java +**Author**: Joshua Bloch +**Style Elements**: +- "Item" format for discrete lessons +- Clear do/don't guidance +- Code examples that evolve + +### Clean Code +**Author**: Robert C. Martin +**Style Elements**: +- Before/after code transformations +- Named principles (SRP, DRY) +- Refactoring narratives + +### A Philosophy of Software Design +**Author**: John Ousterhout +**Style Elements**: +- Counterintuitive insights +- "Red flag" warnings +- Complexity as central theme + +## Recommended Reading Order + +For developing pragmatic writing skills: + +1. **Start here**: Joel on Software archives (free online) + - Accessible, entertaining, teaches by example + - Read: "The Absolute Minimum Every Software Developer Must Know About Unicode" + +2. **Then**: The Pragmatic Programmer (20th Anniversary Edition) + - The template for technical writing + - Notice the structure of each tip + +3. **Then**: Any technical blog you admire + - Study what makes it work + - Identify techniques they use + +## Notable Blog Posts to Study + +### For Structure +- "Choosing Boring Technology" by Dan McKinley +- "The Log: What every software engineer should know" by Jay Kreps + +### For Narrative +- "The Night Watch" by James Mickens +- "Wat" by Gary Bernhardt (talk, but same principles) + +### For Accessibility +- "The Absolute Minimum Every Software Developer Must Know About Unicode" by Joel Spolsky +- "What Every Programmer Should Know About Memory" by Ulrich Drepper + +## Key Quotes to Remember + +> "Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away." +> β€” Antoine de Saint-ExupΓ©ry + +> "The best writing is rewriting." +> β€” E.B. White + +> "Programs must be written for people to read, and only incidentally for machines to execute." +> β€” Harold Abelson + +> "If you can't explain it simply, you don't understand it well enough." +> β€” (Attributed to Einstein, probably apocryphal, still true) diff --git a/plugins/compound-writing/skills/pragmatic-writing/references/techniques.md b/plugins/compound-writing/skills/pragmatic-writing/references/techniques.md new file mode 100644 index 00000000..b60c3028 --- /dev/null +++ b/plugins/compound-writing/skills/pragmatic-writing/references/techniques.md @@ -0,0 +1,244 @@ +# Pragmatic Writing Techniques + +Detailed guide to the 10 core techniques with extended examples. + +## 1. Concrete Before Abstract + +The most important technique. Never explain a concept before showing it. + +### The Pattern + +``` +1. Show the problem scenario +2. Show the naive/common approach +3. Show it failing +4. Reveal the better approach +5. NOW explain the principle +``` + +### Extended Example + +**Bad (abstract first):** +> The Observer pattern is a software design pattern in which an object, named the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes. + +**Good (concrete first):** +> You've got a spreadsheet. Cell A1 contains "10". Cell B1 contains "=A1 * 2". Change A1 to "20", and B1 instantly shows "40". +> +> That's the Observer pattern. B1 is *observing* A1. When A1 changes, B1 gets notified and updates itself. +> +> In code, you might have an Order that needs to notify Inventory, Shipping, and EmailService when it's placed. Instead of the Order calling all three directly... + +## 2. Physical Analogies Catalog + +### Software Abstraction β†’ Physical Tool + +- **Interface** β†’ Power outlet (anything with the right plug works) +- **Caching** β†’ Keeping frequently used tools on your workbench +- **Load balancing** β†’ Multiple checkout lanes at a grocery store +- **Queue** β†’ Line at the DMV +- **Stack** β†’ Stack of plates (last one on is first one off) + +### Design Pattern β†’ Architectural Pattern + +- **Factory** β†’ Bakery (you order "bread", they handle the recipe) +- **Singleton** β†’ The President (only one at a time) +- **Decorator** β†’ Gift wrapping (adds features without changing the gift) +- **Adapter** β†’ Travel power adapter (makes incompatible things work) + +### System Design β†’ Everyday System + +- **Microservices** β†’ Restaurant kitchen (grill station, salad station, dessert station) +- **Monolith** β†’ Home kitchen (one person does everything) +- **Event sourcing** β†’ Bank statement (every transaction recorded, balance calculated) +- **API Gateway** β†’ Hotel concierge (single point of contact, routes requests) + +## 3. Conversational Register Markers + +### Use These + +- "Let's say..." (introduces scenarios) +- "Here's the thing..." (pivots to key insight) +- "Now, you might be thinking..." (addresses objections) +- "I've seen this go wrong when..." (shares experience) +- "The trick is..." (reveals technique) + +### Avoid These + +- "It should be noted that..." +- "One must consider..." +- "The implementation thereof..." +- "As previously mentioned..." +- "In conclusion..." + +## 4. Humor Patterns + +### The Absurdist Example + +Show a bad pattern taken to its extreme: + +> If we followed this logic, we'd have a `StringUtils` class with methods like `addOneToNumber(String s)` that parses the string to an int, adds one, and converts back to a string. +> +> Don't laugh. I've seen it in production code. + +### The Self-Deprecating Admission + +> I spent three hours debugging a race condition before noticing I'd typed `=` instead of `==`. We've all been there. That's why we have linters. + +### The Unexpected Comparison + +> Debugging is like being the detective in a crime movie where you are also the murderer. + +## 5. The "Aha!" Structure Template + +```markdown +## [Problem Statement as Question] + +You've probably encountered [familiar situation]. + +The obvious approach is [common solution]: + +```code +[naive implementation] +``` + +This works... until [edge case or scale issue]. + +[Show the failure scenario] + +The insight is: [key realization] + +Instead, we can: + +```code +[better implementation] +``` + +Notice how [specific improvement]. This is the principle of [named concept]: + +> **[Principle Box]**: [One-sentence version of the insight] +``` + +## 6. Paragraph Length Guide + +### One-sentence paragraphs for: +- Key insights +- Dramatic revelations +- Punchy conclusions +- Transitions + +### Two-sentence paragraphs for: +- Quick examples +- Brief asides +- Setup before code + +### Three-four sentence paragraphs for: +- Explanations +- Scenarios +- Analysis + +### Never more than four sentences. + +## 7. Code Example Guidelines + +### Minimal +Remove everything not essential to the point. + +```ruby +# ❌ Too much +class UserService + def initialize(repository, logger, cache, config) + @repository = repository + @logger = logger + @cache = cache + @config = config + end + + def find_user(id) + @logger.info("Finding user #{id}") + cached = @cache.get("user:#{id}") + return cached if cached + user = @repository.find(id) + @cache.set("user:#{id}", user, ttl: @config.cache_ttl) + user + end +end + +# βœ… Just enough +class UserService + def initialize(repository) + @repository = repository # Injected, not created + end + + def find_user(id) + @repository.find(id) + end +end +``` + +### Progressive +Show evolution from broken to fixed. + +```ruby +# First attempt (broken) +def process(items) + items.each { |i| save(i) } # What if one fails? +end + +# Second attempt (better) +def process(items) + items.each do |i| + save(i) + rescue => e + log_error(e) # But we continue with bad data... + end +end + +# Final (robust) +def process(items) + results = items.map { |i| [i, safely_save(i)] } + failures = results.select { |_, success| !success } + raise BatchError, failures if failures.any? +end +``` + +## 8. Principle Box Formats + +### Numbered Tip +> **Tip 23: Don't Repeat Yourself** +> Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. + +### Highlighted Insight +> πŸ’‘ **The key insight**: Complexity isn't the enemy. *Unnecessary* complexity is. + +### Warning Box +> ⚠️ **Watch out**: If you find yourself adding a boolean parameter, you probably need two methods. + +## 9. Friendly Warning Pattern + +```markdown +It's tempting to [common mistake] because [why it seems reasonable]. + +I've done this. [Brief admission of your own mistake] + +The problem emerges when [specific failure scenario]: + +[Show what goes wrong] + +Instead, [better approach]: + +[Show the fix] +``` + +## 10. Callback Examples + +### Open with question, close with answer + +**Opening**: "Why do we bother with tests if we're just going to rewrite everything?" + +**Closing**: "So why bother with tests? Because they're not protecting the code. They're protecting the behavior. The code can change; the contract shouldn't." + +### Open with scenario, close with transformation + +**Opening**: "It's 3 AM. Your pager goes off. The database is on fire." + +**Closing**: "Now when your pager goes off at 3 AMβ€”and it willβ€”you'll have the logs, the metrics, and the runbooks to handle it. You might even get back to sleep." diff --git a/plugins/compound-writing/skills/voice-capture/SKILL.md b/plugins/compound-writing/skills/voice-capture/SKILL.md new file mode 100644 index 00000000..fdaaa407 --- /dev/null +++ b/plugins/compound-writing/skills/voice-capture/SKILL.md @@ -0,0 +1,242 @@ +--- +name: voice-capture +description: This skill should be used when extracting voice profiles from sample text, creating voice documentation, or matching a specific writing style. It applies when users provide sample text and want to capture the voice for future use. +--- + +# Voice Capture Skill + +Extract and encode writing voice from sample text into reusable voice profiles. This skill transforms examples of writing you like into documented patterns that can guide future writing. + +## When to Use This Skill + +This skill applies when: +- A user provides sample text and asks "write like this" +- Creating a voice profile from existing content +- Documenting a brand voice for consistency +- Capturing an author's style for future reference +- Analyzing differences between two writing styles + +## Core Philosophy + +> Voice isn't just word choice. It's sentence rhythm, paragraph structure, emotional register, and a thousand small decisions that create a distinctive sound. + +This skill captures those decisions systematically so they can be applied to new content. + +## Voice Profile Structure + +A complete voice profile has three layers. See [voice-profile-template.yaml](./assets/voice-profile-template.yaml) for the full template. + +### Layer 1: Immutable Traits + +Core characteristics that define the voice: + +```yaml +traits: + - direct # vs. indirect, circumspect + - conversational # vs. formal, academic + - technically-informed # level of assumed expertise + +register: informal # formal / semiformal / informal + +prohibited: + - "synergy" + - passive voice in openings + - exclamation marks (except in quotes) +``` + +### Layer 2: Channel Guidance + +How the voice adapts by medium: + +```yaml +channels: + blog: + length: "1000-2000 words" + personality: "full" + storytelling: "encouraged" + + newsletter: + length: "300-500 words" + personality: "high - direct address okay" + storytelling: "personal anecdotes" + + social: + length: "280 chars or thread" + personality: "punchy, hooks required" + storytelling: "minimal - punchlines only" + + documentation: + length: "as needed" + personality: "minimal" + storytelling: "none - clarity first" +``` + +### Layer 3: Example Library + +Exemplars that demonstrate the voice: + +```yaml +exemplars: + - path: "samples/great-opening.md" + why: "Concrete example first, theory second" + demonstrates: ["hook", "pacing"] + + - path: "samples/transition.md" + why: "Invisible transition technique" + demonstrates: ["flow", "structure"] + + - path: "samples/closing.md" + why: "Strong CTA without being salesy" + demonstrates: ["conclusion", "call-to-action"] +``` + +## Extraction Process + +### Step 1: Collect Samples + +Minimum: 3 samples (ideally 5-10) +Total words: At least 2,000 words +Variety: Different topics, same author/brand + +### Step 2: Analyze Dimensions + +Reference [analysis-dimensions.md](./references/analysis-dimensions.md) for the full framework. + +#### Vocabulary Analysis +- **Complexity**: Simple ↔ Complex +- **Formality**: Casual ↔ Formal +- **Jargon**: Technical ↔ Accessible +- **Signature words**: Frequently used phrases + +#### Sentence Analysis +- **Length**: Average words per sentence +- **Variety**: Standard deviation of sentence length +- **Structure**: Simple vs. compound vs. complex ratio +- **Fragments**: Used for emphasis? How often? + +#### Paragraph Analysis +- **Length**: Average sentences per paragraph +- **Opening patterns**: How do paragraphs typically start? +- **Closing patterns**: How do paragraphs typically end? + +#### Rhythm Analysis +- **Pacing**: Quick (short sentences) vs. measured (longer) +- **Punctuation style**: Dashes, semicolons, parentheses +- **White space**: Dense vs. airy paragraphs + +#### Emotional Analysis +- **Tone**: Optimistic, skeptical, neutral, passionate +- **Distance**: Intimate (I, you) vs. distant (one, they) +- **Stakes**: High urgency vs. calm reflection + +### Step 3: Document Patterns + +For each dimension, document: +1. The observed pattern +2. A concrete example +3. A counter-example (what this voice avoids) + +### Step 4: Create Profile + +Use [extraction-templates.md](./references/extraction-templates.md) to structure your findings. + +Output: `.claude/voice-profiles/[name].yaml` + +## Using Voice Profiles + +### In Writing Commands + +```yaml +# In /writing:draft +style: + voice_profile: "kieran-blog" + # OR + voice_profile: ".claude/voice-profiles/client-name.yaml" +``` + +### For Voice Guardian + +The voice-guardian agent uses profiles to: +- Score voice consistency (0-100) +- Identify drift points +- Suggest specific fixes + +Target score: 85+ + +### For New Writers + +When onboarding writers to match an existing voice: +1. Share the voice profile +2. Share the exemplars +3. Run voice-guardian on their drafts + +## Quick Extraction Workflow + +For rapid voice capture (when you need a profile fast): + +```markdown +## Quick Profile: [Name] + +**Based on**: [X] samples totaling [Y] words + +### Core Traits +- [Trait 1] +- [Trait 2] +- [Trait 3] + +### Sentence Patterns +Average length: [X] words +Common patterns: +- [Pattern 1] +- [Pattern 2] + +### Vocabulary Markers +**Signature words**: [list] +**Avoided words**: [list] + +### Tone +[Brief description] + +### Quick Examples +Good: "[example that nails the voice]" +Bad: "[example that would violate it]" +``` + +## Common Extraction Challenges + +### Challenge: Too Few Samples + +**Problem**: Can't identify patterns from 1-2 samples. +**Solution**: Ask for more content or analyze published work from the same source. + +### Challenge: Inconsistent Source + +**Problem**: The sample voice varies significantly. +**Solution**: Either document the variation (multiple profiles) or focus on the most recent/best examples. + +### Challenge: Style vs. Voice + +**Problem**: Confusing topic-specific style with core voice. +**Solution**: Analyze samples on different topics. What stays constant? That's the voice. + +### Challenge: Unconscious Patterns + +**Problem**: Author doesn't know what makes their voice distinctive. +**Solution**: Compare to other writers. What's different? That's often the key. + +## Quality Checklist + +A voice profile is complete when: +- [ ] All three layers are populated +- [ ] At least 3 exemplars are documented +- [ ] Prohibited patterns are explicit +- [ ] Channel variations are noted +- [ ] A test passage can be evaluated against it +- [ ] Someone unfamiliar with the voice could use it + +## References + +- [extraction-templates.md](./references/extraction-templates.md) - Templates for structured extraction +- [analysis-dimensions.md](./references/analysis-dimensions.md) - All dimensions to analyze +- [example-profiles.md](./references/example-profiles.md) - Sample voice profiles for reference +- [voice-profile-template.yaml](./assets/voice-profile-template.yaml) - The YAML template diff --git a/plugins/compound-writing/skills/voice-capture/assets/voice-profile-template.yaml b/plugins/compound-writing/skills/voice-capture/assets/voice-profile-template.yaml new file mode 100644 index 00000000..d3bcb552 --- /dev/null +++ b/plugins/compound-writing/skills/voice-capture/assets/voice-profile-template.yaml @@ -0,0 +1,132 @@ +# Voice Profile Template +# Copy and customize this template for new voice profiles + +name: "[voice-name-kebab-case]" +description: "Brief description of this voice" +created: "[YYYY-MM-DD]" +based_on: "[Author name or brand]" +sample_count: 0 +sample_words: 0 + +# Layer 1: Immutable Traits +# Core characteristics that define this voice + +traits: + - "[trait-1]" # e.g., direct, analytical, playful + - "[trait-2]" + - "[trait-3]" + +register: "[formal|semiformal|informal|casual]" + +prohibited: + # Words, phrases, and patterns to never use + - "[word or phrase]" + - "[pattern description]" + +# Vocabulary patterns +vocabulary: + signature_words: + - "[word]" + - "[phrase]" + formality: "[casual|conversational|professional|formal]" + complexity: "[simple|moderate|complex]" + contractions: "[always|usually|sometimes|never]" + technical_density: "[none|light|moderate|heavy]" + +# Sentence patterns +sentences: + average_length: 0 # words + range: "[min]-[max]" + fragment_usage: "[never|rare|occasional|frequent]" + opening_preference: "[subject-verb|question|transition|varied]" + structure_preference: "[simple|compound|complex|varied]" + +# Paragraph patterns +paragraphs: + average_length: 0 # sentences + white_space: "[dense|moderate|airy]" + structure: "[topic-evidence|claim-support|story-lesson|varied]" + opening_type: "[topic-sentence|hook|question|transition]" + closing_type: "[conclusion|bridge|punchline|question]" + +# Rhythm patterns +rhythm: + pacing: "[staccato|legato|varied]" + # Punctuation frequency: never|rare|occasional|frequent + em_dash: "[frequency]" + parentheses: "[frequency]" + semicolon: "[frequency]" + exclamation: "[frequency]" + # Repetition patterns + rule_of_three: "[never|occasional|frequent]" + anaphora: "[never|occasional|frequent]" + +# Emotional tone +tone: + primary: "[one-word descriptor]" + secondary: "[one-word descriptor]" + stakes: "[low|medium|high]" + distance: "[intimate|conversational|professional|distant]" + +# Layer 2: Channel Guidance +# How voice adapts by medium + +channels: + blog: + length: "[word range]" + personality: "[description]" + storytelling: "[none|minimal|encouraged|required]" + notes: "" + + newsletter: + length: "[word range]" + personality: "[description]" + direct_address: "[yes|no|sometimes]" + notes: "" + + social: + length: "[char limit or 'thread']" + personality: "[description]" + hooks: "[required|encouraged|optional]" + notes: "" + + documentation: + length: "as needed" + personality: "[minimal|some|full]" + notes: "" + + # Add more channels as needed + # email: + # presentation: + # etc. + +# Layer 3: Example Library +# Exemplars that demonstrate the voice + +exemplars: + - path: "[relative/path/to/sample.md]" + why: "[What this sample demonstrates]" + demonstrates: + - "[element-1]" # e.g., hook, pacing, tone + - "[element-2]" + + - path: "" + why: "" + demonstrates: [] + + - path: "" + why: "" + demonstrates: [] + +# Anti-exemplars (what this voice would NOT do) +anti_exemplars: + - text: "[Example text that violates this voice]" + violation: "[What rule it breaks]" + +# Metadata +metadata: + confidence: "[high|medium|low]" + last_updated: "[YYYY-MM-DD]" + notes: | + Additional notes about this voice profile. + Common challenges, edge cases, etc. diff --git a/plugins/compound-writing/skills/voice-capture/references/analysis-dimensions.md b/plugins/compound-writing/skills/voice-capture/references/analysis-dimensions.md new file mode 100644 index 00000000..8fb9bbb2 --- /dev/null +++ b/plugins/compound-writing/skills/voice-capture/references/analysis-dimensions.md @@ -0,0 +1,217 @@ +# Voice Analysis Dimensions + +Complete framework for analyzing writing voice across all dimensions. + +## 1. Vocabulary Dimensions + +### 1.1 Complexity + +| Level | Description | Indicators | +|-------|-------------|------------| +| Simple | 8th grade reading level | Short words, common vocabulary | +| Moderate | 10-12th grade | Mix of common and specialized | +| Complex | College+ | Domain expertise, advanced vocabulary | + +**How to measure**: Use Flesch-Kincaid or similar readability metric. + +### 1.2 Formality + +| Level | Indicators | +|-------|------------| +| Casual | Contractions, slang, sentence fragments | +| Conversational | Contractions, no slang, complete sentences | +| Professional | Minimal contractions, industry terms | +| Formal | No contractions, third person, passive voice acceptable | + +### 1.3 Technical Density + +- **None**: No jargon, fully accessible +- **Light**: Occasional terms, defined or obvious +- **Moderate**: Regular technical vocabulary, assumes baseline +- **Heavy**: Dense specialized language, expert audience + +### 1.4 Signature Vocabulary + +Look for: +- Words used 3+ times across samples +- Unusual word choices (not the obvious word) +- Branded terms or coined phrases +- Consistent metaphor families + +## 2. Sentence Dimensions + +### 2.1 Length Metrics + +| Metric | Calculation | +|--------|-------------| +| Average length | Total words / total sentences | +| Shortest sentence | Minimum (for emphasis use) | +| Longest sentence | Maximum (complexity tolerance) | +| Variance | How much length varies | + +**Typical ranges**: +- Punchy: 8-12 words average +- Balanced: 15-20 words average +- Complex: 25+ words average + +### 2.2 Structure Types + +| Type | Pattern | Example | +|------|---------|---------| +| Simple | Subject + Verb | "The code runs." | +| Compound | S+V and/or S+V | "The code runs, and tests pass." | +| Complex | Main clause + dependent | "When you run the code, tests pass." | +| Compound-Complex | Multiple clauses | Full combination | + +### 2.3 Opening Patterns + +Count percentage of sentences starting with: +- Subject (proper start): "The team decided..." +- Question: "What if we..." +- Transition: "However, the approach..." +- Participle: "Running the tests..." +- Subordinate clause: "When the tests passed..." +- "I" or "We": First person leads + +### 2.4 Fragment Usage + +| Level | Description | +|-------|-------------| +| Never | All complete sentences | +| Rare | Emphasis only, <5% | +| Occasional | Stylistic choice, 5-15% | +| Frequent | Part of voice, >15% | + +## 3. Paragraph Dimensions + +### 3.1 Length Patterns + +- **Short**: 1-2 sentences (punchy, scannable) +- **Medium**: 3-4 sentences (standard) +- **Long**: 5+ sentences (dense, academic) + +### 3.2 Structure Patterns + +**Opening types**: +- Topic sentence (states paragraph purpose) +- Hook (attention-grabbing statement) +- Question (rhetorical or actual) +- Transition (from previous paragraph) + +**Closing types**: +- Conclusion (wraps up the point) +- Bridge (sets up next paragraph) +- Punch line (memorable closer) +- Question (leaves reader thinking) + +### 3.3 White Space + +Visual density of paragraphs: +- Dense: Long paragraphs, few breaks +- Moderate: Mixed lengths +- Airy: Short paragraphs, frequent breaks, lists + +## 4. Rhythm Dimensions + +### 4.1 Pacing + +| Type | Pattern | +|------|---------| +| Staccato | Short, punchy, rapid-fire | +| Legato | Long, flowing, connected | +| Varied | Intentional mix for effect | + +### 4.2 Punctuation Profile + +For each mark, note frequency: +- **Em dash**: Emphasis, interruption, asides +- **Parentheses**: Secondary info, qualification +- **Semicolon**: Related ideas, sophistication +- **Colon**: Introduction, lists, explanation +- **Ellipsis**: Trailing off, suspense +- **Exclamation**: Energy, emphasis + +### 4.3 Repetition Patterns + +- **Anaphora**: Repeated beginnings ("We built. We shipped. We learned.") +- **Epistrophe**: Repeated endings +- **Parallelism**: Similar structure across items +- **Rule of three**: Three beats, three examples + +## 5. Emotional Dimensions + +### 5.1 Tone Categories + +| Tone | Indicators | +|------|------------| +| Optimistic | Positive framing, future focus, solutions | +| Skeptical | Questions assumptions, critical analysis | +| Neutral | Balanced, informational, objective | +| Passionate | Strong language, personal investment | +| Urgent | Time pressure, calls to action | +| Calm | Measured, reflective, patient | + +### 5.2 Distance Scale + +| Level | Indicators | +|-------|------------| +| Intimate | "I", "you", personal stories, vulnerability | +| Conversational | Occasional "you", relatable examples | +| Professional | "We", company voice, limited personal | +| Academic | Third person, citations, objectivity | +| Distant | Passive voice, "one", impersonal | + +### 5.3 Stakes Level + +How urgent does the writing feel? + +- **Low**: Informational, "here's how it works" +- **Medium**: Opinion, "this matters because" +- **High**: Urgent, "you need to act now" + +## 6. Structural Dimensions + +### 6.1 Organization Patterns + +- **Linear**: Point A to Point B to Point C +- **Problem-Solution**: State problem, resolve it +- **Compare-Contrast**: This vs. that +- **Chronological**: Timeline or narrative +- **Spatial**: By location or component +- **Priority**: Most to least important + +### 6.2 Argument Style + +- **Inductive**: Examples first, principle after +- **Deductive**: Principle first, examples after +- **Dialectical**: Thesis, antithesis, synthesis + +### 6.3 Evidence Preferences + +- Stories and anecdotes +- Data and statistics +- Expert quotes +- Logical reasoning +- Personal experience +- Historical examples + +## Analysis Checklist + +For complete voice extraction, analyze: + +- [ ] Vocabulary: complexity, formality, technical density, signatures +- [ ] Sentences: length, structure, openings, fragments +- [ ] Paragraphs: length, structure, white space +- [ ] Rhythm: pacing, punctuation, repetition +- [ ] Emotion: tone, distance, stakes +- [ ] Structure: organization, argument style, evidence + +## Quick Analysis Framework + +For rapid analysis, focus on: + +1. **Average sentence length** (objective, measurable) +2. **Formality level** (contractions, word choice) +3. **Primary tone** (one word descriptor) +4. **Signature vocabulary** (3-5 distinctive words) +5. **Paragraph length** (short, medium, long) diff --git a/plugins/compound-writing/skills/voice-capture/references/example-profiles.md b/plugins/compound-writing/skills/voice-capture/references/example-profiles.md new file mode 100644 index 00000000..20745949 --- /dev/null +++ b/plugins/compound-writing/skills/voice-capture/references/example-profiles.md @@ -0,0 +1,273 @@ +# Example Voice Profiles + +Sample voice profiles demonstrating the format. + +## Example 1: DHH (David Heinemeier Hansson) + +```yaml +name: dhh-blog + +traits: + - direct + - opinionated + - contrarian + +register: informal + +prohibited: + - hedge words (seems, might, perhaps) + - passive voice (except for emphasis) + - corporate buzzwords (synergy, leverage, optimize) + - exclamation marks (unless ironic) + - "I think" or "in my opinion" (implied) + +vocabulary: + signature_words: + - "bullshit" + - "vanilla" + - "majestic" + - "heresy" + formality: casual-professional + complexity: moderate + contractions: always + +sentences: + average_length: 12 + fragment_usage: frequent + opening_preference: subject-verb + +paragraphs: + average_length: 2-3 + white_space: airy + structure: claim-evidence + +rhythm: + pacing: punchy + rule_of_three: frequent + em_dash: occasional + semicolon: rare + +tone: + primary: confident + secondary: provocative + stakes: medium-high + distance: conversational + +channels: + blog: + length: "500-1500 words" + personality: "full" + controversy: "welcomed" + twitter: + length: "single tweet preferred" + personality: "concentrated" + controversy: "frequent" + +exemplars: + - text: "Most meetings are a waste of time. Not some. Most." + demonstrates: ["short sentences", "contrarian", "repetition"] + - text: "We don't do free. We don't do enterprise. $99. Done." + demonstrates: ["fragments", "rule of three", "directness"] +``` + +## Example 2: Joel Spolsky + +```yaml +name: joel-on-software + +traits: + - analytical + - humorous + - storytelling + +register: conversational + +prohibited: + - jargon without explanation + - abstract theory without concrete examples + - formal academic tone + - passive voice (mostly) + +vocabulary: + signature_words: + - "leaky abstractions" + - "Joel Test" + - "shlemiel the painter" + formality: casual-technical + complexity: moderate-high (explained) + contractions: yes + +sentences: + average_length: 18 + fragment_usage: occasional + opening_preference: varied + +paragraphs: + average_length: 3-4 + white_space: moderate + structure: story-point-lesson + +rhythm: + pacing: varied + parenthetical_asides: frequent + em_dash: occasional + footnotes: rare + +tone: + primary: explanatory + secondary: witty + stakes: medium + distance: friendly-expert + +channels: + blog: + length: "1500-3000 words" + personality: "full, storytelling" + humor: "embedded throughout" + documentation: + length: "as needed" + personality: "reduced but present" + humor: "occasional" + +exemplars: + - text: "The Joel Test is a quick measure of the quality of a software team. The higher the score, the better the team. No, it's not perfect, but it's fast and pretty good." + demonstrates: ["conversational", "practical", "self-aware"] + - text: "Shlemiel gets a job as a street painter, painting the dotted lines down the middle of the road..." + demonstrates: ["storytelling", "physical analogy", "setup-punchline"] +``` + +## Example 3: Paul Graham + +```yaml +name: paul-graham-essays + +traits: + - exploratory + - philosophical + - building-arguments + +register: semiformal + +prohibited: + - starting with conclusions + - excessive qualification + - jargon without setup + +vocabulary: + signature_words: + - "ramen profitable" + - "do things that don't scale" + - "frighteningly ambitious" + formality: intellectual-accessible + complexity: high (earned) + contractions: some + +sentences: + average_length: 22 + fragment_usage: rare + opening_preference: statement + +paragraphs: + average_length: 4-5 + white_space: moderate-dense + structure: logical-progression + +rhythm: + pacing: measured + nested_clauses: accepted + em_dash: frequent + semicolon: occasional + +tone: + primary: thoughtful + secondary: counterintuitive + stakes: medium + distance: intellectual-peer + +channels: + essay: + length: "2000-4000 words" + personality: "reflective" + structure: "meandering toward insight" + +exemplars: + - text: "Don't just not be evil. Be good." + demonstrates: ["moral clarity", "concision", "building on negation"] + - text: "The way to get startup ideas is not to try to think of startup ideas." + demonstrates: ["counterintuitive", "paradox setup", "memorable"] +``` + +## Example 4: Corporate Neutral (Anti-Example) + +```yaml +name: corporate-neutral +description: "What NOT to do - included for contrast" + +traits: + - hedged + - safe + - buzzword-laden + +register: formal + +vocabulary: + signature_words: + - "leverage" + - "synergy" + - "value proposition" + - "best-in-class" + formality: corporate-formal + complexity: low-disguised-as-high + contractions: never + +sentences: + average_length: 28 + fragment_usage: never + opening_preference: "There are/It is" + +paragraphs: + average_length: 6+ + white_space: dense + structure: circular + +tone: + primary: safe + secondary: defensive + stakes: artificially high + distance: distant + +problems: + - "Says nothing memorable" + - "Could be any company" + - "No human voice" + - "Exhausting to read" + +exemplar_bad: + - text: "We are excited to announce a strategic initiative designed to enhance our value proposition through synergistic partnerships that will drive innovation across our ecosystem." + problems: ["no meaning", "all buzzwords", "passive framing"] +``` + +## Using These Profiles + +### For Matching Voice + +Compare your writing to the exemplars: +1. Read the exemplar aloud +2. Read your writing aloud +3. Do they sound like the same person? + +### For Voice Guardian Scoring + +When scoring voice match: +- Check against prohibited words +- Compare sentence length +- Verify tone matches +- Look for signature vocabulary + +### For Learning Style + +Study the difference between profiles: +- DHH: Short, punchy, contrarian +- Joel: Story-driven, explanatory +- Paul Graham: Exploratory, builds arguments +- Corporate: Avoid at all costs diff --git a/plugins/compound-writing/skills/voice-capture/references/extraction-templates.md b/plugins/compound-writing/skills/voice-capture/references/extraction-templates.md new file mode 100644 index 00000000..6f3cd25b --- /dev/null +++ b/plugins/compound-writing/skills/voice-capture/references/extraction-templates.md @@ -0,0 +1,236 @@ +# Voice Extraction Templates + +Structured templates for capturing voice systematically. + +## Full Extraction Template + +Use this for comprehensive voice profiles. + +```markdown +# Voice Extraction: [Name/Brand] + +## Source Material +- Sample 1: [title/description] ([X] words) +- Sample 2: [title/description] ([X] words) +- Sample 3: [title/description] ([X] words) +Total: [X] words across [X] samples + +## Vocabulary Analysis + +### Complexity Score +[ ] Simple (8th grade reading level) +[X] Moderate (10-12th grade) +[ ] Complex (college+) + +Evidence: "[example sentence]" + +### Formality Score +[ ] Casual (contractions, slang okay) +[X] Conversational (contractions, no slang) +[ ] Professional (minimal contractions) +[ ] Formal (no contractions) + +Evidence: "[example]" + +### Signature Words/Phrases +Words used frequently: +- "[word]" - appears X times +- "[phrase]" - appears X times + +### Prohibited Words +Words never used: +- "[word]" - alternative used instead: "[alternative]" +- "[word]" - never appears despite topic relevance + +## Sentence Analysis + +### Average Length +[X] words (calculated from samples) + +### Length Distribution +Shortest sentences: [X] words (for emphasis) +Longest sentences: [X] words (for explanation) +Standard deviation: [X] + +### Structure Patterns + +**Dominant pattern**: [Simple / Compound / Complex] + +**Fragment usage**: +[ ] Never +[ ] Rarely (emphasis only) +[X] Sometimes +[ ] Frequently + +Example fragment: "[example]" + +### Opening Patterns +Sentences typically start with: +- Subject-verb: [%] +- Question: [%] +- Transition word: [%] +- "-ing" phrase: [%] + +## Paragraph Analysis + +### Average Length +[X] sentences per paragraph + +### Opening Patterns +How paragraphs typically begin: +- Hook/claim: [%] +- Question: [%] +- Continuation: [%] +- Quote: [%] + +### Closing Patterns +How paragraphs typically end: +- Conclusion/summary: [%] +- Transition to next: [%] +- Question: [%] +- Punch line: [%] + +## Rhythm Analysis + +### Pacing +[ ] Quick (short sentences dominate) +[X] Varied (intentional mix) +[ ] Measured (longer sentences dominate) + +### Punctuation Preferences +- Em dashes: [Frequent / Occasional / Rare / Never] +- Parentheses: [Frequent / Occasional / Rare / Never] +- Semicolons: [Frequent / Occasional / Rare / Never] +- Exclamation marks: [Frequent / Occasional / Rare / Never] + +### White Space +[ ] Dense (long paragraphs) +[X] Moderate (mixed) +[ ] Airy (short paragraphs, frequent breaks) + +## Emotional Analysis + +### Tone +Primary: [optimistic / skeptical / neutral / passionate / urgent / calm] +Secondary: [additional descriptor] + +### Emotional Distance +[X] Intimate ("I", "you", direct address) +[ ] Conversational (occasional "you") +[ ] Professional (rare personal pronouns) +[ ] Distant ("one", passive constructions) + +### Stakes Level +[ ] Low (informational, neutral) +[X] Medium (opinion, mild urgency) +[ ] High (urgent, emotional, calls to action) + +## Extracted Patterns + +### Pattern 1: [Name] +**What**: [Description of the pattern] +**Example**: "[Quote from samples]" +**When to use**: [Context] + +### Pattern 2: [Name] +**What**: [Description] +**Example**: "[Quote]" +**When to use**: [Context] + +[Continue for major patterns...] + +## Anti-Patterns + +### What This Voice Avoids +1. [Anti-pattern]: "[Example of what NOT to do]" +2. [Anti-pattern]: "[Example]" +3. [Anti-pattern]: "[Example]" + +## Exemplar Passages + +### Best Example of Voice +> "[Passage that perfectly captures the voice]" + +Why this works: [Explanation] + +### Good Contrast Example +> "[Passage that would NOT fit this voice]" + +Why this doesn't work: [Explanation] + +## Final Profile Summary + +**In one sentence**: This voice is [X], [Y], and [Z]. + +**Key identifiers**: If you see [marker], it's probably this voice. + +**Biggest risk**: Writers often drift toward [common mistake]. +``` + +## Quick Extraction Template + +Use for rapid voice capture when time is limited. + +```markdown +# Quick Voice Profile: [Name] + +**Based on**: [X] samples, [Y] total words +**Confidence**: [High / Medium / Low] + +## Core Characteristics +1. [Most distinctive trait] +2. [Second trait] +3. [Third trait] + +## Sentence Style +- Average length: [X] words +- Fragments: [Yes/No] +- Structure: [Simple / Varied / Complex] + +## Vocabulary +**Signature words**: [word], [word], [word] +**Avoided words**: [word], [word], [word] +**Formality**: [Casual / Professional / Formal] + +## Tone +[One sentence description] + +## Quick Test +This voice would say: "[example]" +This voice would NOT say: "[counter-example]" +``` + +## Comparison Template + +Use when analyzing differences between two voices. + +```markdown +# Voice Comparison: [Voice A] vs. [Voice B] + +## Overview +| Dimension | Voice A | Voice B | +|-----------|---------|---------| +| Formality | [X] | [X] | +| Sentence Length | [X] words | [X] words | +| Tone | [X] | [X] | +| Complexity | [X] | [X] | + +## Key Differences + +### Difference 1: [Dimension] +**Voice A**: [Description with example] +**Voice B**: [Description with example] +**Implication**: [What this means for writing] + +### Difference 2: [Dimension] +[Continue pattern...] + +## Shared Traits +Both voices share: +1. [Shared trait] +2. [Shared trait] + +## When to Use Each +**Use Voice A when**: [Context] +**Use Voice B when**: [Context] +``` diff --git a/plugins/compound-writing/skills/writing-orchestration/SKILL.md b/plugins/compound-writing/skills/writing-orchestration/SKILL.md new file mode 100644 index 00000000..4b03073a --- /dev/null +++ b/plugins/compound-writing/skills/writing-orchestration/SKILL.md @@ -0,0 +1,237 @@ +--- +name: writing-orchestration +description: This skill should be used when orchestrating complex writing workflows with multiple phases. It provides two-agent orchestration patterns, the two-gate content readiness assessment, 10 baseline writing strategies, 20+ situational strategies, and quality checkpoints. Inspired by the Spiral Writing System. +--- + +# Writing Orchestration Skill + +A complete orchestration system for complex writing workflows. This skill provides the strategic layer that coordinates agents, applies writing strategies, and ensures content quality. + +## When to Use This Skill + +This skill applies when: +- Coordinating multiple writing agents +- Applying strategic writing decisions +- Assessing content readiness before drafting +- Selecting and applying writing strategies +- Running quality checkpoints on drafts + +## Two-Agent Architecture + +Complex writing benefits from separation of concerns: + +### Orchestrator Role +- Classifies requests (information vs. content) +- Applies two-gate assessment +- Gathers research and context +- Hands off to writer when ready +- Never creates content directly + +### Writer Role +- Creates drafts using strategies +- Applies style guides +- Produces variations (EXPLORATION mode) +- Refines based on feedback (REFINEMENT mode) +- Uses tools for all content (never in chat) + +``` +User Request + ↓ +[Orchestrator] β†’ Classify β†’ Research β†’ Two-Gate Assessment + ↓ + β”œβ”€β”€ Not Ready β†’ Gather more material/clarity + ↓ + └── Ready β†’ Handoff to Writer + ↓ + [Writer] β†’ Apply Strategies β†’ Create Drafts + ↓ + Quality Checkpoints β†’ Output +``` + +## Two-Gate Content Readiness Assessment + +Before any content creation, apply this assessment: + +### Gate 1: Material Sufficiency + +**Question**: "Could the writer create this without inventing facts?" + +| Outcome | Action | +|---------|--------| +| βœ“ Pass | Have concrete examples, data, quotes available | +| βœ— Fail | Need to research/gather material first | + +**Pass signals**: +- Specific examples available +- Data points confirmed +- Expert quotes accessible +- No major claims need fabrication + +### Gate 2: Message Clarity + +**Question**: "Do we know EXACTLY what message to convey?" + +| Outcome | Action | +|---------|--------| +| βœ“ Pass | Clear, specific communication goal | +| βœ— Fail | Need to interview for clarity | + +**Pass signals**: +- Can state thesis in one sentence +- Know the audience specifically +- Know the desired action +- Angle is differentiated + +### Decision Matrix + +| Material | Message | Action | +|----------|---------|--------| +| βœ“ | βœ“ | Handoff to writer immediately | +| βœ“ | βœ— | Interview for message clarity | +| βœ— | βœ“ | Research/gather material | +| βœ— | βœ— | Interview for both | + +## 10 Baseline Strategies (ALWAYS Apply) + +These strategies apply to ALL content. Reference [baseline-strategies.md](./references/baseline-strategies.md) for full details. + +| Strategy | Rule | Transform | +|----------|------|-----------| +| **reader-zero-context** | Add 3-6 word orienting phrases | "Stripe handles billing" β†’ "Stripe, the payments platform, handles billing" | +| **subject-verb** | Subject + verb in first 5 words | "There were students who..." β†’ "Students completed..." | +| **activate-verbs** | Precise verbs over is/was | "Markets were down" β†’ "Markets plunged" | +| **watch-adverbs** | Let strong verbs carry load | "whispered quietly" β†’ "whispered" | +| **limit-ings** | Simple tense over continuous | "are running tests" β†’ "run tests" | +| **prefer-simple** | Everyday language unless technical | "utilizes stochastic gradient" β†’ "learns by trial and error" | +| **cut-big-small** | Edit hierarchically | Paragraphs β†’ Sentences β†’ Words | +| **ban-empty-hypophora** | No self-answered questions | "The payoff? Our app..." β†’ "Our app..." | +| **present-active-tense** | Direct, immediate language | "debuts today" β†’ "is out now" | +| **one-idea-per-sentence** | Single clear point | Split compound thoughts | + +## 20+ Situational Strategies (Select 3-4) + +Choose based on content type and goals. Reference [situational-strategies.md](./references/situational-strategies.md) for full list. + +### Hook & Opening +- **hook-effectiveness** - Counterintuitive or surprising openings +- **tension-builder** - Create and resolve tension +- **pattern-twist** - Set expectations, then break them + +### Structure & Flow +- **order-words-emphasis** - Important words at sentence ends +- **sentence-length** - Vary for rhythm (short for impact, long for flow) +- **paragraph-length** - Mix for visual rhythm +- **ladder-abstraction** - Alternate concrete ↔ abstract + +### Style & Voice +- **elegant-variation** - Avoid word repetition +- **passive-aggressive** - Strategic passive for emphasis +- **punctuation-pace** - Use punctuation for rhythm +- **key-words-space** - Give important terms breathing room + +### Persuasion & Engagement +- **essential-name-filter** - Only names that add value +- **name-of-dog** - Specific details for authenticity +- **original-images** - Fresh metaphors, avoid clichΓ©s +- **show-and-tell** - Balance showing with telling + +### Narrative & Story +- **narrate-scenes** - Immersive scene-setting +- **cinematic-angles** - Camera-like perspective shifts +- **dialogue-compression** - Tight, purposeful dialogue +- **reveal-traits** - Character through action + +## Quality Checkpoints + +Before finalizing content, verify: + +### Opening Quality +- [ ] Opening is counterintuitive or surprising +- [ ] Leads with most compelling insight/moment/problem +- [ ] No chronology/setup/version numbers in opening +- [ ] Hook earns the next sentence + +### Body Quality +- [ ] Body delivers on opening's promise +- [ ] Concrete sensory details present +- [ ] Each paragraph has clear purpose +- [ ] Transitions are smooth + +### Strategy Compliance +- [ ] All 10 baseline strategies applied +- [ ] 3-4 situational strategies visible +- [ ] Each sentence expresses one clear idea +- [ ] Technical terminology oriented with context + +### Style Guide Compliance +- [ ] Voice matches profile/guide +- [ ] No prohibited words/patterns +- [ ] Formatting rules followed + +## Content Modes + +### EXPLORATION Mode (New Content) + +When creating new content: +1. Generate 3 different drafts +2. Vary angle, not just words +3. Apply all strategies to each +4. Let user choose direction + +### REFINEMENT Mode (Editing) + +When user provides feedback: +1. Work with existing draft +2. Preserve voice and structure +3. Apply specific changes requested +4. Keep what works + +## Handoff Protocol + +### Orchestrator β†’ Writer + +``` +[Research summary if applicable - 2-3 sentences] +[Material gathered: list key assets] +[Message clarity: thesis statement] +[Style guide: name if applicable] +[Mode: EXPLORATION or REFINEMENT] +``` + +### Writer β†’ Orchestrator (Rare) + +Only when: +- User explicitly requests brainstorming +- New research topic needed +- Web search required +- Significant scope change + +## Integration with Commands + +### `/writing:plan` +Uses Orchestrator patterns: +- Request classification +- Research phase +- Two-gate assessment +- Material gathering + +### `/writing:draft` +Uses Writer patterns: +- Strategy application +- Mode selection +- Draft creation +- Quality checkpoints + +### `/writing:review` +Uses both: +- Orchestrator: coordinate review agents +- Writer: apply fixes + +### `/writing:compound` +Captures patterns that worked for future orchestration. + +## References + +- [baseline-strategies.md](./references/baseline-strategies.md) - Full 10 baseline strategies with examples +- [situational-strategies.md](./references/situational-strategies.md) - 20+ situational strategies +- [quality-checkpoints.md](./references/quality-checkpoints.md) - Detailed checkpoint criteria diff --git a/plugins/compound-writing/skills/writing-orchestration/references/baseline-strategies.md b/plugins/compound-writing/skills/writing-orchestration/references/baseline-strategies.md new file mode 100644 index 00000000..1dfaa688 --- /dev/null +++ b/plugins/compound-writing/skills/writing-orchestration/references/baseline-strategies.md @@ -0,0 +1,171 @@ +# 10 Baseline Writing Strategies + +These strategies apply to ALL content. Apply every one, every time. + +## 1. Reader Zero Context + +**Rule**: Add 3-6 word orienting phrases for proper nouns and references. + +**Why**: Readers drop into content without your context. Orient them immediately. + +**Transform**: +| Before | After | +|--------|-------| +| "Stripe handles billing" | "Stripe, the payments platform, handles billing" | +| "We partnered with Acme" | "We partnered with Acme, a logistics startup" | +| "The RFC was approved" | "The RFC (Request for Comments), our design proposal, was approved" | + +**When to skip**: Universally known entities (Google, Apple, Einstein). + +## 2. Subject-Verb First + +**Rule**: Subject and verb within the first 5 words. + +**Why**: Readers parse subject-verb-object fastest. Front-load meaning. + +**Transform**: +| Before | After | +|--------|-------| +| "There were many students who completed the course" | "Many students completed the course" | +| "It is often the case that errors occur" | "Errors occur often" | +| "What we found was that users preferred..." | "Users preferred..." | + +**Pattern to avoid**: "There is/are", "It is", "What X is" + +## 3. Activate Verbs + +**Rule**: Precise verbs over is/was/has/have. + +**Why**: Active verbs create energy. Being verbs create lethargy. + +**Transform**: +| Before | After | +|--------|-------| +| "Markets were down sharply" | "Markets plunged" | +| "The team was in agreement" | "The team agreed" | +| "She was the leader of the project" | "She led the project" | +| "It was a surprise to everyone" | "It surprised everyone" | + +**Find-replace targets**: was, were, is, are, has been, have been + +## 4. Watch Adverbs + +**Rule**: Let strong verbs carry the load. Cut redundant adverbs. + +**Why**: Strong verbs don't need modification. Weak verb + adverb = lazy writing. + +**Transform**: +| Before | After | +|--------|-------| +| "whispered quietly" | "whispered" | +| "ran quickly" | "sprinted" | +| "completely destroyed" | "destroyed" | +| "very angry" | "furious" | + +**Keep adverbs when**: They change meaning ("she smiled coldly" vs "she smiled"). + +## 5. Limit -ings + +**Rule**: Simple tense over continuous tense. + +**Why**: Continuous tense adds words without meaning. Simple tense is direct. + +**Transform**: +| Before | After | +|--------|-------| +| "We are running tests" | "We run tests" | +| "The team was building features" | "The team built features" | +| "Users are experiencing issues" | "Users experience issues" | + +**Keep -ing when**: Action is genuinely ongoing or progressive. + +## 6. Prefer Simple + +**Rule**: Everyday language unless technical precision requires otherwise. + +**Why**: Simple words are faster to read and harder to misunderstand. + +**Transform**: +| Before | After | +|--------|-------| +| "utilize" | "use" | +| "terminate" | "end" | +| "facilitate" | "help" | +| "leverage" | "use" | +| "implement" | "build" or "do" | +| "optimize" | "improve" | + +**Keep complex when**: Technical precision matters (legal, medical, scientific). + +## 7. Cut Big to Small + +**Rule**: Edit hierarchically. Paragraphs β†’ Sentences β†’ Words. + +**Why**: Cutting a paragraph saves more than cutting 20 words. + +**Process**: +1. **Paragraph level**: Does this paragraph advance the argument? If not, cut it. +2. **Sentence level**: Does this sentence add new information? If not, cut it. +3. **Word level**: Does this word do work? If not, cut it. + +**The test**: Read without the cut element. If meaning survives, the cut was right. + +## 8. Ban Empty Hypophora + +**Rule**: No self-answered questions unless the answer surprises. + +**Why**: "The payoff? Amazing results." wastes words. Just say the results. + +**Transform**: +| Before | After | +|--------|-------| +| "The payoff? Our app launched." | "Our app launched." | +| "The solution? We hired more." | "We hired more." | +| "What happened next? Sales doubled." | "Sales doubled." | + +**Keep when**: The answer genuinely surprises or subverts expectations. + +## 9. Present Active Tense + +**Rule**: Direct, immediate language. Now > then. + +**Why**: Present tense creates urgency. Past tense creates distance. + +**Transform**: +| Before | After | +|--------|-------| +| "The feature debuts today" | "The feature is out now" | +| "We will launch soon" | "We launch next week" | +| "The update was released" | "The update is live" | + +**Keep past when**: Historical accuracy matters or sequence is important. + +## 10. One Idea Per Sentence + +**Rule**: Single clear point per sentence. + +**Why**: Compound sentences hide ideas. Simple sentences reveal them. + +**Transform**: +| Before | After | +|--------|-------| +| "The team launched the product, which was well-received, and sales increased dramatically." | "The team launched the product. Reception was strong. Sales increased dramatically." | + +**The test**: Can you state the sentence's one idea in 5 words? + +--- + +## Quick Reference Card + +| # | Strategy | Question to Ask | +|---|----------|-----------------| +| 1 | Reader Zero Context | Would a stranger need more context? | +| 2 | Subject-Verb First | Are subject and verb in first 5 words? | +| 3 | Activate Verbs | Can "is/was" become an action verb? | +| 4 | Watch Adverbs | Does the adverb do work the verb can't? | +| 5 | Limit -ings | Is continuous tense necessary? | +| 6 | Prefer Simple | Is there a simpler word? | +| 7 | Cut Big to Small | Would meaning survive without this? | +| 8 | Ban Empty Hypophora | Does my question-answer add value? | +| 9 | Present Active Tense | Can I make this more immediate? | +| 10 | One Idea Per Sentence | How many ideas in this sentence? | diff --git a/plugins/compound-writing/skills/writing-orchestration/references/quality-checkpoints.md b/plugins/compound-writing/skills/writing-orchestration/references/quality-checkpoints.md new file mode 100644 index 00000000..37716f46 --- /dev/null +++ b/plugins/compound-writing/skills/writing-orchestration/references/quality-checkpoints.md @@ -0,0 +1,148 @@ +# Quality Checkpoints + +Complete verification before finalizing any content. + +## Pre-Draft Checkpoints + +Before writing, verify: + +### Material Readiness +- [ ] Have concrete examples (not hypothetical) +- [ ] Have data/statistics (with sources) +- [ ] Have quotes (properly attributed) +- [ ] Have enough for claims (no fabrication needed) + +### Message Readiness +- [ ] Can state thesis in one sentence +- [ ] Know specific audience +- [ ] Know desired reader action +- [ ] Have differentiated angle + +## Draft Checkpoints + +### Opening (First 50 Words) + +| Checkpoint | Pass Criteria | +|------------|---------------| +| Hook type | Counterintuitive, surprising, or tension-building | +| Lead content | Most compelling insight/moment/problem | +| No chronology | Doesn't start with "Last week..." or timeline | +| No setup | Doesn't explain what you're about to say | +| No version numbers | "Version 2.0 of..." is not a hook | +| Promise made | Reader knows why to keep reading | + +**Test**: Cover everything after the first 50 words. Would you want to read more? + +### Body + +| Checkpoint | Pass Criteria | +|------------|---------------| +| Promise kept | Body delivers what opening promised | +| Sensory details | At least one concrete detail per section | +| Paragraph purpose | Each paragraph advances the argument | +| Transitions | Movement between sections is smooth | +| No redundancy | No section repeats another's point | + +**Test**: Can you summarize each paragraph's contribution in 5 words? + +### Strategy Compliance + +| Checkpoint | Pass Criteria | +|------------|---------------| +| Baseline strategies | All 10 applied | +| Situational strategies | 3-4 selected and visible | +| One idea per sentence | No compound thoughts cramming | +| Technical orientation | Jargon explained in context | +| Active voice | <10% passive voice | + +**Test**: Read aloud. Does it flow? Are sentences clear? + +### Closing + +| Checkpoint | Pass Criteria | +|------------|---------------| +| Callback | References opening hook or promise | +| Action clear | Reader knows what to do next | +| Memorable | Last line could be quoted | +| No summary | Doesn't recap what was said | +| No apology | Doesn't hedge or qualify | + +**Test**: Would you tweet the last line? + +## Style Guide Compliance + +If a style guide is specified: + +### Voice +- [ ] Matches vocabulary patterns +- [ ] Matches sentence length targets +- [ ] Matches formality level +- [ ] Matches emotional register + +### Prohibitions +- [ ] No prohibited words used +- [ ] No prohibited patterns used +- [ ] No formatting violations + +### Requirements +- [ ] Required elements present +- [ ] Required structure followed +- [ ] Required attribution style used + +## Final Pass + +### Read Aloud Test +- [ ] Sentences sound natural when spoken +- [ ] No tongue-twisters +- [ ] Rhythm feels right + +### The Email Test +- [ ] Would send this to your smartest colleague +- [ ] Would feel good if it went viral +- [ ] Would stand behind every claim + +### The Cut Test +- [ ] Tried cutting 10%β€”kept only what survived +- [ ] No paragraph that could be cut without loss +- [ ] No sentence that doesn't earn its place + +## Checkpoint by Content Type + +### Blog Post +1. Hook grabs in first line +2. Subheads are standalone interesting +3. Skimmable (bold, bullets, headers) +4. CTA is clear + +### Newsletter +1. Personal tone established +2. Feels like a letter from a person +3. Value delivered early +4. Easy to forward + +### Social Post +1. Works without clicking through +2. Hook in first line (gets cut in feeds) +3. No wasted words +4. Visual element considered + +### Long-Form +1. Reader can stop after each section and feel complete +2. Sections build but also standalone +3. Pacing varies (tension and release) +4. Ending is earned + +## Red Flags + +Stop and fix if you see: + +| Red Flag | Fix | +|----------|-----| +| Opening starts with "I want to..." | Cut, start with the insight | +| Paragraph over 6 sentences | Split | +| "In this article, we will..." | Delete | +| Three or more "is/was" in a row | Activate verbs | +| Same word appears 3+ times nearby | Elegant variation | +| Quote without attribution | Add source or remove | +| Claim without evidence | Support or soften | +| Ending trails off | Find the punch | diff --git a/plugins/compound-writing/skills/writing-orchestration/references/situational-strategies.md b/plugins/compound-writing/skills/writing-orchestration/references/situational-strategies.md new file mode 100644 index 00000000..a6740b1c --- /dev/null +++ b/plugins/compound-writing/skills/writing-orchestration/references/situational-strategies.md @@ -0,0 +1,254 @@ +# 20+ Situational Writing Strategies + +Select 3-4 strategies based on content type and goals. Don't apply allβ€”choose what fits. + +## Hook & Opening Strategies + +### hook-effectiveness + +**Purpose**: Create openings that demand attention. + +**Techniques**: +- **Counterintuitive**: Challenge what readers believe +- **Surprising stat**: Data that defies expectations +- **In media res**: Start in the middle of action +- **Question**: One the reader genuinely wants answered + +**Test**: Would you keep reading if you saw this on a busy feed? + +### tension-builder + +**Purpose**: Create and resolve tension throughout. + +**Techniques**: +- Establish stakes early +- Create obstacles before solutions +- Use "but" and "however" strategically +- Delay resolution for impact + +**Pattern**: Setup β†’ Complication β†’ Resolution + +### pattern-twist + +**Purpose**: Set expectations, then break them. + +**Techniques**: +- Establish a pattern (three examples) +- Break on the fourth +- Use for humor or insight + +**Example**: "We tried ads. We tried SEO. We tried influencers. We tried talking to customers. That last one worked." + +--- + +## Structure & Flow Strategies + +### order-words-emphasis + +**Purpose**: Put important words where they land hardestβ€”at the end. + +**Techniques**: +- Move key terms to sentence end +- End paragraphs with punch +- Save reveals for last position + +**Transform**: "We need to focus on the customer." β†’ "Our focus must be the customer." + +### sentence-length + +**Purpose**: Vary length for rhythm and impact. + +**Guidelines**: +- **Short (1-5 words)**: For impact. Punch. Emphasis. +- **Medium (10-20 words)**: For information and flow. +- **Long (25+ words)**: For building, explaining, setting scenesβ€”but sparingly. + +**Pattern**: Mix deliberately. Three medium, one short. Repeat. + +### paragraph-length + +**Purpose**: Create visual rhythm on the page. + +**Guidelines**: +- One sentence paragraphs: For emphasis +- 2-3 sentence paragraphs: Standard +- 4+ sentence paragraphs: Use rarely + +Like this. + +### ladder-abstraction + +**Purpose**: Alternate between concrete and abstract. + +**Pattern**: +1. Concrete example +2. Abstract principle +3. Another concrete example +4. Broader implication + +**Why**: Concrete grounds understanding. Abstract provides meaning. Neither alone is sufficient. + +--- + +## Style & Voice Strategies + +### elegant-variation + +**Purpose**: Avoid awkward word repetition. + +**Techniques**: +- Use pronouns strategically +- Find true synonyms (not forced ones) +- Restructure to avoid repetition +- Sometimes, repetition is intentionalβ€”for emphasis + +**Warning**: Don't substitute "the social media giant" for "Facebook" constantly. That's worse. + +### passive-aggressive + +**Purpose**: Use passive voice strategically, not accidentally. + +**When passive works**: +- Actor is unknown: "The data was compromised" +- Actor is irrelevant: "The study was conducted in 2020" +- Emphasis on object: "The bill was passed" (focus on bill, not Congress) + +**Default**: Active voice. Reserve passive for strategic use. + +### punctuation-pace + +**Purpose**: Use punctuation to control reading rhythm. + +**Tools**: +- **Period**: Full stop. Finality. Impact. +- **Comma**: Pause, breath, continuation +- **Em dash**: Interruptionβ€”surpriseβ€”aside +- **Semicolon**: Connection between related ideas; used sparingly +- **Colon**: Introduction of what follows + +**Example**: "We had three optionsβ€”none of them good." + +### key-words-space + +**Purpose**: Give important terms room to breathe. + +**Techniques**: +- Don't cluster key terms together +- Space important words throughout +- Let each land before introducing the next + +**Wrong**: "The efficiency, productivity, and scalability improvements..." +**Right**: "Efficiency improved. So did productivity. Scalability followed." + +--- + +## Persuasion & Engagement Strategies + +### essential-name-filter + +**Purpose**: Include only names that add value. + +**Test**: Does naming this person/company/product serve the reader? + +**Keep**: Names that add credibility, context, or story +**Cut**: Names that are just noise + +### name-of-dog + +**Purpose**: Specific details create authenticity. + +**Technique**: Include the kind of detail only someone who was there would know. + +**Examples**: +- "Her golden retriever, Murphy, sat under the desk" +- "The server ran Ubuntu 18.04" +- "The email came at 2:47 AM" + +**Why**: Specificity = credibility. + +### original-images + +**Purpose**: Fresh metaphors over clichΓ©s. + +**ClichΓ©s to kill**: +- "thinking outside the box" +- "at the end of the day" +- "move the needle" +- "low-hanging fruit" +- "on the same page" + +**Technique**: If you've heard it before, find a new way to say it. + +### show-and-tell + +**Purpose**: Balance showing with telling. + +**When to show**: Emotional moments, key scenes, character +**When to tell**: Transitions, summaries, facts + +**Balance**: Show the important parts. Tell the rest. + +--- + +## Narrative & Story Strategies + +### narrate-scenes + +**Purpose**: Create immersive scene-setting. + +**Elements**: +- Sensory details (what you see, hear, feel) +- Action in progress +- Dialogue if relevant +- Specific time and place + +**Example**: "The office was empty except for Sarah, hunched over her laptop, the glow of Slack notifications reflecting off her glasses." + +### cinematic-angles + +**Purpose**: Use camera-like perspective shifts. + +**Techniques**: +- Wide shot: Establish context, setting +- Medium shot: Character and environment +- Close-up: Detail, emotion, significance +- Pull back: Broader meaning, reflection + +**Use for**: Feature articles, profiles, narrative pieces + +### dialogue-compression + +**Purpose**: Make dialogue tight and purposeful. + +**Rules**: +- Cut greetings and small talk +- Each line should advance story or reveal character +- Attribution ("he said") should be minimal +- Use beats (actions) instead of dialogue tags + +**Wrong**: "Hi, how are you?" "I'm fine, thanks. How are you?" +**Right**: [Cut entirely unless the pleasantries reveal something] + +### reveal-traits + +**Purpose**: Show character through action, not description. + +**Wrong**: "She was a perfectionist." +**Right**: "She realigned the pens on her desk for the third time." + +**Technique**: What would this person DO that shows their trait? + +--- + +## Strategy Selection Guide + +| Content Type | Recommended Strategies | +|--------------|----------------------| +| Blog post | hook-effectiveness, ladder-abstraction, sentence-length | +| Case study | narrate-scenes, name-of-dog, show-and-tell | +| Product launch | tension-builder, pattern-twist, key-words-space | +| Thought piece | hook-effectiveness, elegant-variation, order-words-emphasis | +| Tutorial | ladder-abstraction, sentence-length, paragraph-length | +| Profile | cinematic-angles, reveal-traits, dialogue-compression | +| Newsletter | hook-effectiveness, sentence-length, one-idea-per-sentence | +| Social post | hook-effectiveness, pattern-twist, sentence-length | From a1ce5cdced7f824dd94faca4bf30fd1a163bfa8e Mon Sep 17 00:00:00 2001 From: Kieran Klaassen Date: Fri, 16 Jan 2026 19:26:22 -0800 Subject: [PATCH 02/19] feat(compound-writing): Add scratchpad, context notes, and knowledge systems MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New commands: - /writing:feedback - Capture real-time preferences into scratchpad - /writing:knowledge - Manage voice profiles, patterns, and references New skills: - scratchpad - Session memory for iterative refinement - context-notes - Structured handoff protocol between commands Updates: - All commands now support context notes for seamless handoffs - Draft ID management for persistent tracking across session - Writing-orchestration skill integrated with scratchpad - README updated with comprehensive workflow documentation Component counts: 7 agents, 6 commands, 7 skills πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../.claude-plugin/plugin.json | 2 +- plugins/compound-writing/README.md | 408 ++++++++++++++---- .../commands/writing-compound.md | 32 +- .../commands/writing-draft.md | 63 +++ .../commands/writing-feedback.md | 255 +++++++++++ .../commands/writing-knowledge.md | 271 ++++++++++++ .../compound-writing/commands/writing-plan.md | 31 ++ .../commands/writing-review.md | 44 ++ .../skills/context-notes/SKILL.md | 260 +++++++++++ .../skills/scratchpad/SKILL.md | 251 +++++++++++ .../skills/writing-orchestration/SKILL.md | 77 +++- 11 files changed, 1610 insertions(+), 84 deletions(-) create mode 100644 plugins/compound-writing/commands/writing-feedback.md create mode 100644 plugins/compound-writing/commands/writing-knowledge.md create mode 100644 plugins/compound-writing/skills/context-notes/SKILL.md create mode 100644 plugins/compound-writing/skills/scratchpad/SKILL.md diff --git a/plugins/compound-writing/.claude-plugin/plugin.json b/plugins/compound-writing/.claude-plugin/plugin.json index edcea3c2..afee24d3 100644 --- a/plugins/compound-writing/.claude-plugin/plugin.json +++ b/plugins/compound-writing/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "compound-writing", "version": "1.0.0", - "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 4 workflow commands, and 5 skills for research, drafting, editing, and voice consistency.", + "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 6 workflow commands, and 7 skills for research, drafting, editing, and voice consistency.", "author": { "name": "Kieran Klaassen", "email": "kieran@every.to", diff --git a/plugins/compound-writing/README.md b/plugins/compound-writing/README.md index 8d6fb131..58235558 100644 --- a/plugins/compound-writing/README.md +++ b/plugins/compound-writing/README.md @@ -2,7 +2,7 @@ > Each unit of writing work should make subsequent units easierβ€”not harder. -AI-powered writing tools that apply compound engineering principles to content creation. Just as [compound-engineering](../compound-engineering/) captures coding patterns to accelerate development, compound-writing captures voice, style, and editorial preferences to accelerate writing. +AI-powered writing tools that apply compound engineering principles to content creation. Build a system that learns your voice, captures what works, and makes every piece of writing faster than the last. ## Installation @@ -12,41 +12,81 @@ claude /plugin install compound-writing ## Philosophy -**The 50/50 Rule**: Spend 50% improving your writing system (style guides, templates, voice documentation), 50% actually writing. This feels slow at first. Within weeks, the compounding becomes obvious. +**The Compound Effect**: Every piece you write teaches the system. Patterns get captured, preferences get encoded, and your next piece benefits from everything before it. -### The Compound Effect - -**Before Compound Writing:** ``` -Write β†’ Edit β†’ Publish β†’ Start from scratch -Write β†’ Edit β†’ Publish β†’ Start from scratch +Write β†’ Feedback β†’ Learn β†’ Write (faster) β†’ Feedback β†’ Learn β†’ Write (even faster) ``` -**After Compound Writing:** -``` -Write β†’ Edit β†’ Capture patterns β†’ Publish -Write (faster) β†’ Edit (patterns help) β†’ Capture β†’ Publish -Write (faster still) β†’ Minimal edit β†’ Capture β†’ Publish -``` +**The 50/50 Rule**: Spend 50% improving your writing system (voice profiles, patterns, feedback), 50% actually writing. This feels slow at first. Within weeks, the compounding becomes obvious. ## Quick Start ```bash -# Plan a new piece +# 1. Plan a piece with research claude /writing:plan "How to debug production issues" -# Draft from an outline +# 2. Draft from the outline claude /writing:draft drafts/debug-production/outline.md -# Run editorial review +# 3. Give feedback on drafts +claude /writing:feedback draft-2 love the opening stat +claude /writing:feedback draft-1 too formal + +# 4. Refine based on feedback +claude /writing:draft refine draft-2 + +# 5. Run editorial review claude /writing:review drafts/debug-production/draft-v1.md -# Capture what worked +# 6. Capture what worked claude /writing:compound drafts/debug-production/final.md ``` +## The Complete Workflow + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ COMPOUND WRITING FLOW β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ PLAN │────▢│ DRAFT │────▢│ REVIEW │────▢│ COMPOUND β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ β”‚ β”‚ β”‚ + β–Ό β–Ό β–Ό β–Ό + Research & 3 Draft Multi-Agent Extract + Outline Variations Editorial Patterns + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ FEEDBACK │◀─── Real-time preference capture + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚SCRATCHPAD│◀─── Session memory + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚KNOWLEDGE │◀─── Permanent patterns + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + ## Components +### Commands (6) + +| Command | Purpose | +|---------|---------| +| `/writing:plan` | Transform a topic into a researched outline with sources | +| `/writing:draft` | Execute an outline into prose with 3 variations | +| `/writing:review` | Multi-agent editorial review from every angle | +| `/writing:feedback` | Capture real-time preferences into scratchpad | +| `/writing:knowledge` | Manage voice profiles, patterns, and references | +| `/writing:compound` | Extract patterns from successful writing | + ### Agents (7) | Agent | Purpose | @@ -55,83 +95,263 @@ claude /writing:compound drafts/debug-production/final.md | `fact-checker` | Verify claims, check statistics, ensure accuracy | | `structure-architect` | Create outlines, analyze flow, generate hooks | | `voice-guardian` | Maintain voice consistency, calibrate tone | -| `clarity-editor` | Improve clarity, cut words, remove jargon, fix passive voice | +| `clarity-editor` | Improve clarity, cut words, remove jargon | | `publishing-optimizer` | Optimize for SEO, social media, newsletters | -| `every-style-editor` | Review and edit text against Every's style guide | - -### Commands (4) - -| Command | Purpose | -|---------|---------| -| `/writing:plan` | Transform a topic into a researched outline | -| `/writing:draft` | Execute an outline into prose with style guidance | -| `/writing:review` | Multi-agent editorial review | -| `/writing:compound` | Capture patterns from successful writing | +| `every-style-editor` | Review against Every's style guide | -### Skills (5) +### Skills (7) | Skill | Purpose | |-------|---------| +| `writing-orchestration` | Two-agent architecture with strategies and quality gates | +| `scratchpad` | Real-time feedback tracking for iterative refinement | +| `context-notes` | Structured handoffs between commands | | `pragmatic-writing` | Write like Hunt/Thomas and Joel Spolsky | | `dhh-writing` | Write in DHH's direct, opinionated style | | `voice-capture` | Extract and encode voice profiles from samples | -| `every-style-editor` | Review and edit copy against Every's style guide | -| `writing-orchestration` | Two-agent orchestration with strategies and quality gates | +| `every-style-editor` | Every's editorial style guide | + +## Core Systems + +### 1. The Scratchpad (Session Memory) + +The scratchpad captures your preferences in real-time: + +```bash +# Mark what you like +/writing:feedback draft-2 love the punchy opening + +# Mark what you don't +/writing:feedback draft-1 too corporate, sounds like a press release + +# General preferences +/writing:feedback general prefer short sentences, data-driven +``` -## The Four-Phase Workflow +The scratchpad builds a preference profile: -### Phase 1: `/writing:plan` β€” Research & Outline +```markdown +## What Works βœ“ +- Data-driven openings +- Conversational tone +- Short punchy sentences -Transform a topic into a structured outline with sources. +## What Doesn't βœ— +- Corporate/formal language +- Long paragraphs +- Abstract concepts without examples +``` -- **Parallel research**: Sources, audience, competitors -- **Two-gate assessment**: Material sufficiency, message clarity -- **Output**: `drafts/{slug}/outline.md` +Every subsequent draft reads the scratchpad and adapts. -### Phase 2: `/writing:draft` β€” Execute Outline +### 2. The Knowledge Base (Permanent Memory) -Transform outline into prose following style preferences. +Your writing knowledge compounds over time: -- **Voice matching**: Apply voice profiles and style guides -- **Producer-critic loop**: Voice guardian feedback until score β‰₯85 -- **Output**: `drafts/{slug}/draft-v1.md` +```bash +# Search for techniques +/writing:knowledge search "hooks for technical content" -### Phase 3: `/writing:review` β€” Multi-Agent Editorial +# Add a new pattern +/writing:knowledge add pattern "The Callback Close - end by referencing the opening" + +# Import your voice from samples +/writing:knowledge import voice-profile my-best-posts/*.md +``` + +Knowledge structure: +``` +.claude/writing-knowledge/ +β”œβ”€β”€ voice-profiles/ # Your encoded voices +β”œβ”€β”€ patterns/ # Proven techniques +β”‚ β”œβ”€β”€ hooks/ +β”‚ β”œβ”€β”€ structures/ +β”‚ └── transitions/ +└── references/ # Style guides & exemplars +``` -Exhaustive parallel review from multiple perspectives. +### 3. Context Notes (Handoff Protocol) -- **Core reviews**: Voice, clarity, facts, structure -- **Style reviews**: Every, DHH, Pragmatic (based on context) -- **Interactive triage**: Accept, skip, or customize each fix +Commands pass structured context to each other: -### Phase 4: `/writing:compound` β€” Capture Patterns +```markdown + +## Research Summary +Researched AI adoption. 73% of hospitals now use AI diagnostics. -Turn successful writing into permanent improvements. +## Material Available +- Stat: 73% hospital AI adoption +- Case: Mayo Clinic 40% improvement +- Quote: "AI is the stethoscope of the 21st century" -- **Extract patterns**: Hooks, structures, transitions, voice elements -- **Update documentation**: Add to pattern library -- **Create templates**: For similar future pieces +## Message Clarity +**Thesis**: AI diagnostics are becoming standard of care +**Audience**: Hospital administrators +**Desired Action**: Request a demo + +## Voice Configuration +**Profile**: kieran-blog +**Channel**: blog + +## Mode +EXPLORATION + +``` + +### 4. Draft ID Tracking + +Every draft gets a unique, persistent ID: + +``` +Response 1: draft-1, draft-2, draft-3 (exploration) +Response 2: draft-4, draft-5, draft-6 (new exploration) +Response 3: draft-2 refined (keeps original ID) +``` + +Reference specific drafts in feedback: +```bash +/writing:feedback draft-2 perfect opening +/writing:draft refine draft-2 +``` + +## Two-Agent Architecture + +Complex writing benefits from separation of concerns: + +### Orchestrator Role +- Classifies requests (research vs. content) +- Applies two-gate assessment +- Gathers materials and context +- Hands off when ready + +### Writer Role +- Creates drafts using strategies +- Applies voice profiles +- Produces 3 variations (exploration) or 1 (refinement) +- Incorporates scratchpad preferences + +### Two-Gate Assessment + +Before any content creation: + +**Gate 1: Material Sufficiency** +> "Could we create this without inventing facts?" +- βœ“ Have concrete examples +- βœ“ Have data/statistics +- βœ— Would need to make things up + +**Gate 2: Message Clarity** +> "Do we know exactly what message to convey?" +- βœ“ Clear thesis +- βœ“ Specific audience +- βœ— Vague "write about this" + +## Writing Strategies + +### 10 Baseline Strategies (Always Apply) + +| Strategy | Rule | +|----------|------| +| reader-zero-context | Add orienting phrases for unfamiliar terms | +| subject-verb-first | Subject + verb in first 5 words | +| activate-verbs | Precise verbs over is/was | +| watch-adverbs | Let strong verbs carry the load | +| limit-ings | Simple tense over continuous | +| prefer-simple | Everyday language unless technical | +| cut-big-small | Edit hierarchically (paragraphs β†’ sentences β†’ words) | +| ban-empty-hypophora | No self-answered questions | +| present-active-tense | Direct, immediate language | +| one-idea-per-sentence | Single clear point per sentence | + +### 20+ Situational Strategies (Select 3-4) + +**Hooks**: hook-effectiveness, tension-builder, pattern-twist +**Structure**: ladder-abstraction, sentence-length, paragraph-length +**Style**: elegant-variation, punctuation-pace, key-words-space +**Narrative**: narrate-scenes, cinematic-angles, reveal-traits + +## Modes: Exploration vs. Refinement + +### Exploration Mode (3 Drafts) +When to use: +- New content request +- "Show me different options" +- Unsure about direction + +What happens: +- Creates exactly 3 variations +- Each with a different angle/approach +- User picks one to refine + +### Refinement Mode (1 Draft) +When to use: +- User selected a specific draft +- "Make this punchier" +- Clear direction established + +What happens: +- Works on single draft +- Keeps original draft ID +- Applies specific feedback + +## Example Session + +```bash +# Start with a topic +$ claude /writing:plan "Why most code reviews are useless" + +# Plan creates outline.md and sources.md +# Context notes passed forward + +$ claude /writing:draft drafts/code-reviews/outline.md + +# Creates draft-1, draft-2, draft-3 +# Each with different angle + +$ claude /writing:feedback draft-2 the opening hook is fire +$ claude /writing:feedback draft-1 too academic + +# Scratchpad learns: prefer punchy hooks, avoid academic tone + +$ claude /writing:draft refine draft-2 + +# Creates refined draft-2 using scratchpad preferences + +$ claude /writing:review draft-2 + +# Parallel agents check: voice, clarity, facts, structure +# Returns prioritized issues + +$ claude /writing:feedback draft-2 perfect + +$ claude /writing:compound draft-2 + +# Extracts winning patterns to knowledge base: +# - The hook formula used +# - The structure that worked +# - The voice elements that landed +``` ## Voice Profiles -Voice profiles encode writing style in three layers: +Encode your writing style in a profile: ```yaml voice: name: "kieran-blog" - # Layer 1: Immutable Traits + # Immutable traits traits: [direct, conversational, technically-informed] register: informal - prohibited: ["synergy", passive voice in openings] + prohibited: ["synergy", "leverage", passive voice in openings] - # Layer 2: Channel Guidance + # Channel guidance channels: blog: "longer form, storytelling allowed" social: "punchy, hooks required" newsletter: "personality forward" - # Layer 3: Example Library + # Example library exemplars: - path: "samples/great-opening.md" why: "Concrete example first, theory second" @@ -139,39 +359,75 @@ voice: ## Quality Gates -### Gate 1: Material Sufficiency -"Could the writer create this without inventing facts?" - -### Gate 2: Message Clarity -"Do we know the specific message to convey?" +### Pre-Draft +- [ ] Material sufficiency verified +- [ ] Message clarity confirmed +- [ ] Voice profile loaded -### Gate 3: Style Compliance -"Does it match the voice and style guide?" +### Post-Draft +- [ ] Opening hooks in first 50 words +- [ ] No paragraph over 4 sentences +- [ ] Concrete example in each section +- [ ] All claims supported +- [ ] Voice score β‰₯ 85 -### Gate 4: Factual Accuracy -"Are all claims supported?" +### Post-Review +- [ ] Critical issues addressed +- [ ] Important issues triaged +- [ ] Voice consistency verified -## Pattern Capture System +## Pattern Library -Patterns are stored in `docs/patterns/`: +Patterns are stored and searchable: ``` docs/patterns/ -β”œβ”€β”€ common-patterns.md # Index -β”œβ”€β”€ hooks/ # Hook formulas that work -β”œβ”€β”€ structures/ # Successful article structures -β”œβ”€β”€ transitions/ # Transition phrases that flow -└── voice/ # Voice pattern captures +β”œβ”€β”€ hooks/ # Opening formulas +β”‚ └── stat-surprise.md +β”œβ”€β”€ structures/ # Article architectures +β”‚ └── problem-solution.md +β”œβ”€β”€ transitions/ # Flow techniques +└── closings/ # Ending formulas + └── callback-close.md ``` +Each pattern includes: +- Formula with placeholders +- Usage count and success rate +- Examples from your writing +- When to use / when to avoid + ## Integration with Compound Engineering This plugin complements the compound-engineering plugin: -- **compound-engineering**: Code, systems, development workflows -- **compound-writing**: Content, prose, editorial workflows +| compound-engineering | compound-writing | +|---------------------|------------------| +| Code, systems, dev workflows | Content, prose, editorial | +| Code review agents | Editorial review agents | +| Pattern capture for code | Pattern capture for prose | + +Both follow the same philosophy: each unit of work makes the next easier. + +## File Structure -Both follow the same philosophy: each unit of work should make the next easier. +``` +project/ +β”œβ”€β”€ .claude/ +β”‚ └── writing-knowledge/ +β”‚ β”œβ”€β”€ voice-profiles/ +β”‚ β”œβ”€β”€ patterns/ +β”‚ └── references/ +└── drafts/ + β”œβ”€β”€ .scratchpad.md # Session feedback + β”œβ”€β”€ .context.md # Persistent context + └── [slug]/ + β”œβ”€β”€ outline.md + β”œβ”€β”€ sources.md + β”œβ”€β”€ draft-v1.md + β”œβ”€β”€ draft-v2.md + └── review-v1.md +``` ## License diff --git a/plugins/compound-writing/commands/writing-compound.md b/plugins/compound-writing/commands/writing-compound.md index 950583ea..8c990847 100644 --- a/plugins/compound-writing/commands/writing-compound.md +++ b/plugins/compound-writing/commands/writing-compound.md @@ -39,10 +39,12 @@ This command extracts what worked and encodes it for reuse: Read the final published version Read all draft versions (v1, v2, etc.) Read review reports +Read scratchpad (drafts/.scratchpad.md) for session feedback Identify: - What changed between drafts - What reviewers praised - What the writer kept unchanged +- What the scratchpad marked as "What Works βœ“" ``` ### Identify What Worked @@ -309,10 +311,38 @@ Next similar piece will benefit from: [specific improvements] 3. **Review pattern library** - See all accumulated patterns 4. **Export voice profile** - Save voice profile for sharing +## Phase 6: Promote Scratchpad to Patterns + +### Persist Session Learnings +From the scratchpad, promote recurring preferences to permanent patterns: + +``` +If preference appeared 3+ times in scratchpad: + - Extract to pattern library + - Add to voice profile + - Clear from scratchpad +``` + +### Update Knowledge Base +Add to `.claude/writing-knowledge/`: +- New patterns discovered +- Voice profile refinements +- Anti-patterns to avoid + +### Clear Session Scratchpad +After compounding: +- Archive scratchpad entries that were promoted +- Keep only session-specific notes +- Reset for next writing session + ## The Compound Loop ``` -Write β†’ Review β†’ Edit β†’ Compound β†’ +Write β†’ Feedback β†’ Review β†’ Edit β†’ Compound β†’ + ↓ +Scratchpad captures preferences + ↓ +Compound promotes patterns to knowledge ↓ Next piece starts with more patterns ↓ diff --git a/plugins/compound-writing/commands/writing-draft.md b/plugins/compound-writing/commands/writing-draft.md index 2fe5bb60..1fb92966 100644 --- a/plugins/compound-writing/commands/writing-draft.md +++ b/plugins/compound-writing/commands/writing-draft.md @@ -12,6 +12,8 @@ Execute an outline into prose, following style preferences and voice profiles. #$ARGUMENTS +If the input is "refine [draft-ID]", enter REFINEMENT mode with that specific draft. + ## Workflow Overview This command executes the **drafting phase**: @@ -23,6 +25,24 @@ This command executes the **drafting phase**: ## Phase 1: Load Context +### Read Context Notes +If context notes were passed from `/writing:plan`, extract: +- Research summary +- Material available +- Message clarity (thesis, audience, action) +- Voice configuration +- Mode (EXPLORATION or REFINEMENT) + +### Read Scratchpad +Check `drafts/.scratchpad.md` for session preferences: +``` +If scratchpad exists: + - Load "What Works βœ“" patterns + - Load "What Doesn't βœ—" anti-patterns + - Apply recency weighting (recent feedback > older) + - Use preference profile to guide strategy selection +``` + ### Read Outline and Research ``` Read the outline file at [outline_path] @@ -195,3 +215,46 @@ After creating draft, use AskUserQuestion: - Review outline section estimates - Cut less essential sections for shorter - Expand examples for longer + +## Draft ID Management + +Every draft gets a unique, persistent ID: + +``` +Response 1: draft-1, draft-2, draft-3 (exploration) +Response 2: draft-4, draft-5, draft-6 (new exploration) +Response 3: draft-2 refined (keeps original ID) +``` + +- IDs persist across the session +- Never reuse IDs +- Refinements keep original draft ID +- New explorations increment + +## Context Notes Output + +After creating drafts, output context notes for handoff: + +```markdown + +## Draft Status +- Version: [draft-v1] +- Word count: [count] +- Voice score: [score] (target: 85) +- Drafts created: [count] (user selected: [ID if applicable]) + +## Strategies Applied +- Baseline: All 10 applied +- Situational: [strategy-1], [strategy-2], [strategy-3] + +## Known Issues +- [Any identified weaknesses] + +## Scratchpad Summary +- βœ“ [Preference applied from scratchpad] +- βœ— [Anti-pattern avoided from scratchpad] + +## Mode +[EXPLORATION or REFINEMENT] + +``` diff --git a/plugins/compound-writing/commands/writing-feedback.md b/plugins/compound-writing/commands/writing-feedback.md new file mode 100644 index 00000000..912eb6a5 --- /dev/null +++ b/plugins/compound-writing/commands/writing-feedback.md @@ -0,0 +1,255 @@ +--- +name: writing:feedback +description: Capture real-time feedback into scratchpad for iterative refinement +argument-hint: "[draft ID or 'general'] [feedback text]" +--- + +# Writing Feedback Command + +Capture what works and what doesn't into a persistent scratchpad that guides future drafts. + +## Input + + #$ARGUMENTS + +Parse input: +- First word: Draft ID (e.g., "draft-1", "3") or "general" +- Rest: The feedback text + +## The Scratchpad System + +The scratchpad is a persistent feedback log at `drafts/.scratchpad.md` that: +- Tracks preferences marked as "good" or "bad" +- Records specific draft feedback with IDs +- Builds a profile of what resonates +- Informs all future drafts in the session + +## Workflow + +### Phase 1: Parse Feedback + +``` +Extract from input: +- target: Draft ID or "general" +- sentiment: Detect if positive ("good", "love", "yes", "perfect") + or negative ("bad", "weak", "no", "wrong") +- content: The actual feedback +- timestamp: Current time +``` + +### Phase 2: Categorize Feedback + +Analyze feedback for patterns: + +```markdown +## Feedback Categories + +### Voice & Tone +- Too formal / too casual +- Personality level +- Emotional register + +### Structure & Flow +- Opening strength +- Pacing issues +- Transition problems + +### Content & Substance +- Missing examples +- Weak claims +- Good insights + +### Style & Language +- Word choice +- Sentence rhythm +- Jargon level +``` + +### Phase 3: Update Scratchpad + +Append to `drafts/.scratchpad.md`: + +```markdown +--- +## Feedback Entry [timestamp] + +**Target**: [draft ID or general] +**Sentiment**: [positive/negative/neutral] +**Category**: [voice/structure/content/style] + +> [Original feedback text] + +**Extracted Principle**: [What this tells us about preferences] + +--- +``` + +### Phase 4: Extract Principles + +From feedback, extract actionable principles: + +| Feedback | Principle | +|----------|-----------| +| "draft-2's opening is too weak" | Openings need stronger hooks | +| "love the stats in draft-1" | Data points resonate | +| "too formal" | Prefer conversational tone | +| "the analogy about gardening was perfect" | Concrete analogies work | + +### Phase 5: Summarize Patterns + +After 3+ feedback entries, generate a preference summary: + +```markdown +## Preference Profile (Auto-Generated) + +### What Works βœ“ +- [Pattern 1 with example] +- [Pattern 2 with example] + +### What Doesn't βœ— +- [Anti-pattern 1] +- [Anti-pattern 2] + +### Voice Tendency +- [Inferred voice preference] + +### Strategy Recommendations +Based on feedback, prioritize these situational strategies: +- [strategy-1]: Because [reason from feedback] +- [strategy-2]: Because [reason from feedback] +``` + +## Output + +### Updated Scratchpad + +Save to `drafts/.scratchpad.md`: + +```markdown +--- +updated: [timestamp] +entries: [count] +--- + +# Writing Scratchpad + +## Preference Profile + +### What Works βœ“ +- Data and statistics resonate +- Conversational tone preferred +- Concrete examples > abstract concepts + +### What Doesn't βœ— +- Overly formal language +- Weak openings +- Generic statements without proof + +## Recent Feedback + +[Most recent 10 entries] + +## All Feedback Log + +[Complete history] +``` + +### Confirmation + +```markdown +βœ“ Feedback captured for [target] + +**Extracted**: [principle] +**Category**: [category] +**Pattern count**: [N] entries + +The scratchpad now reflects: +- [Key preference 1] +- [Key preference 2] + +Next drafts will incorporate these preferences. +``` + +## Quick Feedback Shortcuts + +For fast feedback capture: + +```bash +# Mark something as good +/writing:feedback 2 good - love the opening hook + +# Mark something as bad +/writing:feedback 3 bad - too formal, sounds corporate + +# General preference +/writing:feedback general prefer short punchy sentences + +# Quick thumbs +/writing:feedback 1 πŸ‘ +/writing:feedback 2 πŸ‘Ž +``` + +## Integration with Other Commands + +### /writing:draft reads scratchpad +``` +Before creating drafts: +1. Load drafts/.scratchpad.md +2. Extract preference profile +3. Apply principles to strategy selection +4. Weight recent feedback higher +``` + +### /writing:review considers scratchpad +``` +During review: +1. Check draft against scratchpad preferences +2. Flag violations of "What Doesn't Work" +3. Highlight alignment with "What Works" +``` + +### /writing:compound updates patterns +``` +When compounding: +1. Merge scratchpad insights into pattern library +2. Promote recurring preferences to permanent patterns +3. Clear session-specific feedback +``` + +## Scratchpad Lifecycle + +``` +Session Start + ↓ +/writing:feedback β†’ Add entries + ↓ +/writing:draft β†’ Read & apply + ↓ +/writing:feedback β†’ Refine preferences + ↓ +/writing:draft β†’ Better alignment + ↓ +/writing:compound β†’ Persist to patterns + ↓ +Session End (scratchpad can persist or clear) +``` + +## Advanced: Preference Conflicts + +When feedback seems contradictory: + +```markdown +## Conflict Detected + +Entry 1: "too casual" +Entry 5: "too formal" + +**Resolution**: Ask user to clarify +"I'm seeing mixed signals on formality. Entry 1 suggested more formal, +but Entry 5 suggests more casual. What's the right balance for this piece?" +``` + +## Example Session + +``` +User: /writing:feedback 1 the opening stat really grabbed me \ No newline at end of file diff --git a/plugins/compound-writing/commands/writing-knowledge.md b/plugins/compound-writing/commands/writing-knowledge.md new file mode 100644 index 00000000..9450b3f3 --- /dev/null +++ b/plugins/compound-writing/commands/writing-knowledge.md @@ -0,0 +1,271 @@ +--- +name: writing:knowledge +description: Manage workspace knowledge - voice profiles, patterns, and reference materials +argument-hint: "[add|search|list] [content or query]" +--- + +# Writing Knowledge Command + +Build and query your writing knowledge base - voice profiles, proven patterns, and reference materials. + +## Input + + #$ARGUMENTS + +Parse: +- Action: `add`, `search`, `list`, `import` +- Content: Query string or content to add + +## Knowledge Architecture + +``` +.claude/writing-knowledge/ +β”œβ”€β”€ voice-profiles/ # Encoded writing voices +β”‚ β”œβ”€β”€ kieran-blog.yaml +β”‚ └── company-formal.yaml +β”œβ”€β”€ patterns/ # Proven patterns +β”‚ β”œβ”€β”€ hooks/ +β”‚ β”œβ”€β”€ structures/ +β”‚ └── transitions/ +β”œβ”€β”€ references/ # Source materials +β”‚ β”œβ”€β”€ style-guides/ +β”‚ └── exemplars/ +└── index.md # Searchable index +``` + +## Actions + +### `search` - Find Relevant Knowledge + +```bash +/writing:knowledge search "opening hooks for technical content" +``` + +**Process**: +1. Search voice profiles for relevant traits +2. Search patterns for matching techniques +3. Search references for examples +4. Rank by relevance and recency + +**Output**: +```markdown +## Knowledge Search: "opening hooks for technical content" + +### Voice Profile Match +**kieran-blog** recommends: +- Lead with counterintuitive insight +- Concrete before abstract + +### Relevant Patterns +**hook-stat-surprise** (used 12x, 89% positive feedback) +> "Most developers spend 40% of their time..." + +**hook-question-challenge** (used 8x, 75% positive) +> "What if everything you knew about X was wrong?" + +### Reference Examples +From `exemplars/best-openings.md`: +- [Example 1 with source] +- [Example 2 with source] +``` + +### `add` - Add New Knowledge + +```bash +/writing:knowledge add pattern "The Callback Close - end by referencing the opening hook" +``` + +**Process**: +1. Categorize the knowledge (pattern/voice/reference) +2. Extract key attributes +3. Add to appropriate location +4. Update searchable index + +### `list` - Browse Knowledge + +```bash +/writing:knowledge list patterns +/writing:knowledge list voice-profiles +/writing:knowledge list references +``` + +### `import` - Import from External Source + +```bash +/writing:knowledge import voice-profile samples/writing-samples/*.md +/writing:knowledge import patterns competitor-analysis.md +``` + +## Two-Level Knowledge System + +### Level 1: Instant Access (Brief) +Core facts loaded into every writing session: +- Active voice profile traits +- Top 5 proven patterns +- Key prohibitions + +### Level 2: Deep Lookup (Search) +Full knowledge base queried on demand: +- All pattern variations +- Complete exemplar library +- Historical feedback data + +## Knowledge Index + +The index at `.claude/writing-knowledge/index.md`: + +```markdown +--- +updated: 2025-01-16 +profiles: 3 +patterns: 47 +references: 12 +--- + +# Writing Knowledge Index + +## Quick Stats +- **Most used pattern**: hook-stat-surprise (34 uses) +- **Best performing**: callback-close (94% positive) +- **Active voice**: kieran-blog + +## Categories + +### Hooks (12 patterns) +- hook-stat-surprise: Lead with surprising statistic +- hook-question: Open with provocative question +- hook-story: In media res narrative +... + +### Structures (8 patterns) +- structure-problem-solution: Classic persuasion arc +- structure-listicle: Numbered insights +... + +### Transitions (15 patterns) +... + +### Closings (7 patterns) +... + +## Voice Profiles +- kieran-blog: Conversational, direct, technically-informed +- company-formal: Professional, precise, authoritative +- newsletter: Personal, warm, insight-forward +``` + +## Integration with Commands + +### /writing:plan +``` +Before planning: +- Load Level 1 knowledge (brief) +- Check for relevant patterns +- Apply voice profile constraints +``` + +### /writing:draft +``` +During drafting: +- Query Level 2 for specific techniques +- Match patterns to content type +- Enforce voice profile rules +``` + +### /writing:review +``` +During review: +- Check against voice profile +- Verify pattern usage +- Flag knowledge violations +``` + +### /writing:compound +``` +After success: +- Extract new patterns +- Update index +- Reinforce what worked +``` + +## Building Your Knowledge Base + +### Start with Voice Profile +```bash +# Capture your voice from samples +/writing:knowledge import voice-profile my-best-posts/*.md + +# Or define manually +/writing:knowledge add voice-profile "direct, uses analogies, avoids jargon" +``` + +### Add Patterns as You Write +```bash +# After a successful piece +/writing:compound draft-final.md + +# Manually add a technique +/writing:knowledge add pattern hooks "Start with the ending - reveal outcome first" +``` + +### Import References +```bash +# Add style guides +/writing:knowledge import reference company-style-guide.pdf + +# Add exemplars +/writing:knowledge import exemplar best-blog-post.md "Great hook technique" +``` + +## Knowledge Queries + +Natural language queries work: + +```bash +/writing:knowledge search "how do I write better openings?" +/writing:knowledge search "examples of data-driven hooks" +/writing:knowledge search "what does kieran-blog voice sound like?" +/writing:knowledge search "patterns for technical tutorials" +``` + +## Knowledge Lifecycle + +``` +Write β†’ Get Feedback β†’ Compound β†’ Knowledge grows + ↑ ↓ + ←←←←← Future writing benefits ←←←←←← +``` + +Each successful piece adds to knowledge: +- New patterns discovered +- Voice profile refined +- Feedback integrated + +## Example: Building Hook Knowledge + +```markdown +## Pattern: hook-stat-surprise + +**Category**: hooks +**Uses**: 34 +**Success Rate**: 89% + +**Formula**: +"[Surprising statistic]. [Why it matters]. [What we'll explore]." + +**Examples**: +1. "Developers spend 40% of their time debugging. That's 2 days a week lost. Here's how to cut it in half." +2. "93% of written content never gets read past the headline. Yours doesn't have to be one of them." + +**When to use**: +- Technical content +- Persuasive pieces +- Data-rich topics + +**Variations**: +- Lead with the stat +- Lead with the implication +- Lead with the question the stat answers + +**Source**: Extracted from top-performing posts 2024-2025 +``` diff --git a/plugins/compound-writing/commands/writing-plan.md b/plugins/compound-writing/commands/writing-plan.md index ab0caa52..6f002c9e 100644 --- a/plugins/compound-writing/commands/writing-plan.md +++ b/plugins/compound-writing/commands/writing-plan.md @@ -152,6 +152,37 @@ drafts/ └── sources.md # Source list with citations ``` +## Context Notes Output + +After creating the outline, output context notes for handoff to `/writing:draft`: + +```markdown + +## Research Summary +[2-3 sentences summarizing the research phase] + +## Material Available +- [Concrete example 1] +- [Data point 1] +- [Quote or source 1] + +## Message Clarity +**Thesis**: [One sentence thesis] +**Audience**: [Specific audience] +**Desired Action**: [What reader should do] + +## Voice Configuration +**Profile**: [voice profile name or "infer"] +**Style Guide**: [style guide name or "none"] +**Channel**: [blog/newsletter/social/docs] + +## Mode +EXPLORATION + +``` + +These notes pass to the draft command for seamless handoff. + ## Post-Planning Options After creating the outline, use AskUserQuestion: diff --git a/plugins/compound-writing/commands/writing-review.md b/plugins/compound-writing/commands/writing-review.md index f859c108..16370cdd 100644 --- a/plugins/compound-writing/commands/writing-review.md +++ b/plugins/compound-writing/commands/writing-review.md @@ -33,6 +33,22 @@ Extract: - Word count - Style used - Voice profile (if any) +- Draft ID (e.g., draft-2) +``` + +### Read Context Notes +If context notes were passed from `/writing:draft`: +- Load strategies applied +- Check known issues +- Load scratchpad summary + +### Read Scratchpad +Check `drafts/.scratchpad.md` for session preferences: +``` +If scratchpad exists: + - Load preference profile + - Use "What Works βœ“" to validate draft alignment + - Flag "What Doesn't βœ—" violations as issues ``` ### Load Review Context @@ -256,3 +272,31 @@ Review is complete when: - [ ] All claims verified or flagged - [ ] Flow analysis passed - [ ] Style guide compliance checked +- [ ] Scratchpad preferences honored + +## Context Notes Output + +After review, output context notes for handoff to revision: + +```markdown + +## Review Summary +- Critical issues: [count] +- Important issues: [count] +- Polish issues: [count] + +## Accepted Fixes +1. [Fix 1 description] +2. [Fix 2 description] + +## Rejected Fixes +1. [Rejected fix with reason] + +## Scratchpad Updates +- New preference learned: [if applicable] +- Conflict detected: [if applicable] + +## Mode +REFINEMENT (working on [draft-ID]) + +``` diff --git a/plugins/compound-writing/skills/context-notes/SKILL.md b/plugins/compound-writing/skills/context-notes/SKILL.md new file mode 100644 index 00000000..a72aca52 --- /dev/null +++ b/plugins/compound-writing/skills/context-notes/SKILL.md @@ -0,0 +1,260 @@ +--- +name: context-notes +description: Structured context passing protocol between writing commands. Ensures seamless handoffs with all necessary information preserved. +--- + +# Context Notes Skill + +A protocol for passing structured context between writing commands, ensuring nothing gets lost in handoffs. + +## When to Use This Skill + +This skill applies when: +- Handing off from plan to draft +- Passing review findings to revision +- Preserving research across commands +- Maintaining continuity in multi-step workflows + +## The Context Notes Block + +Every command handoff includes a context notes block: + +```markdown + +## Research Summary +[2-3 sentences of gathered research] + +## Material Available +- [Concrete example 1] +- [Data point 1] +- [Quote or source 1] + +## Message Clarity +**Thesis**: [One sentence thesis] +**Audience**: [Specific audience] +**Desired Action**: [What reader should do] + +## Voice Configuration +**Profile**: [voice profile name or "infer"] +**Style Guide**: [style guide name or "none"] +**Channel**: [blog/newsletter/social/docs] + +## Mode +[EXPLORATION or REFINEMENT] + +## Scratchpad Summary +[Key preferences from scratchpad] + +``` + +## Context Flow Between Commands + +### /writing:plan β†’ /writing:draft + +```markdown + +## Research Summary +Researched AI adoption in healthcare. Found 73% of hospitals now use AI diagnostics. +Mayo Clinic case study shows 40% faster diagnosis times. + +## Material Available +- Stat: 73% hospital AI adoption (source: HealthTech 2025) +- Case: Mayo Clinic 40% improvement +- Quote: "AI is the stethoscope of the 21st century" - Dr. Sarah Chen + +## Message Clarity +**Thesis**: AI diagnostics are becoming standard of care, not optional +**Audience**: Hospital administrators considering AI investment +**Desired Action**: Request a demo of our AI platform + +## Voice Configuration +**Profile**: kieran-blog +**Style Guide**: none +**Channel**: blog + +## Mode +EXPLORATION + +``` + +### /writing:draft β†’ /writing:review + +```markdown + +## Draft Status +- Version: draft-v1 +- Word count: 847 +- Voice score: 82 (target: 85) +- Drafts created: 3 (user selected draft-2) + +## Strategies Applied +- Baseline: All 10 applied +- Situational: hook-stat-surprise, ladder-abstraction, tension-builder + +## Known Issues +- Opening may need strengthening (voice score dip) +- Paragraph 4 is dense (consider breaking) + +## Scratchpad Summary +- βœ“ User prefers data-driven openings +- βœ— User dislikes formal tone + +``` + +### /writing:review β†’ /writing:draft (revision) + +```markdown + +## Review Summary +- Critical issues: 2 +- Important issues: 4 +- Polish issues: 3 + +## Accepted Fixes +1. Strengthen opening with specific stat (was too vague) +2. Break paragraph 4 into two +3. Replace passive voice in conclusion + +## Rejected Fixes +1. Adding more technical jargon (user prefers accessible) + +## Mode +REFINEMENT (working on draft-2) + +``` + +## Context Notes Protocol + +### Required Fields + +Every context notes block MUST include: + +| Field | Required For | Purpose | +|-------|--------------|---------| +| Message Clarity | planβ†’draft | Ensures writer knows the goal | +| Material Available | planβ†’draft | Prevents fact invention | +| Voice Configuration | all handoffs | Maintains consistency | +| Mode | draft commands | Determines draft count | +| Draft Status | review handoffs | Tracks versions | + +### Optional Fields + +| Field | When to Include | +|-------|-----------------| +| Research Summary | When research was performed | +| Scratchpad Summary | When feedback exists | +| Known Issues | When issues are pre-identified | +| Accepted/Rejected Fixes | After review triage | + +## Two-Gate Assessment in Context + +Context notes encode the two-gate assessment results: + +### Gate 1: Material Sufficiency +```markdown +## Material Available +- [List of concrete materials] +- [No invented facts needed] +``` +If this section is empty or vague β†’ Gate 1 failed β†’ need more research + +### Gate 2: Message Clarity +```markdown +## Message Clarity +**Thesis**: [Clear one-sentence thesis] +**Audience**: [Specific audience] +**Desired Action**: [Clear CTA] +``` +If any field is vague β†’ Gate 2 failed β†’ need clarification + +## Context Preservation + +### What Gets Preserved +- Research findings +- User preferences (scratchpad) +- Voice configuration +- Draft history and IDs + +### What Gets Fresh Each Command +- Strategy selection (based on current content) +- Quality scores +- Issue lists + +## Example: Full Workflow Context Flow + +``` +/writing:plan "AI in healthcare" + β”‚ + β”œβ”€ Outputs: outline.md + β”œβ”€ Outputs: sources.md + └─ Outputs: with research + message clarity + β”‚ + β–Ό +/writing:draft (receives context_notes) + β”‚ + β”œβ”€ Reads: context_notes + β”œβ”€ Reads: scratchpad preferences + β”œβ”€ Creates: draft-1, draft-2, draft-3 + └─ Outputs: with draft status + β”‚ + β–Ό +/writing:feedback draft-2 "love it, but opening is weak" + β”‚ + └─ Updates: scratchpad + β”‚ + β–Ό +/writing:review draft-2 (receives context_notes + scratchpad) + β”‚ + β”œβ”€ Reads: context_notes (voice, strategies) + β”œβ”€ Reads: scratchpad (preferences) + β”œβ”€ Runs: parallel agent reviews + └─ Outputs: with review findings + β”‚ + β–Ό +/writing:draft refine draft-2 (REFINEMENT mode) + β”‚ + β”œβ”€ Reads: context_notes (accepted fixes) + β”œβ”€ Reads: scratchpad (preferences) + └─ Outputs: refined draft-2 + β”‚ + β–Ό +/writing:compound draft-2 + β”‚ + β”œβ”€ Reads: full context history + └─ Extracts: patterns to knowledge base +``` + +## Context Notes File + +For long-running projects, context can persist in `drafts/.context.md`: + +```markdown +--- +project: "AI Healthcare Blog Series" +created: 2025-01-16 +last_updated: 2025-01-16 +--- + +# Project Context + +## Research Archive +[All research from plan phase] + +## Voice Configuration +[Locked voice settings] + +## Session History +[Command sequence with outcomes] + +## Active Draft +[Current draft being worked on] +``` + +## Integration with Commands + +All commands should: + +1. **Read context notes** from previous command output or `.context.md` +2. **Validate required fields** before proceeding +3. **Generate updated context notes** for next command +4. **Preserve scratchpad preferences** across handoffs diff --git a/plugins/compound-writing/skills/scratchpad/SKILL.md b/plugins/compound-writing/skills/scratchpad/SKILL.md new file mode 100644 index 00000000..ade524ce --- /dev/null +++ b/plugins/compound-writing/skills/scratchpad/SKILL.md @@ -0,0 +1,251 @@ +--- +name: scratchpad +description: Real-time feedback tracking system for iterative writing refinement. Captures preferences, tracks draft performance, and builds a preference profile that guides future content. +--- + +# Scratchpad Skill + +A persistent feedback system that learns what works and what doesn't across your writing session. + +## When to Use This Skill + +This skill applies when: +- Collecting feedback on draft variations +- Building a preference profile during a session +- Tracking what resonates vs. what falls flat +- Refining voice and style iteratively + +## Core Concept + +The scratchpad is your session's memory of preferences: + +``` +Draft 1 β†’ Feedback: "love the opening" β†’ Scratchpad learns: strong hooks work +Draft 2 β†’ Feedback: "too formal" β†’ Scratchpad learns: prefer casual +Draft 3 β†’ Uses learnings β†’ Better alignment +``` + +## Scratchpad Structure + +```markdown +# Session Scratchpad + +## Preference Profile + +### βœ“ What Works +- [Positive pattern with example] + +### βœ— What Doesn't +- [Negative pattern with example] + +## Draft Feedback Log + +### [Draft ID] - [timestamp] +**Sentiment**: positive/negative/neutral +**Feedback**: [user's words] +**Principle**: [extracted learning] + +## Strategy Adjustments +Based on feedback, adjust: +- [strategy]: [how to adjust] +``` + +## Feedback Entry Format + +When capturing feedback: + +```yaml +entry: + draft_id: "draft-3" + timestamp: "2025-01-16T10:30:00" + sentiment: "negative" + raw_feedback: "the opening is weak, doesn't grab me" + category: "hooks" + principle: "Needs stronger, more provocative openings" + action: "Prioritize hook-effectiveness strategy" +``` + +## Preference Categories + +### Voice & Tone +Track formality, personality, emotional register: +- "too corporate" β†’ prefer casual +- "love the warmth" β†’ maintain personal touch +- "feels distant" β†’ add more direct address + +### Structure & Flow +Track pacing, organization, transitions: +- "lost me in the middle" β†’ improve transitions +- "perfect build-up" β†’ use tension-release pattern +- "too long" β†’ cut more aggressively + +### Content & Substance +Track examples, data, depth: +- "needs more proof" β†’ add data/examples +- "love the stats" β†’ lead with data +- "too abstract" β†’ use concrete examples + +### Style & Language +Track word choice, rhythm, clarity: +- "jargon heavy" β†’ simplify language +- "punchy sentences work" β†’ vary length more +- "repetitive" β†’ use elegant variation + +## Building the Preference Profile + +After 3+ feedback entries, synthesize: + +```markdown +## Auto-Generated Preference Profile + +Based on [N] feedback entries: + +### Voice Tendency +[Inferred voice preference with confidence %] + +### Structural Preference +[How they like content organized] + +### Content Style +[What types of examples/proof resonate] + +### Language Patterns +[Sentence style, word choice preferences] + +### Recommended Strategies +1. [strategy-name]: High priority because [feedback evidence] +2. [strategy-name]: Medium priority because [feedback evidence] + +### Strategies to Avoid +1. [strategy-name]: Conflicts with [feedback evidence] +``` + +## Integration Points + +### Reading Scratchpad +Before creating drafts: +``` +1. Load .scratchpad.md +2. Extract preference profile +3. Weight recent feedback higher (recency decay) +4. Apply to strategy selection +``` + +### Writing to Scratchpad +After receiving feedback: +``` +1. Parse feedback for sentiment +2. Categorize the feedback +3. Extract actionable principle +4. Append to log +5. Regenerate preference profile +``` + +### Conflict Resolution +When feedback contradicts: +``` +Entry 1: "too casual" +Entry 5: "too formal" + +Resolution options: +1. Recency wins (Entry 5 takes precedence) +2. Ask for clarification +3. Find the middle ground +``` + +## Recency Weighting + +More recent feedback matters more: + +| Age | Weight | +|-----|--------| +| Current turn | 1.0 | +| 1-3 turns ago | 0.8 | +| 4-6 turns ago | 0.5 | +| 7+ turns ago | 0.3 | + +## Draft ID Tracking + +Every draft gets a unique ID: +- IDs persist across the session +- Never reuse IDs +- Refinements keep original ID +- New explorations increment + +``` +Response 1: draft-1, draft-2, draft-3 +Response 2: draft-4, draft-5, draft-6 (exploration) +Response 3: draft-4 refined (keeps ID) +``` + +## Scratchpad Lifecycle + +``` +Session Start + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ /writing:feedback │◄──┐ +β”‚ Add entry to scratchpad β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ + β”‚ β”‚ + β–Ό β”‚ +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ /writing:draft β”‚ β”‚ +β”‚ Read & apply preferences β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ + β”‚ β”‚ + β–Ό β”‚ + User reviews β”‚ + β”‚ β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ /writing:compound β”‚ +β”‚ Persist to pattern library β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +## Example Session + +``` +Turn 1: + User: /writing:draft "AI in healthcare" + Assistant: Creates draft-1, draft-2, draft-3 + +Turn 2: + User: /writing:feedback draft-1 love the stat opening + Scratchpad: βœ“ Statistical hooks resonate + +Turn 3: + User: /writing:feedback draft-3 too formal, sounds like a press release + Scratchpad: βœ— Avoid formal/corporate tone + +Turn 4: + User: /writing:draft refine draft-1 + Assistant: Reads scratchpad, applies preferences + Creates refined draft-1 (keeps ID, uses casual tone + stats) + +Turn 5: + User: /writing:feedback draft-1 perfect, this is it + Scratchpad: βœ“ Casual + data-driven = winning combo + +Turn 6: + User: /writing:compound draft-1 + Pattern library: Adds "casual-data-hook" pattern +``` + +## Scratchpad File Location + +Default: `drafts/.scratchpad.md` + +Can be configured per project in `.claude/writing-config.yaml`: +```yaml +scratchpad: + path: "drafts/.scratchpad.md" + persist_sessions: true + max_entries: 50 + auto_summarize_at: 10 +``` diff --git a/plugins/compound-writing/skills/writing-orchestration/SKILL.md b/plugins/compound-writing/skills/writing-orchestration/SKILL.md index 4b03073a..9ae56d2a 100644 --- a/plugins/compound-writing/skills/writing-orchestration/SKILL.md +++ b/plugins/compound-writing/skills/writing-orchestration/SKILL.md @@ -190,12 +190,34 @@ When user provides feedback: ### Orchestrator β†’ Writer -``` -[Research summary if applicable - 2-3 sentences] -[Material gathered: list key assets] -[Message clarity: thesis statement] -[Style guide: name if applicable] -[Mode: EXPLORATION or REFINEMENT] +Use the context notes format for structured handoffs: + +```markdown + +## Research Summary +[2-3 sentences summarizing research] + +## Material Available +- [Concrete example 1] +- [Data point 1] +- [Quote or source 1] + +## Message Clarity +**Thesis**: [One sentence thesis] +**Audience**: [Specific audience] +**Desired Action**: [What reader should do] + +## Voice Configuration +**Profile**: [voice profile name or "infer"] +**Style Guide**: [style guide name or "none"] +**Channel**: [blog/newsletter/social/docs] + +## Mode +[EXPLORATION or REFINEMENT] + +## Scratchpad Summary +[Key preferences from session scratchpad] + ``` ### Writer β†’ Orchestrator (Rare) @@ -206,6 +228,49 @@ Only when: - Web search required - Significant scope change +## Scratchpad Integration + +The scratchpad (`drafts/.scratchpad.md`) captures real-time preferences: + +### Reading Scratchpad +Before creating drafts: +1. Load scratchpad preference profile +2. Extract "What Works βœ“" patterns +3. Extract "What Doesn't βœ—" anti-patterns +4. Apply recency weighting (newer feedback > older) +5. Use to guide strategy selection + +### Writing to Scratchpad +After receiving feedback via `/writing:feedback`: +1. Parse feedback for sentiment +2. Categorize (voice, structure, content, style) +3. Extract actionable principle +4. Append to log +5. Regenerate preference profile + +### Promoting to Patterns +Via `/writing:compound`: +1. Identify recurring preferences (3+ appearances) +2. Extract to pattern library +3. Add to voice profile +4. Clear promoted entries from scratchpad + +## Draft ID Management + +Every draft gets a unique, persistent ID: + +``` +Response 1: draft-1, draft-2, draft-3 (exploration) +Response 2: draft-4, draft-5, draft-6 (new exploration) +Response 3: draft-2 refined (keeps original ID) +``` + +Rules: +- IDs persist across the session +- Never reuse IDs +- Refinements keep original draft ID +- New explorations increment + ## Integration with Commands ### `/writing:plan` From ff05ff8776c10b90995e1b67ce910bddcda93113 Mon Sep 17 00:00:00 2001 From: Kieran Klaassen Date: Fri, 16 Jan 2026 20:37:45 -0800 Subject: [PATCH 03/19] docs(compound-writing): Add architecture framework and development guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WRITING-ARCHITECTURE.md: Complete 8-phase writing process framework - 18 agent roles mapped across phases - 5 skill types (core, voice, style guide, domain, format) - "10 books expert" pattern for domain expertise - Implementation roadmap - CLAUDE.md: Development guide for plugin contributors - Current component inventory - Key concepts (two-agent, two-gate, strategies) - Adding new agents/skills/voices - Quality checklist πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- plugins/compound-writing/CLAUDE.md | 144 ++++++++++++ .../docs/WRITING-ARCHITECTURE.md | 206 ++++++++++++++++++ 2 files changed, 350 insertions(+) create mode 100644 plugins/compound-writing/CLAUDE.md create mode 100644 plugins/compound-writing/docs/WRITING-ARCHITECTURE.md diff --git a/plugins/compound-writing/CLAUDE.md b/plugins/compound-writing/CLAUDE.md new file mode 100644 index 00000000..6bb562eb --- /dev/null +++ b/plugins/compound-writing/CLAUDE.md @@ -0,0 +1,144 @@ +# Compound Writing Plugin - Development Guide + +## Philosophy + +**Each piece of writing should make the next piece easier to write.** + +This plugin applies compound engineering principles to content creation: +- Capture what works (patterns, voice, structure) +- Build reusable knowledge (scratchpad β†’ patterns β†’ voice profiles) +- Iterate faster each time + +## Architecture Reference + +See `docs/WRITING-ARCHITECTURE.md` for the complete framework mapping: +- 8 phases of professional writing +- 18 specialized agent roles +- 5 skill types (core, voice, style guide, domain, format) +- Implementation roadmap + +## Current Components + +### Commands (6) +| Command | Phase | Purpose | +|---------|-------|---------| +| `/writing:plan` | Discovery/Architecture | Research and outline | +| `/writing:draft` | Creation | Generate prose | +| `/writing:review` | Editing | Multi-agent review | +| `/writing:feedback` | Any | Capture preferences to scratchpad | +| `/writing:knowledge` | Any | Manage voice/patterns/references | +| `/writing:compound` | Post-publish | Extract patterns | + +### Agents (7) +| Agent | Phase | Role | +|-------|-------|------| +| `source-researcher` | Discovery | Gather sources, analyze audience | +| `structure-architect` | Architecture | Create outlines, analyze flow | +| `voice-guardian` | Creation/Editing | Maintain voice consistency | +| `clarity-editor` | Editing | Improve clarity, cut jargon | +| `fact-checker` | Editing | Verify claims and sources | +| `every-style-editor` | Editing | Every's style guide | +| `publishing-optimizer` | Optimization | SEO, social, newsletters | + +### Skills (7) +| Skill | Type | Purpose | +|-------|------|---------| +| `writing-orchestration` | Core | Two-agent architecture, strategies | +| `scratchpad` | Core | Session preference memory | +| `context-notes` | Core | Structured command handoffs | +| `voice-capture` | Core | Extract voice from samples | +| `pragmatic-writing` | Voice | Hunt/Thomas, Spolsky style | +| `dhh-writing` | Voice | Direct, opinionated style | +| `every-style-editor` | Style Guide | Every's editorial standards | + +## Key Concepts + +### Two-Agent Architecture +- **Orchestrator**: Classifies, researches, assesses readiness +- **Writer**: Creates drafts using strategies + +### Two-Gate Assessment +Before drafting, verify: +1. **Material Sufficiency**: Can write without inventing facts? +2. **Message Clarity**: Know exactly what message to convey? + +### Writing Strategies +- **10 Baseline** (always apply): Short sentences, active voice, concrete examples +- **20+ Situational** (select 3-4): Hook patterns, structure templates, style techniques + +### Scratchpad β†’ Knowledge Flow +``` +Session feedback β†’ Scratchpad β†’ Compound β†’ Pattern library + β†’ Voice profile + β†’ Knowledge base +``` + +## Adding New Components + +### New Agent +1. Create `agents/[name].md` with frontmatter: + ```yaml + --- + name: agent-name + description: What this agent does + --- + ``` +2. Define the agent's role, inputs, outputs +3. Update `plugin.json` count +4. Update `README.md` agent list + +### New Skill +1. Create `skills/[name]/SKILL.md` with frontmatter: + ```yaml + --- + name: skill-name + description: When to use this skill + --- + ``` +2. Add triggers, patterns, examples +3. Update `plugin.json` count +4. Update `README.md` skill list + +### New Voice Skill +Follow the pattern in `pragmatic-writing` or `dhh-writing`: +- Define voice traits +- Provide writing rules +- Include example transformations + +### New Domain Skill ("10 Books Expert") +See `docs/WRITING-ARCHITECTURE.md` for the pattern: +1. Core texts (5 foundational works) +2. Secondary texts (5 supporting works) +3. Key frameworks +4. Reasoning patterns + +## File Structure + +``` +plugins/compound-writing/ +β”œβ”€β”€ .claude-plugin/plugin.json +β”œβ”€β”€ CLAUDE.md # This file +β”œβ”€β”€ README.md # User documentation +β”œβ”€β”€ agents/ # 7 agents +β”œβ”€β”€ commands/ # 6 commands +β”œβ”€β”€ skills/ # 7 skills +β”‚ β”œβ”€β”€ writing-orchestration/ +β”‚ β”‚ β”œβ”€β”€ SKILL.md +β”‚ β”‚ └── references/ # Baseline/situational strategies +β”‚ β”œβ”€β”€ scratchpad/ +β”‚ β”œβ”€β”€ context-notes/ +β”‚ └── ... +└── docs/ + └── WRITING-ARCHITECTURE.md # Full framework reference +``` + +## Quality Checklist + +When adding/modifying components: +- [ ] Frontmatter is valid YAML +- [ ] Description is clear and specific +- [ ] Integrates with scratchpad (reads/writes preferences) +- [ ] Outputs context notes for handoffs +- [ ] Follows existing patterns +- [ ] Counts updated in plugin.json +- [ ] README updated diff --git a/plugins/compound-writing/docs/WRITING-ARCHITECTURE.md b/plugins/compound-writing/docs/WRITING-ARCHITECTURE.md new file mode 100644 index 00000000..ae230aab --- /dev/null +++ b/plugins/compound-writing/docs/WRITING-ARCHITECTURE.md @@ -0,0 +1,206 @@ +# The Writing Process: Agents & Skills Architecture + +> A comprehensive framework mapping the entire writing process to specialized agents and skills. + +## Overview + +This document defines the complete phase-by-phase breakdown of professional writing workflows, from ideation to final form. Use this as a reference for extending the compound-writing plugin. + +--- + +## Phase Map + +| Phase | Focus | Current Plugin Coverage | +|-------|-------|------------------------| +| 1. Discovery | Ideas, strategy, research | `/writing:plan` + `source-researcher` | +| 2. Architecture | Thesis, structure, outline | `/writing:plan` + `structure-architect` | +| 3. Creation | First draft, gap filling | `/writing:draft` + voice skills | +| 4. Revision | Big picture edits | `/writing:review` (partial) | +| 5. Editing | Sentence-level polish | `clarity-editor`, `every-style-editor` | +| 6. Polish | Proofread, headlines | `publishing-optimizer` | +| 7. Optimization | SEO, format adaptation | `publishing-optimizer` (partial) | +| 8. QA | Final verification | `/writing:review` | + +--- + +## Complete Agent Roster + +### Currently Implemented (7) + +| Agent | Phase | Function | +|-------|-------|----------| +| `source-researcher` | Discovery | Gather information, sources, examples | +| `structure-architect` | Architecture | Create outlines, analyze flow | +| `voice-guardian` | Creation/Editing | Maintain voice consistency | +| `clarity-editor` | Editing | Sentence-level clarity | +| `fact-checker` | Editing | Verify claims and sources | +| `every-style-editor` | Editing | Every's style guide compliance | +| `publishing-optimizer` | Polish/Optimization | SEO, social, newsletters | + +### Proposed Additions (11) + +| Agent | Phase | Function | Priority | +|-------|-------|----------|----------| +| `ideation-agent` | Discovery | Generate ideas, find angles | Medium | +| `strategist-agent` | Discovery | Define audience, purpose | Medium | +| `thesis-agent` | Architecture | Crystallize core argument | Low | +| `drafter-agent` | Creation | Generate prose from outline | High | +| `gap-analyst` | Creation | Find missing pieces | Medium | +| `dev-editor-agent` | Revision | Big-picture critique | High | +| `line-editor-agent` | Editing | Prose craft, rhythm | Medium | +| `copy-editor-agent` | Editing | Grammar, style guide | Medium | +| `proofreader-agent` | Polish | Final error catch | Low | +| `headline-agent` | Polish | Craft titles, hooks | Medium | +| `adaptation-agent` | Optimization | Format for platforms | Low | + +--- + +## Skill Types + +### 1. Core Skills (Every Project) + +Essential skills loaded for all writing workflows. + +| Skill | Purpose | Status | +|-------|---------|--------| +| `writing-orchestration` | Two-agent architecture, strategies | Implemented | +| `scratchpad` | Session preference memory | Implemented | +| `context-notes` | Structured handoffs | Implemented | +| `voice-capture` | Extract voice from samples | Implemented | + +### 2. Voice Skills (Select Per Project) + +Define the writing style and tone. + +| Skill | Style | Status | +|-------|-------|--------| +| `pragmatic-writing` | Hunt/Thomas, Joel Spolsky | Implemented | +| `dhh-writing` | Direct, opinionated | Implemented | +| `voice-hemingway` | Sparse, direct, concrete | Proposed | +| `voice-conversational` | Friendly, accessible | Proposed | +| `voice-academic` | Formal, hedged, citation-heavy | Proposed | +| `voice-technical` | Precise, jargon-appropriate | Proposed | + +### 3. Style Guide Skills (Select One) + +Ensure consistency with established standards. + +| Skill | Standard | Status | +|-------|----------|--------| +| `every-style-editor` | Every's house style | Implemented | +| `style-guide-ap` | AP Stylebook | Proposed | +| `style-guide-chicago` | Chicago Manual | Proposed | +| `style-guide-custom` | Organizational rules | Template | + +### 4. Domain Skills (Load as Needed) + +Specialized knowledge for specific fields. + +| Skill | Domain | Contains | +|-------|--------|----------| +| `domain-saas` | SaaS/B2B | Metrics, terminology, examples | +| `domain-finance` | Finance | Terms, compliance, regulations | +| `domain-healthcare` | Medical | Terminology, HIPAA, clinical | +| `domain-legal` | Legal | Language, disclaimers, contracts | +| `domain-expert-[x]` | Custom | "10 books" deep expertise | + +### 5. Format Skills (Load for Output) + +Transform content for different platforms. + +| Skill | Output | Key Constraints | +|-------|--------|-----------------| +| `format-blog-post` | Long-form blog | SEO, headers, readability | +| `format-twitter-thread` | Twitter/X | 280 chars, hooks, numbering | +| `format-linkedin` | LinkedIn | Professional, engagement | +| `format-newsletter` | Email | Subject lines, previews | +| `format-whitepaper` | B2B docs | Formal, comprehensive | + +--- + +## Pipeline Flow + +``` +DISCOVERY ARCHITECTURE CREATION +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Ideation │──▢ Brief ──▢│ Thesis │──▢ Outline β–Άβ”‚ Drafter β”‚ +β”‚ Strategy β”‚ β”‚ Architectβ”‚ β”‚ Gap β”‚ +β”‚ Research β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Analyst β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β–Ό +REVISION EDITING POLISH +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚Dev Editor│──▢ Revised β–Άβ”‚ Line │──▢ Clean ──▢│Proofread β”‚ +β”‚ Revision β”‚ Draft β”‚ Copy β”‚ Draft β”‚ Headline β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Fact β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β–Ό +OPTIMIZATION QA +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ SEO │──▢ Final ──▢│ QA │──▢ PUBLISH +β”‚Adaptationβ”‚ β”‚ Agent β”‚ +β”‚ Style β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## The "10 Books Expert" Pattern + +For domain expertise, create skills grounded in foundational texts: + +```yaml +name: domain-expert-behavioral-economics +description: Deep expertise from Kahneman, Thaler, Ariely, Cialdini +triggers: ["behavioral economics", "cognitive bias", "nudge"] +``` + +**Structure:** +1. Core Texts (5) - The foundational works +2. Secondary Texts (5) - Supporting perspectives +3. Key Frameworks - How to apply the knowledge +4. Reasoning Patterns - Example thought processes + +This pattern can be applied to any domain where deep expertise is needed. + +--- + +## Implementation Roadmap + +### Phase 1: Foundation (Current) +- [x] Core workflow commands (plan, draft, review, compound) +- [x] Basic agents (7) +- [x] Core skills (orchestration, scratchpad, context-notes) +- [x] Two voice skills (pragmatic, dhh) + +### Phase 2: Creation Enhancement +- [ ] `drafter-agent` - Dedicated prose generation +- [ ] `dev-editor-agent` - Big-picture structural critique +- [ ] Additional voice skills (hemingway, conversational) + +### Phase 3: Editing Depth +- [ ] `line-editor-agent` - Prose craft focus +- [ ] `copy-editor-agent` - Grammar/style specialist +- [ ] Style guide skills (AP, Chicago) + +### Phase 4: Optimization +- [ ] `headline-agent` - Titles and hooks +- [ ] `adaptation-agent` - Platform formatting +- [ ] Format skills (twitter, linkedin, newsletter) + +### Phase 5: Domain Expertise +- [ ] Domain skill template +- [ ] "10 books" expert pattern implementation +- [ ] Custom domain skill generator + +--- + +## References + +- [Editorial Department - Editorial Process 101](https://www.editorialdepartment.com/editorial-process/) +- [MasterClass - Line Editing vs Copy Editing](https://www.masterclass.com/articles/what-is-line-editing) +- [CrewAI Documentation](https://docs.crewai.com/en/concepts/agents) +- [Agent Skills Specification](https://agentskills.io/specification) From 4f0cd077652f6da8f85324ffa2faebf690b911e8 Mon Sep 17 00:00:00 2001 From: Kieran Klaassen Date: Fri, 16 Jan 2026 20:47:21 -0800 Subject: [PATCH 04/19] feat(compound-writing): Enhance all commands with explicit steps and skill loading - Add "Skills to Load" sections to all 6 commands - Number all steps explicitly (Step 1, Step 2, etc.) - Add AskUserQuestion blocks for interactive decision points - Mark brainstorming steps with (BRAINSTORM) labels - Add quality checklists at the end of each command - Include context notes handoff sections Commands enhanced: - /writing:plan (11 steps) - /writing:draft (14 steps) - /writing:review (15 steps) - /writing:compound (12 steps) - /writing:feedback (8 steps) - /writing:knowledge (multiple actions with steps) Co-Authored-By: Claude Opus 4.5 --- .../commands/writing-compound.md | 543 +++++++++++------- .../commands/writing-draft.md | 447 +++++++++----- .../commands/writing-feedback.md | 340 ++++++----- .../commands/writing-knowledge.md | 519 ++++++++++++----- .../compound-writing/commands/writing-plan.md | 323 ++++++++--- .../commands/writing-review.md | 489 +++++++++++----- 6 files changed, 1835 insertions(+), 826 deletions(-) diff --git a/plugins/compound-writing/commands/writing-compound.md b/plugins/compound-writing/commands/writing-compound.md index 8c990847..9c697eb9 100644 --- a/plugins/compound-writing/commands/writing-compound.md +++ b/plugins/compound-writing/commands/writing-compound.md @@ -1,7 +1,7 @@ --- name: writing:compound description: Capture learnings from successful writing to improve future work -argument-hint: "[path to published piece or 'latest']" +argument-hint: "[path to published piece] or [draft-ID] or 'latest'" --- # Writing Compound Command @@ -12,7 +12,32 @@ Turn this piece's successes into permanent improvements for future writing. #$ARGUMENTS -If "latest" is provided, find the most recent published/approved piece. +**Input Types:** +- `drafts/[slug]/draft-final.md` β†’ Analyze specific piece +- `draft-2` β†’ Find draft with that ID +- `latest` β†’ Find most recent approved/published piece + +--- + +## Skills to Load + +Before starting, load these skills: + +``` +Skill: voice-capture + - Extract voice patterns from successful writing + - Build/update voice profiles + +Skill: scratchpad + - Read session feedback history + - Promote recurring preferences to patterns + +Skill: context-notes + - Read review learnings + - Document patterns for future commands +``` + +--- ## The Compound Philosophy @@ -23,252 +48,343 @@ This command extracts what worked and encodes it for reuse: - Structure patterns that flowed well - Voice elements that landed - Transitions that felt invisible +- Anti-patterns that were edited out -## Workflow Overview +--- -1. Analyze what made this piece work -2. Extract reusable patterns -3. Update style documentation -4. Create templates for similar pieces -5. Log anti-patterns that were edited out +## Step 1: Load the Piece and History -## Phase 1: Success Analysis +``` +Gather all artifacts: +1. Final/published version +2. All draft versions (v1, v2, etc.) +3. Review reports +4. Scratchpad (drafts/.scratchpad.md) +5. Original brief and outline +``` -### Load the Piece and History +Build timeline: ``` -Read the final published version -Read all draft versions (v1, v2, etc.) -Read review reports -Read scratchpad (drafts/.scratchpad.md) for session feedback -Identify: -- What changed between drafts -- What reviewers praised -- What the writer kept unchanged -- What the scratchpad marked as "What Works βœ“" +Brief β†’ Outline β†’ Draft 1 β†’ Feedback β†’ Draft 2 β†’ Review β†’ Draft 3 β†’ Final + ↓ ↓ ↓ + [Changes made] [Preferences] [Fixes applied] ``` -### Identify What Worked +--- + +## Step 2: Identify Success Factors (BRAINSTORM) -Use AskUserQuestion: ``` -What made this piece successful? -1. The hook grabbed attention -2. The structure was clear -3. The voice was consistent -4. The examples were concrete -5. Something else: [describe] +Use AskUserQuestion: + +Question: "What made this piece successful? (Select all that apply)" + +Options (multiSelect: true): +1. **The hook grabbed attention** - Opening was compelling +2. **The structure was clear** - Easy to follow, well-paced +3. **The voice was consistent** - Tone matched throughout +4. **The examples were concrete** - Showed, didn't just tell +5. **The argument was persuasive** - Made a strong case +6. **Something else** - Describe what worked ``` -Allow multiple selections to understand success factors. +--- -## Phase 2: Extract Patterns +## Step 3: Analyze Hook + +### Extract Opening -### Hook Analysis ```markdown ## Hook Extraction -**Opening text**: -> [First 50-100 words] +**Opening text** (first 50-100 words): +> [Actual opening text] **Hook type**: [Story/Stat/Tension/Question/Surprise] **Why it worked**: - [Specific reason 1] - [Specific reason 2] +``` + +### Abstract the Formula (BRAINSTORM) + +``` +Use AskUserQuestion: -**Formula abstracted**: -[General pattern that could be reused] +Question: "What made this hook work? How would you describe the formula?" -**Similar topics it could work for**: -- [Topic 1] -- [Topic 2] +Options: +1. **[Auto-generated formula based on pattern]** +2. **[Alternative formula interpretation]** +3. **Custom** - Describe the formula in your own words ``` -### Structure Analysis +### Document Pattern + +```markdown +## Pattern: hook-[type]-[topic] + +**Formula**: +"[Generalized pattern with placeholders]" + +**Example from this piece**: +> [Actual opening] + +**When to use**: +- [Topic type 1] +- [Topic type 2] + +**Variations**: +- [Variation 1] +- [Variation 2] + +**Extracted from**: [piece path] +**Date**: [timestamp] +``` + +--- + +## Step 4: Analyze Structure + +### Map the Skeleton + ```markdown ## Structure Extraction -**Pattern used**: [Problem-Solution/Journey/Listicle/Story] +**Pattern used**: [Problem-Solution/Journey/Listicle/Story/Custom] **Section breakdown**: -1. [Section type] - [purpose] - [word count] -2. [Section type] - [purpose] - [word count] -... +| Section | Purpose | Word Count | Key Element | +|---------|---------|------------|-------------| +| Hook | Grab attention | 50 | Surprising stat | +| Section 1 | Establish problem | 300 | Concrete example | +| Section 2 | Present solution | 400 | Step-by-step | +| Section 3 | Prove it works | 350 | Case study | +| Conclusion | Call to action | 150 | Clear CTA | **What made this structure work**: - [Insight 1] - [Insight 2] -**Topics this structure fits**: -- [Topic type 1] -- [Topic type 2] +**Pacing notes**: +- [Where it sped up/slowed down and why] ``` -### Voice Analysis -```markdown -## Voice Extraction +### Create Template (BRAINSTORM if novel) -**Consistent elements identified**: -- Vocabulary patterns: [words/phrases used repeatedly] -- Sentence rhythm: [short-long patterns] -- Tone markers: [specific indicators] - -**Voice profile additions**: -```yaml -# New exemplar -exemplars: - - path: "[this piece path]" - why: "[specific voice element demonstrated]" ``` +Use AskUserQuestion: + +Question: "This structure worked well. Should I save it as a reusable template?" -**Prohibited additions** (if anti-patterns found): -- "[Word/phrase]" - because: [reason] +Options: +1. **Yes, save as template** - Create new structure pattern +2. **Update existing** - Enhance an existing structure template +3. **Skip** - Structure isn't novel enough to save ``` -### Transition Analysis +If saving: + ```markdown -## Transitions Extraction +# Template: [Template Name] -**Smooth transitions found**: -1. Between [section X] and [section Y]: - > "[transition text]" - - Type: [causal/contrast/continuation] - - Why it worked: [reason] +**Best for**: [Topic types this works for] +**Word count target**: [range] -2. [Continue for notable transitions] +## Structure -**Transition formulas**: -- "[Formula 1]" - use when: [context] -- "[Formula 2]" - use when: [context] -``` +### Hook (0-50 words) +[Formula with guidance] +- Include: [required elements] +- Avoid: [anti-patterns] -## Phase 3: Update Documentation +### Section 1: [Purpose] (~X words) +[Guidance] -### Update Pattern Files +### Section 2: [Purpose] (~X words) +[Guidance] -Create or update files in `docs/patterns/`: +### Conclusion (~X words) +[Closing formula] -``` -docs/patterns/ -β”œβ”€β”€ hooks/ -β”‚ └── [hook-type]-[topic].md # New hook pattern -β”œβ”€β”€ structures/ -β”‚ └── [pattern-name].md # Structure template -β”œβ”€β”€ transitions/ -β”‚ └── common-transitions.md # Append new transitions -└── voice/ - └── [voice-name]-exemplars.md # New exemplar reference +**Key elements**: [list] +**Extracted from**: [piece] ``` -### Pattern File Format -```markdown ---- -title: "[Pattern Name]" -type: [hook/structure/transition/voice] -extracted_from: "[original piece path]" -created: [timestamp] -tags: [topic1, topic2] --- -## Pattern +## Step 5: Analyze Voice -[Description of the pattern] +### Extract Voice Patterns -## Example +```markdown +## Voice Extraction -> [The actual text from the piece] +**Consistent elements identified**: -## When to Use +### Vocabulary patterns +- Words/phrases used repeatedly: [list] +- Technical level: [accessible/moderate/expert] +- Formality: [casual/professional/academic] -- [Context 1] -- [Context 2] +### Sentence rhythm +- Average sentence length: [X] words +- Pattern: [e.g., "short-short-long", "varied"] +- Distinctive constructions: [list] -## How to Apply +### Tone markers +- Emotional register: [warm/neutral/intense] +- Personality level: [high/medium/low] +- Direct address: [uses "you" / avoids "you"] +``` -1. [Step 1] -2. [Step 2] +### Update Voice Profile (BRAINSTORM) -## Variations +``` +Use AskUserQuestion: -- [Variation 1] -- [Variation 2] +Question: "Found these voice elements. How should I update your voice profile?" + +Options: +1. **Add as exemplar** - Reference this piece as an example +2. **Extract traits** - Add specific patterns to profile +3. **Both** - Add exemplar and extract traits +4. **Skip** - Voice isn't distinctive enough ``` -### Update Voice Profile +If updating: -If voice profile exists, append new learnings: ```yaml -# Add to exemplars +# Add to .claude/writing-knowledge/voice-profiles/[name].yaml + exemplars: - - path: "[new piece]" - why: "[what it demonstrates]" + - path: "[piece path]" + why: "[specific voice element demonstrated]" -# Add to prohibited if anti-patterns found +traits: + vocabulary: [updated patterns] + rhythm: [updated patterns] + tone: [updated markers] + +# If anti-patterns found during editing: prohibited: - - "[new prohibited item]" + - "[word/phrase]" # because: [reason] ``` -## Phase 4: Create Templates +--- -### If Structure Was Novel +## Step 6: Analyze Transitions -Create a reusable template: +### Extract Smooth Transitions ```markdown -# Template: [Template Name] +## Transitions Extraction -**Best for**: [Topic types this works for] +**Notable transitions found**: -**Structure**: +### Between [Section X] and [Section Y] +> "[Actual transition text]" -## Hook -[Hook formula with placeholders] +**Type**: [causal/contrast/continuation/callback] +**Why it worked**: [reason] +**Formula**: "[Generalized pattern]" +``` -## Section 1: [Purpose] -[Guidance for this section] -- Include: [required elements] -- Avoid: [anti-patterns] +### Add to Transition Library -## Section 2: [Purpose] -[Continue pattern...] +```markdown +# Append to docs/patterns/transitions/common-transitions.md -## Conclusion -[Closing formula] +## [Transition Type]: [Name] -**Word count target**: [range] -**Key elements**: [list] +**Formula**: "[Pattern with placeholders]" +**Example**: "[From this piece]" +**Use when**: [context] +**Extracted from**: [piece] - [date] ``` -Save to `docs/patterns/structures/[template-name].md` +--- -## Phase 5: Log Anti-Patterns +## Step 7: Log Anti-Patterns -### What Was Edited Out +### Review What Was Edited Out -From review history, identify: -- Phrases that were consistently cut -- Structures that were reorganized +Analyze draft history to find: +- Phrases consistently cut +- Structures reorganized - Claims that needed rework +- Voice drift that was corrected ```markdown ## Anti-Patterns Identified ### Phrases to Avoid -- "[Phrase]" - cut because: [reason] -- "[Phrase]" - cut because: [reason] +| Phrase | Why Cut | Better Alternative | +|--------|---------|-------------------| +| "[phrase]" | [reason] | "[alternative]" | ### Structural Issues -- [Issue] - fixed by: [solution] +| Issue | How Fixed | +|-------|-----------| +| [issue] | [solution] | ### Claims That Failed Fact-Check -- "[Claim type]" - always verify: [specific check] +| Claim Type | Always Verify | +|------------|---------------| +| "[type]" | [specific check] | +``` + +--- + +## Step 8: Promote Scratchpad to Patterns + +Read `drafts/.scratchpad.md` and identify recurring preferences: + +``` +For each preference that appeared 3+ times: + 1. Extract to pattern library + 2. Add to voice profile + 3. Mark as promoted in scratchpad +``` + +### Promotion Summary (BRAINSTORM) + +``` +Use AskUserQuestion: + +Question: "Found [N] recurring preferences in scratchpad. Promote to permanent patterns?" + +Options: +1. **Promote all** - Add all recurring preferences to patterns +2. **Review each** - Let me decide one by one +3. **Skip** - Keep in scratchpad for now ``` -Add to appropriate style guide or voice profile. +--- + +## Step 9: Update Knowledge Base + +Save extracted patterns to: + +``` +.claude/writing-knowledge/ +β”œβ”€β”€ voice-profiles/ +β”‚ └── [updated profile].yaml +β”œβ”€β”€ patterns/ +β”‚ β”œβ”€β”€ hooks/ +β”‚ β”‚ └── [new hook pattern].md +β”‚ β”œβ”€β”€ structures/ +β”‚ β”‚ └── [new structure template].md +β”‚ └── transitions/ +β”‚ └── common-transitions.md # appended +└── index.md # updated with new patterns +``` + +--- -## Output +## Step 10: Generate Compound Report -### Compound Report Save to `docs/patterns/compound-log/[date]-[piece-slug].md`: ```markdown @@ -276,77 +392,118 @@ Save to `docs/patterns/compound-log/[date]-[piece-slug].md`: **Date**: [timestamp] **Piece**: [path to original] +**Success factors**: [user-selected factors] ## What Worked -[Summary of success factors] -## Patterns Extracted -- Hook pattern: [saved to path] -- Structure template: [saved to path] -- Transitions: [X] added to common-transitions.md -- Voice exemplar: [added to profile] +### Hook +**Type**: [hook type] +**Formula**: [pattern] +**Saved to**: [file path] + +### Structure +**Pattern**: [structure name] +**Template created**: [yes/no] +**Saved to**: [file path] + +### Voice +**Exemplar added**: [yes/no] +**Traits extracted**: [list] +**Updated profile**: [profile name] + +### Transitions +**New transitions**: [count] +**Added to**: common-transitions.md ## Anti-Patterns Logged -- [X] phrases added to prohibited list -- [X] structural warnings documented +- [N] phrases added to prohibited list +- [N] structural warnings documented +- [N] fact-check reminders added + +## Scratchpad Promotions +- [N] preferences promoted to patterns +- [N] anti-patterns made permanent ## Files Updated -- `docs/patterns/hooks/[file].md` -- `docs/patterns/structures/[file].md` -- `docs/patterns/transitions/common-transitions.md` -- `.claude/voice-profiles/[name].yaml` +- `patterns/hooks/[file].md` +- `patterns/structures/[file].md` +- `patterns/transitions/common-transitions.md` +- `voice-profiles/[name].yaml` +- `index.md` ## The Compound Effect -This piece adds [X] reusable patterns to your writing system. -Next similar piece will benefit from: [specific improvements] +This piece adds [N] reusable patterns to your writing system. + +**Next similar piece will benefit from**: +- [Specific improvement 1] +- [Specific improvement 2] +- [Specific improvement 3] ``` -## Post-Compound Options +--- -**Question**: "Compounding complete. [X] patterns extracted. What next?" +## Step 11: Clear Session Scratchpad -**Options**: -1. **View patterns** - Open the extracted pattern files -2. **Start new piece** - `/writing:plan` with new patterns available -3. **Review pattern library** - See all accumulated patterns -4. **Export voice profile** - Save voice profile for sharing +``` +After compounding: +1. Archive promoted entries +2. Clear session-specific feedback +3. Reset for next writing session +``` -## Phase 6: Promote Scratchpad to Patterns +Keep only: +- Unpromoted preferences +- Context notes for next session -### Persist Session Learnings -From the scratchpad, promote recurring preferences to permanent patterns: +--- + +## Step 12: Post-Compound Options (BRAINSTORM) ``` -If preference appeared 3+ times in scratchpad: - - Extract to pattern library - - Add to voice profile - - Clear from scratchpad -``` +Use AskUserQuestion: -### Update Knowledge Base -Add to `.claude/writing-knowledge/`: -- New patterns discovered -- Voice profile refinements -- Anti-patterns to avoid +Question: "Compounding complete. [N] patterns extracted. What next?" -### Clear Session Scratchpad -After compounding: -- Archive scratchpad entries that were promoted -- Keep only session-specific notes -- Reset for next writing session +Options: +1. **View patterns** - Open the extracted pattern files +2. **Start new piece** - `/writing:plan` with new patterns available +3. **Review pattern library** - See all accumulated patterns +4. **Export voice profile** - Share voice profile +5. **Done** - Finished for now +``` + +--- ## The Compound Loop ``` Write β†’ Feedback β†’ Review β†’ Edit β†’ Compound β†’ - ↓ -Scratchpad captures preferences - ↓ -Compound promotes patterns to knowledge - ↓ -Next piece starts with more patterns - ↓ + ↓ + Scratchpad captures session preferences + ↓ + Compound extracts permanent patterns + ↓ + Knowledge base grows with each piece + ↓ Write (faster) β†’ Review (fewer issues) β†’ Edit (lighter) β†’ Compound β†’ - ↓ -Each cycle gets easier + ↓ + Each cycle gets easier ``` + +--- + +## Quality Checklist + +Before completing: +- [ ] All draft versions analyzed +- [ ] Scratchpad history reviewed +- [ ] Success factors identified with user +- [ ] Hook pattern extracted (if novel) +- [ ] Structure template created (if novel) +- [ ] Voice profile updated +- [ ] Transitions documented +- [ ] Anti-patterns logged +- [ ] Recurring scratchpad preferences promoted +- [ ] Knowledge base files updated +- [ ] Compound report saved +- [ ] Scratchpad cleared for next session diff --git a/plugins/compound-writing/commands/writing-draft.md b/plugins/compound-writing/commands/writing-draft.md index 1fb92966..62345036 100644 --- a/plugins/compound-writing/commands/writing-draft.md +++ b/plugins/compound-writing/commands/writing-draft.md @@ -1,7 +1,7 @@ --- name: writing:draft description: Transform an outline into prose following style preferences -argument-hint: "[path to outline.md]" +argument-hint: "[path to outline.md] or [refine draft-ID]" --- # Writing Draft Command @@ -12,63 +12,148 @@ Execute an outline into prose, following style preferences and voice profiles. #$ARGUMENTS -If the input is "refine [draft-ID]", enter REFINEMENT mode with that specific draft. +**Input Types:** +- `drafts/[slug]/outline.md` β†’ EXPLORATION mode (create 3 drafts) +- `refine draft-2` β†’ REFINEMENT mode (improve specific draft) +- `drafts/[slug]/` β†’ Find outline in that directory -## Workflow Overview +--- + +## Skills to Load + +Before starting, load these skills: + +``` +Skill: writing-orchestration + - 10 baseline strategies (always apply) + - 20+ situational strategies (select 3-4) + - Quality checkpoints + +Skill: scratchpad + - Session preference memory + - Recency weighting for feedback + +Skill: context-notes + - Read handoff from /writing:plan + - Output handoff for /writing:review + +Skill: [voice skill] - Load based on context: + - pragmatic-writing (technical content) + - dhh-writing (opinionated takes) + - every-style-editor (Every house style) + - [custom voice profile] +``` + +--- + +## Step 1: Determine Mode + +| Input | Mode | Output | +|-------|------|--------| +| Outline path | EXPLORATION | 3 draft variations | +| "refine draft-X" | REFINEMENT | 1 improved draft | + +--- + +## Step 2: Load Context Notes + +Read handoff from `/writing:plan`: + +``` +If available: + Extract: + - Research summary + - Material available (examples, data, quotes) + - Message clarity (thesis, audience, action) + - Voice configuration + - Mode +``` -This command executes the **drafting phase**: -1. Load outline and research -2. Load applicable style guide -3. Pre-draft checklist -4. Section-by-section drafting with voice guardian loop -5. Quality checkpoints +--- -## Phase 1: Load Context +## Step 3: Load Scratchpad Preferences -### Read Context Notes -If context notes were passed from `/writing:plan`, extract: -- Research summary -- Material available -- Message clarity (thesis, audience, action) -- Voice configuration -- Mode (EXPLORATION or REFINEMENT) +Check `drafts/.scratchpad.md`: -### Read Scratchpad -Check `drafts/.scratchpad.md` for session preferences: ``` If scratchpad exists: - - Load "What Works βœ“" patterns - - Load "What Doesn't βœ—" anti-patterns - - Apply recency weighting (recent feedback > older) - - Use preference profile to guide strategy selection + 1. Load preference profile + 2. Extract "What Works βœ“" patterns + 3. Extract "What Doesn't βœ—" anti-patterns + 4. Apply recency weighting (newer feedback > older) + 5. Note any conflicts to address ``` -### Read Outline and Research +--- + +## Step 4: Load Outline and Research + ``` -Read the outline file at [outline_path] -Read associated research.md and sources.md in same directory +Read: +- drafts/[slug]/outline.md +- drafts/[slug]/research.md +- drafts/[slug]/sources.md +- drafts/[slug]/brief.md (if exists) + Extract: -- The thesis/argument -- The hook +- Hook (opening text) - Section structure - Source requirements per section +- Target word count ``` -### Load Style Guide -Check for applicable style: +--- -1. **Check for voice profile**: `.claude/voice-profiles/[name].yaml` -2. **Check for style skill**: `every-style-editor`, `dhh-writing`, `pragmatic-writing` -3. **Ask if none found**: "Which style should I use? (Every style, DHH style, Pragmatic style, or provide custom)" +## Step 5: Select Voice (BRAINSTORM if needed) -### Extract Channel Guidance -Based on outline metadata or ask: -- Blog: longer form, storytelling allowed -- Newsletter: personality forward, direct address okay -- Social: punchy, hooks required -- Documentation: clear, step-by-step, minimal personality +**If voice profile specified in context notes:** Load it. -## Phase 2: Pre-Draft Checklist +**If NO voice profile found:** + +``` +Use AskUserQuestion: + +Question: "Which voice/style should I use for this piece?" + +Options: +1. **Pragmatic** - Clear, technical, Hunt/Thomas style +2. **DHH** - Direct, opinionated, punchy +3. **Every** - Professional, warm, insight-forward +4. **Conversational** - Friendly, accessible, uses "you" +5. **Infer from outline** - Match the tone of the outline +``` + +--- + +## Step 6: Select Situational Strategies (BRAINSTORM) + +Load baseline strategies (always apply all 10). + +Then select situational strategies: + +``` +Use AskUserQuestion: + +Question: "Which techniques should I emphasize? (Select 2-3)" + +Options (multiSelect: true): +1. **Strong hooks** - Counterintuitive openings, tension builders +2. **Concrete examples** - Show don't tell, sensory details +3. **Data-driven** - Statistics, research citations +4. **Story elements** - Narrative arc, dialogue, scenes +5. **Persuasion** - Social proof, objection handling +``` + +Map selections to strategies: +- Strong hooks β†’ `hook-effectiveness`, `tension-builder`, `pattern-twist` +- Concrete examples β†’ `ladder-abstraction`, `show-and-tell`, `name-of-dog` +- Data-driven β†’ `source-integration`, `stat-framing` +- Story elements β†’ `narrate-scenes`, `dialogue-compression`, `reveal-traits` +- Persuasion β†’ `objection-bridge`, `social-proof`, `build-to-ask` + +--- + +## Step 7: Pre-Draft Checklist Before writing any prose, verify: @@ -76,27 +161,43 @@ Before writing any prose, verify: - [ ] **Each section has clear purpose** - Know what each must accomplish - [ ] **Sources are sufficient** - Every claim can be supported - [ ] **Voice is defined** - Know the style to match +- [ ] **Scratchpad preferences loaded** - Will honor feedback -If any fail, return to `/writing:plan` to address. +**If any fail:** -## Phase 3: Section-by-Section Drafting +``` +Use AskUserQuestion: + +Question: "Pre-flight check failed: [issue]. What should we do?" + +Options: +1. "Return to /writing:plan" - Address the gap +2. "Proceed anyway" - Note the issue and continue +3. "Clarify now" - Answer inline +``` + +--- + +## Step 8: Section-by-Section Drafting ### The Producer-Critic Loop -For each section, use iterative voice-guardian feedback: +For each section in the outline: ``` Loop for each section: 1. Draft the section following: - - Outline beats - - Style guide rules - - Baseline strategies (short sentences, active voice, concrete examples) + - Outline beats and key points + - Selected strategies + - Voice profile rules + - Scratchpad preferences 2. Run voice-guardian check: Task voice-guardian: "Check this section against voice profile: - [section text] - Voice profile: [profile details] - Return score (0-100) and specific fixes needed." + Section: [section text] + Voice: [profile name] + Scratchpad: [key preferences] + Return: Score (0-100) and specific fixes." 3. If score < 85: - Apply suggested fixes @@ -106,74 +207,93 @@ Loop for each section: - Move to next section ``` -### Baseline Writing Strategies - -Apply these to all content: -- **Short sentences**: Average 15-20 words -- **Active voice**: Subject does the action -- **Concrete examples**: Show, don't tell -- **One idea per paragraph**: No cramming -- **Strong verbs**: Avoid "is", "was", "has" - -### Situational Strategies - -Apply based on context: +### Apply Baseline Strategies -**For technical content**: -- Concrete before abstract -- Physical analogies for concepts -- Code examples where helpful +For ALL content: -**For persuasive content**: -- Acknowledge objections -- Use social proof -- Build to the ask +| Strategy | Check | +|----------|-------| +| `reader-zero-context` | Unfamiliar terms have 3-6 word orienting phrases | +| `subject-verb` | Subject + verb in first 5 words | +| `activate-verbs` | Precise verbs, minimal is/was/has | +| `watch-adverbs` | Strong verbs carry the load | +| `limit-ings` | Simple tense over continuous | +| `prefer-simple` | Everyday language unless technical | +| `cut-big-small` | Edit hierarchically | +| `ban-empty-hypophora` | No self-answered questions | +| `present-active-tense` | Direct, immediate language | +| `one-idea-per-sentence` | Single clear point per sentence | -**For storytelling**: -- Sensory details -- Dialogue where appropriate -- Tension and release - -## Phase 4: Draft Assembly +--- -### Combine Sections -```markdown -# [Title] +## Step 9: Create Draft Variations (EXPLORATION mode) -[Hook - opening 50 words] +If EXPLORATION mode, create 3 distinct drafts: -[Section 1] +``` +Draft 1 (draft-[N]): [Angle 1 - e.g., story-forward] +Draft 2 (draft-[N+1]): [Angle 2 - e.g., data-forward] +Draft 3 (draft-[N+2]): [Angle 3 - e.g., contrarian] +``` -[Section 2] +Each draft should: +- Follow the same outline structure +- Use the same sources +- Vary the APPROACH, not just words: + - Different opening hooks + - Different example emphasis + - Different tonal register -... +--- -[Conclusion with CTA] -``` +## Step 10: Quality Checkpoints -### Quality Checkpoints +Before saving, verify each draft: -Verify before saving: - [ ] Opening hooks within first 50 words - [ ] No paragraph over 4 sentences - [ ] Concrete example in each major section -- [ ] All claims have sources +- [ ] All claims have sources cited - [ ] Clear CTA at end - [ ] Overall voice score β‰₯ 85 +- [ ] Scratchpad preferences honored -## Output +--- + +## Step 11: Save Drafts + +For EXPLORATION mode: + +``` +drafts/[slug]/ +β”œβ”€β”€ draft-[N].md # Draft 1 +β”œβ”€β”€ draft-[N+1].md # Draft 2 +└── draft-[N+2].md # Draft 3 +``` -Save draft to: `drafts/[slug]/draft-v1.md` +For REFINEMENT mode: + +``` +drafts/[slug]/ +└── draft-[ID].md # Updated (keeps same ID) +``` + +**Draft metadata:** ```markdown --- +draft_id: "draft-[N]" title: "[Title]" version: 1 +angle: "[Angle description]" style: "[style used]" voice_score: [final score] word_count: [count] reading_time: "[X] minutes" created: [timestamp] +strategies_applied: + baseline: "all 10" + situational: ["strategy-1", "strategy-2", "strategy-3"] --- [Draft content] @@ -182,79 +302,130 @@ created: [timestamp] ## Draft Notes - Sources used: [list] -- Style guide applied: [name] -- Voice profile: [name or "none"] +- Scratchpad preferences applied: [list] +- Known weaknesses: [any identified issues] ``` -## Post-Draft Options - -After creating draft, use AskUserQuestion: - -**Question**: "Draft ready at `drafts/[slug]/draft-v1.md` ([X] words, voice score: [Y]). What next?" - -**Options**: -1. **Run editorial review** - `/writing:review drafts/[slug]/draft-v1.md` -2. **Tighten/edit manually** - Open draft for hands-on editing -3. **Generate variations** - Create 2 more drafts with different angles -4. **Quick style check** - Run clarity-editor pass only - -## Common Issues - -### Voice Score Won't Reach 85 -- Review voice profile - may be too strict -- Check if content type matches voice -- Consider adjusting profile for this piece - -### Draft Feels Flat -- Add more concrete examples -- Strengthen the opening hook -- Vary sentence length more -- Add tension or stakes - -### Too Long/Too Short -- Review outline section estimates -- Cut less essential sections for shorter -- Expand examples for longer - -## Draft ID Management +--- -Every draft gets a unique, persistent ID: +## Step 12: Draft ID Management ``` -Response 1: draft-1, draft-2, draft-3 (exploration) -Response 2: draft-4, draft-5, draft-6 (new exploration) -Response 3: draft-2 refined (keeps original ID) +Session tracking: +- First exploration: draft-1, draft-2, draft-3 +- Second exploration: draft-4, draft-5, draft-6 +- Refinement of draft-2: draft-2 (keeps ID, version increments) ``` +Rules: - IDs persist across the session -- Never reuse IDs +- NEVER reuse IDs - Refinements keep original draft ID -- New explorations increment +- New explorations always increment + +--- -## Context Notes Output +## Step 13: Output Context Notes -After creating drafts, output context notes for handoff: +Generate handoff for `/writing:review`: ```markdown ## Draft Status -- Version: [draft-v1] -- Word count: [count] -- Voice score: [score] (target: 85) -- Drafts created: [count] (user selected: [ID if applicable]) +- Drafts created: draft-[N], draft-[N+1], draft-[N+2] +- Word counts: [X], [Y], [Z] +- Voice scores: [X], [Y], [Z] (target: 85) ## Strategies Applied - Baseline: All 10 applied - Situational: [strategy-1], [strategy-2], [strategy-3] ## Known Issues -- [Any identified weaknesses] +- [Any identified weaknesses per draft] ## Scratchpad Summary -- βœ“ [Preference applied from scratchpad] -- βœ— [Anti-pattern avoided from scratchpad] +- βœ“ Applied: [preferences honored] +- βœ— Avoided: [anti-patterns avoided] ## Mode -[EXPLORATION or REFINEMENT] +EXPLORATION + +## Recommended Next +User should review drafts and provide feedback via /writing:feedback ``` + +--- + +## Step 14: Present Options (BRAINSTORM) + +``` +Use AskUserQuestion: + +Question: "3 drafts ready. Which resonates most?" + +Options: +1. **draft-[N]**: [Angle 1 summary] - [word count] words +2. **draft-[N+1]**: [Angle 2 summary] - [word count] words +3. **draft-[N+2]**: [Angle 3 summary] - [word count] words +4. **Show all** - Display all 3 for comparison +5. **None** - Try different angles +``` + +After selection: + +``` +Use AskUserQuestion: + +Question: "What next with [selected draft]?" + +Options: +1. **Run editorial review** - `/writing:review [draft-ID]` +2. **Quick feedback** - Mark what works/doesn't +3. **Refine this draft** - Make specific improvements +4. **Generate more variations** - Create 3 more options +``` + +--- + +## Common Issues + +### Voice Score Won't Reach 85 + +``` +Use AskUserQuestion: + +Question: "Voice score stuck at [X]. The profile may be too strict. What should we do?" + +Options: +1. "Lower the bar" - Accept 75+ for this piece +2. "Identify blockers" - Show what's causing drift +3. "Switch voice" - Try a different profile +``` + +### Scratchpad Conflicts + +``` +Use AskUserQuestion: + +Question: "Conflicting preferences in scratchpad: [conflict]. Which takes priority?" + +Options: +1. "[Preference A]" - Recent feedback +2. "[Preference B]" - Earlier feedback +3. "Find middle ground" - Balance both +``` + +--- + +## Quality Checklist + +Before completing: +- [ ] Mode correctly identified (EXPLORATION vs REFINEMENT) +- [ ] Voice profile loaded and applied +- [ ] Scratchpad preferences honored +- [ ] All 10 baseline strategies applied +- [ ] 3-4 situational strategies visible +- [ ] Each draft has unique angle (not just word changes) +- [ ] Draft IDs assigned and tracked +- [ ] Context notes ready for handoff diff --git a/plugins/compound-writing/commands/writing-feedback.md b/plugins/compound-writing/commands/writing-feedback.md index 912eb6a5..220ec9b7 100644 --- a/plugins/compound-writing/commands/writing-feedback.md +++ b/plugins/compound-writing/commands/writing-feedback.md @@ -1,7 +1,7 @@ --- name: writing:feedback description: Capture real-time feedback into scratchpad for iterative refinement -argument-hint: "[draft ID or 'general'] [feedback text]" +argument-hint: "[draft-ID or 'general'] [feedback text]" --- # Writing Feedback Command @@ -12,118 +12,124 @@ Capture what works and what doesn't into a persistent scratchpad that guides fut #$ARGUMENTS -Parse input: -- First word: Draft ID (e.g., "draft-1", "3") or "general" -- Rest: The feedback text +**Input Format:** +- `draft-2 love the opening hook` β†’ Positive feedback on draft-2 +- `3 too formal` β†’ Negative feedback on draft-3 +- `general prefer short sentences` β†’ General preference +- `draft-1 πŸ‘` β†’ Quick thumbs up +- `draft-2 πŸ‘Ž too corporate` β†’ Quick thumbs down with reason -## The Scratchpad System +--- + +## Skills to Load -The scratchpad is a persistent feedback log at `drafts/.scratchpad.md` that: -- Tracks preferences marked as "good" or "bad" -- Records specific draft feedback with IDs -- Builds a profile of what resonates -- Informs all future drafts in the session +``` +Skill: scratchpad + - Preference profile structure + - Recency weighting + - Conflict detection +``` -## Workflow +--- -### Phase 1: Parse Feedback +## Step 1: Parse Input ``` Extract from input: -- target: Draft ID or "general" -- sentiment: Detect if positive ("good", "love", "yes", "perfect") - or negative ("bad", "weak", "no", "wrong") -- content: The actual feedback +- target: Draft ID (e.g., "draft-2", "3") or "general" +- feedback: The feedback text after the target - timestamp: Current time ``` -### Phase 2: Categorize Feedback - -Analyze feedback for patterns: +--- -```markdown -## Feedback Categories +## Step 2: Detect Sentiment -### Voice & Tone -- Too formal / too casual -- Personality level -- Emotional register +Analyze feedback for sentiment: -### Structure & Flow -- Opening strength -- Pacing issues -- Transition problems +| Signal Words | Sentiment | +|-------------|-----------| +| love, good, perfect, yes, great, πŸ‘, βœ“ | Positive | +| bad, weak, wrong, no, hate, πŸ‘Ž, βœ— | Negative | +| prefer, should, could, try | Suggestion | +| ? | Question (needs clarification) | -### Content & Substance -- Missing examples -- Weak claims -- Good insights +--- -### Style & Language -- Word choice -- Sentence rhythm -- Jargon level -``` +## Step 3: Categorize Feedback -### Phase 3: Update Scratchpad +Determine which aspect of writing this affects: -Append to `drafts/.scratchpad.md`: +| Category | Examples | +|----------|----------| +| **Voice & Tone** | "too formal", "love the warmth", "sounds corporate" | +| **Structure & Flow** | "opening is weak", "lost me in the middle", "perfect build-up" | +| **Content & Substance** | "needs more examples", "love the stats", "too abstract" | +| **Style & Language** | "jargon heavy", "punchy sentences work", "too long" | -```markdown --- -## Feedback Entry [timestamp] -**Target**: [draft ID or general] -**Sentiment**: [positive/negative/neutral] -**Category**: [voice/structure/content/style] +## Step 4: Extract Principle -> [Original feedback text] +Transform raw feedback into actionable principle: -**Extracted Principle**: [What this tells us about preferences] +| Raw Feedback | Extracted Principle | +|--------------|---------------------| +| "draft-2's opening is too weak" | Openings need stronger hooks | +| "love the stats in draft-1" | Data points resonate | +| "too formal" | Prefer conversational tone | +| "the gardening analogy was perfect" | Concrete analogies work | +| "lost me in section 3" | Transitions need work | --- + +## Step 5: Check for Conflicts + +If new feedback contradicts existing scratchpad entries: + ``` +Use AskUserQuestion: -### Phase 4: Extract Principles +Question: "I'm seeing conflicting preferences: -From feedback, extract actionable principles: +Previous: '[earlier feedback]' β†’ [principle] +Current: '[new feedback]' β†’ [principle] -| Feedback | Principle | -|----------|-----------| -| "draft-2's opening is too weak" | Openings need stronger hooks | -| "love the stats in draft-1" | Data points resonate | -| "too formal" | Prefer conversational tone | -| "the analogy about gardening was perfect" | Concrete analogies work | +Which should take priority?" -### Phase 5: Summarize Patterns +Options: +1. **New feedback wins** - Update preference to current +2. **Keep previous** - This piece is an exception +3. **Both are true** - Context-dependent, keep both with notes +4. **Clarify** - Help me understand the nuance +``` -After 3+ feedback entries, generate a preference summary: +--- -```markdown -## Preference Profile (Auto-Generated) +## Step 6: Update Scratchpad -### What Works βœ“ -- [Pattern 1 with example] -- [Pattern 2 with example] +Append to `drafts/.scratchpad.md`: -### What Doesn't βœ— -- [Anti-pattern 1] -- [Anti-pattern 2] +```markdown +--- +## Feedback Entry [timestamp] -### Voice Tendency -- [Inferred voice preference] +**Target**: [draft-ID or general] +**Sentiment**: [positive/negative/suggestion] +**Category**: [voice/structure/content/style] +**Raw**: "[Original feedback text]" -### Strategy Recommendations -Based on feedback, prioritize these situational strategies: -- [strategy-1]: Because [reason from feedback] -- [strategy-2]: Because [reason from feedback] +**Principle extracted**: [Actionable learning] +**Strategy impact**: [Which strategies to prioritize/avoid] + +--- ``` -## Output +--- -### Updated Scratchpad +## Step 7: Regenerate Preference Profile -Save to `drafts/.scratchpad.md`: +After 3+ entries, update the preference profile at top of scratchpad: ```markdown --- @@ -133,123 +139,197 @@ entries: [count] # Writing Scratchpad -## Preference Profile +## Preference Profile (Auto-Generated) ### What Works βœ“ -- Data and statistics resonate -- Conversational tone preferred -- Concrete examples > abstract concepts +- [Pattern 1] - evidence: [draft-IDs] +- [Pattern 2] - evidence: [draft-IDs] ### What Doesn't βœ— -- Overly formal language -- Weak openings -- Generic statements without proof +- [Anti-pattern 1] - evidence: [draft-IDs] +- [Anti-pattern 2] - evidence: [draft-IDs] -## Recent Feedback - -[Most recent 10 entries] +### Voice Tendency +Inferred preference: [description] +Confidence: [high/medium/low based on consistency] -## All Feedback Log +### Strategy Recommendations +Based on [N] feedback entries: +- Prioritize: [strategy-1], [strategy-2] +- Avoid: [strategy-3] +- Neutral: [strategy-4] -[Complete history] +### Conflicts Noted +- [Any unresolved conflicts with context] ``` -### Confirmation +--- + +## Step 8: Confirm Capture + +Output confirmation: ```markdown βœ“ Feedback captured for [target] -**Extracted**: [principle] +**Sentiment**: [positive/negative/suggestion] **Category**: [category] -**Pattern count**: [N] entries +**Principle**: [extracted principle] -The scratchpad now reflects: -- [Key preference 1] -- [Key preference 2] +**Scratchpad now has [N] entries:** +- What Works βœ“: [key patterns] +- What Doesn't βœ—: [key anti-patterns] -Next drafts will incorporate these preferences. +Next drafts will apply these preferences. ``` -## Quick Feedback Shortcuts +--- + +## Quick Shortcuts For fast feedback capture: ```bash -# Mark something as good +# Positive feedback /writing:feedback 2 good - love the opening hook +/writing:feedback draft-1 πŸ‘ -# Mark something as bad +# Negative feedback /writing:feedback 3 bad - too formal, sounds corporate +/writing:feedback 2 πŸ‘Ž weak opening -# General preference +# General preferences /writing:feedback general prefer short punchy sentences +/writing:feedback general always lead with data -# Quick thumbs -/writing:feedback 1 πŸ‘ -/writing:feedback 2 πŸ‘Ž +# Compare drafts +/writing:feedback draft-2 better than draft-1, more concrete ``` +--- + ## Integration with Other Commands ### /writing:draft reads scratchpad + ``` -Before creating drafts: +Before creating new drafts: 1. Load drafts/.scratchpad.md 2. Extract preference profile -3. Apply principles to strategy selection -4. Weight recent feedback higher +3. Apply "What Works βœ“" patterns +4. Avoid "What Doesn't βœ—" anti-patterns +5. Weight recent feedback higher ``` ### /writing:review considers scratchpad + ``` During review: 1. Check draft against scratchpad preferences 2. Flag violations of "What Doesn't Work" 3. Highlight alignment with "What Works" +4. Add new learnings to scratchpad ``` -### /writing:compound updates patterns +### /writing:compound promotes patterns + ``` When compounding: -1. Merge scratchpad insights into pattern library -2. Promote recurring preferences to permanent patterns -3. Clear session-specific feedback +1. Identify preferences with 3+ occurrences +2. Promote to permanent pattern library +3. Add to voice profile +4. Clear promoted entries from scratchpad ``` +--- + ## Scratchpad Lifecycle ``` Session Start - ↓ -/writing:feedback β†’ Add entries - ↓ -/writing:draft β†’ Read & apply - ↓ -/writing:feedback β†’ Refine preferences - ↓ -/writing:draft β†’ Better alignment - ↓ -/writing:compound β†’ Persist to patterns - ↓ -Session End (scratchpad can persist or clear) + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ /writing:feedback │◀──┐ +β”‚ Add entry to scratchpad β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ + β”‚ β”‚ + β–Ό β”‚ +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ /writing:draft β”‚ β”‚ +β”‚ Read & apply preferences β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ + β”‚ β”‚ + β–Ό β”‚ + User reviews β”‚ + β”‚ β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ /writing:compound β”‚ +β”‚ Promote to pattern libraryβ”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` -## Advanced: Preference Conflicts +--- + +## Recency Weighting -When feedback seems contradictory: +More recent feedback carries more weight: -```markdown -## Conflict Detected +| Age | Weight | Meaning | +|-----|--------|---------| +| Current turn | 1.0 | Highest priority | +| 1-3 turns ago | 0.8 | Still very relevant | +| 4-6 turns ago | 0.5 | Consider but may be outdated | +| 7+ turns ago | 0.3 | Background context only | -Entry 1: "too casual" -Entry 5: "too formal" +When preferences conflict, recency typically wins unless user specifies otherwise. -**Resolution**: Ask user to clarify -"I'm seeing mixed signals on formality. Entry 1 suggested more formal, -but Entry 5 suggests more casual. What's the right balance for this piece?" -``` +--- ## Example Session ``` -User: /writing:feedback 1 the opening stat really grabbed me \ No newline at end of file +Turn 1: + User: /writing:draft "AI in healthcare" + β†’ Creates draft-1, draft-2, draft-3 + +Turn 2: + User: /writing:feedback draft-1 love the stat opening + β†’ Scratchpad: βœ“ Statistical hooks resonate + +Turn 3: + User: /writing:feedback draft-3 too formal, sounds like a press release + β†’ Scratchpad: βœ— Avoid formal/corporate tone + +Turn 4: + User: /writing:feedback general prefer conversational tone with data + β†’ Scratchpad: βœ“ Conversational + data-driven = winning combo + +Turn 5: + User: /writing:draft refine draft-1 + β†’ Reads scratchpad, applies: stat hook + conversational tone + β†’ Avoids: formal language + β†’ Creates refined draft-1 + +Turn 6: + User: /writing:feedback draft-1 perfect, this is it + β†’ Scratchpad: βœ“ Confirmed: casual + data = success + β†’ Ready for /writing:compound +``` + +--- + +## Quality Checklist + +Before completing: +- [ ] Input parsed correctly (target + feedback) +- [ ] Sentiment detected accurately +- [ ] Category assigned appropriately +- [ ] Principle extracted (actionable, specific) +- [ ] Conflicts checked and resolved +- [ ] Scratchpad updated +- [ ] Preference profile regenerated (if 3+ entries) +- [ ] Confirmation shown to user diff --git a/plugins/compound-writing/commands/writing-knowledge.md b/plugins/compound-writing/commands/writing-knowledge.md index 9450b3f3..ae0bffbf 100644 --- a/plugins/compound-writing/commands/writing-knowledge.md +++ b/plugins/compound-writing/commands/writing-knowledge.md @@ -1,7 +1,7 @@ --- name: writing:knowledge description: Manage workspace knowledge - voice profiles, patterns, and reference materials -argument-hint: "[add|search|list] [content or query]" +argument-hint: "[search|add|list|import] [query or content]" --- # Writing Knowledge Command @@ -12,9 +12,27 @@ Build and query your writing knowledge base - voice profiles, proven patterns, a #$ARGUMENTS -Parse: -- Action: `add`, `search`, `list`, `import` -- Content: Query string or content to add +**Input Types:** +- `search "opening hooks for technical content"` β†’ Query knowledge +- `add pattern "The Callback Close..."` β†’ Add new pattern +- `list patterns` β†’ Browse patterns +- `list voice-profiles` β†’ Browse voices +- `import voice-profile samples/*.md` β†’ Extract voice from samples + +--- + +## Skills to Load + +``` +Skill: voice-capture + - Extract voice patterns from samples + - Build voice profiles + +Skill: scratchpad + - Connect session preferences to knowledge +``` + +--- ## Knowledge Architecture @@ -24,248 +42,461 @@ Parse: β”‚ β”œβ”€β”€ kieran-blog.yaml β”‚ └── company-formal.yaml β”œβ”€β”€ patterns/ # Proven patterns -β”‚ β”œβ”€β”€ hooks/ -β”‚ β”œβ”€β”€ structures/ -β”‚ └── transitions/ +β”‚ β”œβ”€β”€ hooks/ # Opening formulas +β”‚ β”œβ”€β”€ structures/ # Article templates +β”‚ β”œβ”€β”€ transitions/ # Flow techniques +β”‚ └── closings/ # Ending formulas β”œβ”€β”€ references/ # Source materials β”‚ β”œβ”€β”€ style-guides/ β”‚ └── exemplars/ └── index.md # Searchable index ``` -## Actions +--- + +## Action: `search` -### `search` - Find Relevant Knowledge +**Usage:** `/writing:knowledge search "query"` -```bash -/writing:knowledge search "opening hooks for technical content" +### Step 1: Parse Query + +``` +Extract: +- Keywords: [main terms] +- Intent: [hooks/structure/voice/style/all] +- Context: [if any specific context mentioned] +``` + +### Step 2: Search All Sources + +``` +Search in parallel: +1. Voice profiles β†’ Relevant traits and guidance +2. Patterns β†’ Matching techniques +3. References β†’ Example excerpts +4. Scratchpad β†’ Session preferences that apply ``` -**Process**: -1. Search voice profiles for relevant traits -2. Search patterns for matching techniques -3. Search references for examples -4. Rank by relevance and recency +### Step 3: Rank Results + +``` +Ranking factors: +- Keyword match strength +- Recency of creation/update +- Usage count (if tracked) +- Success rate (if tracked) +``` + +### Step 4: Present Results -**Output**: ```markdown -## Knowledge Search: "opening hooks for technical content" +## Knowledge Search: "[query]" ### Voice Profile Match -**kieran-blog** recommends: -- Lead with counterintuitive insight -- Concrete before abstract +**[profile-name]** recommends: +- [Relevant guidance 1] +- [Relevant guidance 2] ### Relevant Patterns -**hook-stat-surprise** (used 12x, 89% positive feedback) -> "Most developers spend 40% of their time..." +**[pattern-name]** (used Xx, Y% positive) +> "[Example or formula]" +**When to use**: [context] -**hook-question-challenge** (used 8x, 75% positive) -> "What if everything you knew about X was wrong?" +**[pattern-name-2]** (used Xx, Y% positive) +> "[Example or formula]" ### Reference Examples -From `exemplars/best-openings.md`: -- [Example 1 with source] -- [Example 2 with source] +From `exemplars/[file].md`: +- [Relevant excerpt with context] + +### Session Preferences +From scratchpad: +- [Any relevant current preferences] ``` -### `add` - Add New Knowledge +### Step 5: Offer Next Steps (BRAINSTORM) -```bash -/writing:knowledge add pattern "The Callback Close - end by referencing the opening hook" +``` +Use AskUserQuestion: + +Question: "Found [N] relevant results. What would you like to do?" + +Options: +1. **Use [top pattern]** - Apply to current draft +2. **Show more details** - Expand on specific result +3. **Refine search** - Try different keywords +4. **Add to current piece** - Insert pattern into outline/draft ``` -**Process**: -1. Categorize the knowledge (pattern/voice/reference) -2. Extract key attributes -3. Add to appropriate location -4. Update searchable index +--- -### `list` - Browse Knowledge +## Action: `add` + +**Usage:** `/writing:knowledge add [type] "[content]"` + +### Step 1: Determine Type + +| Command | Type | Destination | +|---------|------|-------------| +| `add pattern hooks "..."` | Hook pattern | patterns/hooks/ | +| `add pattern structure "..."` | Structure | patterns/structures/ | +| `add pattern transition "..."` | Transition | patterns/transitions/ | +| `add voice-profile "..."` | Voice traits | voice-profiles/ | +| `add reference "..."` | Reference material | references/ | + +### Step 2: Extract Attributes (BRAINSTORM) -```bash -/writing:knowledge list patterns -/writing:knowledge list voice-profiles -/writing:knowledge list references ``` +Use AskUserQuestion: -### `import` - Import from External Source +Question: "Adding new [type]. Let me capture the details:" -```bash -/writing:knowledge import voice-profile samples/writing-samples/*.md -/writing:knowledge import patterns competitor-analysis.md +Options for pattern: +1. **Quick add** - Just save with basic metadata +2. **Full documentation** - Add examples, when to use, variations ``` -## Two-Level Knowledge System +If full documentation: -### Level 1: Instant Access (Brief) -Core facts loaded into every writing session: -- Active voice profile traits -- Top 5 proven patterns -- Key prohibitions +``` +Question: "When should this pattern be used?" -### Level 2: Deep Lookup (Search) -Full knowledge base queried on demand: -- All pattern variations -- Complete exemplar library -- Historical feedback data +Options: +1. [Suggested context 1] +2. [Suggested context 2] +3. [Suggested context 3] +4. Custom - Describe the context +``` + +### Step 3: Create Pattern File + +```markdown +--- +title: "[Pattern Name]" +type: [hook/structure/transition/closing] +created: [timestamp] +source: "manual" +tags: [tag1, tag2] +usage_count: 0 +success_rate: null +--- + +## Pattern + +[Description of the pattern] + +## Formula + +"[Pattern with placeholders]" -## Knowledge Index +## Example -The index at `.claude/writing-knowledge/index.md`: +> [Concrete example] + +## When to Use + +- [Context 1] +- [Context 2] + +## Variations + +- [Variation 1] +- [Variation 2] +``` + +### Step 4: Update Index + +Append to `.claude/writing-knowledge/index.md`: + +```markdown +### [Category] +- **[pattern-name]**: [brief description] - [date added] +``` + +### Step 5: Confirm ```markdown +βœ“ Pattern added: [pattern-name] + +**Saved to**: [file path] +**Tags**: [tags] +**Searchable via**: "/writing:knowledge search [keywords]" +``` + --- -updated: 2025-01-16 -profiles: 3 -patterns: 47 -references: 12 + +## Action: `list` + +**Usage:** `/writing:knowledge list [category]` + +### Categories + +``` +/writing:knowledge list patterns β†’ All patterns +/writing:knowledge list hooks β†’ Hook patterns only +/writing:knowledge list structures β†’ Structure templates +/writing:knowledge list voice-profiles β†’ All voice profiles +/writing:knowledge list references β†’ Reference materials +/writing:knowledge list all β†’ Everything +``` + +### Output Format + +```markdown +## [Category] ([count] items) + +### Most Used +1. **[name]** - [description] - used [N]x +2. **[name]** - [description] - used [N]x + +### Recently Added +1. **[name]** - [description] - [date] +2. **[name]** - [description] - [date] + +### By Tag +**[tag]**: [pattern1], [pattern2] +**[tag]**: [pattern3], [pattern4] +``` + +### Offer Actions (BRAINSTORM) + +``` +Use AskUserQuestion: + +Question: "Showing [N] [category]. What would you like to do?" + +Options: +1. **View details** - Show full pattern for [top item] +2. **Search within** - Filter by keyword +3. **Edit** - Modify an existing pattern +4. **Delete** - Remove outdated pattern +5. **Done** - Exit +``` + --- -# Writing Knowledge Index +## Action: `import` -## Quick Stats -- **Most used pattern**: hook-stat-surprise (34 uses) -- **Best performing**: callback-close (94% positive) -- **Active voice**: kieran-blog +**Usage:** `/writing:knowledge import [type] [source]` -## Categories +### Import Voice Profile -### Hooks (12 patterns) -- hook-stat-surprise: Lead with surprising statistic -- hook-question: Open with provocative question -- hook-story: In media res narrative -... +```bash +/writing:knowledge import voice-profile samples/my-best-posts/*.md +``` + +#### Step 1: Load Samples + +``` +Load skill: voice-capture + +Read all files matching the pattern +Extract for each: +- Word count +- Sentence patterns +- Vocabulary frequency +- Tone markers +``` + +#### Step 2: Analyze Voice (BRAINSTORM) -### Structures (8 patterns) -- structure-problem-solution: Classic persuasion arc -- structure-listicle: Numbered insights -... +``` +Use AskUserQuestion: -### Transitions (15 patterns) -... +Question: "Analyzed [N] writing samples. I found these consistent patterns: -### Closings (7 patterns) -... +**Vocabulary**: [findings] +**Rhythm**: [findings] +**Tone**: [findings] -## Voice Profiles -- kieran-blog: Conversational, direct, technically-informed -- company-formal: Professional, precise, authoritative -- newsletter: Personal, warm, insight-forward +What should I call this voice profile?" + +Options: +1. **[auto-suggested-name]** - Based on detected style +2. **Custom name** - Enter your own +``` + +#### Step 3: Create Profile + +```yaml +# .claude/writing-knowledge/voice-profiles/[name].yaml + +name: "[name]" +created: [timestamp] +source: "imported from [N] samples" + +traits: + vocabulary: + technical_level: [accessible/moderate/expert] + formality: [casual/professional/academic] + distinctive_words: [list] + prohibited: [list] + + rhythm: + avg_sentence_length: [X] words + pattern: "[description]" + paragraph_length: [X] sentences + + tone: + emotional_register: [warm/neutral/intense] + personality: [high/medium/low] + direct_address: [yes/no] + humor: [present/absent] + +channels: + blog: "[channel-specific guidance]" + newsletter: "[channel-specific guidance]" + social: "[channel-specific guidance]" + +exemplars: + - path: "[sample-1-path]" + why: "[what it demonstrates]" + - path: "[sample-2-path]" + why: "[what it demonstrates]" +``` + +#### Step 4: Confirm + +```markdown +βœ“ Voice profile created: [name] + +**Based on**: [N] samples +**Key traits**: +- [trait 1] +- [trait 2] +- [trait 3] + +**Use with**: `/writing:draft` will now offer this voice +**Edit**: `.claude/writing-knowledge/voice-profiles/[name].yaml` +``` + +### Import Patterns + +```bash +/writing:knowledge import patterns competitor-analysis.md +``` + +Extracts patterns from analysis documents and adds to pattern library. + +### Import References + +```bash +/writing:knowledge import reference company-style-guide.pdf ``` +Adds to references for use by style-checking agents. + +--- + +## Two-Level Knowledge System + +### Level 1: Instant Access (Brief) + +Loaded into every writing session automatically: +- Active voice profile traits +- Top 5 proven patterns (by usage/success) +- Key prohibitions + +### Level 2: Deep Lookup (Search) + +Queried on demand via `/writing:knowledge search`: +- All pattern variations +- Complete exemplar library +- Historical feedback data +- Full reference materials + +--- + ## Integration with Commands ### /writing:plan ``` Before planning: -- Load Level 1 knowledge (brief) -- Check for relevant patterns -- Apply voice profile constraints +1. Load Level 1 knowledge (brief) +2. Check for relevant patterns for topic +3. Apply voice profile constraints ``` ### /writing:draft ``` During drafting: -- Query Level 2 for specific techniques -- Match patterns to content type -- Enforce voice profile rules +1. Query Level 2 for specific techniques +2. Match patterns to content type +3. Enforce voice profile rules ``` ### /writing:review ``` During review: -- Check against voice profile -- Verify pattern usage -- Flag knowledge violations +1. Check against voice profile +2. Verify pattern usage +3. Flag knowledge violations ``` ### /writing:compound ``` After success: -- Extract new patterns -- Update index -- Reinforce what worked +1. Extract new patterns β†’ add to knowledge +2. Update pattern usage counts +3. Reinforce what worked ``` +--- + ## Building Your Knowledge Base ### Start with Voice Profile + ```bash -# Capture your voice from samples -/writing:knowledge import voice-profile my-best-posts/*.md +# Capture voice from your best writing +/writing:knowledge import voice-profile ~/blog/best-posts/*.md # Or define manually /writing:knowledge add voice-profile "direct, uses analogies, avoids jargon" ``` ### Add Patterns as You Write + ```bash -# After a successful piece -/writing:compound draft-final.md +# After compounding a successful piece +/writing:compound latest # Manually add a technique /writing:knowledge add pattern hooks "Start with the ending - reveal outcome first" ``` ### Import References + ```bash # Add style guides /writing:knowledge import reference company-style-guide.pdf # Add exemplars -/writing:knowledge import exemplar best-blog-post.md "Great hook technique" +/writing:knowledge import reference best-blog-post.md ``` -## Knowledge Queries +--- + +## Natural Language Queries -Natural language queries work: +These all work: ```bash /writing:knowledge search "how do I write better openings?" /writing:knowledge search "examples of data-driven hooks" -/writing:knowledge search "what does kieran-blog voice sound like?" +/writing:knowledge search "what does my blog voice sound like?" /writing:knowledge search "patterns for technical tutorials" +/writing:knowledge search "transitions between sections" ``` -## Knowledge Lifecycle - -``` -Write β†’ Get Feedback β†’ Compound β†’ Knowledge grows - ↑ ↓ - ←←←←← Future writing benefits ←←←←←← -``` - -Each successful piece adds to knowledge: -- New patterns discovered -- Voice profile refined -- Feedback integrated - -## Example: Building Hook Knowledge - -```markdown -## Pattern: hook-stat-surprise - -**Category**: hooks -**Uses**: 34 -**Success Rate**: 89% - -**Formula**: -"[Surprising statistic]. [Why it matters]. [What we'll explore]." - -**Examples**: -1. "Developers spend 40% of their time debugging. That's 2 days a week lost. Here's how to cut it in half." -2. "93% of written content never gets read past the headline. Yours doesn't have to be one of them." - -**When to use**: -- Technical content -- Persuasive pieces -- Data-rich topics +--- -**Variations**: -- Lead with the stat -- Lead with the implication -- Lead with the question the stat answers +## Quality Checklist -**Source**: Extracted from top-performing posts 2024-2025 -``` +Before completing: +- [ ] Action correctly identified (search/add/list/import) +- [ ] Knowledge type determined +- [ ] Relevant sources searched/created +- [ ] Results formatted clearly +- [ ] Index updated (for add/import) +- [ ] User offered relevant next steps diff --git a/plugins/compound-writing/commands/writing-plan.md b/plugins/compound-writing/commands/writing-plan.md index 6f002c9e..4922b74f 100644 --- a/plugins/compound-writing/commands/writing-plan.md +++ b/plugins/compound-writing/commands/writing-plan.md @@ -12,135 +12,287 @@ Transform a topic or brief into a comprehensive research package and structured #$ARGUMENTS -## Workflow Overview +--- + +## Skills to Load + +Before starting, load these skills: + +``` +Skill: writing-orchestration + - Two-gate assessment framework + - Baseline strategies reference + +Skill: context-notes + - Handoff protocol for /writing:draft +``` + +--- + +## Step 1: Parse Input + +Determine what we're working with: + +| Input Type | Example | Action | +|------------|---------|--------| +| Vague topic | "AI" | Go to Step 2 (needs clarification) | +| Topic with angle | "Why AI will replace junior devs" | Skip to Step 3 | +| Full brief | "Blog post for CTOs about AI hiring" | Skip to Step 3 | +| Existing outline | "drafts/ai-hiring/outline.md" | Skip to Step 5 | + +--- + +## Step 2: Clarify the Brief (BRAINSTORM) + +**Use AskUserQuestion** to clarify vague inputs: + +``` +Question: "Let's sharpen this topic. What angle do you want to take?" + +Options: +1. "Controversial take" - Challenge conventional wisdom +2. "How-to/Tutorial" - Teach something specific +3. "Story/Case study" - Narrative-driven +4. "Analysis/Opinion" - Your perspective on trends +5. Other - Describe your angle +``` + +**Then ask about audience:** + +``` +Question: "Who specifically are you writing for?" -This command executes the **research and planning phase** of the writing workflow: -1. Clarify the brief (what, who, why) -2. Parallel research (sources, audience, competitors) -3. Two-gate assessment (material sufficiency, message clarity) -4. Create structured outline with hooks +Options: +1. "Technical practitioners" - Developers, engineers +2. "Business leaders" - CTOs, founders, managers +3. "General audience" - Curious non-experts +4. "Specific persona" - Describe them +``` -## Phase 1: Clarify the Brief +**Then ask about outcome:** -Before any research, answer these questions: +``` +Question: "What should readers do after reading?" -### The Core Questions -1. **What's the argument?** - The specific point to make (not just the topic) -2. **Who's the reader?** - Specific audience, not "everyone" -3. **What should they do after?** - The call to action +Options: +1. "Change their mind" - Shift perspective +2. "Take action" - Specific next step +3. "Share/discuss" - Spread the idea +4. "Learn something" - Understand a concept +``` -### Brief Clarification -If the input is vague, use AskUserQuestion to clarify: +**Then ask about format:** ``` -Questions to ask: -- "What's the specific angle or argument? (Not just the topic, but your take)" -- "Who specifically are you writing for?" -- "What should readers do after reading?" -- "What channel? (blog, newsletter, social, documentation)" -- "Target length? (short: <1000 words, medium: 1000-2500, long: 2500+)" +Question: "What format and length?" + +Options: +1. "Blog post (1000-2000 words)" - Standard long-form +2. "Newsletter (500-1000 words)" - Punchy, personal +3. "Deep dive (2500+ words)" - Comprehensive +4. "Social thread" - Twitter/LinkedIn series ``` -Only proceed when you have clear answers. +**Capture answers as the brief:** + +```markdown +## Brief + +**Topic**: [original input] +**Angle**: [selected angle] +**Audience**: [selected audience] +**Desired Action**: [selected outcome] +**Format**: [selected format] +**Length**: [word count target] +``` + +--- + +## Step 3: Load Knowledge Context -## Phase 2: Parallel Research +Check for existing knowledge: + +``` +1. Check .claude/writing-knowledge/ for: + - Voice profile to use + - Relevant patterns for this topic + - Past pieces on similar topics + +2. If voice profile found: + Load profile into context + +3. If patterns found: + Load top 3 relevant patterns +``` + +--- + +## Step 4: Parallel Research Launch three research agents simultaneously: ``` -Task source-researcher: "Research sources for: [topic] +Task source-researcher: "Research PRIMARY SOURCES for: [topic] Find: -- Primary sources (original research, data) -- Expert perspectives -- Supporting statistics -- Concrete examples -Return structured source list with quotes and reliability ratings." +- Original research and data +- Expert quotes and perspectives +- Statistics with citations +- Concrete examples and case studies +Return: Structured source list with reliability ratings." -Task source-researcher: "Analyze the target audience for: [topic] +Task source-researcher: "Analyze TARGET AUDIENCE for: [topic] Determine: -- What they already know -- Their emotional state -- Their goals and objections -- The action they should take -Return audience profile." +- What they already know (baseline) +- Their emotional state and concerns +- Goals and objections +- Language they use +Return: Audience profile with communication recommendations." -Task source-researcher: "Analyze competitor content for: [topic] +Task source-researcher: "Analyze COMPETITOR CONTENT for: [topic] Find: -- Top existing pieces on this topic +- Top 5 existing pieces on this topic - Their angles and approaches - Gaps and weaknesses - Differentiation opportunities -Return competitive analysis." +Return: Competitive landscape with recommended angles." ``` -## Phase 3: Two-Gate Assessment +**Wait for all three to complete before proceeding.** + +--- + +## Step 5: Two-Gate Assessment + +Load the two-gate framework from `writing-orchestration` skill: ### Gate 1: Material Sufficiency + Ask: "Could I write this without inventing facts?" -**Pass criteria:** -- [ ] Concrete examples available -- [ ] Data to support key claims -- [ ] Expert voices to cite +**Checklist:** +- [ ] Have 3+ concrete examples +- [ ] Have data to support key claims +- [ ] Have expert voices to cite - [ ] No major claims without sources -**If fails:** Return to research with specific gaps identified. +**If FAILS:** + +``` +Use AskUserQuestion: + +Question: "Research gaps found. What should we do?" + +Options: +1. "Deeper research" - Find more sources (describe what's missing) +2. "Narrow the angle" - Reduce scope to what we can support +3. "Proceed anyway" - Mark unsupported claims for later +``` ### Gate 2: Message Clarity -Ask: "Do I know the specific point to make?" -**Pass criteria:** -- [ ] Can state the thesis in one sentence -- [ ] The angle is differentiated from competitors -- [ ] The CTA is clear and actionable +Ask: "Do I know exactly what point to make?" -**If fails:** Clarify the angle before proceeding. +**Checklist:** +- [ ] Can state thesis in one sentence +- [ ] Angle is differentiated from competitors +- [ ] CTA is clear and actionable +- [ ] Know why this matters to audience -## Phase 4: Create Outline +**If FAILS:** -Using the structure-architect agent patterns: +``` +Use AskUserQuestion: -### Generate Hook Options +Question: "The message needs sharpening. What's the ONE thing you want readers to remember?" + +Options: +1. [Suggested thesis based on research] +2. [Alternative thesis] +3. [Alternative thesis] +4. Other - State your thesis +``` -Create 3-5 hook options: -- **Story opening**: Concrete example first -- **Surprising stat**: Data that demands explanation -- **Tension**: Problem that needs resolution -- **Question**: Something reader genuinely wants answered +--- + +## Step 6: Generate Hook Options (BRAINSTORM) + +Create 4-5 hook options using different patterns: + +``` +Use AskUserQuestion: + +Question: "Which opening hook resonates most?" + +Options: +1. **Story hook**: "[Concrete example/anecdote opening]" +2. **Stat hook**: "[Surprising statistic] + implication" +3. **Question hook**: "[Provocative question readers want answered]" +4. **Tension hook**: "[Problem that demands resolution]" +5. Other - Describe your ideal opening +``` + +--- -Present options to user with recommendation. +## Step 7: Create Structure (BRAINSTORM) -### Create Beat-by-Beat Outline +Load structure patterns from knowledge base, then: + +``` +Use AskUserQuestion: + +Question: "Which structure fits this piece?" + +Options: +1. **Problem β†’ Solution β†’ Proof** - Classic persuasion +2. **Story β†’ Lesson β†’ Application** - Narrative-driven +3. **Myth β†’ Reality β†’ Implication** - Contrarian take +4. **List of [N] points** - Scannable insights +5. Custom - Describe your structure +``` + +--- + +## Step 8: Build Beat-by-Beat Outline + +Using selected hook and structure: ```markdown -## Outline: [Title] +## Outline: [Working Title] ### Hook (0-50 words) [Actual opening text or close approximation] +**Pattern used**: [hook type] ### Section 1: [Title] (~X words) **Purpose**: [What this accomplishes] **Key points**: -- Point 1 -- Point 2 +- [Point 1] +- [Point 2] **Source needed**: [Specific source from research] -**Transition**: [How to move to next section] +**Transition to next**: [How to move forward] ### Section 2: [Title] (~X words) [Continue pattern...] +### Section 3: [Title] (~X words) +[Continue pattern...] + ### Conclusion (~X words) **Summary**: [Key takeaway restated] **CTA**: [Specific action] -**Final line**: [Memorable closer] +**Final line**: [Memorable closer - callback to hook?] --- **Total estimated length**: X words **Reading time**: X minutes +**Structure pattern**: [pattern name] +**Voice profile**: [profile name] ``` -## Output Files +--- + +## Step 9: Save Output Files Create in `drafts/[slug]/`: @@ -149,22 +301,25 @@ drafts/ └── [slug]/ β”œβ”€β”€ outline.md # The structured outline β”œβ”€β”€ research.md # Combined research package - └── sources.md # Source list with citations + β”œβ”€β”€ sources.md # Source list with citations + └── brief.md # Original brief and decisions ``` -## Context Notes Output +--- + +## Step 10: Output Context Notes -After creating the outline, output context notes for handoff to `/writing:draft`: +Generate handoff for `/writing:draft`: ```markdown ## Research Summary -[2-3 sentences summarizing the research phase] +[2-3 sentences summarizing research phase] ## Material Available - [Concrete example 1] -- [Data point 1] -- [Quote or source 1] +- [Data point 1 with source] +- [Quote 1 with attribution] ## Message Clarity **Thesis**: [One sentence thesis] @@ -181,28 +336,34 @@ EXPLORATION ``` -These notes pass to the draft command for seamless handoff. +--- -## Post-Planning Options +## Step 11: Post-Planning Options -After creating the outline, use AskUserQuestion: +``` +Use AskUserQuestion: -**Question**: "Outline ready at `drafts/[slug]/outline.md`. What next?" +Question: "Outline ready at `drafts/[slug]/outline.md`. What next?" -**Options**: -1. **Deepen research** - Get more sources on specific sections -2. **Review outline** - Get structural feedback before drafting -3. **Start drafting** - Run `/writing:draft drafts/[slug]/outline.md` +Options: +1. **Start drafting** - Run `/writing:draft drafts/[slug]/outline.md` +2. **Deepen research** - Get more sources on specific sections +3. **Review outline** - Get structural feedback before drafting 4. **Adjust angle** - Refine the thesis or approach +5. **Save for later** - Done for now +``` + +--- ## Quality Checklist Before completing: -- [ ] Brief is clarified (what, who, why) +- [ ] Brief is fully clarified (what, who, why, format) - [ ] Research covers sources, audience, competitors - [ ] Material sufficiency gate passed - [ ] Message clarity gate passed - [ ] Hook is concrete (not abstract) -- [ ] Each section has clear purpose +- [ ] Each section has clear purpose and sources - [ ] Transitions are planned - [ ] CTA is specific +- [ ] Context notes ready for handoff diff --git a/plugins/compound-writing/commands/writing-review.md b/plugins/compound-writing/commands/writing-review.md index 16370cdd..7ac441db 100644 --- a/plugins/compound-writing/commands/writing-review.md +++ b/plugins/compound-writing/commands/writing-review.md @@ -1,7 +1,7 @@ --- name: writing:review description: Exhaustive parallel editorial review of written content -argument-hint: "[path to draft.md or 'latest']" +argument-hint: "[path to draft.md] or [draft-ID] or 'latest'" --- # Writing Review Command @@ -12,129 +12,243 @@ Multi-agent editorial review that examines content from every angle. #$ARGUMENTS -If "latest" is provided, find the most recent draft in `drafts/`. +**Input Types:** +- `drafts/[slug]/draft-1.md` β†’ Review specific file +- `draft-2` β†’ Find and review draft with that ID +- `latest` β†’ Find most recent draft in `drafts/` -## Workflow Overview +--- + +## Skills to Load + +Before starting, load these skills: + +``` +Skill: writing-orchestration + - Quality checkpoints + - Strategy verification + +Skill: scratchpad + - Read session preferences + - Update with review learnings + +Skill: context-notes + - Read handoff from /writing:draft + - Output handoff for revision + +Skill: [style guide] - Based on draft metadata: + - every-style-editor (Every content) + - pragmatic-writing (technical content) + - dhh-writing (opinionated content) +``` + +--- + +## Step 1: Locate Draft + +``` +If input is file path: + Load that file + +If input is draft ID (e.g., "draft-2"): + Search drafts/ for matching draft_id in frontmatter + +If input is "latest": + Find most recently modified .md in drafts/ +``` + +--- -This command executes the **review phase**: -1. Load draft and context -2. Launch parallel review agents -3. Collect and prioritize findings -4. Present interactive triage -5. Apply accepted fixes +## Step 2: Load Draft Context -## Phase 1: Load Context +Extract from draft file: + +``` +From frontmatter: +- draft_id +- title +- version +- style/voice used +- voice_score (current) +- word_count +- strategies_applied + +From content: +- Full draft text +- Section structure +``` + +--- + +## Step 3: Load Context Notes + +If context notes from `/writing:draft` available: -### Read Draft ``` -Read the draft file Extract: -- Title and metadata -- Word count -- Style used -- Voice profile (if any) -- Draft ID (e.g., draft-2) +- Strategies that were applied +- Known issues already identified +- Scratchpad preferences used ``` -### Read Context Notes -If context notes were passed from `/writing:draft`: -- Load strategies applied -- Check known issues -- Load scratchpad summary +--- + +## Step 4: Load Scratchpad + +Check `drafts/.scratchpad.md`: -### Read Scratchpad -Check `drafts/.scratchpad.md` for session preferences: ``` If scratchpad exists: - - Load preference profile - - Use "What Works βœ“" to validate draft alignment - - Flag "What Doesn't βœ—" violations as issues + 1. Load preference profile + 2. "What Works βœ“" β†’ Validate draft alignment + 3. "What Doesn't βœ—" β†’ Flag violations as issues ``` -### Load Review Context +--- + +## Step 5: Load Review Context + ``` -If voice profile exists: Load for voice-guardian -If style guide specified: Load rules -Find sources.md for fact-checking +Load for agents: +- Voice profile (if specified) +- Style guide rules +- Sources.md (for fact-checking) +- Research.md (for completeness checking) ``` -## Phase 2: Parallel Review Agents +--- + +## Step 6: Select Review Depth (BRAINSTORM) -Launch ALL relevant agents simultaneously: +``` +Use AskUserQuestion: -### Core Reviews (Always Run) +Question: "How thorough should this review be?" + +Options: +1. **Quick pass** - Voice + clarity only (fastest) +2. **Standard review** - Voice + clarity + facts + structure +3. **Deep review** - All agents + publishing optimization +4. **Custom** - Select specific agents +``` + +If "Custom" selected: + +``` +Use AskUserQuestion: + +Question: "Which review agents should I run? (Select all that apply)" + +Options (multiSelect: true): +1. **Voice Guardian** - Voice consistency and drift +2. **Clarity Editor** - Clarity, concision, jargon +3. **Fact Checker** - Verify claims against sources +4. **Structure Architect** - Flow and organization +5. **Publishing Optimizer** - SEO and social hooks +6. **Style Guide** - [Detected style] compliance +``` + +--- + +## Step 7: Launch Parallel Review Agents + +Run selected agents simultaneously: + +### Core Reviews ``` Task voice-guardian: "Check voice consistency in this draft. -Voice profile: [profile or 'infer from content'] +Voice profile: [profile or 'infer'] Draft: [draft content] -Return: Voice score, drift areas, specific fixes." +Scratchpad preferences: [key preferences] +Return: +- Voice score (0-100) +- Drift areas with line numbers +- Specific fixes with before/after" -Task clarity-editor: "Review for clarity, concision, jargon, and passive voice. +Task clarity-editor: "Review for clarity, concision, and accessibility. Draft: [draft content] +Check for: +- Passive voice instances +- Unnecessary jargon +- Redundant phrases +- Unclear sentences Return: Prioritized issues with before/after fixes." Task fact-checker: "Verify all claims against sources. Draft: [draft content] Sources: [sources.md content] -Return: Claim verification report." +Return: +- Verified claims βœ“ +- Unverified claims ? +- Incorrect claims βœ— +- Suggestions for each" Task structure-architect: "Analyze flow and structure. Draft: [draft content] -Return: Flow analysis, gap identification, structure assessment." +Outline: [original outline if available] +Return: +- Flow analysis +- Gap identification +- Pacing assessment +- Structure score" ``` ### Style Reviews (Based on Context) -If using Every style: -``` -Task every-style-editor: "Check against Every's style guide. -Draft: [draft content] -Return: Style violations with line numbers and fixes." ``` +If using Every style: + Task every-style-editor: "Check against Every's style guide. + Draft: [draft content] + Return: Violations with line numbers and fixes." If technical content: -``` -Skill: pragmatic-writing -Apply pragmatic writing principles and report issues. -``` + Skill: pragmatic-writing + Apply pragmatic principles, report issues. -If opinion/persuasive content: -``` -Skill: dhh-writing -Apply DHH's direct, opinionated style checks. +If opinion/persuasive: + Skill: dhh-writing + Apply DHH style checks, report issues. ``` ### Publishing Reviews (If Requested) ``` -Task publishing-optimizer: "Analyze for SEO and social potential. +Task publishing-optimizer: "Analyze for discoverability and engagement. Draft: [draft content] -Return: SEO recommendations, social hooks, headline alternatives." +Return: +- SEO recommendations +- Social media hooks (3-5 options) +- Headline alternatives (5 options) +- Newsletter subject lines (3 options)" ``` -## Phase 3: Collect and Prioritize Findings +**Wait for all agents to complete.** + +--- + +## Step 8: Collect and Prioritize Findings ### Categorize Issues ```markdown ## Review Summary -### Critical (Must Fix) +### πŸ”΄ Critical (Must Fix) Issues that significantly harm the piece: - Factual errors - Unsupported claims - Major clarity problems - Structural gaps -### Important (Should Fix) +### 🟑 Important (Should Fix) Issues that noticeably weaken the piece: - Voice drift - Passive voice - Unnecessary jargon - Flow problems -### Polish (Nice to Fix) +### 🟒 Polish (Nice to Fix) Minor improvements: - Word choice refinements - Rhythm adjustments @@ -142,148 +256,193 @@ Minor improvements: ``` ### Deduplicate -Multiple agents may flag the same issue. Combine duplicates and note agreement: + +If multiple agents flag the same issue, combine and note agreement: + ``` "Passive voice in paragraph 3" - flagged by: clarity-editor, voice-guardian +(Higher confidence when multiple agents agree) ``` -## Phase 4: Interactive Triage - -Present each issue with options: - -```markdown --- -**[Critical]** Unsupported claim in paragraph 3 +## Step 9: Interactive Triage (BRAINSTORM) -> "Studies show that 73% of developers prefer..." +Present issues one by one: -No source provided for this statistic. +### For Critical Issues -**Suggested fix**: Add citation or remove claim. +``` +Use AskUserQuestion: -What would you like to do? -1. Accept fix (add citation placeholder) -2. Skip (keep as is) -3. Custom (provide your fix) -4. Remove claim entirely +Question: "[Critical] Unsupported claim in paragraph 3: +> 'Studies show that 73% of developers prefer...' +No source provided. What should we do?" ---- +Options: +1. **Add citation** - Insert [citation needed] placeholder +2. **Remove claim** - Delete the unsupported statement +3. **Rephrase** - Soften to opinion ("Many developers prefer...") +4. **Skip** - Keep as is (explain why) +``` + +### For Important Issues -**[Important]** Passive voice: 4 instances detected +``` +Use AskUserQuestion: +Question: "[Important] Passive voice: 4 instances detected. Lines: 12, 34, 56, 78 +Example: 'The code was written' β†’ 'The developer wrote the code' +What should we do?" + +Options: +1. **Accept all** - Fix all 4 instances +2. **Review each** - Show me one by one +3. **Skip all** - Intentional stylistic choice +4. **Accept some** - Fix specific lines only +``` -**Suggested fixes**: -- "The code was written" β†’ "The developer wrote the code" -- "It was decided" β†’ "We decided" -- [etc.] +### For Polish Issues -What would you like to do? -1. Accept all -2. Accept some (show each) -3. Skip all -4. Custom +``` +Use AskUserQuestion: ---- +Question: "[Polish] 3 minor style guide issues found. Review them?" + +Options: +1. **Accept all** - Apply all fixes +2. **Review each** - Show me one by one +3. **Skip all** - Good enough ``` -### Track Decisions +--- + +## Step 10: Track Decisions + +Build triage log: + ```markdown ## Triage Log -- Issue 1: Accepted -- Issue 2: Skipped (reason: intentional stylistic choice) -- Issue 3: Custom fix applied + +| Issue | Category | Decision | Reason | +|-------|----------|----------|--------| +| Unsupported claim P3 | Critical | Removed | No source available | +| Passive voice Γ—4 | Important | Fixed 3/4 | Line 56 intentional | +| Oxford comma | Polish | Skipped | Style preference | ``` -## Phase 5: Apply Fixes +--- + +## Step 11: Apply Fixes ### Create New Version -After triage, apply all accepted fixes: -- Create `draft-v2.md` (or increment version) -- Preserve original -- Log all changes + +``` +After triage: +1. Apply all accepted fixes +2. Create draft-v[N+1].md (increment version) +3. Preserve original (never overwrite) +4. Log all changes in metadata +``` ### Re-Run Critical Checks + +``` After fixes applied: -- Fact-check any new claims added -- Voice-guardian quick check on changed sections -- Verify no new issues introduced +1. Voice-guardian quick check on changed sections +2. Fact-check any new claims added +3. Verify no new issues introduced +``` -## Output +--- + +## Step 12: Save Review Report -### Review Report -Save to `drafts/[slug]/review-v1.md`: +Create `drafts/[slug]/review-v[N].md`: ```markdown # Editorial Review: [Title] +**Draft reviewed**: draft-[ID] v[version] +**Review date**: [timestamp] +**Review depth**: [quick/standard/deep] + ## Summary -- Issues found: X -- Critical: X -- Important: X -- Polish: X +- Issues found: [total] +- Critical: [count] β†’ [fixed/remaining] +- Important: [count] β†’ [fixed/remaining] +- Polish: [count] β†’ [fixed/remaining] +- Voice score: [before] β†’ [after] ## Agent Reports ### Voice Guardian -[Full report] +**Score**: [X]/100 +**Issues**: [list] +**Fixes applied**: [list] ### Clarity Editor -[Full report] +**Issues**: [list] +**Fixes applied**: [list] ### Fact Checker -[Full report] +**Verified**: [count] +**Flagged**: [count] ### Structure Architect -[Full report] +**Flow score**: [X]/100 +**Gaps identified**: [list] ## Triage Decisions -[Log of all decisions] +[Full triage log] + +## Changes Made +[Diff or change list] + +## Remaining Items +- [ ] [Any skipped issues] +- [ ] [Follow-up needed] ## Next Steps -- [ ] Address remaining skipped issues +- [ ] Address remaining issues - [ ] Final proofread -- [ ] Prepare for publishing +- [ ] Ready for /writing:compound ``` -### Updated Draft -If fixes were applied, save `draft-v2.md` with: -- Updated content -- Change log in metadata -- New voice score +--- -## Post-Review Options +## Step 13: Update Scratchpad -**Question**: "Review complete. [X] issues found, [Y] fixed. What next?" +If new preferences emerged during triage: -**Options**: -1. **View full report** - Show detailed review-v1.md -2. **Run another review pass** - Re-run with fresh eyes -3. **Prepare for publishing** - `/writing:compound` to capture patterns -4. **Make manual edits** - Open draft for hands-on refinement -5. **Publish** - Move to publishing workflow +``` +Append to drafts/.scratchpad.md: -## Quality Gates +--- +## Review Learnings [timestamp] -Review is complete when: -- [ ] All critical issues addressed -- [ ] Voice score β‰₯ 85 -- [ ] All claims verified or flagged -- [ ] Flow analysis passed -- [ ] Style guide compliance checked -- [ ] Scratchpad preferences honored +**New preference identified**: +- [Preference from triage decision] + +**Anti-pattern confirmed**: +- [Issue type to avoid in future] +--- +``` + +--- -## Context Notes Output +## Step 14: Output Context Notes -After review, output context notes for handoff to revision: +Generate handoff for revision or compound: ```markdown ## Review Summary -- Critical issues: [count] -- Important issues: [count] -- Polish issues: [count] +- Critical issues: [count fixed / count remaining] +- Important issues: [count fixed / count remaining] +- Polish issues: [count fixed / count remaining] +- Voice score: [before] β†’ [after] ## Accepted Fixes 1. [Fix 1 description] @@ -293,10 +452,60 @@ After review, output context notes for handoff to revision: 1. [Rejected fix with reason] ## Scratchpad Updates -- New preference learned: [if applicable] -- Conflict detected: [if applicable] +- New preference: [if applicable] +- Conflict resolved: [if applicable] + +## Draft Status +- Version: draft-[ID] v[new version] +- Ready for: [/writing:compound or more revision] ## Mode -REFINEMENT (working on [draft-ID]) +REFINEMENT (working on draft-[ID]) ``` + +--- + +## Step 15: Post-Review Options (BRAINSTORM) + +``` +Use AskUserQuestion: + +Question: "Review complete. [X] issues found, [Y] fixed. Voice score: [before]β†’[after]. What next?" + +Options: +1. **View full report** - Open review-v[N].md +2. **Another review pass** - Re-run with fresh perspective +3. **Refine further** - `/writing:draft refine draft-[ID]` +4. **Compound** - `/writing:compound draft-[ID]` (capture patterns) +5. **Done** - Ready to publish +``` + +--- + +## Quality Gates + +Review is complete when: +- [ ] All critical issues addressed +- [ ] Voice score β‰₯ 85 +- [ ] All claims verified or explicitly flagged +- [ ] Flow analysis passed +- [ ] Style guide compliance checked +- [ ] Scratchpad preferences honored +- [ ] Triage decisions logged +- [ ] Context notes ready for handoff + +--- + +## Quality Checklist + +Before completing: +- [ ] Draft located and loaded +- [ ] Appropriate agents selected for content type +- [ ] All selected agents completed +- [ ] Issues properly categorized (critical/important/polish) +- [ ] Each issue triaged with user input +- [ ] Fixes applied to new version (original preserved) +- [ ] Review report saved +- [ ] Scratchpad updated with learnings +- [ ] Context notes ready for next command From 8d73682f1c4a3b1b5b1aa4c744da0b67ab006ec9 Mon Sep 17 00:00:00 2001 From: Kieran Klaassen Date: Fri, 16 Jan 2026 20:52:27 -0800 Subject: [PATCH 05/19] feat(compound-writing): Add every-essay-guide skill MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New skill capturing Every's essay philosophy and best practices: - Worldview: optimistic realism, personal narrative + intellectual rigor - 10 craft principles (hook, depth, facts before feelings, etc.) - Hed/Dek/Opening paragraph playbook - Pre-share checklist (8 quality scans) - Quick reference card Complements every-style-editor which handles mechanical editing. Total skills: 7 β†’ 8 Co-Authored-By: Claude Opus 4.5 --- .../.claude-plugin/plugin.json | 2 +- plugins/compound-writing/CLAUDE.md | 7 +- plugins/compound-writing/README.md | 5 +- .../skills/every-essay-guide/SKILL.md | 216 ++++++++++++++++++ 4 files changed, 224 insertions(+), 6 deletions(-) create mode 100644 plugins/compound-writing/skills/every-essay-guide/SKILL.md diff --git a/plugins/compound-writing/.claude-plugin/plugin.json b/plugins/compound-writing/.claude-plugin/plugin.json index afee24d3..2aa87674 100644 --- a/plugins/compound-writing/.claude-plugin/plugin.json +++ b/plugins/compound-writing/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "compound-writing", "version": "1.0.0", - "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 6 workflow commands, and 7 skills for research, drafting, editing, and voice consistency.", + "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 6 workflow commands, and 8 skills for research, drafting, editing, and voice consistency.", "author": { "name": "Kieran Klaassen", "email": "kieran@every.to", diff --git a/plugins/compound-writing/CLAUDE.md b/plugins/compound-writing/CLAUDE.md index 6bb562eb..aecda79f 100644 --- a/plugins/compound-writing/CLAUDE.md +++ b/plugins/compound-writing/CLAUDE.md @@ -40,7 +40,7 @@ See `docs/WRITING-ARCHITECTURE.md` for the complete framework mapping: | `every-style-editor` | Editing | Every's style guide | | `publishing-optimizer` | Optimization | SEO, social, newsletters | -### Skills (7) +### Skills (8) | Skill | Type | Purpose | |-------|------|---------| | `writing-orchestration` | Core | Two-agent architecture, strategies | @@ -49,7 +49,8 @@ See `docs/WRITING-ARCHITECTURE.md` for the complete framework mapping: | `voice-capture` | Core | Extract voice from samples | | `pragmatic-writing` | Voice | Hunt/Thomas, Spolsky style | | `dhh-writing` | Voice | Direct, opinionated style | -| `every-style-editor` | Style Guide | Every's editorial standards | +| `every-style-editor` | Style Guide | Mechanical editing (grammar, punctuation) | +| `every-essay-guide` | Style Guide | Essay craft (worldview, best practices, hed/dek) | ## Key Concepts @@ -121,7 +122,7 @@ plugins/compound-writing/ β”œβ”€β”€ README.md # User documentation β”œβ”€β”€ agents/ # 7 agents β”œβ”€β”€ commands/ # 6 commands -β”œβ”€β”€ skills/ # 7 skills +β”œβ”€β”€ skills/ # 8 skills β”‚ β”œβ”€β”€ writing-orchestration/ β”‚ β”‚ β”œβ”€β”€ SKILL.md β”‚ β”‚ └── references/ # Baseline/situational strategies diff --git a/plugins/compound-writing/README.md b/plugins/compound-writing/README.md index 58235558..74188bc1 100644 --- a/plugins/compound-writing/README.md +++ b/plugins/compound-writing/README.md @@ -99,7 +99,7 @@ claude /writing:compound drafts/debug-production/final.md | `publishing-optimizer` | Optimize for SEO, social media, newsletters | | `every-style-editor` | Review against Every's style guide | -### Skills (7) +### Skills (8) | Skill | Purpose | |-------|---------| @@ -109,7 +109,8 @@ claude /writing:compound drafts/debug-production/final.md | `pragmatic-writing` | Write like Hunt/Thomas and Joel Spolsky | | `dhh-writing` | Write in DHH's direct, opinionated style | | `voice-capture` | Extract and encode voice profiles from samples | -| `every-style-editor` | Every's editorial style guide | +| `every-style-editor` | Every's mechanical style guide (grammar, punctuation) | +| `every-essay-guide` | Every's essay craft (worldview, best practices, hed/dek playbook) | ## Core Systems diff --git a/plugins/compound-writing/skills/every-essay-guide/SKILL.md b/plugins/compound-writing/skills/every-essay-guide/SKILL.md new file mode 100644 index 00000000..32e17bb9 --- /dev/null +++ b/plugins/compound-writing/skills/every-essay-guide/SKILL.md @@ -0,0 +1,216 @@ +--- +name: every-essay-guide +description: This skill should be used when writing essays for Every publication. It provides the worldview, tonal DNA, craft principles, and playbooks that define Every's distinctive voice - optimistic realism, personal narrative with intellectual rigor, and practical frameworks that move readers forward. +--- + +# Every Essay Guide + +Writing is Every's R&D lab, marketing funnel, and cultural glue. Essays do double duty: they satisfy readers' curiosity today and prototype the businesses we'll build tomorrow. This skill captures the craft principles that turn sparks of insight into pieces that inform, delight, and create momentum. + +## When to Use This Skill + +Use this skill when: +- Planning or drafting essays for Every publication +- Applying Every's distinctive voice and worldview +- Crafting headlines, deks, and opening paragraphs +- Running pre-share quality checks before submitting +- Understanding what makes Every essays resonate + +## Every's Core Promise + +**Optimistic, intellectually generous writing that moves readers and moves the company forward.** + +--- + +## Part 1: What Makes an Every Essay + +### 1. Optimistic Realism About AI and Work + +| Principle | Application | +|-----------|-------------| +| **Practical optimism** | AI is treated as an enabling forceβ€”but never a silver bullet. Celebrate possibilities while naming risks. | +| **From knowledge to allocation** | Track the macro-shift: raw knowledge matters less than the judgment to wield AI-generated intelligence. | +| **Rise of the generalist** | Champion adaptable people who synthesize across domains and thrive in "wicked" environmentsβ€”work that remains stubbornly human. | + +### 2. Personal Narrative Γ— Intellectual Rigor + +| Principle | Application | +|-----------|-------------| +| **Intellectual accessibility** | Translate dense economic or philosophical ideas into plain, lively language. | +| **Narrative-driven argument** | A vivid anecdote or scene pulls readers in before zooming to universal insight. | +| **Authenticity and vulnerability** | Disclose a personal stakeβ€”mental health, career pivots, creative doubtsβ€”to make abstract forces visceral. | + +### 3. Rethinking Creativity and Entrepreneurship + +| Principle | Application | +|-----------|-------------| +| **Writing as product R&D** | Essays seed software, courses, and consultingβ€”proving ideas in public before building. | +| **Audience-first business model** | Subscriptions and spin-off services fund exploration, aligning incentives with reader trust rather than VC timelines. | +| **Constant experimentation** | Pivot quickly with algorithm shifts, AI advances, and new formatsβ€”treating agility as a craft. | + +### 4. Practical Optimism & Generous Intellectualism + +| Principle | Application | +|-----------|-------------| +| **Constructive, not contrarian** | Critique, then propose frameworks, metaphors, or playbooks that move the conversation forward. | +| **Open-ended curiosity** | Pose genuine questions and invite readers into the search, resisting dogma. | + +### 5. Interconnected, Recursive Thinking + +Ideas recur and evolve ("allocation economy," "vibe coding"), weaving a self-referential, cumulative universe that rewards long-time readers. + +--- + +## Part 2: Every Writing Best Practices + +Ten craft principles that keep essays sharp, honest, and actionable: + +### 1. Hook & Purpose +Lead with tension; state the promise fast. The reader should feel the problem and crave the answer within two sentences. + +### 2. Structure & Flow +Each section answers the question you just posed. Clear progression, no wandering. + +### 3. Depth Over Breadth +Fewer ideas, interrogated harder. Own one thing completely rather than touching many things lightly. + +### 4. Facts Before Feelings +Evidence first, emotion second. Ground claims in data, examples, or expert voices before making emotional appeals. + +### 5. Concrete, Sensory Writing +Make abstractions photographable. Can you film the nouns and verbs? + +**Weak:** "The company grew quickly." +**Strong:** "Headcount jumped from 12 to 47 in six months." + +### 6. Confident, Nuanced Claims +Assert boldly, qualify intelligently. Own your perspective while acknowledging complexity. + +### 7. Rhythm & Voice +Vary sentence length; surface your stake early. Read aloudβ€”does it have music? + +### 8. Dialogue & Interiority +Trim dialogue tags; earn emotional beats. Show thought in action. + +### 9. One-and-Done Statements +No echoing. Say it once, say it best. If you've made the point, move on. + +### 10. Payoff & Practicality +End with actions, frameworks, or reframed vision. The reader leaves able to do, see differently, or quote something. + +--- + +## Part 3: Hed / Dek / Opening Paragraph Playbook + +A great Every piece wins or loses readers in the first 150 words. Use this three-step method: + +### Step 1: Find the Spark + +1. Speed-read your draft; stop where your own heartbeat jumps. +2. The sentence that startles youβ€”that's the core idea. Highlight it. + +### Step 2: Put the Spark on Top + +#### Hed (Headline) +State the idea in its punchiest, most concrete form. Avoid abstractions; invoke stakes. + +| Weak | Stronger | +|------|----------| +| "Redesign Everything for AI" | "Redesign the Web for a Billion AI Agents" | +| "How to Be More Productive" | "The 90-Minute Rule That Saved My Startup" | + +#### Dek (Sub-headline) +Sharpen the promiseβ€”who benefits, what's at stake, why now. Keep it one crisp line. + +> "There's a fortune to be made if you can build interfaces AI can read." + +#### Opening Paragraph + +1. **Meet the reader where they are.** Pose or restate the question your hed opened. +2. **Set the stakes.** Make the problem visceral (money, time, reputation, existential dread). +3. **Establish credibility.** One line on why you can guide them. +4. **Promise the payoff.** What will they know or be able to do by the end? + +### Step 3: Stress-Test Before Shipping + +- [ ] Would a skim-reader feel the problem and crave the answer after two sentences? +- [ ] Is the hed specific enough that someone could argue with it? (If not, get sharper.) +- [ ] Could the dek double as a tweet people might quote? + +--- + +## Part 4: Pre-Share Checklist + +Eight quick scans that catch 90% of problems before editors do: + +| Check | Question | +|-------|----------| +| **Promise check** | Does the opener state the tension and hint at payoff? | +| **Evidence check** | Are bold claims supported by data, examples, or experts? | +| **Camera check** | Can you film the nouns and verbs? | +| **Hedge check** | Delete unnecessary qualifiers. | +| **Music check** | Read aloud; vary the beat. | +| **POV check** | Is your stake visible by word 150? | +| **Transition check** | Does each section answer "why now?" | +| **Payoff check** | Will the reader leave able to do, see differently, or quote something? | + +--- + +## Summary: Takeaways for Writers + +1. **Blend personal + universal.** Start from lived experience; expand to cultural or economic stakes. + +2. **Maintain practical optimism.** Critique tech responsibly, but spotlight creative possibilities. + +3. **Celebrate synthesis.** Show how cross-domain thinking beats narrow specialization. + +4. **Stay accessible.** Explain big theories in everyday language and examples. + +5. **Move with the internet.** Iterate, experiment, update. Curiosity is a workflow, not a one-off. + +--- + +## Integration with Other Skills + +| Skill | Relationship | +|-------|--------------| +| `every-style-editor` | Use AFTER drafting to check grammar, punctuation, and mechanical style guide compliance | +| `writing-orchestration` | Use the 10 baseline strategies alongside these Every-specific principles | +| `pragmatic-writing` | Every's voice shares Hunt/Thomas accessibilityβ€”combine for technical topics | + +--- + +## Quick Reference Card + +``` +EVERY ESSAY DNA +=============== +Optimistic realism about AI + work +Personal narrative Γ— intellectual rigor +Writing as product R&D +Constructive, not contrarian +Recursive, interconnected ideas + +CRAFT CHECKLIST +=============== +β–‘ Hook with tension, promise fast +β–‘ Depth > breadth +β–‘ Facts before feelings +β–‘ Concrete, filmable language +β–‘ Confident + nuanced claims +β–‘ Varied rhythm, audible voice +β–‘ No echoingβ€”one-and-done +β–‘ End with actionable payoff + +HED / DEK / OPENER +================== +1. Find the spark (heartbeat jump) +2. Put spark on top (hed = punchiest form) +3. Dek = one crisp promise line +4. Opener: stakes β†’ credibility β†’ payoff + +PRE-SHARE SCANS +=============== +Promise | Evidence | Camera | Hedge +Music | POV by 150 | Transitions | Payoff +``` From ac3b7b42062b00f4ff92d4d41d0a20c00390c5b4 Mon Sep 17 00:00:00 2001 From: Kieran Klaassen Date: Fri, 16 Jan 2026 20:54:28 -0800 Subject: [PATCH 06/19] feat(compound-writing): Add source-code-guide skill MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New skill for Every's Source Code series - essays on building in the AI era: - Vision: Coin language, demonstrate workflows, shape industry thinking - Source Code gradient (engineering β†’ practice β†’ philosophy β†’ journey) - 6 strategy principles (first-person authority, stakes, One Big Idea, ELI5) - Sensibility and voice spectrum - Opening patterns and structural templates - 10 Source Code Commandments Total skills: 8 β†’ 9 Co-Authored-By: Claude Opus 4.5 --- .../.claude-plugin/plugin.json | 2 +- plugins/compound-writing/CLAUDE.md | 5 +- plugins/compound-writing/README.md | 3 +- .../skills/source-code-guide/SKILL.md | 325 ++++++++++++++++++ 4 files changed, 331 insertions(+), 4 deletions(-) create mode 100644 plugins/compound-writing/skills/source-code-guide/SKILL.md diff --git a/plugins/compound-writing/.claude-plugin/plugin.json b/plugins/compound-writing/.claude-plugin/plugin.json index 2aa87674..9918236c 100644 --- a/plugins/compound-writing/.claude-plugin/plugin.json +++ b/plugins/compound-writing/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "compound-writing", "version": "1.0.0", - "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 6 workflow commands, and 8 skills for research, drafting, editing, and voice consistency.", + "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 6 workflow commands, and 9 skills for research, drafting, editing, and voice consistency.", "author": { "name": "Kieran Klaassen", "email": "kieran@every.to", diff --git a/plugins/compound-writing/CLAUDE.md b/plugins/compound-writing/CLAUDE.md index aecda79f..9bc678d0 100644 --- a/plugins/compound-writing/CLAUDE.md +++ b/plugins/compound-writing/CLAUDE.md @@ -40,7 +40,7 @@ See `docs/WRITING-ARCHITECTURE.md` for the complete framework mapping: | `every-style-editor` | Editing | Every's style guide | | `publishing-optimizer` | Optimization | SEO, social, newsletters | -### Skills (8) +### Skills (9) | Skill | Type | Purpose | |-------|------|---------| | `writing-orchestration` | Core | Two-agent architecture, strategies | @@ -51,6 +51,7 @@ See `docs/WRITING-ARCHITECTURE.md` for the complete framework mapping: | `dhh-writing` | Voice | Direct, opinionated style | | `every-style-editor` | Style Guide | Mechanical editing (grammar, punctuation) | | `every-essay-guide` | Style Guide | Essay craft (worldview, best practices, hed/dek) | +| `source-code-guide` | Style Guide | Source Code series (AI-era building, coining language) | ## Key Concepts @@ -122,7 +123,7 @@ plugins/compound-writing/ β”œβ”€β”€ README.md # User documentation β”œβ”€β”€ agents/ # 7 agents β”œβ”€β”€ commands/ # 6 commands -β”œβ”€β”€ skills/ # 8 skills +β”œβ”€β”€ skills/ # 9 skills β”‚ β”œβ”€β”€ writing-orchestration/ β”‚ β”‚ β”œβ”€β”€ SKILL.md β”‚ β”‚ └── references/ # Baseline/situational strategies diff --git a/plugins/compound-writing/README.md b/plugins/compound-writing/README.md index 74188bc1..c157eb92 100644 --- a/plugins/compound-writing/README.md +++ b/plugins/compound-writing/README.md @@ -99,7 +99,7 @@ claude /writing:compound drafts/debug-production/final.md | `publishing-optimizer` | Optimize for SEO, social media, newsletters | | `every-style-editor` | Review against Every's style guide | -### Skills (8) +### Skills (9) | Skill | Purpose | |-------|---------| @@ -111,6 +111,7 @@ claude /writing:compound drafts/debug-production/final.md | `voice-capture` | Extract and encode voice profiles from samples | | `every-style-editor` | Every's mechanical style guide (grammar, punctuation) | | `every-essay-guide` | Every's essay craft (worldview, best practices, hed/dek playbook) | +| `source-code-guide` | Every's Source Code series (AI-era building, coining language, technical narratives) | ## Core Systems diff --git a/plugins/compound-writing/skills/source-code-guide/SKILL.md b/plugins/compound-writing/skills/source-code-guide/SKILL.md new file mode 100644 index 00000000..0d00af2e --- /dev/null +++ b/plugins/compound-writing/skills/source-code-guide/SKILL.md @@ -0,0 +1,325 @@ +--- +name: source-code-guide +description: This skill should be used when writing for Every's Source Code series - essays on the craft of building in the AI era. It provides the vision, strategy, sensibility, and structural templates for pieces that coin language, demonstrate workflows, and shape how the industry thinks about building with AI. +--- + +# Source Code Style Guide + +Source Code is Every's series on the craft of building in the AI era. These essays document, define, and brand new ways of workingβ€”not just with code, but with design, product philosophy, and the entire creative process of making software. + +## Vision + +**We coin language, demonstrate workflows, and shape how the industry thinks about building with AI.** + +Our purpose: +- Establish Source Code as the cultural and technical reference for AI-native creation +- Coin and circulate the vocabulary that defines new disciplines (compounding engineering, vibe design, selfish software) +- Transform Every's practices into public intellectual property: frameworks, metaphors, and playbooks + +--- + +## Part 1: The Source Code Gradient + +Not every piece needs to be purely technical. We publish across a spectrum: + +| Type | Focus | Examples | +|------|-------|----------| +| **Engineering-Heavy** | Deep technical workflows, system architecture, code-first narratives | Claude Code delegation, parallel orchestration | +| **Practice-Focused** | New methodologies, workflow innovations, tool orchestration | Compounding engineering, vibe coding | +| **Philosophy-Driven** | Design as engineering, personal software manifestos, ethics/aesthetics | Atmosphere-first development, selfish software | +| **Journey-Centered** | Career transformation, origin stories, personal cost and reward | Finding your way back to what you love | + +**All are valid Source Code pieces if they illuminate new ways of building in the AI age.** + +--- + +## Part 2: Strategy Principles + +### 1. Anchor in First-Person Authority + +Source Code is written by the builders themselves: Kieran Klaassen on Claude Code and compounding engineering, Yash Poojary on Sparkle's rebuild, Lucas on design philosophy. + +**Tone:** Personal but authoritativeβ€”"field notes" from people shipping real products. + +### 2. Personal Stakes as Foundation + +Every piece needs to show what the author risks or sacrifices: + +| Stake Type | Example | +|------------|---------| +| **Origin stories** | Why you started building this way | +| **Rediscovery narratives** | Finding your way back to what you love | +| **Career pivots** | When conventional success isn't enough | +| **The cost of the practice** | Late nights, failed experiments, $100 fines | + +**Stakes make the practice real, not theoretical.** + +### 3. The "One Big Idea" Rule + +Each piece must coin, claim, or crystallize ONE memorable concept: + +- A new discipline (compounding engineering) +- A practice philosophy (vibe design, selfish software) +- A controversial stance (AI wrappers are the future) +- A workflow innovation (parallel Claude orchestration) + +**This builds Every's intellectual property one term at a time.** + +### 4. Blend Narrative with Intellectual Rigor + +1. **Open with a scene:** PRs reviewing themselves, a weekend rebuild of Sparkle, a debugging breakthrough +2. **Zoom out to the universal:** How engineering work, careers, or creativity itself are changing +3. **Ground in data or stakes:** Sparkle has organized 10M+ files; compounding engineering cuts ship times from weeks to days + +### 5. Build Playbooks, Not Just Opinions + +Every piece delivers frameworks and heuristics readers can try. Playbooks come in many forms: + +| Playbook Type | Description | +|---------------|-------------| +| **Technical frameworks** | Commands, workflows, step-by-step processes | +| **Philosophical principles** | Mindset shifts and new ways of thinking | +| **Tool stacks** | Specific setup and why it matters | +| **Challenges/Provocations** | "Start your experiment log today" | +| **Visual systems** | Atmosphere kits, VIBE.md files | + +**Not every piece needs explicit steps, but all should leave readers with something actionable.** + +### 6. The ELI5 Rule + +Our pieces must be specific enough to be interesting to an advanced AI user AND descriptive enough to be accessible to a smart newcomer. + +**When to apply:** +- Using a technical term or tool name for the first time +- Describing how we built or tested something +- Explaining an editing, research, or publishing workflow +- Recounting "how I got from A β†’ B" in an anecdote + +#### Examples that BREAK the ELI5 rule + +❌ **Vague workflow:** +> "We spun up a retrieval pipeline with subagents, chunked the corpus, hydrated the cache, and it just worked." + +Why it breaks: Jargon, no steps, missing clicks/inputs. + +❌ **Hand-wavy editing:** +> "I ran the draft through our editor, then tuned it until it felt right." + +Why it breaks: No start state, no actions, no success check. + +❌ **A β†’ B without the bridge:** +> "I started with a messy free write and ended with a clean memo. I played around until the ideas clicked." + +Why it breaks: Skips the actual moves that made the change. + +#### Examples that FOLLOW the ELI5 rule + +| Term | ELI5 Explanation | +|------|------------------| +| Agent vs. slash command | "An agent (a specialized AI worker) versus a slash command (a simple shortcut)" | +| Context window | "Each agent has its own separate conversation history and memory, so they can't see each other's work unless you pass it along" | +| Prompt engineering | "The process of designing laser-specific prompts so large language models produce the output you want" | +| Context engineering | "Prompt engineering is asking your brilliant intern the right question. Context engineering is giving that intern access to the right filing cabinets… and examples of what 'good' looks like" | +| Vibe coding | "Coding with AI-powered tools that convert natural-language instructions into working code" | +| Bridge job | "Roles that appear when a new technology needs human translatorsβ€”essential at first, then absorbed once the interface gets easier" | + +--- + +## Part 3: Sensibility + +Source Code inherits Every's tonal DNA: + +| Quality | Application | +|---------|-------------| +| **Optimistic Realism** | AI as leverage, with quirks surfaced (Claude over-testing, Gemini over-engineering) | +| **Practical Optimism** | Constructive frameworks, not contrarian rants | +| **Personal Stakes** | Exhaustion, late-night ramen rebuilds, nitpicky "feel checks" | +| **Accessible Rigor** | Technical enough for engineers, clear enough for curious non-tech readers | +| **Taste as Core Value** | Coding isn't just implementationβ€”it's about "sparkle," vibe, and design choices | + +### Voice Spectrum + +Different pieces call for different voices, all valid: + +| Voice | Example Line | +|-------|--------------| +| **Technical authority** | "I haven't typed a function in weeks, yet I'm shipping faster than ever" | +| **Philosophical builder** | "Software is a place; make it worth visiting" | +| **Vulnerable founder** | "The questions still haunt me sometimes" | +| **Rediscovered enthusiast** | "Code was like magic, but betterβ€”it was real" | +| **Defiant craftsperson** | "You don't need permission to make the internet beautiful" | + +**Choose the voice that serves the story.** + +--- + +## Part 4: Craft Checklist + +### Opening Patterns + +Start strong with one of these proven patterns: + +#### The Charged Anecdote +- "The PR that reviewed itself" +- "Opening email and flinching at the fluorescent void" +- "Seeing your design aesthetic stolen" + +#### The Manifesto Declaration +- "I'd like to introduce a concept I call selfish software" +- "Software should conform to you, not the other way around" + +#### The Sensory Contrast +- Fluorescent Gmail vs. outside air +- Conference room software vs. somewhere you want to be + +#### The Confession +- "Two months ago, I chose chaos over comfort" +- "I haven't typed a function in weeks" + +#### The Pattern Recognition +- Multiple Claude instances like mission control +- Your feed full of your workβ€”except it isn't + +### Throughout the Piece + +**Mix registers and materials:** +- Technical exposition + personal narrative +- Code/prompts/screenshots + human reflection +- Philosophy + practical application +- Data/metrics + sensory details + +**Use concrete language:** + +| ❌ Vague | βœ… Concrete | +|----------|-------------| +| "Optimized workflows" | "Claude spun up five PRs while I drank coffee" | +| "Enhanced backgrounds" | "8k oil-painted skies" | +| "Cost-effective" | "$400/month replacing $400k/year" | + +**Create memorable subheads:** +Not just organizational but evocative: +- "The Gravity of Sameness" +- "Escaping the Golden Handcuffs" +- "Ship the Atmosphere" + +**Address the skeptics:** + +| Objection | Response Pattern | +|-----------|------------------| +| "Ugly products win" | Sometimes, but... | +| "We can't afford this" | You can't afford not to | +| "AI wrappers are overdone" | The opportunity is just beginning | + +--- + +## Part 5: Structural Templates + +### The Discovery Arc +1. Problem/frustration encountered +2. Conventional solution inadequate +3. Breakthrough moment +4. New practice developed +5. Results and transformation +6. How readers can adopt it + +### The Philosophy-Practice Bridge +1. Philosophical observation about building +2. Why the current approach falls short +3. New framework/lens introduced +4. Concrete application shown +5. Broader implications explored +6. Call to adopt the mindset + +### The Journey Narrative +1. Where I was (comfortable but unfulfilled) +2. The catalyst for change +3. The leap and its costs +4. What I'm building now +5. Early results and learnings +6. Why others should consider this path + +### The Technical Deep-Dive +1. The surprising behavior/result +2. How we got here (workflow detail) +3. Why this matters (efficiency gain) +4. System architecture explained +5. Iterations and improvements +6. Your turn to implement + +--- + +## Part 6: Source Code Commandments + +1. **Show the mess** β€” Include failures, frustrations, and false starts +2. **Coin deliberately** β€” If you name it, define it clearly and defend it +3. **Connect to canon** β€” Reference other Source Code concepts where relevant +4. **Start from joy** β€” Even technical pieces should convey enthusiasm +5. **End with action** β€” Give readers something specific to try +6. **Prove with examples** β€” Show actual workflows, real metrics, screenshots +7. **Write the future** β€” Describe the world where this practice is normal +8. **Honor the craft** β€” Respect both technical excellence and human creativity +9. **Make it memorable** β€” One takeaway phrase or framework they'll quote +10. **Build in public** β€” Share tools, frameworks, and code where possible + +--- + +## Why It Matters + +Source Code is Every's claim on the future of building. In a world where: +- AI can generate competent code in seconds +- Templates and patterns are free +- Technical barriers are falling daily + +...the differentiators become: +- **Taste and curation** +- **Joy and personal connection** +- **Systems that compound** +- **Philosophy that guides practice** +- **Character that can't be averaged away** + +Source Code documents the builders who understand this shift and are creating the disciplines, tools, and mindsets for what comes next. + +--- + +## Quick Reference Card + +``` +SOURCE CODE DNA +=============== +First-person authority (builders writing) +Personal stakes (show what you risk) +One Big Idea (coin it, claim it) +Narrative + rigor (scene to universal) +Playbooks (actionable frameworks) +ELI5 (accessible to newcomers) + +GRADIENT SPECTRUM +================= +Engineering-Heavy β†’ Practice-Focused β†’ Philosophy-Driven β†’ Journey-Centered + +OPENING PATTERNS +================ +β–‘ Charged anecdote (the PR that reviewed itself) +β–‘ Manifesto declaration (I call this selfish software) +β–‘ Sensory contrast (fluorescent void vs. outside air) +β–‘ Confession (I haven't typed a function in weeks) +β–‘ Pattern recognition (multiple Claudes like mission control) + +10 COMMANDMENTS +=============== +Show the mess | Coin deliberately | Connect to canon +Start from joy | End with action | Prove with examples +Write the future | Honor the craft | Make it memorable +Build in public +``` + +--- + +## Integration with Other Skills + +| Skill | Relationship | +|-------|--------------| +| `every-essay-guide` | General Every voice and best practices | +| `every-style-editor` | Mechanical editing after drafting | +| `pragmatic-writing` | Hunt/Thomas accessibility for technical sections | +| `dhh-writing` | Direct, opinionated voice for manifestos | From d8de2178c1c1e8159e5a8087fc790b967e5e7dbe Mon Sep 17 00:00:00 2001 From: Kieran Klaassen Date: Fri, 16 Jan 2026 20:59:22 -0800 Subject: [PATCH 07/19] refactor(compound-writing): Organize skills by type taxonomy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restructure skills directory following WRITING-ARCHITECTURE.md types: skills/ β”œβ”€β”€ core/ # Orchestration, memory, handoffs (4) β”œβ”€β”€ voice/ # All voices - can layer multiple (4) β”‚ β”œβ”€β”€ pragmatic-writing β”‚ β”œβ”€β”€ dhh-writing β”‚ β”œβ”€β”€ every-essay-guide β”‚ └── source-code-guide β”œβ”€β”€ editing/ # Review tools for post-draft (1) β”‚ └── every-style-editor β”œβ”€β”€ domain/ # Future: "10 Books Expert" skills └── format/ # Future: platform-specific Key insight: every-essay-guide and source-code-guide are VOICE skills (they define how to write for a publication), while every-style-editor is an EDITING tool (checks mechanical compliance after drafting). Voice layering now supported - combine multiple voices per piece. Co-Authored-By: Claude Opus 4.5 --- plugins/compound-writing/CLAUDE.md | 28 ++++++++++++------- plugins/compound-writing/README.md | 24 ++++++++-------- .../skills/{ => core}/context-notes/SKILL.md | 0 .../skills/{ => core}/scratchpad/SKILL.md | 0 .../skills/{ => core}/voice-capture/SKILL.md | 0 .../assets/voice-profile-template.yaml | 0 .../references/analysis-dimensions.md | 0 .../references/example-profiles.md | 0 .../references/extraction-templates.md | 0 .../{ => core}/writing-orchestration/SKILL.md | 0 .../references/baseline-strategies.md | 0 .../references/quality-checkpoints.md | 0 .../references/situational-strategies.md | 0 .../{ => editing}/every-style-editor/SKILL.md | 0 .../references/EVERY_WRITE_STYLE.md | 0 .../skills/{ => voice}/dhh-writing/SKILL.md | 0 .../dhh-writing/references/anti-patterns.md | 0 .../dhh-writing/references/examples.md | 0 .../dhh-writing/references/resources.md | 0 .../dhh-writing/references/techniques.md | 0 .../{ => voice}/every-essay-guide/SKILL.md | 0 .../{ => voice}/pragmatic-writing/SKILL.md | 0 .../references/anti-patterns.md | 0 .../pragmatic-writing/references/examples.md | 0 .../pragmatic-writing/references/sources.md | 0 .../references/techniques.md | 0 .../{ => voice}/source-code-guide/SKILL.md | 0 27 files changed, 31 insertions(+), 21 deletions(-) rename plugins/compound-writing/skills/{ => core}/context-notes/SKILL.md (100%) rename plugins/compound-writing/skills/{ => core}/scratchpad/SKILL.md (100%) rename plugins/compound-writing/skills/{ => core}/voice-capture/SKILL.md (100%) rename plugins/compound-writing/skills/{ => core}/voice-capture/assets/voice-profile-template.yaml (100%) rename plugins/compound-writing/skills/{ => core}/voice-capture/references/analysis-dimensions.md (100%) rename plugins/compound-writing/skills/{ => core}/voice-capture/references/example-profiles.md (100%) rename plugins/compound-writing/skills/{ => core}/voice-capture/references/extraction-templates.md (100%) rename plugins/compound-writing/skills/{ => core}/writing-orchestration/SKILL.md (100%) rename plugins/compound-writing/skills/{ => core}/writing-orchestration/references/baseline-strategies.md (100%) rename plugins/compound-writing/skills/{ => core}/writing-orchestration/references/quality-checkpoints.md (100%) rename plugins/compound-writing/skills/{ => core}/writing-orchestration/references/situational-strategies.md (100%) rename plugins/compound-writing/skills/{ => editing}/every-style-editor/SKILL.md (100%) rename plugins/compound-writing/skills/{ => editing}/every-style-editor/references/EVERY_WRITE_STYLE.md (100%) rename plugins/compound-writing/skills/{ => voice}/dhh-writing/SKILL.md (100%) rename plugins/compound-writing/skills/{ => voice}/dhh-writing/references/anti-patterns.md (100%) rename plugins/compound-writing/skills/{ => voice}/dhh-writing/references/examples.md (100%) rename plugins/compound-writing/skills/{ => voice}/dhh-writing/references/resources.md (100%) rename plugins/compound-writing/skills/{ => voice}/dhh-writing/references/techniques.md (100%) rename plugins/compound-writing/skills/{ => voice}/every-essay-guide/SKILL.md (100%) rename plugins/compound-writing/skills/{ => voice}/pragmatic-writing/SKILL.md (100%) rename plugins/compound-writing/skills/{ => voice}/pragmatic-writing/references/anti-patterns.md (100%) rename plugins/compound-writing/skills/{ => voice}/pragmatic-writing/references/examples.md (100%) rename plugins/compound-writing/skills/{ => voice}/pragmatic-writing/references/sources.md (100%) rename plugins/compound-writing/skills/{ => voice}/pragmatic-writing/references/techniques.md (100%) rename plugins/compound-writing/skills/{ => voice}/source-code-guide/SKILL.md (100%) diff --git a/plugins/compound-writing/CLAUDE.md b/plugins/compound-writing/CLAUDE.md index 9bc678d0..1f8b712d 100644 --- a/plugins/compound-writing/CLAUDE.md +++ b/plugins/compound-writing/CLAUDE.md @@ -49,9 +49,9 @@ See `docs/WRITING-ARCHITECTURE.md` for the complete framework mapping: | `voice-capture` | Core | Extract voice from samples | | `pragmatic-writing` | Voice | Hunt/Thomas, Spolsky style | | `dhh-writing` | Voice | Direct, opinionated style | -| `every-style-editor` | Style Guide | Mechanical editing (grammar, punctuation) | -| `every-essay-guide` | Style Guide | Essay craft (worldview, best practices, hed/dek) | -| `source-code-guide` | Style Guide | Source Code series (AI-era building, coining language) | +| `every-essay-guide` | Voice | Every essay craft (worldview, best practices, hed/dek) | +| `source-code-guide` | Voice | Source Code series (AI-era building, coining language) | +| `every-style-editor` | Editing | Mechanical review (grammar, punctuation, compliance) | ## Key Concepts @@ -123,13 +123,21 @@ plugins/compound-writing/ β”œβ”€β”€ README.md # User documentation β”œβ”€β”€ agents/ # 7 agents β”œβ”€β”€ commands/ # 6 commands -β”œβ”€β”€ skills/ # 9 skills -β”‚ β”œβ”€β”€ writing-orchestration/ -β”‚ β”‚ β”œβ”€β”€ SKILL.md -β”‚ β”‚ └── references/ # Baseline/situational strategies -β”‚ β”œβ”€β”€ scratchpad/ -β”‚ β”œβ”€β”€ context-notes/ -β”‚ └── ... +β”œβ”€β”€ skills/ # 9 skills (organized by type) +β”‚ β”œβ”€β”€ core/ # Orchestration, assessment, memory +β”‚ β”‚ β”œβ”€β”€ writing-orchestration/ +β”‚ β”‚ β”œβ”€β”€ scratchpad/ +β”‚ β”‚ β”œβ”€β”€ context-notes/ +β”‚ β”‚ └── voice-capture/ +β”‚ β”œβ”€β”€ voice/ # Voices (can layer multiple) +β”‚ β”‚ β”œβ”€β”€ pragmatic-writing/ +β”‚ β”‚ β”œβ”€β”€ dhh-writing/ +β”‚ β”‚ β”œβ”€β”€ every-essay-guide/ +β”‚ β”‚ └── source-code-guide/ +β”‚ β”œβ”€β”€ editing/ # Review tools (for post-draft) +β”‚ β”‚ └── every-style-editor/ +β”‚ β”œβ”€β”€ domain/ # "10 Books Expert" (future) +β”‚ └── format/ # Channel-specific (future) └── docs/ └── WRITING-ARCHITECTURE.md # Full framework reference ``` diff --git a/plugins/compound-writing/README.md b/plugins/compound-writing/README.md index c157eb92..86eca7e0 100644 --- a/plugins/compound-writing/README.md +++ b/plugins/compound-writing/README.md @@ -101,17 +101,19 @@ claude /writing:compound drafts/debug-production/final.md ### Skills (9) -| Skill | Purpose | -|-------|---------| -| `writing-orchestration` | Two-agent architecture with strategies and quality gates | -| `scratchpad` | Real-time feedback tracking for iterative refinement | -| `context-notes` | Structured handoffs between commands | -| `pragmatic-writing` | Write like Hunt/Thomas and Joel Spolsky | -| `dhh-writing` | Write in DHH's direct, opinionated style | -| `voice-capture` | Extract and encode voice profiles from samples | -| `every-style-editor` | Every's mechanical style guide (grammar, punctuation) | -| `every-essay-guide` | Every's essay craft (worldview, best practices, hed/dek playbook) | -| `source-code-guide` | Every's Source Code series (AI-era building, coining language, technical narratives) | +| Skill | Type | Purpose | +|-------|------|---------| +| `writing-orchestration` | Core | Two-agent architecture with strategies and quality gates | +| `scratchpad` | Core | Real-time feedback tracking for iterative refinement | +| `context-notes` | Core | Structured handoffs between commands | +| `voice-capture` | Core | Extract and encode voice profiles from samples | +| `pragmatic-writing` | Voice | Write like Hunt/Thomas and Joel Spolsky | +| `dhh-writing` | Voice | Write in DHH's direct, opinionated style | +| `every-essay-guide` | Voice | Every essay craft (worldview, best practices, hed/dek) | +| `source-code-guide` | Voice | Source Code series (AI-era building, coining language) | +| `every-style-editor` | Editing | Mechanical review tool (grammar, punctuation, compliance) | + +**Voice Layering:** Combine multiple voices for a piece. Example: Source Code + DHH directness, or Every essay + pragmatic clarity. ## Core Systems diff --git a/plugins/compound-writing/skills/context-notes/SKILL.md b/plugins/compound-writing/skills/core/context-notes/SKILL.md similarity index 100% rename from plugins/compound-writing/skills/context-notes/SKILL.md rename to plugins/compound-writing/skills/core/context-notes/SKILL.md diff --git a/plugins/compound-writing/skills/scratchpad/SKILL.md b/plugins/compound-writing/skills/core/scratchpad/SKILL.md similarity index 100% rename from plugins/compound-writing/skills/scratchpad/SKILL.md rename to plugins/compound-writing/skills/core/scratchpad/SKILL.md diff --git a/plugins/compound-writing/skills/voice-capture/SKILL.md b/plugins/compound-writing/skills/core/voice-capture/SKILL.md similarity index 100% rename from plugins/compound-writing/skills/voice-capture/SKILL.md rename to plugins/compound-writing/skills/core/voice-capture/SKILL.md diff --git a/plugins/compound-writing/skills/voice-capture/assets/voice-profile-template.yaml b/plugins/compound-writing/skills/core/voice-capture/assets/voice-profile-template.yaml similarity index 100% rename from plugins/compound-writing/skills/voice-capture/assets/voice-profile-template.yaml rename to plugins/compound-writing/skills/core/voice-capture/assets/voice-profile-template.yaml diff --git a/plugins/compound-writing/skills/voice-capture/references/analysis-dimensions.md b/plugins/compound-writing/skills/core/voice-capture/references/analysis-dimensions.md similarity index 100% rename from plugins/compound-writing/skills/voice-capture/references/analysis-dimensions.md rename to plugins/compound-writing/skills/core/voice-capture/references/analysis-dimensions.md diff --git a/plugins/compound-writing/skills/voice-capture/references/example-profiles.md b/plugins/compound-writing/skills/core/voice-capture/references/example-profiles.md similarity index 100% rename from plugins/compound-writing/skills/voice-capture/references/example-profiles.md rename to plugins/compound-writing/skills/core/voice-capture/references/example-profiles.md diff --git a/plugins/compound-writing/skills/voice-capture/references/extraction-templates.md b/plugins/compound-writing/skills/core/voice-capture/references/extraction-templates.md similarity index 100% rename from plugins/compound-writing/skills/voice-capture/references/extraction-templates.md rename to plugins/compound-writing/skills/core/voice-capture/references/extraction-templates.md diff --git a/plugins/compound-writing/skills/writing-orchestration/SKILL.md b/plugins/compound-writing/skills/core/writing-orchestration/SKILL.md similarity index 100% rename from plugins/compound-writing/skills/writing-orchestration/SKILL.md rename to plugins/compound-writing/skills/core/writing-orchestration/SKILL.md diff --git a/plugins/compound-writing/skills/writing-orchestration/references/baseline-strategies.md b/plugins/compound-writing/skills/core/writing-orchestration/references/baseline-strategies.md similarity index 100% rename from plugins/compound-writing/skills/writing-orchestration/references/baseline-strategies.md rename to plugins/compound-writing/skills/core/writing-orchestration/references/baseline-strategies.md diff --git a/plugins/compound-writing/skills/writing-orchestration/references/quality-checkpoints.md b/plugins/compound-writing/skills/core/writing-orchestration/references/quality-checkpoints.md similarity index 100% rename from plugins/compound-writing/skills/writing-orchestration/references/quality-checkpoints.md rename to plugins/compound-writing/skills/core/writing-orchestration/references/quality-checkpoints.md diff --git a/plugins/compound-writing/skills/writing-orchestration/references/situational-strategies.md b/plugins/compound-writing/skills/core/writing-orchestration/references/situational-strategies.md similarity index 100% rename from plugins/compound-writing/skills/writing-orchestration/references/situational-strategies.md rename to plugins/compound-writing/skills/core/writing-orchestration/references/situational-strategies.md diff --git a/plugins/compound-writing/skills/every-style-editor/SKILL.md b/plugins/compound-writing/skills/editing/every-style-editor/SKILL.md similarity index 100% rename from plugins/compound-writing/skills/every-style-editor/SKILL.md rename to plugins/compound-writing/skills/editing/every-style-editor/SKILL.md diff --git a/plugins/compound-writing/skills/every-style-editor/references/EVERY_WRITE_STYLE.md b/plugins/compound-writing/skills/editing/every-style-editor/references/EVERY_WRITE_STYLE.md similarity index 100% rename from plugins/compound-writing/skills/every-style-editor/references/EVERY_WRITE_STYLE.md rename to plugins/compound-writing/skills/editing/every-style-editor/references/EVERY_WRITE_STYLE.md diff --git a/plugins/compound-writing/skills/dhh-writing/SKILL.md b/plugins/compound-writing/skills/voice/dhh-writing/SKILL.md similarity index 100% rename from plugins/compound-writing/skills/dhh-writing/SKILL.md rename to plugins/compound-writing/skills/voice/dhh-writing/SKILL.md diff --git a/plugins/compound-writing/skills/dhh-writing/references/anti-patterns.md b/plugins/compound-writing/skills/voice/dhh-writing/references/anti-patterns.md similarity index 100% rename from plugins/compound-writing/skills/dhh-writing/references/anti-patterns.md rename to plugins/compound-writing/skills/voice/dhh-writing/references/anti-patterns.md diff --git a/plugins/compound-writing/skills/dhh-writing/references/examples.md b/plugins/compound-writing/skills/voice/dhh-writing/references/examples.md similarity index 100% rename from plugins/compound-writing/skills/dhh-writing/references/examples.md rename to plugins/compound-writing/skills/voice/dhh-writing/references/examples.md diff --git a/plugins/compound-writing/skills/dhh-writing/references/resources.md b/plugins/compound-writing/skills/voice/dhh-writing/references/resources.md similarity index 100% rename from plugins/compound-writing/skills/dhh-writing/references/resources.md rename to plugins/compound-writing/skills/voice/dhh-writing/references/resources.md diff --git a/plugins/compound-writing/skills/dhh-writing/references/techniques.md b/plugins/compound-writing/skills/voice/dhh-writing/references/techniques.md similarity index 100% rename from plugins/compound-writing/skills/dhh-writing/references/techniques.md rename to plugins/compound-writing/skills/voice/dhh-writing/references/techniques.md diff --git a/plugins/compound-writing/skills/every-essay-guide/SKILL.md b/plugins/compound-writing/skills/voice/every-essay-guide/SKILL.md similarity index 100% rename from plugins/compound-writing/skills/every-essay-guide/SKILL.md rename to plugins/compound-writing/skills/voice/every-essay-guide/SKILL.md diff --git a/plugins/compound-writing/skills/pragmatic-writing/SKILL.md b/plugins/compound-writing/skills/voice/pragmatic-writing/SKILL.md similarity index 100% rename from plugins/compound-writing/skills/pragmatic-writing/SKILL.md rename to plugins/compound-writing/skills/voice/pragmatic-writing/SKILL.md diff --git a/plugins/compound-writing/skills/pragmatic-writing/references/anti-patterns.md b/plugins/compound-writing/skills/voice/pragmatic-writing/references/anti-patterns.md similarity index 100% rename from plugins/compound-writing/skills/pragmatic-writing/references/anti-patterns.md rename to plugins/compound-writing/skills/voice/pragmatic-writing/references/anti-patterns.md diff --git a/plugins/compound-writing/skills/pragmatic-writing/references/examples.md b/plugins/compound-writing/skills/voice/pragmatic-writing/references/examples.md similarity index 100% rename from plugins/compound-writing/skills/pragmatic-writing/references/examples.md rename to plugins/compound-writing/skills/voice/pragmatic-writing/references/examples.md diff --git a/plugins/compound-writing/skills/pragmatic-writing/references/sources.md b/plugins/compound-writing/skills/voice/pragmatic-writing/references/sources.md similarity index 100% rename from plugins/compound-writing/skills/pragmatic-writing/references/sources.md rename to plugins/compound-writing/skills/voice/pragmatic-writing/references/sources.md diff --git a/plugins/compound-writing/skills/pragmatic-writing/references/techniques.md b/plugins/compound-writing/skills/voice/pragmatic-writing/references/techniques.md similarity index 100% rename from plugins/compound-writing/skills/pragmatic-writing/references/techniques.md rename to plugins/compound-writing/skills/voice/pragmatic-writing/references/techniques.md diff --git a/plugins/compound-writing/skills/source-code-guide/SKILL.md b/plugins/compound-writing/skills/voice/source-code-guide/SKILL.md similarity index 100% rename from plugins/compound-writing/skills/source-code-guide/SKILL.md rename to plugins/compound-writing/skills/voice/source-code-guide/SKILL.md From 2119e055e41b589cacae7c5de25f2367a64c4c6b Mon Sep 17 00:00:00 2001 From: Kieran Klaassen Date: Fri, 16 Jan 2026 21:04:38 -0800 Subject: [PATCH 08/19] feat(compound-writing): Add /writing:skill command for creating skills MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New command to create voice, domain, and format skills automatically: Usage: - /writing:skill create voice "kieran-blog" samples/*.md - /writing:skill create domain "saas-metrics" - /writing:skill create format "linkedin" Features: - Parallel sub-agents research the skill type - Reads existing skills as patterns/templates - Generates complete skill structure with references - Updates documentation automatically - Commits the new skill Total commands: 6 β†’ 7 Co-Authored-By: Claude Opus 4.5 --- .../.claude-plugin/plugin.json | 2 +- plugins/compound-writing/CLAUDE.md | 5 +- plugins/compound-writing/README.md | 3 +- .../commands/writing-skill.md | 479 ++++++++++++++++++ 4 files changed, 485 insertions(+), 4 deletions(-) create mode 100644 plugins/compound-writing/commands/writing-skill.md diff --git a/plugins/compound-writing/.claude-plugin/plugin.json b/plugins/compound-writing/.claude-plugin/plugin.json index 9918236c..854948ad 100644 --- a/plugins/compound-writing/.claude-plugin/plugin.json +++ b/plugins/compound-writing/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "compound-writing", "version": "1.0.0", - "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 6 workflow commands, and 9 skills for research, drafting, editing, and voice consistency.", + "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 7 workflow commands, and 9 skills for research, drafting, editing, and voice consistency.", "author": { "name": "Kieran Klaassen", "email": "kieran@every.to", diff --git a/plugins/compound-writing/CLAUDE.md b/plugins/compound-writing/CLAUDE.md index 1f8b712d..0c1a8e67 100644 --- a/plugins/compound-writing/CLAUDE.md +++ b/plugins/compound-writing/CLAUDE.md @@ -19,7 +19,7 @@ See `docs/WRITING-ARCHITECTURE.md` for the complete framework mapping: ## Current Components -### Commands (6) +### Commands (7) | Command | Phase | Purpose | |---------|-------|---------| | `/writing:plan` | Discovery/Architecture | Research and outline | @@ -28,6 +28,7 @@ See `docs/WRITING-ARCHITECTURE.md` for the complete framework mapping: | `/writing:feedback` | Any | Capture preferences to scratchpad | | `/writing:knowledge` | Any | Manage voice/patterns/references | | `/writing:compound` | Post-publish | Extract patterns | +| `/writing:skill` | Setup | Create new skills (voice, domain, format) | ### Agents (7) | Agent | Phase | Role | @@ -122,7 +123,7 @@ plugins/compound-writing/ β”œβ”€β”€ CLAUDE.md # This file β”œβ”€β”€ README.md # User documentation β”œβ”€β”€ agents/ # 7 agents -β”œβ”€β”€ commands/ # 6 commands +β”œβ”€β”€ commands/ # 7 commands β”œβ”€β”€ skills/ # 9 skills (organized by type) β”‚ β”œβ”€β”€ core/ # Orchestration, assessment, memory β”‚ β”‚ β”œβ”€β”€ writing-orchestration/ diff --git a/plugins/compound-writing/README.md b/plugins/compound-writing/README.md index 86eca7e0..3dc5c5b2 100644 --- a/plugins/compound-writing/README.md +++ b/plugins/compound-writing/README.md @@ -76,7 +76,7 @@ claude /writing:compound drafts/debug-production/final.md ## Components -### Commands (6) +### Commands (7) | Command | Purpose | |---------|---------| @@ -86,6 +86,7 @@ claude /writing:compound drafts/debug-production/final.md | `/writing:feedback` | Capture real-time preferences into scratchpad | | `/writing:knowledge` | Manage voice profiles, patterns, and references | | `/writing:compound` | Extract patterns from successful writing | +| `/writing:skill` | Create new skills (voice, domain, format) with research | ### Agents (7) diff --git a/plugins/compound-writing/commands/writing-skill.md b/plugins/compound-writing/commands/writing-skill.md new file mode 100644 index 00000000..76103bbf --- /dev/null +++ b/plugins/compound-writing/commands/writing-skill.md @@ -0,0 +1,479 @@ +--- +name: writing:skill +description: Create new writing skills (voice, domain, format) with automatic research +argument-hint: "create [voice|domain|format] \"name\" [samples or description]" +--- + +# Writing Skill Command + +Create new writing skills with automatic research, pattern matching, and documentation. + +## Input + + #$ARGUMENTS + +**Usage:** +- `create voice "kieran-blog" samples/*.md` β†’ Create voice from writing samples +- `create voice "startup-founder" "direct, data-driven, builds in public"` β†’ Create voice from description +- `create domain "saas-metrics" "MRR, churn, CAC/LTV"` β†’ Create "10 Books Expert" domain skill +- `create format "linkedin" ` β†’ Create platform-specific format skill + +--- + +## Step 1: Parse Input + +``` +Extract: +- action: "create" (only action for now) +- type: "voice" | "domain" | "format" +- name: Skill name (kebab-case) +- source: File paths OR description text +``` + +--- + +## Step 2: Load Existing Patterns + +Before creating, read existing skills as templates: + +``` +For voice skills: + Read: skills/voice/pragmatic-writing/SKILL.md + Read: skills/voice/dhh-writing/SKILL.md + Read: skills/voice/every-essay-guide/SKILL.md + Extract: Common structure, sections, frontmatter + +For domain skills: + Read: docs/WRITING-ARCHITECTURE.md (10 Books Expert pattern) + Extract: Core texts, secondary texts, frameworks, reasoning patterns + +For format skills: + Read: docs/WRITING-ARCHITECTURE.md (Format Skills section) + Extract: Platform constraints, key elements +``` + +--- + +## Step 3: Research Phase (Parallel Sub-Agents) + +### For Voice Skills + +``` +If source is file paths: + Load skill: voice-capture + + Task voice-analyzer: "Analyze these writing samples to extract voice patterns. + Samples: [file contents] + Return: + - Vocabulary patterns (technical level, formality, distinctive words) + - Sentence rhythm (avg length, patterns, constructions) + - Tone markers (emotional register, personality, direct address) + - Anti-patterns (what this voice avoids) + - Example excerpts that exemplify the voice" + +If source is description: + Task voice-researcher: "Research and expand this voice description into a full profile. + Description: [user description] + + Use WebSearch to find: + - Writers with similar styles + - Techniques that match this voice + - Examples of this voice in action + + Return: Full voice profile with traits, patterns, examples" +``` + +### For Domain Skills + +``` +Task domain-researcher: "Research this domain to create a '10 Books Expert' skill. +Domain: [domain name] +Context: [user description if provided] + +Research: +1. Identify 5 foundational books/sources for this domain +2. Identify 5 secondary/supporting sources +3. Extract key frameworks and mental models +4. Find common reasoning patterns +5. Identify domain-specific vocabulary +6. Find example applications + +Use WebSearch and Context7 for: +- Authoritative sources +- Key thought leaders +- Standard frameworks +- Best practices + +Return: Complete domain expertise profile" +``` + +### For Format Skills + +``` +Task format-researcher: "Research platform-specific writing constraints and best practices. +Platform: [platform name] + +Research: +1. Character/word limits +2. Formatting constraints (headers, lists, links) +3. Optimal structure patterns +4. Engagement best practices +5. Example high-performing content +6. Common mistakes to avoid + +Use WebSearch for: +- Platform documentation +- Creator guides +- Performance studies +- Expert recommendations + +Return: Complete format constraints and templates" +``` + +**Wait for all research to complete.** + +--- + +## Step 4: Review Research (BRAINSTORM) + +``` +Use AskUserQuestion: + +Question: "Research complete for [type] skill '[name]'. Here's what I found: + +[Summary of key findings] + +Does this look right?" + +Options: +1. **Looks good** - Proceed with skill creation +2. **Add more** - Include additional elements +3. **Adjust focus** - Change emphasis +4. **Research more** - Dig deeper on specific areas +``` + +--- + +## Step 5: Generate Skill Files + +### Voice Skill Structure + +Create `skills/voice/[name]/`: + +```markdown +# SKILL.md +--- +name: [name] +description: [When to use this voice - be specific about triggers] +--- + +# [Name] Voice + +[One paragraph describing this voice's essence] + +## When to Use This Skill + +Use this skill when: +- [Trigger 1] +- [Trigger 2] +- [Trigger 3] + +## Voice Profile + +### Core Traits +- **Tone**: [warm/neutral/intense/etc.] +- **Formality**: [casual/professional/academic] +- **Personality**: [high/medium/low] +- **Technical Level**: [accessible/moderate/expert] + +### Vocabulary Patterns + +**Distinctive words/phrases:** +- [word/phrase 1] +- [word/phrase 2] + +**Prohibited words:** +- [word 1] - because: [reason] +- [word 2] - because: [reason] + +### Sentence Rhythm + +- **Average length**: [X] words +- **Pattern**: [description] +- **Constructions**: [distinctive patterns] + +### Signature Techniques + +1. **[Technique 1]**: [Description] +2. **[Technique 2]**: [Description] + +## Writing Rules + +1. [Rule 1] +2. [Rule 2] +3. [Rule 3] + +## Anti-Patterns + +| Avoid | Because | Instead | +|-------|---------|---------| +| [pattern] | [reason] | [alternative] | + +## Examples + +### Before (Generic) +> [Generic version] + +### After ([Name] Voice) +> [Transformed version] + +## Integration + +Works well with: +- `[other voice]` for [reason] +- `[editing skill]` for [reason] +``` + +Create supporting files if needed: +- `references/examples.md` - Extended examples +- `references/techniques.md` - Deep dive on techniques + +### Domain Skill Structure + +Create `skills/domain/[name]/`: + +```markdown +# SKILL.md +--- +name: domain-[name] +description: Deep expertise in [domain] - the "10 Books Expert" for [topic] +--- + +# [Domain] Expertise + +[One paragraph on what this domain covers and why it matters] + +## When to Use This Skill + +Use this skill when writing about: +- [Topic 1] +- [Topic 2] +- [Topic 3] + +## Core Knowledge Base + +### Foundational Works (The 5 Core Books) + +1. **[Book/Source 1]** by [Author] + - Key insight: [insight] + - Use when: [context] + +2. **[Book/Source 2]** by [Author] + - Key insight: [insight] + - Use when: [context] + +[... 3-5 total] + +### Supporting Works (5 Secondary Sources) + +1. **[Source 1]**: [What it adds] +2. **[Source 2]**: [What it adds] + +[... 3-5 total] + +## Key Frameworks + +### [Framework 1 Name] +[Description and how to apply] + +### [Framework 2 Name] +[Description and how to apply] + +## Domain Vocabulary + +| Term | Definition | Usage | +|------|------------|-------| +| [term] | [definition] | [when to use] | + +## Reasoning Patterns + +When writing about [domain], apply these thinking patterns: + +1. **[Pattern 1]**: [How to reason about X] +2. **[Pattern 2]**: [How to reason about Y] + +## Common Mistakes + +| Mistake | Why It's Wrong | Correct Approach | +|---------|----------------|------------------| +| [mistake] | [reason] | [fix] | + +## Example Applications + +### Topic: [Example Topic 1] +**Approach**: [How to apply domain knowledge] +**Key points**: [What to emphasize] +``` + +### Format Skill Structure + +Create `skills/format/[name]/`: + +```markdown +# SKILL.md +--- +name: format-[name] +description: Optimize content for [platform] - constraints, templates, and best practices +--- + +# [Platform] Format + +[One paragraph on this platform and its unique requirements] + +## When to Use This Skill + +Use when: +- Adapting content for [platform] +- Writing native [platform] content +- Optimizing for [platform] engagement + +## Platform Constraints + +| Element | Constraint | +|---------|-----------| +| Character limit | [X chars] | +| Optimal length | [range] | +| Headers | [allowed/not] | +| Links | [how they work] | +| Images | [specs] | +| Hashtags | [best practice] | + +## Optimal Structure + +### Template 1: [Type] +``` +[Structure with placeholders] +``` + +### Template 2: [Type] +``` +[Structure with placeholders] +``` + +## Best Practices + +1. **[Practice 1]**: [Why and how] +2. **[Practice 2]**: [Why and how] + +## Hooks That Work + +| Hook Type | Example | +|-----------|---------| +| [type] | "[example]" | + +## Common Mistakes + +| Mistake | Fix | +|---------|-----| +| [mistake] | [solution] | + +## Examples + +### High-Performing [Platform] Post +``` +[Actual example with annotations] +``` +``` + +--- + +## Step 6: Update Documentation + +``` +Update plugins/compound-writing/CLAUDE.md: +- Add new skill to appropriate table +- Update skill count + +Update plugins/compound-writing/README.md: +- Add new skill to skills list +- Update count in description +``` + +--- + +## Step 7: Commit + +```bash +git add plugins/compound-writing/skills/[type]/[name]/ +git add plugins/compound-writing/CLAUDE.md +git add plugins/compound-writing/README.md + +git commit -m "feat(compound-writing): Add [name] [type] skill + +[Brief description of the skill] + +- [Key feature 1] +- [Key feature 2] +- [Key feature 3] + +Co-Authored-By: Claude " +``` + +--- + +## Step 8: Confirm Creation + +```markdown +βœ“ Created [type] skill: [name] + +**Location**: skills/[type]/[name]/ +**Files**: +- SKILL.md (main skill definition) +- references/[files] (supporting materials) + +**Research sources used**: +- [source 1] +- [source 2] + +**Ready to use**: +- Voice selection in `/writing:plan` +- Layering with other voices + +**Next steps**: +1. Review the generated skill +2. Add personal examples if desired +3. Test with `/writing:draft` +``` + +--- + +## Step 9: Post-Creation Options (BRAINSTORM) + +``` +Use AskUserQuestion: + +Question: "Skill '[name]' created and committed. What next?" + +Options: +1. **View skill** - Open the SKILL.md file +2. **Test it** - Run /writing:plan with this voice +3. **Refine** - Edit or expand the skill +4. **Create another** - Make another skill +5. **Done** - Finished for now +``` + +--- + +## Quality Checklist + +Before completing: +- [ ] Input correctly parsed (type, name, source) +- [ ] Existing skills read as patterns +- [ ] Research sub-agents completed +- [ ] User approved research findings +- [ ] Skill files created in correct location +- [ ] SKILL.md has valid frontmatter +- [ ] References files created if needed +- [ ] Documentation updated (CLAUDE.md, README.md) +- [ ] Changes committed with descriptive message +- [ ] User shown confirmation with next steps From c4ab8cf0fa995fb006cf39c1f574f5ca5a5969a1 Mon Sep 17 00:00:00 2001 From: Kieran Klaassen Date: Fri, 16 Jan 2026 21:07:48 -0800 Subject: [PATCH 09/19] docs(compound-writing): Add writing-focused examples to /writing:skill Update skill templates with concrete writing examples: Voice skill: - Before/after paragraph transformations - Writing-specific anti-patterns (passive voice, jargon, hedging) Domain skill: - "Use when writing" context - Writing frameworks and argument structures - Example paragraphs with hooks and key phrases Format skill: - Full example post with annotation - Hook examples (contrarian, story, number, bold claim) - Writing techniques (front-load value, write for skimmers) Co-Authored-By: Claude Opus 4.5 --- .../commands/writing-skill.md | 149 +++++++++++------- 1 file changed, 93 insertions(+), 56 deletions(-) diff --git a/plugins/compound-writing/commands/writing-skill.md b/plugins/compound-writing/commands/writing-skill.md index 76103bbf..f8fdd475 100644 --- a/plugins/compound-writing/commands/writing-skill.md +++ b/plugins/compound-writing/commands/writing-skill.md @@ -13,10 +13,10 @@ Create new writing skills with automatic research, pattern matching, and documen #$ARGUMENTS **Usage:** -- `create voice "kieran-blog" samples/*.md` β†’ Create voice from writing samples -- `create voice "startup-founder" "direct, data-driven, builds in public"` β†’ Create voice from description -- `create domain "saas-metrics" "MRR, churn, CAC/LTV"` β†’ Create "10 Books Expert" domain skill -- `create format "linkedin" ` β†’ Create platform-specific format skill +- `create voice "kieran-blog" ~/writing/posts/*.md` β†’ Create voice from your writing samples +- `create voice "founder-voice" "direct, vulnerable, builds in public"` β†’ Create voice from description +- `create domain "persuasion" "Cialdini, rhetoric, behavioral economics"` β†’ Create writing expertise skill +- `create format "twitter-thread"` β†’ Create platform-specific writing format --- @@ -217,15 +217,17 @@ Use this skill when: | Avoid | Because | Instead | |-------|---------|---------| -| [pattern] | [reason] | [alternative] | +| "I think that..." | Weakens authority | State directly | +| Passive voice in openings | Buries the action | Lead with subject + verb | +| Corporate jargon | Alienates readers | Use plain language | ## Examples ### Before (Generic) -> [Generic version] +> It is believed by many experts that the implementation of AI tools can potentially lead to significant productivity improvements in various workplace settings. ### After ([Name] Voice) -> [Transformed version] +> AI tools double your output. I've seen it happenβ€”first in my own work, then across our entire team. ## Integration @@ -246,12 +248,12 @@ Create `skills/domain/[name]/`: # SKILL.md --- name: domain-[name] -description: Deep expertise in [domain] - the "10 Books Expert" for [topic] +description: Deep expertise in [domain] - the "10 Books Expert" for writing about [topic] --- -# [Domain] Expertise +# [Domain] Writing Expertise -[One paragraph on what this domain covers and why it matters] +[One paragraph on what this domain covers and how it improves your writing] ## When to Use This Skill @@ -266,53 +268,55 @@ Use this skill when writing about: 1. **[Book/Source 1]** by [Author] - Key insight: [insight] - - Use when: [context] + - Use when writing: [context] 2. **[Book/Source 2]** by [Author] - Key insight: [insight] - - Use when: [context] + - Use when writing: [context] [... 3-5 total] ### Supporting Works (5 Secondary Sources) -1. **[Source 1]**: [What it adds] -2. **[Source 2]**: [What it adds] +1. **[Source 1]**: [What it adds to your writing] +2. **[Source 2]**: [What it adds to your writing] [... 3-5 total] -## Key Frameworks +## Writing Frameworks ### [Framework 1 Name] -[Description and how to apply] +[How to structure arguments using this framework] ### [Framework 2 Name] -[Description and how to apply] +[How to build narratives using this framework] ## Domain Vocabulary -| Term | Definition | Usage | -|------|------------|-------| -| [term] | [definition] | [when to use] | +| Term | Plain English | Use in Writing | +|------|---------------|----------------| +| [jargon] | [simple definition] | "[example sentence]" | -## Reasoning Patterns +## Reasoning Patterns for Writing -When writing about [domain], apply these thinking patterns: +When writing about [domain], structure your thinking: -1. **[Pattern 1]**: [How to reason about X] -2. **[Pattern 2]**: [How to reason about Y] +1. **[Pattern 1]**: Start with [X], then show [Y] +2. **[Pattern 2]**: Use [framework] to build the argument -## Common Mistakes +## Common Writing Mistakes -| Mistake | Why It's Wrong | Correct Approach | -|---------|----------------|------------------| -| [mistake] | [reason] | [fix] | +| Mistake | Why Readers Lose Interest | Better Approach | +|---------|---------------------------|-----------------| +| Starting with definitions | Feels like a textbook | Open with a story or stake | +| Too much jargon | Alienates non-experts | Translate, then use sparingly | -## Example Applications +## Example Paragraphs ### Topic: [Example Topic 1] -**Approach**: [How to apply domain knowledge] -**Key points**: [What to emphasize] +**Hook**: [Opening sentence that grabs attention] +**Structure**: [How to build the argument] +**Key phrases**: "[memorable line]", "[quotable insight]" ``` ### Format Skill Structure @@ -323,66 +327,99 @@ Create `skills/format/[name]/`: # SKILL.md --- name: format-[name] -description: Optimize content for [platform] - constraints, templates, and best practices +description: Write for [platform] - constraints, templates, and hooks that work --- -# [Platform] Format +# Writing for [Platform] -[One paragraph on this platform and its unique requirements] +[One paragraph on this platform's unique writing requirements] ## When to Use This Skill Use when: -- Adapting content for [platform] +- Adapting an essay for [platform] - Writing native [platform] content -- Optimizing for [platform] engagement +- Repurposing long-form into [platform] format -## Platform Constraints +## Writing Constraints | Element | Constraint | |---------|-----------| | Character limit | [X chars] | | Optimal length | [range] | -| Headers | [allowed/not] | -| Links | [how they work] | -| Images | [specs] | -| Hashtags | [best practice] | +| Paragraph length | [X sentences max] | +| Links | [how they affect reach] | +| Formatting | [what's available] | -## Optimal Structure +## Writing Templates -### Template 1: [Type] +### Template 1: The Thread Opener ``` -[Structure with placeholders] +[Hook that stops the scroll] + +[Promise of value] + +[Thread indicator: 🧡 or "A thread:"] ``` -### Template 2: [Type] +### Template 2: The Single Post ``` -[Structure with placeholders] +[Observation or hot take] + +[One supporting point] + +[Call to engage or share] ``` -## Best Practices +## Writing Techniques -1. **[Practice 1]**: [Why and how] -2. **[Practice 2]**: [Why and how] +1. **Front-load value**: Put the insight in the first line +2. **Write for skimmers**: Each line should work alone +3. **End with engagement**: Question, challenge, or call to action -## Hooks That Work +## Hooks That Stop the Scroll | Hook Type | Example | |-----------|---------| -| [type] | "[example]" | +| Contrarian | "Unpopular opinion: Most productivity advice makes you less productive" | +| Story start | "Last week I almost quit my job. Here's what happened instead:" | +| Number hook | "I've written 500 blog posts. These 3 lessons took the longest to learn:" | +| Bold claim | "AI won't take your job. But someone using AI will." | -## Common Mistakes +## Common Writing Mistakes | Mistake | Fix | |---------|-----| -| [mistake] | [solution] | +| Burying the hook | Move your best line to the top | +| Too much context | Assume they know nothing, explain everything | +| Weak endings | End with action, not summary | -## Examples +## Example: High-Performing Post -### High-Performing [Platform] Post ``` -[Actual example with annotations] +I've shipped code every day for 10 years. + +Here's the one habit that changed everything: + +I stop coding at 4pm. No exceptions. + +Not because I'm lazy. Because the best ideas +come when I'm NOT at my desk. + +Shower thoughts. Walk thoughts. Dinner thoughts. + +The code I write at 9am is 10x better because +of the thinking I did after 4pm yesterday. + +Productivity isn't about more hours. +It's about better hours. ``` + +**Why it works:** +- Hook with credibility (10 years) +- Counterintuitive insight (stop at 4pm) +- Specific details (shower, walk, dinner) +- Memorable takeaway (better hours, not more) ``` --- From 69ef09ef6076a83fe07949350214f68de05700d5 Mon Sep 17 00:00:00 2001 From: Kieran Klaassen Date: Fri, 16 Jan 2026 21:15:52 -0800 Subject: [PATCH 10/19] feat(compound-writing): Add /writing:init command for interactive project setup Interactive wizard that sets up compound-writing for a project: - Creates .claude/writing-knowledge/ directories - Initializes drafts/ with scratchpad and context files - Creates/updates project CLAUDE.md with writing config - Configures voice profile (from samples, description, or preset) - Sets default style guide preference - Optional .gitignore configuration Supports --minimal mode for quick setup without questions. Co-Authored-By: Claude --- .../.claude-plugin/plugin.json | 2 +- plugins/compound-writing/CLAUDE.md | 3 +- plugins/compound-writing/README.md | 3 +- .../compound-writing/commands/writing-init.md | 498 ++++++++++++++++++ 4 files changed, 503 insertions(+), 3 deletions(-) create mode 100644 plugins/compound-writing/commands/writing-init.md diff --git a/plugins/compound-writing/.claude-plugin/plugin.json b/plugins/compound-writing/.claude-plugin/plugin.json index 854948ad..c71966b7 100644 --- a/plugins/compound-writing/.claude-plugin/plugin.json +++ b/plugins/compound-writing/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "compound-writing", "version": "1.0.0", - "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 7 workflow commands, and 9 skills for research, drafting, editing, and voice consistency.", + "description": "AI-powered writing tools that compound your writing skills. Includes 7 specialized agents, 8 workflow commands, and 9 skills for research, drafting, editing, and voice consistency.", "author": { "name": "Kieran Klaassen", "email": "kieran@every.to", diff --git a/plugins/compound-writing/CLAUDE.md b/plugins/compound-writing/CLAUDE.md index 0c1a8e67..4ca79c2b 100644 --- a/plugins/compound-writing/CLAUDE.md +++ b/plugins/compound-writing/CLAUDE.md @@ -19,9 +19,10 @@ See `docs/WRITING-ARCHITECTURE.md` for the complete framework mapping: ## Current Components -### Commands (7) +### Commands (8) | Command | Phase | Purpose | |---------|-------|---------| +| `/writing:init` | Setup | Interactive project setup wizard | | `/writing:plan` | Discovery/Architecture | Research and outline | | `/writing:draft` | Creation | Generate prose | | `/writing:review` | Editing | Multi-agent review | diff --git a/plugins/compound-writing/README.md b/plugins/compound-writing/README.md index 3dc5c5b2..837d4ae9 100644 --- a/plugins/compound-writing/README.md +++ b/plugins/compound-writing/README.md @@ -76,10 +76,11 @@ claude /writing:compound drafts/debug-production/final.md ## Components -### Commands (7) +### Commands (8) | Command | Purpose | |---------|---------| +| `/writing:init` | Interactive setup wizard for project writing environment | | `/writing:plan` | Transform a topic into a researched outline with sources | | `/writing:draft` | Execute an outline into prose with 3 variations | | `/writing:review` | Multi-agent editorial review from every angle | diff --git a/plugins/compound-writing/commands/writing-init.md b/plugins/compound-writing/commands/writing-init.md new file mode 100644 index 00000000..1c2e7667 --- /dev/null +++ b/plugins/compound-writing/commands/writing-init.md @@ -0,0 +1,498 @@ +--- +name: writing:init +description: Initialize compound-writing for this project with interactive setup +argument-hint: "[--minimal | --full]" +--- + +# Writing Init Command + +Set up compound-writing for this project with an interactive wizard. + +## Input + + #$ARGUMENTS + +**Modes:** +- `--minimal` β†’ Skip questions, create basic structure only +- `--full` β†’ Full interactive setup with all options +- (no args) β†’ Smart defaults with key questions + +--- + +## Step 1: Welcome & Mode Detection + +```markdown +# Compound Writing Setup + +Setting up your writing environment. This will create: +- Local knowledge directories for voice profiles and patterns +- Project CLAUDE.md with writing preferences +- Draft workspace with scratchpad + +Let's customize your setup. +``` + +Check for existing setup: +``` +If .claude/writing-knowledge/ exists: + Ask: "Existing setup found. Overwrite / Merge / Cancel?" +``` + +--- + +## Step 2: Interactive Configuration (BRAINSTORM) + +``` +Use AskUserQuestion: + +Question: "What type of writing will you do in this project?" +Header: "Content Type" +Options: +1. **Technical/Engineering** - Documentation, tutorials, dev blogs +2. **Business/Marketing** - Landing pages, emails, social +3. **Editorial/Essays** - Long-form articles, newsletters +4. **Mixed** - Multiple content types +``` + +``` +Use AskUserQuestion: + +Question: "Do you have existing writing samples to extract your voice from?" +Header: "Voice Setup" +Options: +1. **Yes, I have samples** - Will analyze files to create voice profile +2. **No, describe my style** - I'll describe my voice preferences +3. **Use a preset voice** - Start with pragmatic/DHH/Every style +4. **Skip for now** - Set up voice later +``` + +``` +Use AskUserQuestion: + +Question: "Which style guide should be your default?" +Header: "Style Guide" +Options: +1. **Every Style** - Every publication standards +2. **Pragmatic** - Hunt/Thomas/Spolsky style +3. **DHH Style** - Direct, opinionated prose +4. **Custom** - I'll configure my own +5. **None** - No default style guide +``` + +``` +Use AskUserQuestion: + +Question: "Where should drafts be stored?" +Header: "Draft Location" +Options: +1. **drafts/** - Standard drafts directory (recommended) +2. **content/** - Content directory +3. **docs/** - Documentation directory +4. **Custom** - Specify custom path +``` + +--- + +## Step 3: Create Directory Structure + +Based on selections, create: + +```bash +# Core knowledge directories +mkdir -p .claude/writing-knowledge/voice-profiles +mkdir -p .claude/writing-knowledge/patterns/hooks +mkdir -p .claude/writing-knowledge/patterns/structures +mkdir -p .claude/writing-knowledge/patterns/transitions +mkdir -p .claude/writing-knowledge/references + +# Draft workspace (based on selection) +mkdir -p drafts + +# Create empty tracking files +touch drafts/.scratchpad.md +touch drafts/.context.md +``` + +### Initialize Scratchpad + +```markdown +# Writing Scratchpad + +> Session-specific preferences and feedback. Reset between projects. + +## What Works βœ“ + +_Add preferences as you draft: `/writing:feedback draft-2 love the opening`_ + +## What Doesn't βœ— + +_Mark what to avoid: `/writing:feedback draft-1 too formal`_ + +## Voice Notes + +_General style preferences discovered during this session_ + +--- + +Last updated: [timestamp] +``` + +### Initialize Context + +```markdown +# Writing Context + +> Persistent context that carries between sessions. + +## Project Overview + +_Describe the writing project_ + +## Target Audience + +_Who are you writing for?_ + +## Voice Configuration + +- **Primary voice**: [selected voice or "not configured"] +- **Style guide**: [selected guide or "none"] +- **Channel**: [blog/newsletter/social/docs] + +## Active Drafts + +_Tracked automatically by /writing:plan and /writing:draft_ + +--- + +Last updated: [timestamp] +``` + +--- + +## Step 4: Create Project CLAUDE.md + +If no `.claude/CLAUDE.md` exists, create one. If it exists, append writing section. + +### New CLAUDE.md Template + +```markdown +# Project Writing Guide + +## Writing System + +This project uses the compound-writing plugin for AI-assisted writing. + +### Quick Commands + +| Command | Purpose | +|---------|---------| +| `/writing:plan [topic]` | Research and outline a piece | +| `/writing:draft [outline]` | Turn outline into prose | +| `/writing:review [draft]` | Multi-agent editorial review | +| `/writing:feedback [draft] [note]` | Capture preferences | +| `/writing:compound [piece]` | Extract patterns from success | + +### Voice Configuration + +**Primary Voice**: [from selection] +**Style Guide**: [from selection] +**Content Type**: [from selection] + +### Writing Preferences + +_Add your preferences here as you discover them_ + +#### Do +- [preference 1] +- [preference 2] + +#### Don't +- [anti-preference 1] +- [anti-preference 2] + +### Draft Location + +All drafts are stored in: `[selected path]/` + +Structure: +``` +[drafts]/ +β”œβ”€β”€ .scratchpad.md # Session feedback +β”œβ”€β”€ .context.md # Persistent context +└── [slug]/ # Per-piece directories + β”œβ”€β”€ outline.md + β”œβ”€β”€ sources.md + └── draft-v*.md +``` + +## Voice Profile + +_Generated from samples or configured manually_ + +```yaml +voice: + name: "[project-name]-voice" + traits: [] + register: informal + prohibited: [] + channels: + default: "standard prose" +``` + +--- + +πŸ€– Generated with [Claude Code](https://claude.com/claude-code) compound-writing plugin +``` + +### Append to Existing CLAUDE.md + +If CLAUDE.md exists, append: + +```markdown + +--- + +## Writing System + +This project uses the compound-writing plugin. + +### Configuration +- **Voice**: [selection] +- **Style Guide**: [selection] +- **Draft Location**: [selection] + +### Commands +- `/writing:plan` β†’ Research & outline +- `/writing:draft` β†’ Execute outline +- `/writing:review` β†’ Editorial review +- `/writing:feedback` β†’ Capture preferences +``` + +--- + +## Step 5: Voice Setup (If Selected) + +### Option A: Extract from Samples + +``` +Use AskUserQuestion: + +Question: "Provide paths to your writing samples (glob patterns supported)" +Header: "Samples" +Options: +1. **Blog posts** - posts/*.md or content/blog/*.md +2. **Documentation** - docs/*.md or README files +3. **Custom path** - Specify your own pattern +``` + +Then run voice extraction: +``` +Load skill: voice-capture + +Task voice-analyzer: "Analyze these writing samples to extract voice patterns. +Samples: [glob pattern results] +Return: Voice profile YAML" +``` + +Save to `.claude/writing-knowledge/voice-profiles/[project-name].yaml` + +### Option B: Describe Style + +``` +Use AskUserQuestion: + +Question: "Describe your writing style in a few words" +Header: "Style" +Options: +1. **Direct & punchy** - Short sentences, no fluff +2. **Conversational** - Friendly, like talking to a friend +3. **Technical but clear** - Precise without jargon +4. **Storytelling** - Narrative-driven, uses examples +``` + +Create voice profile from selection. + +### Option C: Use Preset + +Copy selected voice profile to local: +```bash +cp skills/voice/[selected]/references/voice-profile.yaml \ + .claude/writing-knowledge/voice-profiles/default.yaml +``` + +--- + +## Step 6: Create Pattern Templates + +Initialize empty pattern files for future capture: + +### hooks/README.md +```markdown +# Hook Patterns + +Captured opening hooks that work well. + +## Usage + +Run `/writing:compound` after publishing to extract hooks. + +## Pattern Template + +```yaml +--- +name: hook-name +type: hook +effectiveness: high/medium +use_when: "description" +--- + +[Hook example] + +**Why it works**: [explanation] +``` +``` + +### structures/README.md +```markdown +# Structure Patterns + +Captured article structures that work. + +## Pattern Template + +```yaml +--- +name: structure-name +type: structure +word_count: 1000-2000 +use_when: "description" +--- + +1. **Opening**: [description] +2. **Section 1**: [description] +3. **Section 2**: [description] +4. **Closing**: [description] +``` +``` + +--- + +## Step 7: Git Configuration (Optional) + +``` +Use AskUserQuestion: + +Question: "Add writing files to .gitignore?" +Header: "Git" +Options: +1. **Yes, ignore drafts** - Keep drafts local only +2. **Yes, ignore scratchpad only** - Track drafts, not session data +3. **No, track everything** - Commit all writing files +4. **Skip** - Don't modify .gitignore +``` + +If selected, append to .gitignore: +``` +# Compound Writing (session files) +drafts/.scratchpad.md +drafts/.context.md + +# Optional: ignore all drafts +# drafts/ +``` + +--- + +## Step 8: Confirmation Summary + +```markdown +# Setup Complete βœ“ + +## Created Directories +- `.claude/writing-knowledge/voice-profiles/` +- `.claude/writing-knowledge/patterns/hooks/` +- `.claude/writing-knowledge/patterns/structures/` +- `.claude/writing-knowledge/patterns/transitions/` +- `.claude/writing-knowledge/references/` +- `[draft-location]/` + +## Created Files +- `[draft-location]/.scratchpad.md` - Session feedback +- `[draft-location]/.context.md` - Persistent context +- `.claude/CLAUDE.md` - Project writing guide (created/updated) +- `.claude/writing-knowledge/voice-profiles/[name].yaml` - Voice profile (if configured) + +## Configuration +- **Voice**: [selection or "not configured"] +- **Style Guide**: [selection] +- **Draft Location**: [path] +- **Content Type**: [selection] + +## Next Steps + +1. **Start writing**: `/writing:plan "your topic"` +2. **Configure voice**: `/writing:knowledge add voice-profile` +3. **Add patterns**: `/writing:compound` after publishing + +Run `/writing:knowledge status` to see your setup anytime. +``` + +--- + +## Step 9: Post-Init Options (BRAINSTORM) + +``` +Use AskUserQuestion: + +Question: "Setup complete! What would you like to do next?" +Header: "Next" +Options: +1. **Start a draft** - Run /writing:plan with a topic +2. **Configure voice** - Set up voice profile from samples +3. **View setup** - Show created files and directories +4. **Done** - Exit setup +``` + +--- + +## Minimal Mode (--minimal) + +Skip all questions, use smart defaults: + +```bash +# Create all directories +mkdir -p .claude/writing-knowledge/voice-profiles +mkdir -p .claude/writing-knowledge/patterns/{hooks,structures,transitions} +mkdir -p .claude/writing-knowledge/references +mkdir -p drafts + +# Create tracking files +touch drafts/.scratchpad.md +touch drafts/.context.md + +# Create minimal CLAUDE.md section +# Append writing config to existing or create new +``` + +Output: +``` +βœ“ Created compound-writing structure in .claude/writing-knowledge/ +βœ“ Created draft workspace in drafts/ +βœ“ Updated .claude/CLAUDE.md + +Run /writing:plan to start writing! +``` + +--- + +## Quality Checklist + +Before completing init: +- [ ] All directories created successfully +- [ ] Scratchpad initialized with template +- [ ] Context file initialized with template +- [ ] CLAUDE.md created or updated +- [ ] Voice profile saved (if configured) +- [ ] .gitignore updated (if selected) +- [ ] Summary shown to user +- [ ] Next steps provided From 438d50042e35a99fa3112b69da5c2cd3a6508bf8 Mon Sep 17 00:00:00 2001 From: Kieran Klaassen Date: Fri, 16 Jan 2026 21:22:00 -0800 Subject: [PATCH 11/19] fix(compound-writing): Enforce AskUserQuestion for all post-command options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add **MANDATORY** instruction to ensure tool is used, not plain text - Convert all "What next?" sections to explicit YAML format - Add "Based on selection" handlers for each option - Reorder options to put "Open/View" first (review before action) - Add "Open outline/draft/report" as primary action Updated commands: - writing-plan: Open outline β†’ Deepen β†’ Review β†’ Start drafting - writing-draft: Open draft β†’ Review β†’ Feedback β†’ Refine - writing-review: View report β†’ View diff β†’ Another pass β†’ Compound - writing-compound: View patterns β†’ Review library β†’ Start new - writing-skill: View skill β†’ Test β†’ Refine β†’ Create another - writing-init: View setup β†’ Start draft β†’ Configure β†’ Done Co-Authored-By: Claude --- .claude/ralph-loop.local.md | 9 - .../commands/writing-compound.md | 33 ++- .../commands/writing-draft.md | 36 ++- .../compound-writing/commands/writing-init.md | 32 ++- .../compound-writing/commands/writing-plan.md | 31 ++- .../commands/writing-review.md | 35 ++- .../commands/writing-skill.md | 31 ++- tmp/orchestration.html | 181 +++++++++++++ tmp/plugin-overview.html | 220 +++++++++++++++ tmp/screenshots/01-overview.png | Bin 0 -> 291862 bytes tmp/screenshots/02-orchestration.png | Bin 0 -> 308824 bytes tmp/screenshots/03-strategies.png | Bin 0 -> 292898 bytes tmp/screenshots/04-workflow.png | Bin 0 -> 254863 bytes tmp/strategies.html | 194 +++++++++++++ tmp/videos/feature-demo-preview.gif | Bin 0 -> 172620 bytes tmp/videos/feature-demo.mp4 | Bin 0 -> 208712 bytes tmp/workflow.html | 255 ++++++++++++++++++ 17 files changed, 982 insertions(+), 75 deletions(-) delete mode 100644 .claude/ralph-loop.local.md create mode 100644 tmp/orchestration.html create mode 100644 tmp/plugin-overview.html create mode 100644 tmp/screenshots/01-overview.png create mode 100644 tmp/screenshots/02-orchestration.png create mode 100644 tmp/screenshots/03-strategies.png create mode 100644 tmp/screenshots/04-workflow.png create mode 100644 tmp/strategies.html create mode 100644 tmp/videos/feature-demo-preview.gif create mode 100644 tmp/videos/feature-demo.mp4 create mode 100644 tmp/workflow.html diff --git a/.claude/ralph-loop.local.md b/.claude/ralph-loop.local.md deleted file mode 100644 index ba36d2c1..00000000 --- a/.claude/ralph-loop.local.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -active: true -iteration: 1 -max_iterations: 0 -completion_promise: "DONE" -started_at: "2026-01-17T01:49:52Z" ---- - -finish all slash commands diff --git a/plugins/compound-writing/commands/writing-compound.md b/plugins/compound-writing/commands/writing-compound.md index 9c697eb9..6c6a3a01 100644 --- a/plugins/compound-writing/commands/writing-compound.md +++ b/plugins/compound-writing/commands/writing-compound.md @@ -459,18 +459,29 @@ Keep only: ## Step 12: Post-Compound Options (BRAINSTORM) -``` -Use AskUserQuestion: - -Question: "Compounding complete. [N] patterns extracted. What next?" +**MANDATORY: Use the AskUserQuestion tool here. Do NOT output options as plain text.** -Options: -1. **View patterns** - Open the extracted pattern files -2. **Start new piece** - `/writing:plan` with new patterns available -3. **Review pattern library** - See all accumulated patterns -4. **Export voice profile** - Share voice profile -5. **Done** - Finished for now -``` +```yaml +tool: AskUserQuestion +question: "Compounding complete. [N] patterns extracted. What next?" +header: "Next" +options: + - label: "View patterns" + description: "Open the extracted pattern files in editor" + - label: "Review pattern library" + description: "See all accumulated patterns" + - label: "Start new piece" + description: "/writing:plan with new patterns available" + - label: "Done" + description: "Finished for now" +``` + +Based on selection: +- **View patterns** β†’ Run `open` on each extracted pattern file +- **Review pattern library** β†’ Display contents of `.claude/writing-knowledge/patterns/` +- **Start new piece** β†’ Call `/writing:plan` to begin new content with accumulated patterns +- **Done** β†’ Exit, patterns are saved for future use +- **Other** (automatically provided) β†’ Accept free text for custom action --- diff --git a/plugins/compound-writing/commands/writing-draft.md b/plugins/compound-writing/commands/writing-draft.md index 62345036..12025b2a 100644 --- a/plugins/compound-writing/commands/writing-draft.md +++ b/plugins/compound-writing/commands/writing-draft.md @@ -372,19 +372,29 @@ Options: 5. **None** - Try different angles ``` -After selection: - -``` -Use AskUserQuestion: - -Question: "What next with [selected draft]?" - -Options: -1. **Run editorial review** - `/writing:review [draft-ID]` -2. **Quick feedback** - Mark what works/doesn't -3. **Refine this draft** - Make specific improvements -4. **Generate more variations** - Create 3 more options -``` +After selection, **MANDATORY: Use the AskUserQuestion tool here. Do NOT output options as plain text.** + +```yaml +tool: AskUserQuestion +question: "What next with [selected draft]?" +header: "Next" +options: + - label: "Open draft" + description: "View the draft in editor for review" + - label: "Run editorial review" + description: "/writing:review [draft-ID]" + - label: "Quick feedback" + description: "Mark what works/doesn't" + - label: "Refine this draft" + description: "Make specific improvements" +``` + +Based on selection: +- **Open draft** β†’ Run `open drafts/[slug]/draft-v[N].md` to open in default editor +- **Run editorial review** β†’ Call `/writing:review [draft-ID]` +- **Quick feedback** β†’ Call `/writing:feedback [draft-ID]` with user's note +- **Refine this draft** β†’ Ask what to improve, then iterate on the draft +- **Other** (automatically provided) β†’ Accept free text for custom action --- diff --git a/plugins/compound-writing/commands/writing-init.md b/plugins/compound-writing/commands/writing-init.md index 1c2e7667..bffaab37 100644 --- a/plugins/compound-writing/commands/writing-init.md +++ b/plugins/compound-writing/commands/writing-init.md @@ -441,17 +441,29 @@ Run `/writing:knowledge status` to see your setup anytime. ## Step 9: Post-Init Options (BRAINSTORM) -``` -Use AskUserQuestion: +**MANDATORY: Use the AskUserQuestion tool here. Do NOT output options as plain text.** -Question: "Setup complete! What would you like to do next?" -Header: "Next" -Options: -1. **Start a draft** - Run /writing:plan with a topic -2. **Configure voice** - Set up voice profile from samples -3. **View setup** - Show created files and directories -4. **Done** - Exit setup -``` +```yaml +tool: AskUserQuestion +question: "Setup complete! What would you like to do next?" +header: "Next" +options: + - label: "View setup" + description: "Show created files and directories" + - label: "Start a draft" + description: "Run /writing:plan with a topic" + - label: "Configure voice" + description: "Set up voice profile from samples" + - label: "Done" + description: "Exit setup" +``` + +Based on selection: +- **View setup** β†’ Run `ls -la` on created directories and show file contents +- **Start a draft** β†’ Ask for topic, then call `/writing:plan [topic]` +- **Configure voice** β†’ Call `/writing:knowledge add voice-profile` workflow +- **Done** β†’ Exit, setup is complete +- **Other** (automatically provided) β†’ Accept free text for custom action --- diff --git a/plugins/compound-writing/commands/writing-plan.md b/plugins/compound-writing/commands/writing-plan.md index 4922b74f..40a4eae3 100644 --- a/plugins/compound-writing/commands/writing-plan.md +++ b/plugins/compound-writing/commands/writing-plan.md @@ -340,18 +340,29 @@ EXPLORATION ## Step 11: Post-Planning Options +**MANDATORY: Use the AskUserQuestion tool here. Do NOT output options as plain text.** + +```yaml +tool: AskUserQuestion +question: "Outline ready at `drafts/[slug]/outline.md`. What would you like to do next?" +header: "Next" +options: + - label: "Open outline" + description: "View the outline in editor for review" + - label: "Deepen research" + description: "Get more sources on specific sections" + - label: "Review outline" + description: "Get structural feedback before drafting" + - label: "Start drafting" + description: "Run /writing:draft drafts/[slug]/outline.md" ``` -Use AskUserQuestion: - -Question: "Outline ready at `drafts/[slug]/outline.md`. What next?" -Options: -1. **Start drafting** - Run `/writing:draft drafts/[slug]/outline.md` -2. **Deepen research** - Get more sources on specific sections -3. **Review outline** - Get structural feedback before drafting -4. **Adjust angle** - Refine the thesis or approach -5. **Save for later** - Done for now -``` +Based on selection: +- **Open outline** β†’ Run `open drafts/[slug]/outline.md` to open in default editor +- **Deepen research** β†’ Ask which sections need more sources, then run source-researcher agent +- **Review outline** β†’ Run structure-architect agent on the outline +- **Start drafting** β†’ Call `/writing:draft drafts/[slug]/outline.md` +- **Other** (automatically provided) β†’ Accept free text for adjustments --- diff --git a/plugins/compound-writing/commands/writing-review.md b/plugins/compound-writing/commands/writing-review.md index 7ac441db..507cb03f 100644 --- a/plugins/compound-writing/commands/writing-review.md +++ b/plugins/compound-writing/commands/writing-review.md @@ -468,18 +468,29 @@ REFINEMENT (working on draft-[ID]) ## Step 15: Post-Review Options (BRAINSTORM) -``` -Use AskUserQuestion: - -Question: "Review complete. [X] issues found, [Y] fixed. Voice score: [before]β†’[after]. What next?" - -Options: -1. **View full report** - Open review-v[N].md -2. **Another review pass** - Re-run with fresh perspective -3. **Refine further** - `/writing:draft refine draft-[ID]` -4. **Compound** - `/writing:compound draft-[ID]` (capture patterns) -5. **Done** - Ready to publish -``` +**MANDATORY: Use the AskUserQuestion tool here. Do NOT output options as plain text.** + +```yaml +tool: AskUserQuestion +question: "Review complete. [X] issues found, [Y] fixed. Voice score: [before]β†’[after]. What next?" +header: "Next" +options: + - label: "View full report" + description: "Open review-v[N].md in editor" + - label: "View diff" + description: "Show before/after changes" + - label: "Another review pass" + description: "Re-run with fresh perspective" + - label: "Compound" + description: "/writing:compound draft-[ID] (capture patterns)" +``` + +Based on selection: +- **View full report** β†’ Run `open drafts/[slug]/review-v[N].md` to open in default editor +- **View diff** β†’ Show side-by-side or unified diff of changes made +- **Another review pass** β†’ Re-run review agents for fresh perspective +- **Compound** β†’ Call `/writing:compound draft-[ID]` to capture winning patterns +- **Other** (automatically provided) β†’ Accept free text for custom action --- diff --git a/plugins/compound-writing/commands/writing-skill.md b/plugins/compound-writing/commands/writing-skill.md index f8fdd475..60d55c94 100644 --- a/plugins/compound-writing/commands/writing-skill.md +++ b/plugins/compound-writing/commands/writing-skill.md @@ -486,18 +486,29 @@ Co-Authored-By: Claude " ## Step 9: Post-Creation Options (BRAINSTORM) +**MANDATORY: Use the AskUserQuestion tool here. Do NOT output options as plain text.** + +```yaml +tool: AskUserQuestion +question: "Skill '[name]' created and committed. What next?" +header: "Next" +options: + - label: "View skill" + description: "Open the SKILL.md file in editor" + - label: "Test it" + description: "Run /writing:plan with this voice" + - label: "Refine" + description: "Edit or expand the skill" + - label: "Create another" + description: "Make another skill" ``` -Use AskUserQuestion: - -Question: "Skill '[name]' created and committed. What next?" -Options: -1. **View skill** - Open the SKILL.md file -2. **Test it** - Run /writing:plan with this voice -3. **Refine** - Edit or expand the skill -4. **Create another** - Make another skill -5. **Done** - Finished for now -``` +Based on selection: +- **View skill** β†’ Run `open skills/[type]/[name]/SKILL.md` to open in default editor +- **Test it** β†’ Ask for a topic, then call `/writing:plan` with the new voice selected +- **Refine** β†’ Ask what to improve, then edit the skill file +- **Create another** β†’ Loop back to Step 1 for a new skill +- **Other** (automatically provided) β†’ Accept free text for custom action --- diff --git a/tmp/orchestration.html b/tmp/orchestration.html new file mode 100644 index 00000000..70232c97 --- /dev/null +++ b/tmp/orchestration.html @@ -0,0 +1,181 @@ + + + + + + Writing Orchestration + + + +
+

Writing Orchestration Skill

+

Two-agent architecture with 30+ strategies and quality gates

+ +
+
+
🎯
+
Orchestrator
+
Research, classify, two-gate assessment
+
+
β†’
+
+
✍️
+
Writer
+
Apply strategies, draft, refine
+
+
β†’
+
+
βœ…
+
Output
+
Voice score β‰₯85
+
+
+ +
+
+

Two-Gate Assessment

+
+
Gate 1: Material Sufficiency
+
"Could the writer create this without inventing facts?"
+
+
+
Gate 2: Message Clarity
+
"Do we know EXACTLY what message to convey?"
+
+
+ +
+

Quality Checkpoints

+
    +
  • βœ“ Opening is counterintuitive or surprising
  • +
  • βœ“ Body delivers on opening's promise
  • +
  • βœ“ All 10 baseline strategies applied
  • +
  • βœ“ 3-4 situational strategies visible
  • +
  • βœ“ Voice matches profile/guide
  • +
+
+
+ +
+

10 Baseline Strategies (Always Apply)

+
+
reader-zero-context
+
subject-verb-first
+
activate-verbs
+
watch-adverbs
+
limit-ings
+
prefer-simple
+
cut-big-small
+
ban-empty-hypophora
+
present-active-tense
+
one-idea-per-sentence
+
+
+
+ + diff --git a/tmp/plugin-overview.html b/tmp/plugin-overview.html new file mode 100644 index 00000000..cd7ad881 --- /dev/null +++ b/tmp/plugin-overview.html @@ -0,0 +1,220 @@ + + + + + + compound-writing Plugin + + + +
+

compound-writing

+

Each unit of writing work should make subsequent units easierβ€”not harder.

+ +
+
+
7
+
Specialized Agents
+
+
+
4
+
Workflow Commands
+
+
+
5
+
Writing Skills
+
+
+ +
+

The Four-Phase Workflow

+
+
+
πŸ“‹
+
Plan
+
/writing:plan
+
+
β†’
+
+
✍️
+
Draft
+
/writing:draft
+
+
β†’
+
+
πŸ”
+
Review
+
/writing:review
+
+
β†’
+
+
πŸ“š
+
Compound
+
/writing:compound
+
+
+
+ +
+

Agents

+
+
+
source-researcher
+
Research sources, analyze audience, study competitors
+
+
+
fact-checker
+
Verify claims, check statistics, ensure accuracy
+
+
+
structure-architect
+
Create outlines, analyze flow, generate hooks
+
+
+
voice-guardian
+
Maintain voice consistency, calibrate tone
+
+
+
clarity-editor
+
Improve clarity, cut words, fix passive voice
+
+
+
publishing-optimizer
+
Optimize for SEO, social media, newsletters
+
+
+
every-style-editor
+
Review against Every's style guide
+
+
+
+ +
+

Skills

+
+
+
pragmatic-writing
+
Write like Hunt/Thomas and Joel Spolsky
+
+
+
dhh-writing
+
DHH's direct, opinionated style
+
+
+
voice-capture
+
Extract and encode voice profiles
+
+
+
every-style-editor
+
Every's editorial style guide
+
+
+
writing-orchestration
+
Two-agent orchestration with 30+ strategies
+
+
+
+ + +
+ + diff --git a/tmp/screenshots/01-overview.png b/tmp/screenshots/01-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..bac224c697dcf09c5a6409ccc942084f0498c6f0 GIT binary patch literal 291862 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 literal 0 HcmV?d00001 diff --git a/tmp/screenshots/02-orchestration.png b/tmp/screenshots/02-orchestration.png new file mode 100644 index 0000000000000000000000000000000000000000..708f3b05abc1beaad9d6c2192df3f29e68a2dc4b GIT binary patch literal 308824 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⋘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�_9oF>POG;waX80f*I=I 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