From interactive-planning
File-based planning with interactive gates and native task tracking. Use when user says /plan, needs to break a complex feature into phases, or wants structured implementation planning with user approval at key decision points. Supports task mode (single plan file) and spec mode (multi-file architecture).
How this skill is triggered — by the user, by Claude, or both
Slash command
/interactive-planning:interactive-planningThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Combines **file-based persistence** (Manus-style) with **interactive clarification gates**.
Combines file-based persistence (Manus-style) with interactive clarification gates.
Context Window = RAM (volatile, limited)
Filesystem = Disk (persistent, unlimited)
Task Tools = Structured progress (visible, stateful)
AskUserQuestion = User alignment (prevents rework)
→ Tasks for actions (TaskCreate/Update)
→ Files for knowledge (findings.md)
→ Ask users before committing to approaches
Before anything else, check for unsynced context:
python3 ~/.claude/skills/planning-with-files/scripts/session-catchup.py "$(pwd)"
If catchup shows unsynced context:
git diff --stat to see code changesUse AskUserQuestion BEFORE creating any files. Two questions:
Question 1: Planning Mode
AskUserQuestion(
question="What kind of planning does this need?",
header="Mode",
options=[
{"label": "Task-based (Recommended)", "description": "Single task_plan.md with phases. Best for straightforward features."},
{"label": "Spec-driven", "description": "Multiple spec files per concern, manifest index. Best for complex multi-domain work."}
]
)
If "Task-based" → continue with existing flow (Gates 2-4 unchanged). If "Spec-driven" → continue with Gates 2, 3 (enhanced), 4 (enhanced) below.
Question 2: Priority (asked regardless of mode)
AskUserQuestion(
question="Which aspect is most important?",
header="Priority",
options=[
{"label": "Speed (Recommended)", "description": "MVP approach, ship fast, iterate later"},
{"label": "Quality", "description": "Tests, docs, edge cases, production-ready"},
{"label": "Flexibility", "description": "Extensible, configurable, multiple use cases"},
{"label": "Simplicity", "description": "Minimal, focused, easy to understand"}
]
)
AskUserQuestion(
question="I identified these requirements. Select all that apply:",
header="Requirements",
multiSelect=True,
options=[
{"label": "[Inferred req 1]", "description": "..."},
{"label": "[Inferred req 2]", "description": "..."},
{"label": "[Inferred req 3]", "description": "..."},
{"label": "Add more", "description": "I'll provide additional requirements"}
]
)
AskUserQuestion(
question="There are a few ways to approach this:",
header="Approach",
options=[
{"label": "Approach A", "description": "Tradeoffs: faster but less flexible"},
{"label": "Approach B", "description": "Tradeoffs: more setup but scalable"},
{"label": "Approach C", "description": "Tradeoffs: full control, more work"}
]
)
If spec-driven mode was selected in Gate 1, replace Gate 3 above with this combined gate.
The agent:
Present to user:
Based on your requirements, here's the approach and spec breakdown:
**Approach:** {description of chosen approach with rationale}
**Spec Decomposition:**
- root-spec.md — {description} (parent of all)
├── {name}-spec.md — {description}
├── {name}-spec.md — {description} (depends on: {dep})
└── {name}-spec.md — {description} (depends on: {dep})
**Auto-computed grouping:**
Phase 1, Sprint 1: root-spec, {independent specs}
Phase 1, Sprint 2: {specs depending on sprint 1}
Phase 2, Sprint 1: {specs depending on phase 1}
AskUserQuestion(
question="Does this spec breakdown look right?",
header="Specs",
options=[
{"label": "Looks good", "description": "Proceed with this decomposition"},
{"label": "Adjust specs", "description": "I want to add, remove, or restructure specs"},
{"label": "Too granular", "description": "Merge some specs together — fewer, larger specs"},
{"label": "Not granular enough", "description": "Split some specs further"}
]
)
Sprint/Phase auto-assignment algorithm:
After gates pass, create tasks for phases and files for research:
If spec-driven mode was selected in Gate 1, replace the task_plan.md creation below with this path.
mkdir -p docs/plans/specs
Use template from ~/.claude/skills/orchestrator/templates/manifest-template.md.
Fill in:
Write to: docs/plans/manifest.md
For each spec identified in Gate 3, use template from
~/.claude/skills/orchestrator/templates/spec-template.md.
Fill in:
Write each to: docs/plans/specs/{name}-spec.md
Use the spec-driven findings.md template below (not the task-based version).
The extra sections give /orchestrate the dependency graph and per-spec decision
traceability it needs for skill-matching and agent dispatch.
Use the spec-driven progress.md template below (not the task-based version).
The Spec Status table is the primary resume signal for /orchestrate --resume.
Create tasks at two levels: spec tasks (parents) and sub-tasks (from the spec's ## Tasks section).
This gives /orchestrate granular dispatch — it can assign individual sub-tasks to agents
and track completion within each spec.
Level 1 — Spec tasks (inter-spec blocking via DAG):
# Create one parent task per spec
TaskCreate(
subject="Spec: {spec-name}",
description="Implement docs/plans/specs/{spec-name}-spec.md\nPhase {N}, Sprint {M}\nDepends on: {deps}\n\nThis is a parent task. Sub-tasks below do the actual work.",
activeForm="Implementing {spec-name}"
)
# Returns task ID, e.g. "1"
# Wire inter-spec dependencies from the DAG
# If api-spec depends on data-model-spec:
TaskUpdate(taskId="{api-spec-task}", addBlockedBy=["{data-model-spec-task}"])
Level 2 — Sub-tasks (intra-spec blocking, sequential within each spec):
For each task listed in the spec's ## Tasks section, create a sub-task
that references its parent spec and is blocked by the previous sub-task:
# Spec: data-model has 3 tasks in its ## Tasks section:
# Sub-task 1 — blocked by the parent spec's upstream dependencies (inherits)
TaskCreate(
subject="data-model: Create database schema",
description="Spec: data-model (Phase 1, Sprint 1)\nParent task: #{spec_task_id}\nFile targets: {from spec ## Files table}",
activeForm="Creating database schema"
)
# Returns e.g. "1a"
TaskUpdate(taskId="1a", addBlockedBy=["{upstream_spec_last_subtask or spec_blockers}"])
# Sub-task 2 — blocked by sub-task 1
TaskCreate(
subject="data-model: Write migration",
description="Spec: data-model (Phase 1, Sprint 1)\nParent task: #{spec_task_id}",
activeForm="Writing migration"
)
# Returns e.g. "1b"
TaskUpdate(taskId="1b", addBlockedBy=["1a"])
# Sub-task 3 — blocked by sub-task 2
TaskCreate(
subject="data-model: Add seed data",
description="Spec: data-model (Phase 1, Sprint 1)\nParent task: #{spec_task_id}",
activeForm="Adding seed data"
)
# Returns e.g. "1c"
TaskUpdate(taskId="1c", addBlockedBy=["1b"])
Inter-spec handoff rule: A downstream spec's first sub-task is blocked by the upstream spec's last sub-task (not the parent). This prevents the downstream spec from starting before the upstream spec's work is actually finished:
# api-spec depends on data-model. data-model's last sub-task is "1c".
# api-spec's first sub-task:
TaskCreate(subject="api-layer: Define route handlers", ...)
TaskUpdate(taskId="{api_first_subtask}", addBlockedBy=["1c"])
# NOT addBlockedBy: ["1"] — the parent task is a grouping label, not a gate.
Naming convention: Sub-task subjects are prefixed with their spec name
(data-model: Create schema) so the flat task list stays readable.
Completion rule: When ALL sub-tasks for a spec are completed, mark the parent spec task as completed too:
# After all data-model sub-tasks done:
TaskUpdate(taskId="{data-model-spec-task}", status="completed")
Then continue to Gate 4 below (which validates the full structure).
For each phase identified, create a task:
# Phase 1
TaskCreate(
subject="Phase 1: [Title]",
description="[Details from gates]\n- Task 1\n- Task 2",
activeForm="Working on Phase 1"
)
# Phase 2 (blocked by Phase 1)
TaskCreate(
subject="Phase 2: [Title]",
description="[Details]",
activeForm="Working on Phase 2"
)
# Then: TaskUpdate(taskId="2", addBlockedBy=["1"])
Consult references/templates.md for the full findings.md and progress.md templates. Both have task-based and spec-driven variants.
After creating tasks and files:
# First show user the task list
TaskList()
AskUserQuestion(
question="Created X tasks (visible in UI). Ready to proceed?",
header="Validate",
options=[
{"label": "Looks good, proceed", "description": "Start Phase 1"},
{"label": "Adjust tasks", "description": "I want to modify the plan"},
{"label": "Show more detail", "description": "Expand on the approach"}
]
)
When starting a phase:
TaskUpdate(taskId="1", status="in_progress")
When completing a phase:
TaskUpdate(taskId="1", status="completed")
# Next task auto-unblocks if it was waiting
| Trigger | Action |
|---|---|
| Phase complete | TaskUpdate(completed) + "Phase N done. Continue?" |
| Unexpected complexity | "More complex than expected. Simplify scope, extend timeline, or proceed?" |
| 3-strike error | "Hit 3 failures. Try alternative, ask for help, or skip?" |
| Scope creep | TaskCreate for new work + "New scope detected. Add task or defer?" |
After every 2 view/browser/search operations: → IMMEDIATELY write findings to findings.md → Multimodal content doesn't persist - capture as text NOW
ATTEMPT 1: Diagnose & fix
ATTEMPT 2: Alternative approach (NEVER repeat same action)
ATTEMPT 3: Broader rethink, search for solutions
AFTER 3: AskUserQuestion to escalate
Consult references/templates.md for full template files and detailed "when to use / skip" guidance.
| Don't | Do Instead |
|---|---|
| Create tasks without asking scope | Run Gate 1 first |
| Assume requirements | Validate with Gate 2 |
| Pick approach silently | Use Gate 3 if multiple options |
| Start coding without tasks | TaskCreate for all phases FIRST |
| Track progress in markdown checkboxes | Use TaskUpdate for status |
| Store large research in task descriptions | Use findings.md |
| Ask too many questions | Batch related questions |
| Forget to update task status | TaskUpdate(completed) when done |
For plans with 2+ phases, offer parallel worktree execution. Full protocol in references/worktree-orchestration.md — covers Gate 5 setup decision, worktree creation, mother/worker agent spawning, and merge flow.
After Gate 4, if the user wants automated execution, hand off to the /orchestrate skill which reads findings.md and progress.md to drive the 6-stage pipeline (plan ingestion → review → skill matching → agent dispatch → testing → code review). The orchestrator consumes the same file artifacts this skill produces.
| All phases done | Mother reports final summary |
npx claudepluginhub shihwesley/shihwesley-plugins --plugin interactive-planningMulti-step planning pipeline for Medium and Complex tasks: discovery, phase decomposition, skill matching, cross-cutting concerns, and plan emission with Gate fields.
Converts approved specs into executable implementation plans with task breakdowns, file maps, and verification steps. Use before multi-step coding work.