maestro-flow 0.3.9 → 0.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/workflow-collab-planner.md +1 -1
- package/.claude/agents/workflow-executor.md +1 -1
- package/.claude/agents/workflow-plan-checker.md +1 -1
- package/.claude/agents/workflow-planner.md +1 -1
- package/.claude/commands/learn-decompose.md +176 -176
- package/.claude/commands/learn-follow.md +167 -167
- package/.claude/commands/learn-retro.md +1 -1
- package/.claude/commands/maestro-analyze.md +46 -3
- package/.claude/commands/maestro-coordinate.md +1 -3
- package/.claude/commands/maestro-execute.md +14 -0
- package/.claude/commands/maestro-plan.md +16 -0
- package/.claude/commands/manage-harvest.md +131 -131
- package/.claude/commands/manage-issue-discover.md +2 -2
- package/.claude/commands/manage-issue.md +5 -5
- package/.claude/commands/spec-add.md +67 -56
- package/.claude/commands/spec-load.md +66 -64
- package/.claude/commands/spec-setup.md +5 -9
- package/.codex/skills/learn-decompose/SKILL.md +119 -0
- package/.codex/skills/learn-follow/SKILL.md +83 -0
- package/.codex/skills/learn-investigate/SKILL.md +83 -0
- package/.codex/skills/learn-retro/SKILL.md +83 -0
- package/.codex/skills/learn-second-opinion/SKILL.md +86 -0
- package/.codex/skills/maestro/SKILL.md +335 -0
- package/.codex/skills/maestro-analyze/SKILL.md +84 -75
- package/.codex/skills/maestro-brainstorm/SKILL.md +452 -463
- package/.codex/skills/maestro-chain/SKILL.md +233 -0
- package/.codex/skills/maestro-coordinate/SKILL.md +167 -278
- package/.codex/skills/maestro-execute/SKILL.md +435 -438
- package/.codex/skills/maestro-fork/SKILL.md +68 -0
- package/.codex/skills/maestro-init/SKILL.md +171 -167
- package/.codex/skills/maestro-learn/SKILL.md +80 -0
- package/.codex/skills/maestro-link-coordinate/SKILL.md +224 -220
- package/.codex/skills/maestro-merge/SKILL.md +62 -0
- package/.codex/skills/maestro-milestone-audit/SKILL.md +108 -103
- package/.codex/skills/maestro-milestone-complete/SKILL.md +155 -149
- package/.codex/skills/maestro-milestone-release/SKILL.md +70 -0
- package/.codex/skills/maestro-overlay/SKILL.md +188 -185
- package/.codex/skills/maestro-plan/SKILL.md +66 -69
- package/.codex/skills/maestro-quick/SKILL.md +26 -23
- package/.codex/skills/maestro-roadmap/SKILL.md +65 -73
- package/.codex/skills/maestro-spec-generate/SKILL.md +66 -74
- package/.codex/skills/maestro-ui-design/SKILL.md +34 -31
- package/.codex/skills/maestro-verify/SKILL.md +556 -566
- package/.codex/skills/manage-codebase-rebuild/SKILL.md +397 -405
- package/.codex/skills/manage-codebase-refresh/SKILL.md +93 -82
- package/.codex/skills/manage-harvest/SKILL.md +82 -0
- package/.codex/skills/manage-issue/SKILL.md +80 -65
- package/.codex/skills/manage-issue-discover/SKILL.md +491 -503
- package/.codex/skills/manage-learn/SKILL.md +190 -186
- package/.codex/skills/manage-memory/SKILL.md +95 -72
- package/.codex/skills/manage-memory-capture/SKILL.md +99 -86
- package/.codex/skills/manage-status/SKILL.md +102 -89
- package/.codex/skills/quality-business-test/SKILL.md +228 -223
- package/.codex/skills/quality-debug/SKILL.md +54 -66
- package/.codex/skills/quality-integration-test/SKILL.md +532 -544
- package/.codex/skills/quality-refactor/SKILL.md +197 -191
- package/.codex/skills/quality-retrospective/SKILL.md +512 -505
- package/.codex/skills/quality-review/SKILL.md +93 -105
- package/.codex/skills/quality-sync/SKILL.md +101 -89
- package/.codex/skills/quality-test/SKILL.md +202 -198
- package/.codex/skills/quality-test-gen/SKILL.md +93 -104
- package/.codex/skills/spec-add/SKILL.md +58 -39
- package/.codex/skills/spec-load/SKILL.md +45 -40
- package/.codex/skills/spec-map/SKILL.md +180 -182
- package/.codex/skills/spec-setup/SKILL.md +94 -76
- package/.codex/skills/team-coordinate/SKILL.md +346 -357
- package/.codex/skills/team-executor/SKILL.md +70 -112
- package/.codex/skills/team-lifecycle-v4/SKILL.md +311 -299
- package/.codex/skills/team-quality-assurance/SKILL.md +234 -227
- package/.codex/skills/team-review/SKILL.md +232 -225
- package/.codex/skills/team-tech-debt/SKILL.md +78 -100
- package/.codex/skills/team-testing/SKILL.md +242 -235
- package/.codex/skills/wiki-connect/SKILL.md +75 -0
- package/.codex/skills/wiki-digest/SKILL.md +87 -0
- package/README.md +14 -11
- package/README.zh-CN.md +14 -11
- package/chains/issue-lifecycle.json +13 -13
- package/chains/singles/issue-analyze.json +3 -3
- package/chains/singles/issue-execute.json +3 -3
- package/chains/singles/issue-plan.json +3 -3
- package/dashboard/dist-server/dashboard/src/server/commander/commander-agent.js +2 -2
- package/dashboard/dist-server/dashboard/src/server/commander/commander-agent.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js +3 -3
- package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/issues.js +34 -0
- package/dashboard/dist-server/dashboard/src/server/routes/issues.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/specs.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js +75 -30
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.d.ts +5 -0
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js +5 -0
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/execution-handler.js +2 -3
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/execution-handler.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.js +5 -0
- package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/issue-types.d.ts +5 -0
- package/dashboard/dist-server/dashboard/src/shared/issue-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/normalize-task.d.ts +2 -0
- package/dashboard/dist-server/dashboard/src/shared/normalize-task.js +75 -0
- package/dashboard/dist-server/dashboard/src/shared/normalize-task.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/shared/team-types.d.ts +21 -0
- package/dashboard/dist-server/dashboard/src/shared/team-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/types.d.ts +3 -2
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.js.map +1 -1
- package/dashboard/dist-server/src/hooks/constants.d.ts +92 -12
- package/dashboard/dist-server/src/hooks/constants.js +151 -16
- package/dashboard/dist-server/src/hooks/constants.js.map +1 -1
- package/dashboard/dist-server/src/types/index.d.ts +5 -0
- package/dist/src/commands/collab.d.ts +1 -34
- package/dist/src/commands/collab.d.ts.map +1 -1
- package/dist/src/commands/collab.js +8 -76
- package/dist/src/commands/collab.js.map +1 -1
- package/dist/src/commands/hooks.d.ts +5 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +115 -10
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/install-ui/InstallConfirm.d.ts +3 -1
- package/dist/src/commands/install-ui/InstallConfirm.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallConfirm.js +3 -1
- package/dist/src/commands/install-ui/InstallConfirm.js.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.js +5 -1
- package/dist/src/commands/install-ui/InstallExecution.js.map +1 -1
- package/dist/src/commands/install-ui/InstallFlow.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallFlow.js +7 -3
- package/dist/src/commands/install-ui/InstallFlow.js.map +1 -1
- package/dist/src/commands/install-ui/StatuslineConfig.d.ts +6 -1
- package/dist/src/commands/install-ui/StatuslineConfig.d.ts.map +1 -1
- package/dist/src/commands/install-ui/StatuslineConfig.js +27 -5
- package/dist/src/commands/install-ui/StatuslineConfig.js.map +1 -1
- package/dist/src/commands/spec.d.ts.map +1 -1
- package/dist/src/commands/spec.js +7 -2
- package/dist/src/commands/spec.js.map +1 -1
- package/dist/src/hooks/__tests__/statusline-visual-test.d.ts +7 -0
- package/dist/src/hooks/__tests__/statusline-visual-test.d.ts.map +1 -0
- package/dist/src/hooks/__tests__/statusline-visual-test.js +236 -0
- package/dist/src/hooks/__tests__/statusline-visual-test.js.map +1 -0
- package/dist/src/hooks/constants.d.ts +92 -12
- package/dist/src/hooks/constants.d.ts.map +1 -1
- package/dist/src/hooks/constants.js +151 -16
- package/dist/src/hooks/constants.js.map +1 -1
- package/dist/src/hooks/guards/index.d.ts +2 -0
- package/dist/src/hooks/guards/index.d.ts.map +1 -1
- package/dist/src/hooks/guards/index.js +2 -0
- package/dist/src/hooks/guards/index.js.map +1 -1
- package/dist/src/hooks/guards/preflight-guard.d.ts +29 -0
- package/dist/src/hooks/guards/preflight-guard.d.ts.map +1 -0
- package/dist/src/hooks/guards/preflight-guard.js +95 -0
- package/dist/src/hooks/guards/preflight-guard.js.map +1 -0
- package/dist/src/hooks/guards/spec-validator.d.ts +25 -0
- package/dist/src/hooks/guards/spec-validator.d.ts.map +1 -0
- package/dist/src/hooks/guards/spec-validator.js +66 -0
- package/dist/src/hooks/guards/spec-validator.js.map +1 -0
- package/dist/src/hooks/index.d.ts +1 -0
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/index.js +1 -0
- package/dist/src/hooks/index.js.map +1 -1
- package/dist/src/hooks/keyword-spec-injector.d.ts +21 -0
- package/dist/src/hooks/keyword-spec-injector.d.ts.map +1 -0
- package/dist/src/hooks/keyword-spec-injector.js +96 -0
- package/dist/src/hooks/keyword-spec-injector.js.map +1 -0
- package/dist/src/hooks/plugins/spec-injection-plugin.d.ts +2 -1
- package/dist/src/hooks/plugins/spec-injection-plugin.d.ts.map +1 -1
- package/dist/src/hooks/plugins/spec-injection-plugin.js +21 -12
- package/dist/src/hooks/plugins/spec-injection-plugin.js.map +1 -1
- package/dist/src/hooks/preflight-core.d.ts +37 -0
- package/dist/src/hooks/preflight-core.d.ts.map +1 -0
- package/dist/src/hooks/preflight-core.js +86 -0
- package/dist/src/hooks/preflight-core.js.map +1 -0
- package/dist/src/hooks/spec-bridge.d.ts +40 -0
- package/dist/src/hooks/spec-bridge.d.ts.map +1 -0
- package/dist/src/hooks/spec-bridge.js +97 -0
- package/dist/src/hooks/spec-bridge.js.map +1 -0
- package/dist/src/hooks/spec-injector.d.ts.map +1 -1
- package/dist/src/hooks/spec-injector.js +18 -12
- package/dist/src/hooks/spec-injector.js.map +1 -1
- package/dist/src/hooks/statusline.d.ts +8 -17
- package/dist/src/hooks/statusline.d.ts.map +1 -1
- package/dist/src/hooks/statusline.js +269 -112
- package/dist/src/hooks/statusline.js.map +1 -1
- package/dist/src/i18n/locales/en.d.ts.map +1 -1
- package/dist/src/i18n/locales/en.js +5 -0
- package/dist/src/i18n/locales/en.js.map +1 -1
- package/dist/src/i18n/locales/zh.d.ts.map +1 -1
- package/dist/src/i18n/locales/zh.js +5 -0
- package/dist/src/i18n/locales/zh.js.map +1 -1
- package/dist/src/i18n/types.d.ts +5 -0
- package/dist/src/i18n/types.d.ts.map +1 -1
- package/dist/src/team/phase-orchestrator.d.ts +52 -0
- package/dist/src/team/phase-orchestrator.d.ts.map +1 -0
- package/dist/src/team/phase-orchestrator.js +165 -0
- package/dist/src/team/phase-orchestrator.js.map +1 -0
- package/dist/src/team/phase-types.d.ts +51 -0
- package/dist/src/team/phase-types.d.ts.map +1 -0
- package/dist/src/team/phase-types.js +41 -0
- package/dist/src/team/phase-types.js.map +1 -0
- package/dist/src/tools/collab-adapter.d.ts +17 -0
- package/dist/src/tools/collab-adapter.d.ts.map +1 -1
- package/dist/src/tools/collab-adapter.js +138 -0
- package/dist/src/tools/collab-adapter.js.map +1 -1
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +6 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/merge-validator.d.ts +24 -0
- package/dist/src/tools/merge-validator.d.ts.map +1 -0
- package/dist/src/tools/merge-validator.js +220 -0
- package/dist/src/tools/merge-validator.js.map +1 -0
- package/dist/src/tools/spec-entry-parser.d.ts +56 -0
- package/dist/src/tools/spec-entry-parser.d.ts.map +1 -0
- package/dist/src/tools/spec-entry-parser.js +196 -0
- package/dist/src/tools/spec-entry-parser.js.map +1 -0
- package/dist/src/tools/spec-init.d.ts.map +1 -1
- package/dist/src/tools/spec-init.js +66 -92
- package/dist/src/tools/spec-init.js.map +1 -1
- package/dist/src/tools/spec-keyword-index.d.ts +30 -0
- package/dist/src/tools/spec-keyword-index.d.ts.map +1 -0
- package/dist/src/tools/spec-keyword-index.js +101 -0
- package/dist/src/tools/spec-keyword-index.js.map +1 -0
- package/dist/src/tools/spec-loader.d.ts +3 -3
- package/dist/src/tools/spec-loader.d.ts.map +1 -1
- package/dist/src/tools/spec-loader.js +49 -23
- package/dist/src/tools/spec-loader.js.map +1 -1
- package/dist/src/tools/team-agents.d.ts +27 -0
- package/dist/src/tools/team-agents.d.ts.map +1 -0
- package/dist/src/tools/team-agents.js +362 -0
- package/dist/src/tools/team-agents.js.map +1 -0
- package/dist/src/tools/team-mailbox.d.ts +40 -0
- package/dist/src/tools/team-mailbox.d.ts.map +1 -0
- package/dist/src/tools/team-mailbox.js +384 -0
- package/dist/src/tools/team-mailbox.js.map +1 -0
- package/dist/src/tools/team-msg.d.ts +17 -8
- package/dist/src/tools/team-msg.d.ts.map +1 -1
- package/dist/src/tools/team-msg.js +110 -13
- package/dist/src/tools/team-msg.js.map +1 -1
- package/dist/src/tools/team-tasks-mcp.d.ts +27 -0
- package/dist/src/tools/team-tasks-mcp.d.ts.map +1 -0
- package/dist/src/tools/team-tasks-mcp.js +408 -0
- package/dist/src/tools/team-tasks-mcp.js.map +1 -0
- package/dist/src/types/index.d.ts +5 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/package.json +2 -1
- package/templates/cli/prompts/workflow-skill-conflict-patterns.txt +3 -3
- package/templates/cli/prompts/workflow-skill-lessons-learned.txt +3 -3
- package/templates/search-tools.md +1 -1
- package/workflows/analyze.md +816 -816
- package/workflows/brainstorm.md +471 -471
- package/workflows/cli-tools-usage.md +44 -27
- package/workflows/codebase-rebuild.md +332 -332
- package/workflows/codebase-refresh.md +240 -240
- package/workflows/delegate-usage.md +3 -3
- package/workflows/execute.md +1 -1
- package/workflows/harvest.md +420 -420
- package/workflows/integration-test.md +343 -343
- package/workflows/issue-analyze.md +6 -2
- package/workflows/issue-discover.md +414 -414
- package/workflows/issue-execute.md +6 -3
- package/workflows/issue-plan.md +5 -2
- package/workflows/maestro-coordinate.codex.md +281 -470
- package/workflows/maestro-coordinate.md +14 -14
- package/workflows/maestro-link-coordinate.md +2 -2
- package/workflows/maestro.codex.md +710 -0
- package/workflows/maestro.md +10 -11
- package/workflows/map.md +111 -111
- package/workflows/milestone-complete.md +176 -176
- package/workflows/plan.md +1 -1
- package/workflows/quick.md +497 -497
- package/workflows/refactor.md +300 -300
- package/workflows/retrospective.md +1 -1
- package/workflows/roadmap.md +335 -335
- package/workflows/spec-generate.md +640 -640
- package/workflows/specs-add.md +46 -81
- package/workflows/specs-load.md +15 -17
- package/workflows/specs-setup.md +40 -161
- package/.claude/commands/manage-issue-analyze.md +0 -62
- package/.claude/commands/manage-issue-execute.md +0 -73
- package/.claude/commands/manage-issue-plan.md +0 -62
- package/.codex/skills/manage-issue-analyze/SKILL.md +0 -207
- package/.codex/skills/manage-issue-execute/SKILL.md +0 -200
- package/.codex/skills/manage-issue-plan/SKILL.md +0 -186
package/workflows/roadmap.md
CHANGED
|
@@ -1,335 +1,335 @@
|
|
|
1
|
-
# Workflow: roadmap
|
|
2
|
-
|
|
3
|
-
Interactive roadmap creation with iterative refinement. Lightweight path from requirements to roadmap without full specification documents.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Worktree Guard
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
# Block in worktree
|
|
11
|
-
IF file_exists(".workflow/worktree-scope.json"):
|
|
12
|
-
ERROR "Cannot run maestro-roadmap inside a worktree. Run from the main worktree."
|
|
13
|
-
EXIT
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Step 1: Session Initialization
|
|
17
|
-
|
|
18
|
-
```javascript
|
|
19
|
-
const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()
|
|
20
|
-
|
|
21
|
-
// Parse flags
|
|
22
|
-
const autoYes = $ARGUMENTS.includes('--yes') || $ARGUMENTS.includes('-y')
|
|
23
|
-
const continueMode = $ARGUMENTS.includes('--continue') || $ARGUMENTS.includes('-c')
|
|
24
|
-
const modeMatch = $ARGUMENTS.match(/(?:--mode|-m)\s+(progressive|direct|auto)/)
|
|
25
|
-
const requestedMode = modeMatch ? modeMatch[1] : 'auto'
|
|
26
|
-
const brainstormMatch = $ARGUMENTS.match(/--from-brainstorm\s+(\S+)/)
|
|
27
|
-
|
|
28
|
-
// Clean requirement text
|
|
29
|
-
const requirement = $ARGUMENTS
|
|
30
|
-
.replace(/--yes|-y|--continue|-c|--mode\s+\w+|-m\s+\w+|--from-brainstorm\s+\S+/g, '')
|
|
31
|
-
.trim()
|
|
32
|
-
|
|
33
|
-
const slug = requirement.toLowerCase()
|
|
34
|
-
.replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-')
|
|
35
|
-
.substring(0, 40)
|
|
36
|
-
const dateStr = getUtc8ISOString().substring(0, 10)
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**Session directory**: `.workflow/.roadmap/RMAP-{slug}-{date}/`
|
|
40
|
-
|
|
41
|
-
**Continue mode**: If `-c` and session exists, resume from last state.
|
|
42
|
-
|
|
43
|
-
**Brainstorm import**: If `--from-brainstorm`, read `guidance-specification.md` for enriched context (problem statement, features, non-goals, terminology).
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## Step 1.5: Load Project Context
|
|
48
|
-
|
|
49
|
-
### 1.5.1: Load Specs
|
|
50
|
-
```
|
|
51
|
-
specs_content = maestro spec load --category
|
|
52
|
-
```
|
|
53
|
-
Ensure phases in Step 2 respect architectural constraints.
|
|
54
|
-
|
|
55
|
-
### 1.5.2: Load Project History (if `.workflow/` exists)
|
|
56
|
-
|
|
57
|
-
Read project artifacts to understand what has already been built and what carries forward:
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
IF .workflow/project.md exists:
|
|
61
|
-
Read project.md:
|
|
62
|
-
- "### Validated" section → already_shipped (completed features, DO NOT re-plan)
|
|
63
|
-
- "### Active" section → current_scope (features to plan for)
|
|
64
|
-
- "## Context" section → project_history (milestone summaries, prior work)
|
|
65
|
-
- "## Key Decisions" section → locked_decisions (constraints on new phases)
|
|
66
|
-
|
|
67
|
-
IF .workflow/state.json exists:
|
|
68
|
-
Read state.json.accumulated_context:
|
|
69
|
-
- deferred[] → candidate_requirements (explicitly pushed to this milestone)
|
|
70
|
-
- key_decisions[] → architectural_constraints
|
|
71
|
-
- blockers[] → known_risks
|
|
72
|
-
|
|
73
|
-
IF .workflow/codebase/ exists (from codebase-rebuild or codebase-refresh):
|
|
74
|
-
Read available codebase docs for feature inventory
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
**Context assembly** — pass to Step 2 as `project_context`:
|
|
78
|
-
```json
|
|
79
|
-
{
|
|
80
|
-
"already_shipped": ["REQ-001: User auth", "REQ-002: API layer"],
|
|
81
|
-
"current_scope": ["REQ-003: Payments", "REQ-004: i18n"],
|
|
82
|
-
"deferred_from_previous": ["Internationalization deferred from v1.0"],
|
|
83
|
-
"locked_decisions": ["JWT stateless auth", "PostgreSQL"],
|
|
84
|
-
"learnings": ["JWT has perf issues at scale — consider caching"],
|
|
85
|
-
"project_history": "Milestone v1.0 completed 2026-03-15: auth + API layer shipped"
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**Rules**:
|
|
90
|
-
- NEVER re-plan features listed in `already_shipped` — they are done
|
|
91
|
-
- `deferred_from_previous` items are HIGH PRIORITY candidates for new phases
|
|
92
|
-
- `locked_decisions` constrain technology choices in decomposition
|
|
93
|
-
- `learnings` inform risk assessment and phase sizing
|
|
94
|
-
|
|
95
|
-
---
|
|
96
|
-
|
|
97
|
-
## Step 2: Requirement Understanding & Strategy
|
|
98
|
-
|
|
99
|
-
**Objective**: Parse requirement, assess uncertainty, select decomposition strategy.
|
|
100
|
-
|
|
101
|
-
1. **Parse Requirement**
|
|
102
|
-
- Extract: goal, constraints, stakeholders, keywords
|
|
103
|
-
- If `--from-brainstorm`: enrich from guidance-specification.md
|
|
104
|
-
- If `project_context` loaded (Step 1.5.2): merge into requirement analysis
|
|
105
|
-
- Cross-reference requirement against `already_shipped` — flag overlaps as "already done"
|
|
106
|
-
- Promote `deferred_from_previous` items into active requirement scope
|
|
107
|
-
- Apply `locked_decisions` as constraints
|
|
108
|
-
|
|
109
|
-
2. **Codebase Exploration (conditional)**
|
|
110
|
-
- Detect if project has source files
|
|
111
|
-
- If yes: spawn `cli-explore-agent` for context discovery
|
|
112
|
-
- If `project_context.already_shipped` exists: include as "feature audit" directive —
|
|
113
|
-
agent should verify which shipped features are present in code and identify integration points for new work
|
|
114
|
-
- Output: relevant files, patterns, tech stack, feature_audit (existing capabilities mapped to shipped requirements)
|
|
115
|
-
|
|
116
|
-
3. **External Research — API & Technology Details (Optional)**
|
|
117
|
-
|
|
118
|
-
Spawn `workflow-external-researcher` agent when requirement mentions specific technologies, APIs, or external services.
|
|
119
|
-
|
|
120
|
-
**Trigger**: Technology keywords detected in requirement or codebase exploration found external dependencies. Auto-trigger in auto mode (`-y`). Skip if requirement is purely organizational.
|
|
121
|
-
|
|
122
|
-
```
|
|
123
|
-
// Extract technology keywords from requirement + codebase exploration
|
|
124
|
-
researchTopics = extract named technologies, APIs, frameworks, protocols
|
|
125
|
-
|
|
126
|
-
IF researchTopics is not empty:
|
|
127
|
-
Agent(
|
|
128
|
-
subagent_type="workflow-external-researcher",
|
|
129
|
-
prompt="""
|
|
130
|
-
<objective>
|
|
131
|
-
Research API details and technology specifics for: {requirement}
|
|
132
|
-
Mode: API Research
|
|
133
|
-
</objective>
|
|
134
|
-
|
|
135
|
-
<context>
|
|
136
|
-
Technologies identified: {researchTopics}
|
|
137
|
-
Codebase tech stack: {codebase_exploration.tech_stack or "none"}
|
|
138
|
-
</context>
|
|
139
|
-
|
|
140
|
-
<task>
|
|
141
|
-
For each identified technology/API:
|
|
142
|
-
1. Current stable version and key capabilities
|
|
143
|
-
2. Core API surface: key endpoints/methods, auth model
|
|
144
|
-
3. Integration patterns and recommended setup
|
|
145
|
-
4. Known limitations, breaking changes, or deprecations
|
|
146
|
-
5. Effort estimation signals (simple wrapper vs complex integration)
|
|
147
|
-
|
|
148
|
-
Focus on details that affect phase decomposition and dependency ordering.
|
|
149
|
-
Be prescriptive. Return structured markdown only — do NOT write files.
|
|
150
|
-
</task>
|
|
151
|
-
""",
|
|
152
|
-
run_in_background=false
|
|
153
|
-
)
|
|
154
|
-
apiResearchContext = agent_output
|
|
155
|
-
ELSE:
|
|
156
|
-
apiResearchContext = null
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
`apiResearchContext` is passed into:
|
|
160
|
-
- Step 3 (Decomposition): technology complexity informs phase sizing and ordering
|
|
161
|
-
- Step 4 (Refinement): API constraints surface realistic dependency chains
|
|
162
|
-
|
|
163
|
-
If research fails: `apiResearchContext = null`, continue without external context.
|
|
164
|
-
|
|
165
|
-
4. **Assess Uncertainty**
|
|
166
|
-
```
|
|
167
|
-
Factors: scope_clarity, technical_risk, dependency_unknown,
|
|
168
|
-
domain_familiarity, requirement_stability
|
|
169
|
-
Each: low | medium | high
|
|
170
|
-
≥3 high → progressive, ≥3 low → direct, else → ask
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
5. **Strategy Selection** (skip if `-m` specified or `-y`)
|
|
174
|
-
- Present uncertainty assessment
|
|
175
|
-
- User selects: Progressive or Direct
|
|
176
|
-
- `-y`: use recommended strategy
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## Step 3: Decomposition
|
|
181
|
-
|
|
182
|
-
**Objective**: Break requirement into phases via CLI-assisted analysis.
|
|
183
|
-
|
|
184
|
-
Spawn `cli-roadmap-plan-agent`.
|
|
185
|
-
If `apiResearchContext` is set: include as "External API Research" context in the agent prompt — technology complexity, API constraints, and integration effort inform phase sizing and dependency ordering.
|
|
186
|
-
|
|
187
|
-
### Minimum-Phase Principle (MANDATORY)
|
|
188
|
-
|
|
189
|
-
**Core rule: Phase = synchronization barrier.** Each Phase triggers a full plan→execute→verify→transition serial cycle. More phases = slower delivery. The wave DAG inside each Phase already handles task ordering and parallelism, so only create a new Phase when tasks **cannot** start until a previous Phase's entire output exists.
|
|
190
|
-
|
|
191
|
-
**Default: 1 Phase.** Put everything into a single Phase unless a hard dependency forces a split.
|
|
192
|
-
|
|
193
|
-
| Rule | Constraint |
|
|
194
|
-
|------|-----------|
|
|
195
|
-
| **Default** | **1 Phase**. All work in one plan→execute cycle; wave DAG handles internal ordering. |
|
|
196
|
-
| **Maximum** | **2 Phases**. Only when a hard dependency boundary exists that cannot be resolved. |
|
|
197
|
-
| **Exceptional** | **3 Phases**. Must explicitly justify why 2 is insufficient. |
|
|
198
|
-
| **Minimum tasks per phase** | 5 tasks. If a phase would have fewer, merge it into an adjacent phase. |
|
|
199
|
-
| **Merge principle** | Same-module, same-concern, or tightly-coupled work belongs in ONE phase. Infra + core logic + API in one phase is fine. |
|
|
200
|
-
| **Split principle** | Only split when ALL three hard-dependency conditions are met (see below). |
|
|
201
|
-
|
|
202
|
-
**Hard dependency — all three conditions required to justify a Phase split:**
|
|
203
|
-
1. **Runtime dependency**: Phase B code at runtime MUST call Phase A's real output (cannot mock/stub).
|
|
204
|
-
2. **Not parallelizable**: A and B cannot develop concurrently via contract/interface/type agreement.
|
|
205
|
-
3. **Full barrier**: ALL of Phase A's tasks must complete before ANY of Phase B's tasks can start.
|
|
206
|
-
|
|
207
|
-
If only 1-2 conditions are met → keep in the same Phase, use wave dependencies instead.
|
|
208
|
-
|
|
209
|
-
**Phase sizing checklist (applied after decomposition, before presenting to user):**
|
|
210
|
-
1. Count total phases. If > 2 → justify each split against the 3 hard-dependency conditions, merge if unjustified.
|
|
211
|
-
2. Count estimated tasks per phase. Any phase < 5 tasks → merge into neighbor.
|
|
212
|
-
3. Verify each phase has a meaningful deliverable boundary (not just "setup" or "cleanup").
|
|
213
|
-
|
|
214
|
-
**Scope escalation:**
|
|
215
|
-
- **Single project** (any size): 1-2 Phases. Use wave DAG for internal parallelism.
|
|
216
|
-
- **Large scope** (monorepo with 2+ independently deployable services): Use **Milestones** to divide scope. Each Milestone follows the 1-2 Phase limit independently.
|
|
217
|
-
|
|
218
|
-
**Progressive mode**:
|
|
219
|
-
- Progressive layers (MVP → Usable → Refined) map to **Milestones**, not Phases.
|
|
220
|
-
- Each Milestone contains 1-2 Phases following the minimum-phase principle.
|
|
221
|
-
- MVP must be self-contained (no external dependencies)
|
|
222
|
-
- Each feature in exactly ONE milestone (no overlap)
|
|
223
|
-
|
|
224
|
-
**Direct mode**:
|
|
225
|
-
- Topologically-sorted task sequence
|
|
226
|
-
- Each task: title, type, scope, inputs, outputs, convergence, depends_on
|
|
227
|
-
- parallel_group for truly independent tasks
|
|
228
|
-
|
|
229
|
-
**Phase format** (both modes):
|
|
230
|
-
```markdown
|
|
231
|
-
### Phase {N}: {Title}
|
|
232
|
-
- **Goal**: <what this phase achieves>
|
|
233
|
-
- **Depends on**: <prerequisite phases or "Nothing">
|
|
234
|
-
- **Requirements**: <REQ-IDs mapped from project.md Active requirements>
|
|
235
|
-
- **Success Criteria** (what must be TRUE):
|
|
236
|
-
1. <observable behavior from user perspective>
|
|
237
|
-
2. <observable behavior from user perspective>
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
Phase numbering: integers (1, 2, 3) for planned work, decimals (2.1, 2.2) for inserted phases.
|
|
241
|
-
Decimal phases count toward the total phase limit.
|
|
242
|
-
Phase directories use `{NN}-{slug}` format (e.g., `01-auth`, `02-api`).
|
|
243
|
-
|
|
244
|
-
**Requirements traceability**: Every Active requirement from project.md MUST appear in exactly one phase's Requirements field. If a requirement maps to no phase, surface it as a gap.
|
|
245
|
-
|
|
246
|
-
---
|
|
247
|
-
|
|
248
|
-
## Step 4: Iterative Refinement
|
|
249
|
-
|
|
250
|
-
**Objective**: Multi-round user feedback to refine roadmap.
|
|
251
|
-
|
|
252
|
-
1. **Present Roadmap**
|
|
253
|
-
- Phase count, milestone structure, dependency graph
|
|
254
|
-
- Key success criteria per phase
|
|
255
|
-
|
|
256
|
-
2. **Gather Feedback** (skip if `-y` or `config.gates.confirm_roadmap == false`)
|
|
257
|
-
- Options: Approve / Adjust Scope / Reorder / Split-Merge / Re-decompose
|
|
258
|
-
- Max 5 rounds
|
|
259
|
-
|
|
260
|
-
3. **Process Feedback**
|
|
261
|
-
- **Approve**: Run minimum-phase checklist (Step 3 rules) before accepting. If violations found, auto-merge and inform user.
|
|
262
|
-
- **Adjust Scope**: Move features between milestones, modify criteria
|
|
263
|
-
- **Reorder**: Change phase sequencing
|
|
264
|
-
- **Split/Merge**: Break large phases or combine small ones (enforce min 5 tasks, max 2 phases)
|
|
265
|
-
- **Re-decompose**: Return to Step 3 with new strategy
|
|
266
|
-
|
|
267
|
-
4. **Loop** until approved or max rounds reached
|
|
268
|
-
|
|
269
|
-
---
|
|
270
|
-
|
|
271
|
-
## Step 5: Write Outputs
|
|
272
|
-
|
|
273
|
-
1. **Write roadmap.md** to `.workflow/roadmap.md` using @templates/roadmap.md:
|
|
274
|
-
```markdown
|
|
275
|
-
# Roadmap: {project_name}
|
|
276
|
-
|
|
277
|
-
## Overview
|
|
278
|
-
<one paragraph describing the journey>
|
|
279
|
-
|
|
280
|
-
## Phases
|
|
281
|
-
- [ ] **Phase 1: {Title}** - {one-line description}
|
|
282
|
-
- [ ] **Phase 2: {Title}** - {one-line description}
|
|
283
|
-
|
|
284
|
-
## Phase Details
|
|
285
|
-
|
|
286
|
-
### Phase 1: {Title}
|
|
287
|
-
**Goal**: {what this phase delivers}
|
|
288
|
-
**Depends on**: Nothing (first phase)
|
|
289
|
-
**Requirements**: {REQ-IDs from project.md Active requirements}
|
|
290
|
-
**Success Criteria** (what must be TRUE):
|
|
291
|
-
1. {observable behavior from user perspective}
|
|
292
|
-
2. {observable behavior from user perspective}
|
|
293
|
-
|
|
294
|
-
### Phase 2: {Title}
|
|
295
|
-
**Goal**: {what this phase delivers}
|
|
296
|
-
**Depends on**: Phase 1
|
|
297
|
-
**Requirements**: {REQ-IDs}
|
|
298
|
-
**Success Criteria** (what must be TRUE):
|
|
299
|
-
1. {observable behavior}
|
|
300
|
-
|
|
301
|
-
## Scope Decisions
|
|
302
|
-
- In scope: <included>
|
|
303
|
-
- Deferred: <later milestones>
|
|
304
|
-
- Out of scope: <excluded>
|
|
305
|
-
|
|
306
|
-
## Progress
|
|
307
|
-
| Phase | Status | Completed |
|
|
308
|
-
|-------|--------|-----------|
|
|
309
|
-
| 1. {Title} | Not started | - |
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
**Requirements traceability**: Cross-check that every Active requirement from project.md maps to exactly one phase. Surface unmapped requirements as gaps.
|
|
313
|
-
|
|
314
|
-
2. **Ensure scratch directory**: `mkdir -p .workflow/scratch/`
|
|
315
|
-
|
|
316
|
-
3. **Update state.json** (if exists): set milestones from roadmap, set `current_milestone` to first milestone
|
|
317
|
-
|
|
318
|
-
---
|
|
319
|
-
|
|
320
|
-
## Step 6: Handoff
|
|
321
|
-
|
|
322
|
-
Display summary and offer next steps:
|
|
323
|
-
|
|
324
|
-
```
|
|
325
|
-
=== ROADMAP CREATED ===
|
|
326
|
-
Strategy: {progressive|direct}
|
|
327
|
-
Phases: {phase_count} across {milestone_count} milestones
|
|
328
|
-
Roadmap: .workflow/roadmap.md
|
|
329
|
-
|
|
330
|
-
Next steps:
|
|
331
|
-
Skill({ skill: "maestro-init" }) -- Set up project (if not yet initialized)
|
|
332
|
-
Skill({ skill: "maestro-plan", args: "1" }) -- Plan first phase
|
|
333
|
-
Skill({ skill: "maestro-brainstorm", args: "1" }) -- Explore first phase ideas
|
|
334
|
-
Skill({ skill: "manage-status" }) -- View project dashboard
|
|
335
|
-
```
|
|
1
|
+
# Workflow: roadmap
|
|
2
|
+
|
|
3
|
+
Interactive roadmap creation with iterative refinement. Lightweight path from requirements to roadmap without full specification documents.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Worktree Guard
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
# Block in worktree
|
|
11
|
+
IF file_exists(".workflow/worktree-scope.json"):
|
|
12
|
+
ERROR "Cannot run maestro-roadmap inside a worktree. Run from the main worktree."
|
|
13
|
+
EXIT
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Step 1: Session Initialization
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()
|
|
20
|
+
|
|
21
|
+
// Parse flags
|
|
22
|
+
const autoYes = $ARGUMENTS.includes('--yes') || $ARGUMENTS.includes('-y')
|
|
23
|
+
const continueMode = $ARGUMENTS.includes('--continue') || $ARGUMENTS.includes('-c')
|
|
24
|
+
const modeMatch = $ARGUMENTS.match(/(?:--mode|-m)\s+(progressive|direct|auto)/)
|
|
25
|
+
const requestedMode = modeMatch ? modeMatch[1] : 'auto'
|
|
26
|
+
const brainstormMatch = $ARGUMENTS.match(/--from-brainstorm\s+(\S+)/)
|
|
27
|
+
|
|
28
|
+
// Clean requirement text
|
|
29
|
+
const requirement = $ARGUMENTS
|
|
30
|
+
.replace(/--yes|-y|--continue|-c|--mode\s+\w+|-m\s+\w+|--from-brainstorm\s+\S+/g, '')
|
|
31
|
+
.trim()
|
|
32
|
+
|
|
33
|
+
const slug = requirement.toLowerCase()
|
|
34
|
+
.replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-')
|
|
35
|
+
.substring(0, 40)
|
|
36
|
+
const dateStr = getUtc8ISOString().substring(0, 10)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Session directory**: `.workflow/.roadmap/RMAP-{slug}-{date}/`
|
|
40
|
+
|
|
41
|
+
**Continue mode**: If `-c` and session exists, resume from last state.
|
|
42
|
+
|
|
43
|
+
**Brainstorm import**: If `--from-brainstorm`, read `guidance-specification.md` for enriched context (problem statement, features, non-goals, terminology).
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Step 1.5: Load Project Context
|
|
48
|
+
|
|
49
|
+
### 1.5.1: Load Specs
|
|
50
|
+
```
|
|
51
|
+
specs_content = maestro spec load --category arch
|
|
52
|
+
```
|
|
53
|
+
Ensure phases in Step 2 respect architectural constraints.
|
|
54
|
+
|
|
55
|
+
### 1.5.2: Load Project History (if `.workflow/` exists)
|
|
56
|
+
|
|
57
|
+
Read project artifacts to understand what has already been built and what carries forward:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
IF .workflow/project.md exists:
|
|
61
|
+
Read project.md:
|
|
62
|
+
- "### Validated" section → already_shipped (completed features, DO NOT re-plan)
|
|
63
|
+
- "### Active" section → current_scope (features to plan for)
|
|
64
|
+
- "## Context" section → project_history (milestone summaries, prior work)
|
|
65
|
+
- "## Key Decisions" section → locked_decisions (constraints on new phases)
|
|
66
|
+
|
|
67
|
+
IF .workflow/state.json exists:
|
|
68
|
+
Read state.json.accumulated_context:
|
|
69
|
+
- deferred[] → candidate_requirements (explicitly pushed to this milestone)
|
|
70
|
+
- key_decisions[] → architectural_constraints
|
|
71
|
+
- blockers[] → known_risks
|
|
72
|
+
|
|
73
|
+
IF .workflow/codebase/ exists (from codebase-rebuild or codebase-refresh):
|
|
74
|
+
Read available codebase docs for feature inventory
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Context assembly** — pass to Step 2 as `project_context`:
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"already_shipped": ["REQ-001: User auth", "REQ-002: API layer"],
|
|
81
|
+
"current_scope": ["REQ-003: Payments", "REQ-004: i18n"],
|
|
82
|
+
"deferred_from_previous": ["Internationalization deferred from v1.0"],
|
|
83
|
+
"locked_decisions": ["JWT stateless auth", "PostgreSQL"],
|
|
84
|
+
"learnings": ["JWT has perf issues at scale — consider caching"],
|
|
85
|
+
"project_history": "Milestone v1.0 completed 2026-03-15: auth + API layer shipped"
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Rules**:
|
|
90
|
+
- NEVER re-plan features listed in `already_shipped` — they are done
|
|
91
|
+
- `deferred_from_previous` items are HIGH PRIORITY candidates for new phases
|
|
92
|
+
- `locked_decisions` constrain technology choices in decomposition
|
|
93
|
+
- `learnings` inform risk assessment and phase sizing
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Step 2: Requirement Understanding & Strategy
|
|
98
|
+
|
|
99
|
+
**Objective**: Parse requirement, assess uncertainty, select decomposition strategy.
|
|
100
|
+
|
|
101
|
+
1. **Parse Requirement**
|
|
102
|
+
- Extract: goal, constraints, stakeholders, keywords
|
|
103
|
+
- If `--from-brainstorm`: enrich from guidance-specification.md
|
|
104
|
+
- If `project_context` loaded (Step 1.5.2): merge into requirement analysis
|
|
105
|
+
- Cross-reference requirement against `already_shipped` — flag overlaps as "already done"
|
|
106
|
+
- Promote `deferred_from_previous` items into active requirement scope
|
|
107
|
+
- Apply `locked_decisions` as constraints
|
|
108
|
+
|
|
109
|
+
2. **Codebase Exploration (conditional)**
|
|
110
|
+
- Detect if project has source files
|
|
111
|
+
- If yes: spawn `cli-explore-agent` for context discovery
|
|
112
|
+
- If `project_context.already_shipped` exists: include as "feature audit" directive —
|
|
113
|
+
agent should verify which shipped features are present in code and identify integration points for new work
|
|
114
|
+
- Output: relevant files, patterns, tech stack, feature_audit (existing capabilities mapped to shipped requirements)
|
|
115
|
+
|
|
116
|
+
3. **External Research — API & Technology Details (Optional)**
|
|
117
|
+
|
|
118
|
+
Spawn `workflow-external-researcher` agent when requirement mentions specific technologies, APIs, or external services.
|
|
119
|
+
|
|
120
|
+
**Trigger**: Technology keywords detected in requirement or codebase exploration found external dependencies. Auto-trigger in auto mode (`-y`). Skip if requirement is purely organizational.
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
// Extract technology keywords from requirement + codebase exploration
|
|
124
|
+
researchTopics = extract named technologies, APIs, frameworks, protocols
|
|
125
|
+
|
|
126
|
+
IF researchTopics is not empty:
|
|
127
|
+
Agent(
|
|
128
|
+
subagent_type="workflow-external-researcher",
|
|
129
|
+
prompt="""
|
|
130
|
+
<objective>
|
|
131
|
+
Research API details and technology specifics for: {requirement}
|
|
132
|
+
Mode: API Research
|
|
133
|
+
</objective>
|
|
134
|
+
|
|
135
|
+
<context>
|
|
136
|
+
Technologies identified: {researchTopics}
|
|
137
|
+
Codebase tech stack: {codebase_exploration.tech_stack or "none"}
|
|
138
|
+
</context>
|
|
139
|
+
|
|
140
|
+
<task>
|
|
141
|
+
For each identified technology/API:
|
|
142
|
+
1. Current stable version and key capabilities
|
|
143
|
+
2. Core API surface: key endpoints/methods, auth model
|
|
144
|
+
3. Integration patterns and recommended setup
|
|
145
|
+
4. Known limitations, breaking changes, or deprecations
|
|
146
|
+
5. Effort estimation signals (simple wrapper vs complex integration)
|
|
147
|
+
|
|
148
|
+
Focus on details that affect phase decomposition and dependency ordering.
|
|
149
|
+
Be prescriptive. Return structured markdown only — do NOT write files.
|
|
150
|
+
</task>
|
|
151
|
+
""",
|
|
152
|
+
run_in_background=false
|
|
153
|
+
)
|
|
154
|
+
apiResearchContext = agent_output
|
|
155
|
+
ELSE:
|
|
156
|
+
apiResearchContext = null
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
`apiResearchContext` is passed into:
|
|
160
|
+
- Step 3 (Decomposition): technology complexity informs phase sizing and ordering
|
|
161
|
+
- Step 4 (Refinement): API constraints surface realistic dependency chains
|
|
162
|
+
|
|
163
|
+
If research fails: `apiResearchContext = null`, continue without external context.
|
|
164
|
+
|
|
165
|
+
4. **Assess Uncertainty**
|
|
166
|
+
```
|
|
167
|
+
Factors: scope_clarity, technical_risk, dependency_unknown,
|
|
168
|
+
domain_familiarity, requirement_stability
|
|
169
|
+
Each: low | medium | high
|
|
170
|
+
≥3 high → progressive, ≥3 low → direct, else → ask
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
5. **Strategy Selection** (skip if `-m` specified or `-y`)
|
|
174
|
+
- Present uncertainty assessment
|
|
175
|
+
- User selects: Progressive or Direct
|
|
176
|
+
- `-y`: use recommended strategy
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Step 3: Decomposition
|
|
181
|
+
|
|
182
|
+
**Objective**: Break requirement into phases via CLI-assisted analysis.
|
|
183
|
+
|
|
184
|
+
Spawn `cli-roadmap-plan-agent`.
|
|
185
|
+
If `apiResearchContext` is set: include as "External API Research" context in the agent prompt — technology complexity, API constraints, and integration effort inform phase sizing and dependency ordering.
|
|
186
|
+
|
|
187
|
+
### Minimum-Phase Principle (MANDATORY)
|
|
188
|
+
|
|
189
|
+
**Core rule: Phase = synchronization barrier.** Each Phase triggers a full plan→execute→verify→transition serial cycle. More phases = slower delivery. The wave DAG inside each Phase already handles task ordering and parallelism, so only create a new Phase when tasks **cannot** start until a previous Phase's entire output exists.
|
|
190
|
+
|
|
191
|
+
**Default: 1 Phase.** Put everything into a single Phase unless a hard dependency forces a split.
|
|
192
|
+
|
|
193
|
+
| Rule | Constraint |
|
|
194
|
+
|------|-----------|
|
|
195
|
+
| **Default** | **1 Phase**. All work in one plan→execute cycle; wave DAG handles internal ordering. |
|
|
196
|
+
| **Maximum** | **2 Phases**. Only when a hard dependency boundary exists that cannot be resolved. |
|
|
197
|
+
| **Exceptional** | **3 Phases**. Must explicitly justify why 2 is insufficient. |
|
|
198
|
+
| **Minimum tasks per phase** | 5 tasks. If a phase would have fewer, merge it into an adjacent phase. |
|
|
199
|
+
| **Merge principle** | Same-module, same-concern, or tightly-coupled work belongs in ONE phase. Infra + core logic + API in one phase is fine. |
|
|
200
|
+
| **Split principle** | Only split when ALL three hard-dependency conditions are met (see below). |
|
|
201
|
+
|
|
202
|
+
**Hard dependency — all three conditions required to justify a Phase split:**
|
|
203
|
+
1. **Runtime dependency**: Phase B code at runtime MUST call Phase A's real output (cannot mock/stub).
|
|
204
|
+
2. **Not parallelizable**: A and B cannot develop concurrently via contract/interface/type agreement.
|
|
205
|
+
3. **Full barrier**: ALL of Phase A's tasks must complete before ANY of Phase B's tasks can start.
|
|
206
|
+
|
|
207
|
+
If only 1-2 conditions are met → keep in the same Phase, use wave dependencies instead.
|
|
208
|
+
|
|
209
|
+
**Phase sizing checklist (applied after decomposition, before presenting to user):**
|
|
210
|
+
1. Count total phases. If > 2 → justify each split against the 3 hard-dependency conditions, merge if unjustified.
|
|
211
|
+
2. Count estimated tasks per phase. Any phase < 5 tasks → merge into neighbor.
|
|
212
|
+
3. Verify each phase has a meaningful deliverable boundary (not just "setup" or "cleanup").
|
|
213
|
+
|
|
214
|
+
**Scope escalation:**
|
|
215
|
+
- **Single project** (any size): 1-2 Phases. Use wave DAG for internal parallelism.
|
|
216
|
+
- **Large scope** (monorepo with 2+ independently deployable services): Use **Milestones** to divide scope. Each Milestone follows the 1-2 Phase limit independently.
|
|
217
|
+
|
|
218
|
+
**Progressive mode**:
|
|
219
|
+
- Progressive layers (MVP → Usable → Refined) map to **Milestones**, not Phases.
|
|
220
|
+
- Each Milestone contains 1-2 Phases following the minimum-phase principle.
|
|
221
|
+
- MVP must be self-contained (no external dependencies)
|
|
222
|
+
- Each feature in exactly ONE milestone (no overlap)
|
|
223
|
+
|
|
224
|
+
**Direct mode**:
|
|
225
|
+
- Topologically-sorted task sequence
|
|
226
|
+
- Each task: title, type, scope, inputs, outputs, convergence, depends_on
|
|
227
|
+
- parallel_group for truly independent tasks
|
|
228
|
+
|
|
229
|
+
**Phase format** (both modes):
|
|
230
|
+
```markdown
|
|
231
|
+
### Phase {N}: {Title}
|
|
232
|
+
- **Goal**: <what this phase achieves>
|
|
233
|
+
- **Depends on**: <prerequisite phases or "Nothing">
|
|
234
|
+
- **Requirements**: <REQ-IDs mapped from project.md Active requirements>
|
|
235
|
+
- **Success Criteria** (what must be TRUE):
|
|
236
|
+
1. <observable behavior from user perspective>
|
|
237
|
+
2. <observable behavior from user perspective>
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Phase numbering: integers (1, 2, 3) for planned work, decimals (2.1, 2.2) for inserted phases.
|
|
241
|
+
Decimal phases count toward the total phase limit.
|
|
242
|
+
Phase directories use `{NN}-{slug}` format (e.g., `01-auth`, `02-api`).
|
|
243
|
+
|
|
244
|
+
**Requirements traceability**: Every Active requirement from project.md MUST appear in exactly one phase's Requirements field. If a requirement maps to no phase, surface it as a gap.
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## Step 4: Iterative Refinement
|
|
249
|
+
|
|
250
|
+
**Objective**: Multi-round user feedback to refine roadmap.
|
|
251
|
+
|
|
252
|
+
1. **Present Roadmap**
|
|
253
|
+
- Phase count, milestone structure, dependency graph
|
|
254
|
+
- Key success criteria per phase
|
|
255
|
+
|
|
256
|
+
2. **Gather Feedback** (skip if `-y` or `config.gates.confirm_roadmap == false`)
|
|
257
|
+
- Options: Approve / Adjust Scope / Reorder / Split-Merge / Re-decompose
|
|
258
|
+
- Max 5 rounds
|
|
259
|
+
|
|
260
|
+
3. **Process Feedback**
|
|
261
|
+
- **Approve**: Run minimum-phase checklist (Step 3 rules) before accepting. If violations found, auto-merge and inform user.
|
|
262
|
+
- **Adjust Scope**: Move features between milestones, modify criteria
|
|
263
|
+
- **Reorder**: Change phase sequencing
|
|
264
|
+
- **Split/Merge**: Break large phases or combine small ones (enforce min 5 tasks, max 2 phases)
|
|
265
|
+
- **Re-decompose**: Return to Step 3 with new strategy
|
|
266
|
+
|
|
267
|
+
4. **Loop** until approved or max rounds reached
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Step 5: Write Outputs
|
|
272
|
+
|
|
273
|
+
1. **Write roadmap.md** to `.workflow/roadmap.md` using @templates/roadmap.md:
|
|
274
|
+
```markdown
|
|
275
|
+
# Roadmap: {project_name}
|
|
276
|
+
|
|
277
|
+
## Overview
|
|
278
|
+
<one paragraph describing the journey>
|
|
279
|
+
|
|
280
|
+
## Phases
|
|
281
|
+
- [ ] **Phase 1: {Title}** - {one-line description}
|
|
282
|
+
- [ ] **Phase 2: {Title}** - {one-line description}
|
|
283
|
+
|
|
284
|
+
## Phase Details
|
|
285
|
+
|
|
286
|
+
### Phase 1: {Title}
|
|
287
|
+
**Goal**: {what this phase delivers}
|
|
288
|
+
**Depends on**: Nothing (first phase)
|
|
289
|
+
**Requirements**: {REQ-IDs from project.md Active requirements}
|
|
290
|
+
**Success Criteria** (what must be TRUE):
|
|
291
|
+
1. {observable behavior from user perspective}
|
|
292
|
+
2. {observable behavior from user perspective}
|
|
293
|
+
|
|
294
|
+
### Phase 2: {Title}
|
|
295
|
+
**Goal**: {what this phase delivers}
|
|
296
|
+
**Depends on**: Phase 1
|
|
297
|
+
**Requirements**: {REQ-IDs}
|
|
298
|
+
**Success Criteria** (what must be TRUE):
|
|
299
|
+
1. {observable behavior}
|
|
300
|
+
|
|
301
|
+
## Scope Decisions
|
|
302
|
+
- In scope: <included>
|
|
303
|
+
- Deferred: <later milestones>
|
|
304
|
+
- Out of scope: <excluded>
|
|
305
|
+
|
|
306
|
+
## Progress
|
|
307
|
+
| Phase | Status | Completed |
|
|
308
|
+
|-------|--------|-----------|
|
|
309
|
+
| 1. {Title} | Not started | - |
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**Requirements traceability**: Cross-check that every Active requirement from project.md maps to exactly one phase. Surface unmapped requirements as gaps.
|
|
313
|
+
|
|
314
|
+
2. **Ensure scratch directory**: `mkdir -p .workflow/scratch/`
|
|
315
|
+
|
|
316
|
+
3. **Update state.json** (if exists): set milestones from roadmap, set `current_milestone` to first milestone
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Step 6: Handoff
|
|
321
|
+
|
|
322
|
+
Display summary and offer next steps:
|
|
323
|
+
|
|
324
|
+
```
|
|
325
|
+
=== ROADMAP CREATED ===
|
|
326
|
+
Strategy: {progressive|direct}
|
|
327
|
+
Phases: {phase_count} across {milestone_count} milestones
|
|
328
|
+
Roadmap: .workflow/roadmap.md
|
|
329
|
+
|
|
330
|
+
Next steps:
|
|
331
|
+
Skill({ skill: "maestro-init" }) -- Set up project (if not yet initialized)
|
|
332
|
+
Skill({ skill: "maestro-plan", args: "1" }) -- Plan first phase
|
|
333
|
+
Skill({ skill: "maestro-brainstorm", args: "1" }) -- Explore first phase ideas
|
|
334
|
+
Skill({ skill: "manage-status" }) -- View project dashboard
|
|
335
|
+
```
|