Bootstrap a new project through a CPO+CTO interview flow. Produces versioned, dated foundational documents (vision, architecture, constraints, roadmap, mvp-features) in ./docs/project/. Also supports 'review' mode to periodically re-validate hypotheses and decisions. Use when starting a greenfield project or when you want to formalize the vision and architecture of an existing project. Do NOT use for single feature analysis (use /express-need instead).
The skill does NOT modify /express-need. It stands alone. /express-need and bootstrap-project can be used independently; bootstrap-project does not call /express-need.
Four modes:
Each step lives in its own file and declares its next transition. This orchestrator
parses arguments, selects the entry point, loads the first step, tracks state, and follows
transitions until STOP.
Progress is tracked in ./docs/project/.bootstrap-state.json:
{
"version": 1,
"started": "2026-04-07",
"updated": "2026-04-07T15:51:00",
"last_completed": "save",
"steps_done": ["receive-and-check", "vision-phase", "architecture-phase", "roadmap-phase", "save"]
}
This file is updated after each step completes. It enables:
/bootstrap-project without args)Arguments passed from command: $ARGUMENTS
review (case-insensitive) → REVIEW mode
review/R1-read-existing.mdtickets (case-insensitive) → TICKETS mode
./docs/project/.bootstrap-state.json exists AND all 5 core docs exist/bootstrap-project pour générer les documents de projet." → STOPsteps/07-create-tickets.md (skip steps 01-06)$ARGUMENTS is empty AND ./docs/project/.bootstrap-state.json exists → CONTINUE mode
last_completedlast_completed (see state-to-step mapping below)$ARGUMENTS is the raw idea, or emptysteps/01-receive-and-check.mdStore the raw idea (if any) as raw_idea for use by the first step.
Get today's date in ISO format via Bash: date +%Y-%m-%d. Store as today_date.
last_completed | Next step | What to load |
|---|---|---|
receive-and-check | steps/02-vision-phase.md | raw_idea from state or vision.md sources |
vision-phase | steps/03-architecture-phase.md | vision.md |
architecture-phase | steps/04-roadmap-phase.md | vision.md, architecture.md, constraints.md |
roadmap-phase | steps/05-save.md | all in-memory content (rare — save usually follows immediately) |
save | steps/06-next-steps.md | all docs from files |
next-steps | steps/07-create-tickets.md | all docs from files |
create-tickets | STOP (workflow complete) | suggest /bootstrap-project review |
When resuming (continue or tickets mode), read each existing doc file, strip the YAML
frontmatter (everything between the opening --- and closing ---), and store the
remaining content as the corresponding variable:
./docs/project/vision.md → vision_content./docs/project/architecture.md → architecture_content./docs/project/constraints.md → constraints_content./docs/project/roadmap.md → roadmap_content./docs/project/mvp-features.md → mvp_features_contentOnly load files that exist. Display: Reprise à l'étape : {step_name}
</instructions>
Execute the step's instructions. </instructions>
Update state file: record the completed step name and timestamp
python3 -c "
import json, datetime, os
f = './docs/project/.bootstrap-state.json'
os.makedirs(os.path.dirname(f), exist_ok=True)
try:
state = json.load(open(f))
except (FileNotFoundError, json.JSONDecodeError):
state = {'version': 1, 'started': '$(date +%Y-%m-%d)', 'steps_done': []}
state['last_completed'] = '{step_name}'
if '{step_name}' not in state['steps_done']:
state['steps_done'].append('{step_name}')
state['updated'] = datetime.datetime.now().isoformat(timespec='seconds')
json.dump(state, open(f, 'w'), indent=2)
print('State updated: {step_name}')
"
Replace {step_name} with the name field from the step's frontmatter.
Read the step file's next field from frontmatter
Resolve the next step file:
${CLAUDE_SKILL_DIR}/steps/{NN}-{next-name}.md (find by frontmatter name field)${CLAUDE_SKILL_DIR}/review/R{N}-{next-name}.mdnext is STOP: end workflowLoad the next step file and execute
Repeat until STOP
CRITICAL: Do not skip transitions. Each step file explicitly declares what comes next in its frontmatter. Follow the chain until STOP. Always update the state file between steps. </workflow>
| Order | File | Name | Description |
|---|---|---|---|
| 01 | steps/01-receive-and-check.md | receive-and-check | Receive raw idea, check for existing docs, handle conflicts |
| 02 | steps/02-vision-phase.md | vision-phase | Product vision scout + interview + synthesis (product-strategist) |
| 03 | steps/03-architecture-phase.md | architecture-phase | Architecture scout + interview + synthesis (tech-architect) |
| 04 | steps/04-roadmap-phase.md | roadmap-phase | MVP interview + roadmap synthesis (product-strategist) |
| 05 | steps/05-save.md | save | Write 5 files to ./docs/project/ with dated frontmatter |
| 06 | steps/06-next-steps.md | next-steps | Display guidance, propose ticket creation |
| 07 | steps/07-create-tickets.md | create-tickets | Break MVP features into atomic tickets and create them |
| Order | File | Name | Description |
|---|---|---|---|
| R1 | review/R1-read-existing.md | review-read-existing | Read existing foundational docs, parse hypotheses and decisions |
| R2 | review/R2-review-loop.md | review-loop | Ask user to re-validate each hypothesis, decision, and MVP feature |
| R3 | review/R3-update-files.md | review-update-files | Append Review Log, update last_reviewed date, flag invalidated items |
${CLAUDE_SKILL_DIR}/references/file-formats.md — frontmatter templates and expected file structures${CLAUDE_SKILL_DIR}/references/scout-parsing.md — how to parse scout agent outputs into AskUserQuestion calls~/.claude/agents/references/cross-cutting-concerns.md — shared trigger table used by both agentsAll user communication in French. Technical content (file paths, command outputs, stack names, constraint text) in English.
Begin workflow for: $ARGUMENTS