A Claude Code plugin for the pre-implementation planning pipeline: everything
between a rough idea and approved, executable work. Eleven pipeline skills covering
charting a too-big, foggy effort as a decision map, divergence, product intent, the
engineering contract, contract validation, hand-off of a decision another person
holds, goal authoring, design exploration, the design→plan gate, adversarial review,
and the implementation plan itself, plus a re-runnable setup action that settles
where artifacts land in the consuming repo.
| Skill | Stage | What it does |
|---|---|---|
/planning:wayfind |
Chart | Charts a too-big-AND-foggy effort as a shared decision map on the work-item tracker, then works its frontier one decision at a time, routing each to the right skill until the fog clears and a Brief / PRD / PLAN can be handed onward. An escalation from an interview that outgrew one session, never the first step. |
/planning:brainstorm |
Diverge | Turns a rough problem into codebase-grounded candidate approaches ordered cheapest→most ambitious; the user reacts, then work routes onward scoped. |
/planning:prd |
Product intent | Produces a Product Requirements Document (problem, users, success metrics) in three tiers (one-pager, consumer-feature, B2B-internal) with a synthesize path and a review mode. Acceptance-criteria capture asks once about missing unwanted-behavior and state-driven cases (skipped and reported unexamined on the synthesize path). |
/planning:interview |
Engineering contract | Locks a task contract (goal, constraints, acceptance criteria, named assumptions) into a PLAN.md Brief, synthesizing when intent is clear, running frontier-rounds Q&A when it isn't, or interviewing relentlessly on request. Acceptance-criteria capture asks once about missing unwanted-behavior and state-driven cases, and emits EARS-tagged criteria when the team's convention selects that format. The surface option can render rounds on a local page the session watches. The product action interviews a product idea against product principles and ends in a verdict. |
/planning:audit-answers |
Contract validation | Independent adversarial validation of a completed /planning:interview's answers, over any filled ledger, hand-answered or auto-accepted. Fresh-context validators re-examine each answer with its rationale withheld and return one verdict per answer: confirmed, challenged, or reclassified. Only the challenged and reclassified answers, plus every user-reserved decision, return as real human questions. Open branches are accept-filled first, holding the never-auto floor. |
/planning:questionnaire |
Person hand-off | Turns a decision another person holds into a discovery questionnaire delivered async. It interviews the user about the send only (recipient, what's needed back), writes the document to the topic's memory slice, and leaves delivery out-of-band. |
/planning:draft-goal-condition |
Goal authoring | Crafts a paste-ready /goal completion condition from a stated intent. It reads the current official /goal docs live for the condition shape and character limit (nothing hardcoded), drafts a transcript-demonstrable condition, and proves it fits the limit with a deterministic character counter instead of model guesswork, with a branch that builds a checkable condition for goals no metric can measure; a lever-fit gate routes interval-shaped, cloud/sessionless, orchestration-only, and multi-window / multi-ticket work elsewhere. Standalone. |
/planning:design |
Design space | Explores types, contracts, module boundaries, and package topology through collaborative discussion rounds, producing capability-matrix / type-inventory / design-threads / topology artifacts; its handoff action delegates to /planning:design-handoff. Its data, integration, and system artifacts are typed: each carries a scope + dialect label and a fenced block in the dialect the diagram_dialect convention key resolves to (mermaid erDiagram or DBML for data; mermaid sequenceDiagram plus an OpenAPI 3.1 sketch for integration; a LikeC4 or C4-PlantUML container view for system, and no C4 view at all when that key is unset). library and module emit no typed artifact. |
/planning:design-handoff |
Design→plan gate | Gates a finished design for /planning:plan. The gate is a binary check that every design-threads.md thread is RESOLVED, directional, or TAGGED-DEFERRED. Then it packages the plan-ready summary and resume prompt, or FAILs and routes back to /planning:design. On PASS and FAIL alike it also emits an advisory six-dimension coverage table (what, how, where, who, when, why) that never contributes to the verdict; uncovered dimensions ride along in the handoff summary and the resume prompt. |
/planning:devils-advocate |
Adversarial review | Stress-tests plans via assumption extraction, evidence checks, failure scenarios, and operational-gotcha sweeps. Every finding evidence-backed, never generic warnings. An incumbent mode turns the same lens on the status quo: an Alternatives Sweep that stress-tests keeping an incumbent tool/approach against alternatives (native > official > vetted ladder, coupling priced, KEEP / MIGRATE / RESEARCH verdict), exploring the incumbent first-hand in a fresh sub-agent. |
/planning:plan |
Implementation plan | Produces a structured plan (goal, approach, test strategy, blast radius, parallelism analysis, tagged unilateral decisions) with a mandatory fresh-context plan-reviewer stress-test and a user approval gate, persisted to PLAN.md. |
/planning:setup |
Configuration | check inspects the standards index read-only; apply interviews the consumer and bootstraps the standards index (idempotent; re-run to reconfigure). |
The pipeline composes end-to-end. wayfind charts the fog upstream when an effort
is too big to hold at once, then brainstorm → prd → interview → design → design-handoff → plan with devils-advocate attacking the plan before
approval, while /domain-driven-design:curate-language is invoked whenever
those workflows resolve vocabulary, when the domain-driven-design plugin is
enabled; without it, resolved terms are recorded in the design artifacts
themselves. Every skill also works standalone.
/planning:plan-panel(workflows/plan-panel.js). A multi-angle plan panel that/planning:planlaunches, opt-in, for a hard or wide plan: one planner per angle (MVP-first, risk-first, reuse-first and testability-first by default), independent judges that score every draft on goal fit, blast radius, test strategy and reversibility, and one synthesizer that builds the plan from the winner and grafts runner-up ideas. Itsargscarrytask(required; without it the run dispatches nothing),context,angles,judges(default 3),rolesandmaxConcurrent(default 4).rolesis the map/multi-agent:route allprints. Without it, built-in fallbacks run planners onopusatmediumeffort and judges onopusathigh, and the synthesizer inherits the session model athigh. It returns the plan, the scores, the grafted ideas, the dissent and every draft; the synthesized plan goes through the skill's reviewer and approval gate. When the Workflow tool is absent,/planning:planformulates the single plan as before.
- Reads your conventions, assumes none. Project rules, naming conventions,
review checklists, domain-vocabulary files, and commit policy come from your own
project's
CLAUDE.mdand rules; where none exist, the skills apply standard engineering defaults. - Graceful degrade. Adjacent capabilities are invoked when enabled:
codebase exploration and external research (
discovery), test-design guidance (tdd), prototyping (prototype), decision recording (architecture), and session handoff (session-flow). Missing plugins get inline guidance; no step blocks. - Self-contained assets. Templates and reference files ship inside the plugin;
planning artifacts land in the self-ignoring memory slice
<memory_dir>/<topic-slug>/(default.work/). Never in plugin-internal paths.
/plugin marketplace add melodic-software/claude-code-plugins
/plugin install planning@melodic-softwareWhere artifacts land is set by the plugin's lifecycle artifact protocol
(reference/artifact-protocol.md): every working artifact (PRD.md, PLAN.md,
design/, checklists, baselines, scratch) goes to the self-ignoring
<memory_dir>/<topic-slug>/ (default .work/) and is never committed. Durable
content is published to the pull request body and the linked issue. Run
/planning:setup check to inspect the standards index read-only, or
/planning:setup apply to bootstrap it.
The format acceptance criteria are written in is a separate, optional team-shared
choice. /planning:interview and /planning:prd read
acceptance_criteria_format from <home>/authoring-formats/README.md, where
<home> is the convention home bound by the pointer line in your root instruction
file. ears tags every emitted criterion with one of five bracketed patterns
(ubiquitous, event-driven, state-driven, unwanted-behavior,
optional-feature); free-text is the default and emits prose criteria untagged,
exactly as before. Every failure to resolve degrades to free-text with the cause
named, whether that is no pointer line, no such document, no such key, or an
unrecognized value, so a repo that declares nothing sees no change in output.
surface. A value other than terminal or page falls back to terminal.
plan_store. A repository sets it for everyone with plan_store: local or plan_store: tracker
in docs/conventions/planning.yaml (schema: schemas/planning.schema.json), which wins over this
option. Any other value resolves local. tracker needs the work-items plugin and a claimed item.
plan_reader. How much of an approved plan reaches the work item and the pull request paste:
step-by-step (default) the whole plan, standard the design plus a phase outline, guardrails
the design alone, each reduced copy also keeping the Brief. A reduced depth publishes a derived file and
leaves PLAN.md whole. --reader <depth> on /planning:plan overrides it for one run, and the plan
records the depth it published at so a later close-out keeps it. A repository sets it for everyone
with the plan_reader key in docs/conventions/planning.yaml, which wins over this option. A value
outside the three, --reader included, is named and that layer is dropped: a valid higher layer
still wins, otherwise the plan publishes step-by-step, never a lower layer's value.
/planning:setup apply plan_reader=<value> writes the repository file.
phase_order. Decides the order of a plan's phases after the build technique is chosen.
composed removes dead code the change touches first (a bug fix skips this), then builds the
integration slice, then the riskiest remaining unknown, then scaffold, then the remaining features.
subtraction-first runs dead-code removal, then scaffold, then features. riskiest-first puts the
step whose failure would invalidate the most later work first. A repository sets it for everyone
with the phase_order key in docs/conventions/planning.yaml, which wins over this option. A value
outside the three is named and that layer is dropped; with no valid layer left the plan uses
composed. /planning:setup apply phase_order=<value> writes the repository file. All keys and
layers: reference/config.md.
scaffold_stubs. Off by default. When on, /planning:design lists each new file the design
needs with the signatures it will declare, and /planning:plan turns that list into one stub phase
right after the dead-code removal step (first when there is none). Stub bodies use the language's
ordinary not-implemented form, and a stub phase that leaves the build or tests red declares it with
a **Planned breakage:** line. A repository sets it for everyone with scaffold_stubs: true or
scaffold_stubs: false (bare booleans; a quoted "true" is invalid and that layer is dropped) in
docs/conventions/planning.yaml, which wins over this option.
/planning:setup apply scaffold_stubs=true writes it.
use_emoji_question_markers. On the page surface the anchors sit on the question title and
the Recommendation heading; the terminal line they lead is My recommendation:. Q numbering
stays the functional handle, and persisted artifacts (ledger, register, Brief) never carry the
emoji. A user instruction against emoji wins over this option, and the page is then started with
--emoji-markers false so it matches the terminal.
Generated from this plugin's .claude-plugin/plugin.json. Every option Claude Code
will prompt for when the plugin is enabled, with the environment variable each hook
reads it from.
| Option | Type | Default | Environment variable | Description |
|---|---|---|---|---|
surface |
string | "terminal" |
CLAUDE_PLUGIN_OPTION_SURFACE |
Where /planning:interview renders its question rounds: terminal (default, inline in the conversation) or page (a local 127.0.0.1 page the session watches, where each question is answered and every save reaches the session). Applies only to /planning:interview. |
question_pacing |
string | "round" |
CLAUDE_PLUGIN_OPTION_QUESTION_PACING |
How /planning:interview asks a frontier: round (default, every ready question in one message) or single (one per message, largest blast radius first). Asking for the other pacing in a session overrides it there; a repository's planning.yaml in its convention home overrides this value. |
use_ask_user_question |
boolean | false |
CLAUDE_PLUGIN_OPTION_USE_ASK_USER_QUESTION |
When enabled, the planning skills' question rounds (interview, prd, design, plan) render a round of independent questions that fits one AskUserQuestion call instead of inline prose. Default: inline prose (dictation-friendly). |
use_emoji_question_markers |
boolean | false |
CLAUDE_PLUGIN_OPTION_USE_EMOJI_QUESTION_MARKERS |
When on, each interview round question leads with a ❓ anchor on its Q line and its My recommendation line leads with ➡️, in the terminal and on the page surface. Purely presentational: persisted artifacts never carry the emoji. Default: plain text. |
shared_session_open_browser |
boolean | true |
CLAUDE_PLUGIN_OPTION_SHARED_SESSION_OPEN_BROWSER |
When on, starting a /planning:interview shared session opens the owner's page in the default browser. Turn off to open it yourself. Default: on. |
tunnel_hostname |
string | (none) | CLAUDE_PLUGIN_OPTION_TUNNEL_HOSTNAME |
Hostname of a named Cloudflare tunnel for /planning:interview shared sessions (such as interview.example.com), so the guest link survives a restart. One session serves it at a time; others get a quick tunnel. Empty (default): a quick tunnel, whose link changes on restart. Setup: shared/README.md. |
tunnel_token_file |
string | (none) | CLAUDE_PLUGIN_OPTION_TUNNEL_TOKEN_FILE |
Absolute path, or one starting with ~/, of a file holding the named tunnel's token, readable only by you; cloudflared runs from it. Used only when tunnel_hostname is set. Default: empty. |
tunnel_api_token_file |
string | (none) | CLAUDE_PLUGIN_OPTION_TUNNEL_API_TOKEN_FILE |
Absolute path, or one starting with ~/, of a file holding a Cloudflare API token with Cloudflare One Connector: cloudflared Write (it can change every tunnel in the account), readable only by you; sessions check connectors and route the tunnel to their port. Empty: port 8765. See shared/README.md. |
plan_store |
string | "local" |
CLAUDE_PLUGIN_OPTION_PLAN_STORE |
Where /planning:plan keeps an approved plan: local (default, PLAN.md in the memory slice only) or tracker (also posted as one comment on the claimed work item). A repository's docs/conventions/planning.yaml plan_store key overrides this value. |
plan_reader |
string | "step-by-step" |
CLAUDE_PLUGIN_OPTION_PLAN_READER |
How much of an approved plan /planning:plan publishes: step-by-step (default, the whole plan), standard (Brief, design, phase outline) or guardrails (Brief and design). A --reader argument overrides it per run; a repository's docs/conventions/planning.yaml plan_reader key overrides this value. |
phase_order |
string | "composed" |
CLAUDE_PLUGIN_OPTION_PHASE_ORDER |
How /planning:plan orders phases: composed (default: dead-code removal, integration slice, riskiest unknown, scaffold, features), subtraction-first (removal, scaffold, features) or riskiest-first. A repository's docs/conventions/planning.yaml phase_order key overrides this value. |
scaffold_stubs |
boolean | false |
CLAUDE_PLUGIN_OPTION_SCAFFOLD_STUBS |
When on, /planning:design hands off the stub files and signatures a change needs, and /planning:plan puts one stub phase right after dead-code removal (first when there is none). Default: off. A repository's docs/conventions/planning.yaml scaffold_stubs key overrides this value. |
time_units |
boolean | false |
CLAUDE_PLUGIN_OPTION_TIME_UNITS |
When on, the planning skills may state an estimate or budget of work in hours, days or weeks; when off they use the work_size levels instead. Practice cadence and measurement windows are not affected. Default: off. A repository's docs/conventions/planning.yaml time_units key overrides this value. |
Three supported routes:
-
Interactively. Open this plugin's options dialog (
/pluginin a session):/plugin configure planning@<marketplace>. -
Headless. Save the values with
claude plugin configure, run from the project the plugin is installed in. Replace<marketplace>with the marketplace you installed this plugin from:claude plugin configure planning@<marketplace> --values-stdin < values.json
values.jsonholds a JSON object of strings, booleans included:{"surface": "<value>"}This is the preferred headless route in the plugin-reconfiguration convention, which records its limits: the Claude Code version it needs, which install it finds, how it rejects a bad value, and why a session started before the change keeps the old value until a fresh session starts. Do not
claude plugin uninstallto reconfigure: see What an uninstall deletes and keeps.The fallback the convention names, for a Claude Code release without
plugin configure, reruns the install with the new value, passing the scopeclaude plugin listreports for this plugin:claude plugin install planning@<marketplace> -s <scope> --config surface=<value>
-
By hand, in settings. Add the value under
pluginConfigsin your user settings (~/.claude/settings.json):{ "pluginConfigs": { "planning@<marketplace>": { "options": { "surface": <value> } } } }The
pluginConfigsentry names the settings scopes Claude Code reads this key from.
Do not set the CLAUDE_PLUGIN_OPTION_* variables yourself; set the value through one
of the routes above.
- User configuration: the
userConfigschema and theCLAUDE_PLUGIN_OPTION_<KEY>export - Plugin configure: the
--values-stdinflag's reference entry - Plugin install options: the
--configflag's reference entry - Plugins and skills settings:
enabledPlugins,extraKnownMarketplaces,pluginConfigs - Settings files and who they affect: user vs project vs local precedence
- Manage installed plugins: enabling, disabling,
/plugin list
MIT (SPDX-License-Identifier: MIT).