Skip to content

feat(capabilities): general draft content capability (batch + select-and-say revise) - #107

Open
sameeeeeeep wants to merge 2 commits into
mainfrom
claude/launcher-capability-composition-404ee6
Open

feat(capabilities): general draft content capability (batch + select-and-say revise)#107
sameeeeeeep wants to merge 2 commits into
mainfrom
claude/launcher-capability-composition-404ee6

Conversation

@sameeeeeeep

Copy link
Copy Markdown
Owner

What & where

Adds the general content-drafting capability the composition vision was missing. This is the capability layer — not the launcher (packages/menubar/ is untouched). It's the piece the launcher will eventually compose.

  • examples/apps/src/core/draft.core.js — new capability core
  • packages/switchboard-mcp/registry.mjs — registers it (one import + MANIFESTS push)

Why

Every existing core is single-purpose (batch = a YC application, reachout = one lead's sequence). A real dogfood test — composing capabilities for a live "start making content on X/IG/LinkedIn" goal — confirmed the seed→strategy half composes (ideabrain.briefautopilot.slate) but there was no general "draft N posts" capability to close it. This is that capability.

Two actions, one capability

  • draft(input, sb) — N distinct pieces of one format (x-thread, x-single, linkedin, ig-caption, ig-carousel), grounded in a voice/angle/audience brief. The content pipeline's last stage.
  • revise(input, sb) — one piece + a steer, re-drafted in place. The primitive behind notch select-and-say (select a block → your words become a steer → re-run just that piece), on the same steers contract reachout already uses.

Both surface as wrapp__draft__draft / wrapp__draft__revise and are composable by the planner + edit layer via the shared run(input, sb) contract.

Verification

  • Mock-sb unit test — green: messy-fence JSON parse, n-count pad/truncate, steer ordering (latest wins), per-format guides, and actionTable() run-parity (the exact call the connector makes).
  • Real end-to-end — green: driven through the user's own Claude; drafts real posts and revise("punchier, lead with the stat") tightens correctly.

Not in this PR (follow-ups)

  • Wiring into the launcher onAsk / live MCP path (needs daemon+MCP reload — the running MCP won't hot-reload registry.mjs).
  • The compose.mjs planner (query + actionTable() → plan → chained run).
  • revise → notch select-and-say edit layer; steers → taste.md.

🤖 Generated with Claude Code

sameeeeeeep and others added 2 commits August 14, 2026 03:35
…elect-and-say revise)

The composition vision was missing a factored, general content-drafting
capability — every existing core is single-purpose (batch = a YC application,
reachout = one lead's sequence). `draft.core.js` fills that gap and ships two
actions on one capability:

  • draft(input, sb)  — N distinct pieces of one format (x-thread, x-single,
                        linkedin, ig-caption, ig-carousel), grounded in a
                        voice/angle/audience brief. The content pipeline's
                        last stage.
  • revise(input, sb) — one piece + a steer, re-drafted in place. The primitive
                        behind notch "select-and-say" (select a block → your
                        words become a steer → re-run JUST that piece), on the
                        same `steers` contract reachout already uses.

Registered in switchboard-mcp/registry.mjs (one import + MANIFESTS push) →
wrapp__draft__draft / wrapp__draft__revise, composable by the planner and the
edit layer via the shared run(input, sb) contract.

Verified: mock-sb unit test (messy-fence parse, n-count pad/truncate, steer
ordering, format guides, actionTable run-parity) all green; real end-to-end run
through the user's own Claude drafts + revises real posts correctly.

Not yet wired into the launcher/MCP live path (needs daemon+MCP reload).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…voice-fix draft prompt

Builds out the select-and-say edit loop and the "help every step" principle,
and fixes the draft voice.

draft (prompt fix): replaced the hook/CTA-oriented prompt with a hard VOICE
rule — one idea per piece; no announcements, no "I call them X" coinage-reveals,
no feature-bullet cadence, no screenshot-bait aphorisms, no rhetorical-question
endings, no sign-off clichés; keep the person's plain words instead of polishing
them. Stripped "scroll-stopping hook"/closing-CTA from every format guide. Fixed
a latent ${count} interpolation bug in the no-topic branch.

record (new capability): the "no step ends with 'you go do it'" principle as
code. plan() turns a written post into a spoken teleprompter (paced lines) +
shot plan + setup checklist; buildRecordGuide()/guide() emit a teach-mode guru
flow that speaks each line and walks the take — the human only supplies face and
voice. Registered as wrapp__record__plan / wrapp__record__guide.

arrange (new capability): the EDITOR, not the writer. Takes a person's own raw
words and only cuts filler / fixes transcription / breaks into lines / reorders
— never adds a sentence, hook, or aphorism. This is what should back select-and-
say for a founder's own voice (generate-from-a-brief produced slop). Registered
as wrapp__arrange__arrange.

draft wrapp UI (new): examples/apps/src/draft.js (+ draft.html, wrapps/draft/
switchboard.json, build + harness wiring) — the select-and-say front-end. Each
piece renders with a steerRow; on steer submit it calls revise({piece,steers,
brief}, relay) in-page and swaps THAT piece in place, others untouched.

Verified: draft + record unit tests green; registry loads all of
wrapp__{draft__draft,draft__revise,record__plan,record__guide,arrange__arrange};
draft UI builds + a live harness run swapped one piece in place on steer.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant