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).
npx claudepluginhub shihwesley/shihwesley-plugins --plugin interactive-planningThis skill is limited to using the following tools:
Combines **file-based persistence** (Manus-style) with **interactive clarification gates**.
Creates new Angular apps using Angular CLI with flags for routing, SSR, SCSS, prefixes, and AI config. Follows best practices for modern TypeScript/Angular development. Use when starting Angular projects.
Generates Angular code and provides architectural guidance for projects, components, services, reactivity with signals, forms, dependency injection, routing, SSR, ARIA accessibility, animations, Tailwind styling, testing, and CLI tooling.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
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 |