maestro-flow 0.3.7 → 0.3.9
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/commands/learn-decompose.md +3 -3
- package/.claude/commands/learn-follow.md +5 -5
- package/.claude/commands/learn-investigate.md +3 -3
- package/.claude/commands/learn-retro.md +303 -0
- package/.claude/commands/learn-second-opinion.md +3 -3
- package/.claude/commands/maestro-analyze.md +123 -99
- package/.claude/commands/maestro-brainstorm.md +2 -2
- package/.claude/commands/maestro-execute.md +137 -96
- package/.claude/commands/maestro-fork.md +111 -0
- package/.claude/commands/maestro-init.md +6 -6
- package/.claude/commands/maestro-learn.md +74 -298
- package/.claude/commands/maestro-merge.md +77 -0
- package/.claude/commands/maestro-milestone-audit.md +72 -60
- package/.claude/commands/maestro-milestone-complete.md +67 -59
- package/.claude/commands/maestro-milestone-release.md +6 -6
- package/.claude/commands/maestro-plan.md +151 -130
- package/.claude/commands/maestro-quick.md +4 -4
- package/.claude/commands/maestro-roadmap.md +5 -5
- package/.claude/commands/maestro-spec-generate.md +5 -5
- package/.claude/commands/maestro-ui-design.md +3 -3
- package/.claude/commands/maestro-verify.md +106 -87
- package/.claude/commands/maestro.md +10 -4
- package/.claude/commands/manage-codebase-rebuild.md +4 -4
- package/.claude/commands/manage-codebase-refresh.md +1 -1
- package/.claude/commands/manage-harvest.md +5 -5
- package/.claude/commands/manage-issue-discover.md +1 -1
- package/.claude/commands/manage-issue-execute.md +6 -6
- package/.claude/commands/manage-issue.md +6 -6
- package/.claude/commands/manage-learn.md +23 -17
- package/.claude/commands/manage-memory-capture.md +15 -17
- package/.claude/commands/manage-memory.md +3 -3
- package/.claude/commands/manage-status.md +24 -24
- package/.claude/commands/quality-business-test.md +5 -5
- package/.claude/commands/quality-debug.md +4 -4
- package/.claude/commands/quality-integration-test.md +4 -4
- package/.claude/commands/quality-refactor.md +3 -3
- package/.claude/commands/quality-retrospective.md +7 -7
- package/.claude/commands/quality-review.md +4 -4
- package/.claude/commands/quality-sync.md +3 -3
- package/.claude/commands/quality-test-gen.md +4 -4
- package/.claude/commands/quality-test.md +9 -9
- package/.claude/commands/spec-add.md +2 -2
- package/.claude/commands/spec-load.md +8 -3
- package/.claude/commands/spec-setup.md +5 -5
- package/.claude/commands/wiki-connect.md +3 -3
- package/.claude/commands/wiki-digest.md +30 -5
- package/.codex/skills/maestro-analyze/SKILL.md +52 -14
- package/.codex/skills/maestro-execute/SKILL.md +27 -26
- package/.codex/skills/maestro-milestone-audit/SKILL.md +103 -209
- package/.codex/skills/maestro-milestone-complete/SKILL.md +149 -158
- package/.codex/skills/maestro-plan/SKILL.md +47 -17
- package/.codex/skills/maestro-roadmap/SKILL.md +3 -2
- package/.codex/skills/team-coordinate/roles/coordinator/commands/monitor.md +2 -2
- package/.codex/skills/team-executor/roles/executor/commands/monitor.md +1 -1
- package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +2 -2
- package/.codex/skills/team-lifecycle-v4/specs/knowledge-transfer.md +2 -2
- package/.codex/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +1 -1
- package/.codex/skills/team-review/roles/coordinator/commands/monitor.md +1 -1
- package/.codex/skills/team-tech-debt/roles/coordinator/commands/monitor.md +1 -1
- package/.codex/skills/team-testing/roles/coordinator/commands/monitor.md +1 -1
- package/README.md +115 -227
- package/README.zh-CN.md +169 -187
- package/bin/maestro-mcp.js +1 -1
- package/chains/_intent-map.json +21 -9
- package/chains/_router.json +30 -77
- package/chains/brainstorm-driven.json +17 -6
- package/chains/full-lifecycle.json +22 -23
- package/chains/milestone-close.json +20 -7
- package/chains/milestone-fork-merge.json +50 -0
- package/chains/roadmap-driven.json +17 -6
- package/chains/spec-driven.json +17 -6
- package/dashboard/dist/assets/{ArtifactsPage-A9yzYtpj.js → ArtifactsPage-DZNCi6tn.js} +12 -7
- package/dashboard/dist/assets/ChatInput-Bvr-FeEq.js +49 -0
- package/dashboard/dist/assets/ChatPage-D9zTkJZo.js +22 -0
- package/dashboard/dist/assets/CollabPage-B4NAHXS2.js +1 -0
- package/dashboard/dist/assets/ExecutionPanel-CFt4LJyq.js +1 -0
- package/dashboard/dist/assets/KanbanPage-C8USth6H.js +21 -0
- package/dashboard/dist/assets/{MarkdownRenderer-CCXHaut3.js → MarkdownRenderer-X4af_WNb.js} +1 -1
- package/dashboard/dist/assets/McpPage-BKfCVIyU.js +21 -0
- package/dashboard/dist/assets/OutputPanel-BlBQFJSW.js +1 -0
- package/dashboard/dist/assets/ProblemsPanel-De3DLvoI.js +1 -0
- package/dashboard/dist/assets/{RequirementBoardPage-CEOvppGn.js → RequirementBoardPage-Bf1trzqs.js} +2 -2
- package/dashboard/dist/assets/{RequirementPage-DpnbTEqY.js → RequirementPage-Bllxe2XI.js} +10 -5
- package/dashboard/dist/assets/{SpecsPage-CYqOfFkB.js → SpecsPage-9lwxKT27.js} +2 -2
- package/dashboard/dist/assets/{SupervisorPage-B2sZwkq8.js → SupervisorPage-SusdfHFq.js} +1 -1
- package/dashboard/dist/assets/{TeamsPage-CkZdCAVZ.js → TeamsPage-DsuM6OwC.js} +2 -2
- package/dashboard/dist/assets/TreeBrowser-Q12qobZs.js +6 -0
- package/dashboard/dist/assets/WorkflowPage-D_Fzdy3_.js +6 -0
- package/dashboard/dist/assets/{arrow-left-6fktHyjN.js → arrow-left-Bqtb2hle.js} +1 -1
- package/dashboard/dist/assets/{check-Cbxq2l1-.js → check-u6fGOwQO.js} +1 -1
- package/dashboard/dist/assets/{chevron-right-Yts3bi8p.js → chevron-right-Csu22t58.js} +1 -1
- package/dashboard/dist/assets/{circle-4Ci4Xolf.js → circle-CMrkbRNg.js} +1 -1
- package/dashboard/dist/assets/{circle-alert-B25g9BTL.js → circle-alert-c3tH1P4z.js} +1 -1
- package/dashboard/dist/assets/{circle-check-big-DzO2BlL7.js → circle-check-big-TDSeWstm.js} +1 -1
- package/dashboard/dist/assets/{circle-check-BA5_XqeV.js → circle-check-gYxxSYuH.js} +1 -1
- package/dashboard/dist/assets/{code-zxwuybO8.js → code-CFN2uX9V.js} +1 -1
- package/dashboard/dist/assets/{columns-3-DV4oeCfU.js → columns-3-38xIDlzy.js} +1 -1
- package/dashboard/dist/assets/{download-CXCyQw8M.js → download-DC7KkKyP.js} +1 -1
- package/dashboard/dist/assets/{folder-Bvjj8Vn9.js → folder-CWq_lAnf.js} +1 -1
- package/dashboard/dist/assets/index-DWG-WrzT.js +231 -0
- package/dashboard/dist/assets/{index-BvScJmJM.js → index-Do71weNR.js} +1 -1
- package/dashboard/dist/assets/index-GUNJodSR.css +1 -0
- package/dashboard/dist/assets/{list-Dj4i9N75.js → list-CgIP_2A-.js} +1 -1
- package/dashboard/dist/assets/{minus-DwlFabsT.js → minus-DYoN5UGk.js} +1 -1
- package/dashboard/dist/assets/{pen-line-D7UzECt6.js → pen-line-Bh_WKYHm.js} +1 -1
- package/dashboard/dist/assets/{proxy-B9XRqHD9.js → proxy-BKxDAKTj.js} +1 -1
- package/dashboard/dist/assets/{search-BQbBTIYl.js → search-SieXnOgr.js} +1 -1
- package/dashboard/dist/assets/{shallow-Clb1Lyd_.js → shallow-Bme1JY57.js} +1 -1
- package/dashboard/dist/assets/{table-BqxCXid2.js → table-llyEtj-7.js} +1 -1
- package/dashboard/dist/assets/terminal-BB3Xfuv5.js +6 -0
- package/dashboard/dist/assets/{trash-2-6rN9B-EQ.js → trash-2-C8f4vFFM.js} +1 -1
- package/dashboard/dist/assets/{zap-DxUhG-gk.js → zap-4uwlzVm0.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist-server/dashboard/src/server/agents/agent-sdk-adapter.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/agent-sdk-adapter.js +5 -4
- package/dashboard/dist-server/dashboard/src/server/agents/agent-sdk-adapter.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js +8 -4
- package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/entry-normalizer.d.ts +1 -0
- package/dashboard/dist-server/dashboard/src/server/agents/entry-normalizer.js +2 -1
- package/dashboard/dist-server/dashboard/src/server/agents/entry-normalizer.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/stream-json-adapter.js +20 -10
- package/dashboard/dist-server/dashboard/src/server/agents/stream-json-adapter.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/tools/issue-mcp-server.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/tools/issue-mcp-server.js +3 -4
- package/dashboard/dist-server/dashboard/src/server/agents/tools/issue-mcp-server.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/tools/issue-mcp-server.test.js +4 -4
- package/dashboard/dist-server/dashboard/src/server/agents/tools/issue-mcp-server.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/commander/commander-agent.js +4 -3
- package/dashboard/dist-server/dashboard/src/server/commander/commander-agent.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/commander/commander-agent.test.js +20 -7
- package/dashboard/dist-server/dashboard/src/server/commander/commander-agent.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/execution/wave-executor.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/server/execution/wave-executor.js +4 -4
- package/dashboard/dist-server/dashboard/src/server/execution/wave-executor.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/index.js +2 -1
- package/dashboard/dist-server/dashboard/src/server/index.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/git.d.ts +2 -0
- package/dashboard/dist-server/dashboard/src/server/routes/git.js +79 -0
- package/dashboard/dist-server/dashboard/src/server/routes/git.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/routes/index.js +3 -0
- package/dashboard/dist-server/dashboard/src/server/routes/index.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/issues.js +14 -14
- package/dashboard/dist-server/dashboard/src/server/routes/issues.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/linear.js +7 -5
- package/dashboard/dist-server/dashboard/src/server/routes/linear.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/workspace.js +43 -0
- package/dashboard/dist-server/dashboard/src/server/routes/workspace.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/state/state-manager.js +186 -25
- package/dashboard/dist-server/dashboard/src/server/state/state-manager.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/utils/issue-store.d.ts +6 -0
- package/dashboard/dist-server/dashboard/src/server/utils/issue-store.js +24 -2
- package/dashboard/dist-server/dashboard/src/server/utils/issue-store.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/execution-handler.js +4 -7
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/execution-handler.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.js +2 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.test.js +5 -5
- package/dashboard/dist-server/dashboard/src/shared/constants.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/issue-types.test.js +4 -4
- package/dashboard/dist-server/dashboard/src/shared/issue-types.test.js.map +1 -1
- package/dashboard/dist-server/src/commands/delegate.js +7 -1
- package/dashboard/dist-server/src/commands/delegate.js.map +1 -1
- package/dashboard/package.json +59 -59
- package/dist/src/cli.js +3 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/{team.d.ts → collab.d.ts} +2 -2
- package/dist/src/commands/collab.d.ts.map +1 -0
- package/dist/src/commands/{team.js → collab.js} +391 -24
- package/dist/src/commands/collab.js.map +1 -0
- package/dist/src/commands/delegate.d.ts.map +1 -1
- package/dist/src/commands/delegate.js +7 -1
- package/dist/src/commands/delegate.js.map +1 -1
- package/dist/src/commands/msg.d.ts.map +1 -1
- package/dist/src/commands/msg.js +4 -3
- package/dist/src/commands/msg.js.map +1 -1
- package/dist/src/hooks/team-monitor.d.ts.map +1 -1
- package/dist/src/hooks/team-monitor.js +16 -0
- package/dist/src/hooks/team-monitor.js.map +1 -1
- package/dist/src/tools/collab-adapter.d.ts +85 -0
- package/dist/src/tools/collab-adapter.d.ts.map +1 -0
- package/dist/src/tools/collab-adapter.js +320 -0
- package/dist/src/tools/collab-adapter.js.map +1 -0
- package/dist/src/tools/namespace-guard.d.ts +2 -0
- package/dist/src/tools/namespace-guard.d.ts.map +1 -1
- package/dist/src/tools/namespace-guard.js +12 -0
- package/dist/src/tools/namespace-guard.js.map +1 -1
- package/dist/src/tools/phase-gate-evaluator.d.ts +45 -0
- package/dist/src/tools/phase-gate-evaluator.d.ts.map +1 -0
- package/dist/src/tools/phase-gate-evaluator.js +42 -0
- package/dist/src/tools/phase-gate-evaluator.js.map +1 -0
- package/dist/src/tools/team-members.d.ts +18 -0
- package/dist/src/tools/team-members.d.ts.map +1 -1
- package/dist/src/tools/team-members.js +50 -0
- package/dist/src/tools/team-members.js.map +1 -1
- package/dist/src/tools/team-tasks.d.ts +120 -0
- package/dist/src/tools/team-tasks.d.ts.map +1 -0
- package/dist/src/tools/team-tasks.js +365 -0
- package/dist/src/tools/team-tasks.js.map +1 -0
- package/dist/src/tools/transition-recorder.d.ts +3 -0
- package/dist/src/tools/transition-recorder.d.ts.map +1 -1
- package/dist/src/tools/transition-recorder.js +52 -1
- package/dist/src/tools/transition-recorder.js.map +1 -1
- package/dist/src/utils/get-version.d.ts.map +1 -1
- package/dist/src/utils/get-version.js +15 -4
- package/dist/src/utils/get-version.js.map +1 -1
- package/package.json +1 -1
- package/templates/config.json +7 -0
- package/templates/worktree-scope.json +10 -0
- package/templates/worktrees.json +27 -0
- package/workflows/analyze.md +86 -36
- package/workflows/brainstorm.md +17 -37
- package/workflows/delegate-usage.md +39 -41
- package/workflows/execute.md +247 -61
- package/workflows/fork.md +309 -0
- package/workflows/init.md +11 -2
- package/workflows/issue.md +66 -7
- package/workflows/maestro-coordinate.codex.md +1 -1
- package/workflows/maestro-coordinate.md +24 -17
- package/workflows/maestro.md +54 -37
- package/workflows/memory.md +2 -1
- package/workflows/merge.md +285 -0
- package/workflows/milestone-audit.md +89 -70
- package/workflows/milestone-complete.md +89 -156
- package/workflows/plan.md +131 -19
- package/workflows/retrospective.md +5 -5
- package/workflows/roadmap.md +12 -4
- package/workflows/spec-generate.md +9 -0
- package/workflows/status.md +76 -27
- package/workflows/ui-design.md +14 -12
- package/workflows/verify.md +44 -8
- package/.claude/commands/learn-retro-decision.md +0 -198
- package/.claude/commands/learn-retro-git.md +0 -160
- package/.claude/commands/maestro-phase-add.md +0 -63
- package/.claude/commands/maestro-phase-transition.md +0 -75
- package/.codex/skills/maestro-phase-add/SKILL.md +0 -154
- package/.codex/skills/maestro-phase-transition/SKILL.md +0 -173
- package/chains/singles/phase-add.json +0 -31
- package/chains/singles/phase-transition.json +0 -23
- package/dashboard/dist/assets/ChatInput-PuCvZZ3y.js +0 -67
- package/dashboard/dist/assets/ChatPage-v19GURYH.js +0 -8
- package/dashboard/dist/assets/CollabPage-I5k_mCbG.js +0 -1
- package/dashboard/dist/assets/KanbanPage-PDDBv5-9.js +0 -16
- package/dashboard/dist/assets/McpPage-CiqXpCHg.js +0 -16
- package/dashboard/dist/assets/TreeBrowser-0VIMWclo.js +0 -11
- package/dashboard/dist/assets/WorkflowPage-Csm23wUS.js +0 -6
- package/dashboard/dist/assets/git-branch-DL8p9kVC.js +0 -6
- package/dashboard/dist/assets/index-11DuhKhc.js +0 -231
- package/dashboard/dist/assets/index-D2Mtyw7I.css +0 -1
- package/dashboard/dist/assets/wrench-BScEJFqC.js +0 -11
- package/dist/src/commands/team.d.ts.map +0 -1
- package/dist/src/commands/team.js.map +0 -1
- package/workflows/phase-add.md +0 -252
- package/workflows/phase-transition.md +0 -399
package/workflows/plan.md
CHANGED
|
@@ -4,34 +4,61 @@
|
|
|
4
4
|
|
|
5
5
|
Produces two-layer plan output: `plan.json` (overview with task_ids[] and waves[]) + `.task/TASK-{NNN}.json` (individual task definitions).
|
|
6
6
|
|
|
7
|
+
All output goes to `.workflow/scratch/plan-{slug}-{date}/`.
|
|
8
|
+
|
|
7
9
|
---
|
|
8
10
|
|
|
9
11
|
## Prerequisites
|
|
10
12
|
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
- `index.json` present in target directory
|
|
13
|
+
- None for standalone operation (state.json auto-bootstraps)
|
|
14
|
+
- For milestone/phase scope: init + roadmap required
|
|
14
15
|
|
|
15
16
|
---
|
|
16
17
|
|
|
17
|
-
##
|
|
18
|
+
## Scope Resolution
|
|
18
19
|
|
|
19
20
|
```
|
|
20
|
-
Input:
|
|
21
|
+
Input: [phase] argument OR --dir <path>
|
|
22
|
+
|
|
23
|
+
# Worktree scope check
|
|
24
|
+
IF file_exists(".workflow/worktree-scope.json"):
|
|
25
|
+
scope = read(".workflow/worktree-scope.json")
|
|
26
|
+
IF <phase> is a number AND <phase> NOT IN scope.owned_phases:
|
|
27
|
+
ERROR "Phase {phase} not owned by this worktree. Owned: {scope.owned_phases}"
|
|
28
|
+
EXIT
|
|
29
|
+
|
|
30
|
+
# Auto-bootstrap state.json if missing
|
|
31
|
+
IF NOT file_exists(".workflow/state.json"):
|
|
32
|
+
mkdir -p .workflow/scratch/
|
|
33
|
+
Write minimal state.json: { project: null, status: "active", current_milestone: null,
|
|
34
|
+
current_task_id: null, milestones: [], artifacts: [], last_updated: now() }
|
|
21
35
|
|
|
22
36
|
IF --dir <path> is provided:
|
|
23
|
-
1. Set
|
|
24
|
-
2. Validate directory exists
|
|
25
|
-
3.
|
|
37
|
+
1. Set CONTEXT_DIR = <path> (absolute or relative to .workflow/)
|
|
38
|
+
2. Validate directory exists (context.md or conclusions.json present)
|
|
39
|
+
3. Determine scope from parent artifact in state.json (if registered), else "standalone"
|
|
26
40
|
4. Set PHASE_NUM = null, PHASE_SLUG = directory basename
|
|
27
41
|
|
|
28
|
-
ELSE
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
42
|
+
ELSE IF no arguments:
|
|
43
|
+
IF state.json.current_milestone AND roadmap.md exists:
|
|
44
|
+
scope = "milestone"
|
|
45
|
+
milestone_slug = slugify(current_milestone name)
|
|
46
|
+
CONTEXT_DIR = find latest analyze artifact for this milestone from state.json.artifacts[]
|
|
47
|
+
ELSE:
|
|
48
|
+
ERROR E001 "No args and no roadmap — provide phase number or create roadmap"
|
|
49
|
+
|
|
50
|
+
ELSE IF argument is a number:
|
|
51
|
+
IF state.json.current_milestone AND roadmap.md exists:
|
|
52
|
+
scope = "phase"
|
|
53
|
+
PHASE_NUM = parsed number
|
|
54
|
+
PHASE_SLUG = resolve from roadmap.md
|
|
55
|
+
CONTEXT_DIR = find latest analyze artifact for this phase from state.json.artifacts[]
|
|
56
|
+
ELSE:
|
|
57
|
+
ERROR "Phase number requires init + roadmap"
|
|
58
|
+
|
|
59
|
+
# Output directory (always scratch)
|
|
60
|
+
OUTPUT_DIR = .workflow/scratch/plan-{PHASE_SLUG or milestone_slug}-{date}/
|
|
61
|
+
mkdir -p {OUTPUT_DIR}/.task/
|
|
35
62
|
```
|
|
36
63
|
|
|
37
64
|
---
|
|
@@ -56,8 +83,10 @@ ELSE (standard phase resolution):
|
|
|
56
83
|
|
|
57
84
|
1. **Load user decisions**
|
|
58
85
|
```
|
|
59
|
-
|
|
60
|
-
|
|
86
|
+
IF CONTEXT_DIR exists:
|
|
87
|
+
Read ${CONTEXT_DIR}/context.md
|
|
88
|
+
ELSE:
|
|
89
|
+
warn "No upstream analyze found. Run /maestro-analyze first or proceed with defaults."
|
|
61
90
|
```
|
|
62
91
|
|
|
63
92
|
2. **Load spec reference** (if `--spec` flag or index.json has spec_ref)
|
|
@@ -401,7 +430,8 @@ Build plan.json with gap-fix tasks
|
|
|
401
430
|
task_ids: [extracted from plan.json],
|
|
402
431
|
task_count: plan.json.task_count,
|
|
403
432
|
complexity: plan.json.complexity,
|
|
404
|
-
waves: plan.json.waves
|
|
433
|
+
waves: plan.json.waves,
|
|
434
|
+
executor_assignments: {} # populated by user override or auto-assignment in P5
|
|
405
435
|
}
|
|
406
436
|
index.json.status = "planning"
|
|
407
437
|
index.json.updated_at = now()
|
|
@@ -414,6 +444,53 @@ Build plan.json with gap-fix tasks
|
|
|
414
444
|
|
|
415
445
|
---
|
|
416
446
|
|
|
447
|
+
## P4.5: Collision Detection
|
|
448
|
+
|
|
449
|
+
**Purpose:** Warn if this plan's files overlap with existing plans in the same milestone.
|
|
450
|
+
|
|
451
|
+
**Skip if:** scope == "standalone" (no milestone context to compare against)
|
|
452
|
+
|
|
453
|
+
```
|
|
454
|
+
// 1. Collect existing plan file sets
|
|
455
|
+
existing_plans = state.json.artifacts
|
|
456
|
+
.filter(a => a.milestone == current_milestone
|
|
457
|
+
&& a.type == "plan"
|
|
458
|
+
&& a.status == "completed")
|
|
459
|
+
|
|
460
|
+
existing_files = {} // { file_path: [plan_id, ...] }
|
|
461
|
+
FOR each plan IN existing_plans:
|
|
462
|
+
tasks = load_all_tasks(plan.path + "/.task/")
|
|
463
|
+
FOR each task IN tasks:
|
|
464
|
+
FOR each file IN task.files:
|
|
465
|
+
existing_files[file].push(plan.id)
|
|
466
|
+
|
|
467
|
+
// 2. Collect new plan's file set
|
|
468
|
+
new_tasks = load_all_tasks(OUTPUT_DIR + "/.task/")
|
|
469
|
+
new_files = Set()
|
|
470
|
+
FOR each task IN new_tasks:
|
|
471
|
+
FOR each file IN task.files:
|
|
472
|
+
new_files.add(file)
|
|
473
|
+
|
|
474
|
+
// 3. Check intersection
|
|
475
|
+
collisions = []
|
|
476
|
+
FOR each file IN new_files:
|
|
477
|
+
IF file IN existing_files:
|
|
478
|
+
collisions.push({ file, existing_plans: existing_files[file] })
|
|
479
|
+
|
|
480
|
+
// 4. Report (non-blocking)
|
|
481
|
+
IF collisions.length > 0:
|
|
482
|
+
WARN: "碰撞检测发现 {collisions.length} 个文件重叠:"
|
|
483
|
+
FOR each c IN collisions:
|
|
484
|
+
" {c.file} ← 已在 {c.existing_plans.join(', ')} 中规划"
|
|
485
|
+
"建议: 确认是否有意覆盖,或调整 task 范围"
|
|
486
|
+
ELSE:
|
|
487
|
+
"碰撞检测通过: 无文件重叠"
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
**Note:** Only checks `task.files[]` (write targets). `task.read_first[]` (read-only references) are excluded.
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
|
|
417
494
|
## P5: Confirmation
|
|
418
495
|
|
|
419
496
|
**Purpose:** Present plan to user and determine next action.
|
|
@@ -442,6 +519,10 @@ Build plan.json with gap-fix tasks
|
|
|
442
519
|
|
|
443
520
|
3. **executionContext handoff** (if "Execute now")
|
|
444
521
|
```
|
|
522
|
+
executionMethod = config.json.execution.method || "agent"
|
|
523
|
+
defaultExecutor = config.json.execution.default_executor || "gemini"
|
|
524
|
+
executorAssignments = index.json.plan.executor_assignments || {}
|
|
525
|
+
|
|
445
526
|
executionContext = {
|
|
446
527
|
planObject: {
|
|
447
528
|
plan: plan.json contents,
|
|
@@ -449,7 +530,9 @@ Build plan.json with gap-fix tasks
|
|
|
449
530
|
},
|
|
450
531
|
explorations: [ exploration-*.json contents ],
|
|
451
532
|
clarifications: clarificationContext,
|
|
452
|
-
executionMethod:
|
|
533
|
+
executionMethod: executionMethod,
|
|
534
|
+
defaultExecutor: defaultExecutor,
|
|
535
|
+
executorAssignments: executorAssignments,
|
|
453
536
|
phaseIndex: index.json contents,
|
|
454
537
|
specRef: spec-ref contents (if loaded)
|
|
455
538
|
}
|
|
@@ -457,6 +540,35 @@ Build plan.json with gap-fix tasks
|
|
|
457
540
|
Hand off to /workflow:execute with executionContext in memory
|
|
458
541
|
```
|
|
459
542
|
|
|
543
|
+
4. **Register artifact in state.json**
|
|
544
|
+
```
|
|
545
|
+
Read .workflow/state.json
|
|
546
|
+
// Find upstream analyze artifact
|
|
547
|
+
upstream_analyze = state.json.artifacts
|
|
548
|
+
.filter(a => a.type == "analyze" && a.path == CONTEXT_DIR relative path)
|
|
549
|
+
.last() // most recent
|
|
550
|
+
|
|
551
|
+
next_id = max(artifacts.filter(a => a.type == "plan").map(a => parseInt(a.id.replace("PLN-","")))) + 1
|
|
552
|
+
|
|
553
|
+
artifact = {
|
|
554
|
+
id: "PLN-{next_id padded to 3}",
|
|
555
|
+
type: "plan",
|
|
556
|
+
milestone: state.json.current_milestone,
|
|
557
|
+
phase: PHASE_NUM,
|
|
558
|
+
scope: scope,
|
|
559
|
+
path: OUTPUT_DIR relative to .workflow/,
|
|
560
|
+
status: "completed",
|
|
561
|
+
depends_on: upstream_analyze?.id || null,
|
|
562
|
+
harvested: false,
|
|
563
|
+
created_at: plan_start_time,
|
|
564
|
+
completed_at: now()
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
state.json.artifacts.push(artifact)
|
|
568
|
+
state.json.last_updated = now()
|
|
569
|
+
Write state.json (atomic: write tmp + rename)
|
|
570
|
+
```
|
|
571
|
+
|
|
460
572
|
---
|
|
461
573
|
|
|
462
574
|
## Error Handling
|
|
@@ -507,14 +507,14 @@ insight.routed_id = "SPEC-retro-{phase_num}-{INS_id}-{slug}.md"
|
|
|
507
507
|
|
|
508
508
|
#### Target: note
|
|
509
509
|
|
|
510
|
-
Reuse the existing `manage-
|
|
510
|
+
Reuse the existing `manage-learn` skill in tip mode — do not duplicate the learning pipeline.
|
|
511
511
|
|
|
512
512
|
```
|
|
513
513
|
note_text = "[Retro phase {NN} / {lens}] {insight.title}: {insight.summary}"
|
|
514
514
|
tags = insight.tags + ["retrospective", "phase-{NN}", insight.lens]
|
|
515
515
|
|
|
516
516
|
Skill({
|
|
517
|
-
skill: "manage-
|
|
517
|
+
skill: "manage-learn",
|
|
518
518
|
args: "tip \"{note_text}\" --tag " + tags.join(",")
|
|
519
519
|
})
|
|
520
520
|
|
|
@@ -667,7 +667,7 @@ Write .workflow/learning/learning-index.json
|
|
|
667
667
|
|
|
668
668
|
### Backward-compat append to specs/learnings.md
|
|
669
669
|
|
|
670
|
-
|
|
670
|
+
Append learnings to `.workflow/specs/learnings.md` (shared with milestone-complete's learning extraction). Append a one-line summary per insight:
|
|
671
671
|
|
|
672
672
|
```
|
|
673
673
|
IF .workflow/specs/learnings.md exists:
|
|
@@ -679,7 +679,7 @@ IF .workflow/specs/learnings.md exists:
|
|
|
679
679
|
Phase: {NN} | Source: retrospective | Insight: {INS_id} | Lens: {lens}
|
|
680
680
|
```
|
|
681
681
|
|
|
682
|
-
If the file does not exist,
|
|
682
|
+
If the file does not exist, create it with a `## Entries` header.
|
|
683
683
|
|
|
684
684
|
---
|
|
685
685
|
|
|
@@ -707,7 +707,7 @@ Next steps (suggested):
|
|
|
707
707
|
Skill({ skill: "manage-status" }) — Review project state
|
|
708
708
|
Skill({ skill: "manage-issue", args: "list --source retrospective" }) — Triage created issues
|
|
709
709
|
Skill({ skill: "manage-learn", args: "list" }) — Browse the lessons library
|
|
710
|
-
Skill({ skill: "maestro-
|
|
710
|
+
Skill({ skill: "maestro-milestone-audit" }) — Audit milestone if all phases done
|
|
711
711
|
```
|
|
712
712
|
|
|
713
713
|
If `mode == "range"` or `--all`, loop Stages 3–8 per phase, then print an aggregate summary at the end:
|
package/workflows/roadmap.md
CHANGED
|
@@ -4,6 +4,15 @@ Interactive roadmap creation with iterative refinement. Lightweight path from re
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
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
|
+
|
|
7
16
|
## Step 1: Session Initialization
|
|
8
17
|
|
|
9
18
|
```javascript
|
|
@@ -61,7 +70,7 @@ IF .workflow/state.json exists:
|
|
|
61
70
|
- key_decisions[] → architectural_constraints
|
|
62
71
|
- blockers[] → known_risks
|
|
63
72
|
|
|
64
|
-
IF .workflow/codebase/ exists (from
|
|
73
|
+
IF .workflow/codebase/ exists (from codebase-rebuild or codebase-refresh):
|
|
65
74
|
Read available codebase docs for feature inventory
|
|
66
75
|
```
|
|
67
76
|
|
|
@@ -302,10 +311,9 @@ Phase directories use `{NN}-{slug}` format (e.g., `01-auth`, `02-api`).
|
|
|
302
311
|
|
|
303
312
|
**Requirements traceability**: Cross-check that every Active requirement from project.md maps to exactly one phase. Surface unmapped requirements as gaps.
|
|
304
313
|
|
|
305
|
-
2. **
|
|
306
|
-
- Create empty `index.json` in each
|
|
314
|
+
2. **Ensure scratch directory**: `mkdir -p .workflow/scratch/`
|
|
307
315
|
|
|
308
|
-
3. **Update state.json** (if exists): set `
|
|
316
|
+
3. **Update state.json** (if exists): set milestones from roadmap, set `current_milestone` to first milestone
|
|
309
317
|
|
|
310
318
|
---
|
|
311
319
|
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Specification document chain producing a complete specification package (Product Brief, PRD, Architecture, Epics, Roadmap) through 7 sequential phases with multi-CLI analysis and interactive refinement. Pure documentation — no code generation.
|
|
4
4
|
|
|
5
|
+
## Worktree Guard
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
# Block in worktree
|
|
9
|
+
IF file_exists(".workflow/worktree-scope.json"):
|
|
10
|
+
ERROR "Cannot run maestro-spec-generate inside a worktree. Run from the main worktree."
|
|
11
|
+
EXIT
|
|
12
|
+
```
|
|
13
|
+
|
|
5
14
|
## Pipeline Position
|
|
6
15
|
|
|
7
16
|
```
|
package/workflows/status.md
CHANGED
|
@@ -44,43 +44,57 @@ Status dashboard with intelligent routing.
|
|
|
44
44
|
|
|
45
45
|
---
|
|
46
46
|
|
|
47
|
-
## Step 2:
|
|
47
|
+
## Step 2: Build Virtual Phase View from Artifact Registry
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
Derive phase progress from `state.json.artifacts[]`:
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
51
|
+
```
|
|
52
|
+
// Group artifacts by phase for current milestone
|
|
53
|
+
milestone_artifacts = state.json.artifacts.filter(a => a.milestone == current_milestone)
|
|
54
|
+
|
|
55
|
+
// Build phase view from roadmap + artifact registry
|
|
56
|
+
phases_from_roadmap = parse roadmap.md → list of { number, slug, title }
|
|
57
|
+
|
|
58
|
+
FOR each phase IN phases_from_roadmap:
|
|
59
|
+
phase_artifacts = milestone_artifacts.filter(a => a.phase == phase.number)
|
|
60
|
+
has_analyze = phase_artifacts.some(a => a.type == "analyze" && a.status == "completed")
|
|
61
|
+
has_plan = phase_artifacts.some(a => a.type == "plan" && a.status == "completed")
|
|
62
|
+
has_execute = phase_artifacts.some(a => a.type == "execute" && a.status == "completed")
|
|
63
|
+
has_verify = phase_artifacts.some(a => a.type == "verify" && a.status == "completed")
|
|
64
|
+
|
|
65
|
+
// Derive status from artifact chain
|
|
66
|
+
status = has_verify ? "verified" :
|
|
67
|
+
has_execute ? "executed" :
|
|
68
|
+
has_plan ? "planned" :
|
|
69
|
+
has_analyze ? "analyzed" :
|
|
70
|
+
"pending"
|
|
71
|
+
|
|
72
|
+
// Get task counts from plan artifacts
|
|
73
|
+
plan_artifact = phase_artifacts.find(a => a.type == "plan" && a.status == "completed")
|
|
74
|
+
IF plan_artifact:
|
|
75
|
+
plan_json = read .workflow/{plan_artifact.path}/plan.json
|
|
76
|
+
tasks_total = plan_json.task_ids.length
|
|
77
|
+
tasks_completed = count .task/TASK-*.json where status == "completed"
|
|
78
|
+
|
|
79
|
+
phases[] = { number, slug, title, status, tasks_total, tasks_completed, has_verify }
|
|
80
|
+
|
|
81
|
+
// Also show adhoc artifacts
|
|
82
|
+
adhoc_artifacts = milestone_artifacts.filter(a => a.scope == "adhoc")
|
|
83
|
+
```
|
|
64
84
|
|
|
65
85
|
---
|
|
66
86
|
|
|
67
|
-
## Step 2.5:
|
|
68
|
-
|
|
69
|
-
Verify that `roadmap.md` and `state.json` agree on phase structure:
|
|
87
|
+
## Step 2.5: Artifact Registry Consistency Check
|
|
70
88
|
|
|
71
89
|
```
|
|
72
90
|
IF .workflow/roadmap.md exists:
|
|
73
91
|
roadmap_phases = parse phase headings from roadmap.md (count "### Phase N:" entries)
|
|
74
|
-
|
|
75
|
-
actual_dirs = count .workflow/phases/*/ directories
|
|
92
|
+
artifact_phases = unique phase numbers from milestone_artifacts
|
|
76
93
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
State total: {state_total}
|
|
82
|
-
Phase dirs: {actual_dirs}
|
|
83
|
-
Run /maestro-roadmap or /maestro-phase-add to reconcile.
|
|
94
|
+
// Check for unregistered work (artifacts without matching roadmap phases)
|
|
95
|
+
orphan_artifacts = milestone_artifacts.filter(a => a.phase && !roadmap_phases.includes(a.phase))
|
|
96
|
+
IF orphan_artifacts.length > 0:
|
|
97
|
+
Display WARNING: "Artifacts reference phases not in roadmap"
|
|
84
98
|
|
|
85
99
|
ELSE IF NOT .workflow/roadmap.md exists AND state.json.phases_summary.total > 0:
|
|
86
100
|
Display WARNING:
|
|
@@ -175,6 +189,41 @@ Status icons:
|
|
|
175
189
|
- `[ ]` pending
|
|
176
190
|
- `[!]` blocked
|
|
177
191
|
|
|
192
|
+
### Step 4.2: Render Worktree Status
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
IF file_exists(".workflow/worktree-scope.json"):
|
|
196
|
+
// Running inside a worktree
|
|
197
|
+
Read .workflow/worktree-scope.json → scope
|
|
198
|
+
Display:
|
|
199
|
+
┌─────────────────────────────────────────┐
|
|
200
|
+
│ WORKTREE MODE │
|
|
201
|
+
├─────────────────────────────────────────┤
|
|
202
|
+
│ Milestone: {scope.milestone} │
|
|
203
|
+
│ Branch: {scope.branch} │
|
|
204
|
+
│ Phases: {scope.owned_phases} │
|
|
205
|
+
│ Main: {scope.main_worktree} │
|
|
206
|
+
└─────────────────────────────────────────┘
|
|
207
|
+
|
|
208
|
+
ELSE IF file_exists(".workflow/worktrees.json"):
|
|
209
|
+
// Running in main worktree with active worktrees
|
|
210
|
+
Read .workflow/worktrees.json → registry
|
|
211
|
+
activeWorktrees = registry.worktrees.filter(w => w.status === "active")
|
|
212
|
+
|
|
213
|
+
IF activeWorktrees.length > 0:
|
|
214
|
+
Display:
|
|
215
|
+
┌─────────────────────────────────────────┐
|
|
216
|
+
│ ACTIVE WORKTREES │
|
|
217
|
+
├─────────────────────────────────────────┤
|
|
218
|
+
{for each wt in activeWorktrees}
|
|
219
|
+
│ {wt.milestone} | {wt.branch} | {wt.path} │
|
|
220
|
+
{/for}
|
|
221
|
+
│ │
|
|
222
|
+
│ Sync: /maestro-fork <milestone> --sync │
|
|
223
|
+
│ Merge: /maestro-merge <milestone> │
|
|
224
|
+
└─────────────────────────────────────────┘
|
|
225
|
+
```
|
|
226
|
+
|
|
178
227
|
---
|
|
179
228
|
|
|
180
229
|
## Step 5: Route Next Step
|
package/workflows/ui-design.md
CHANGED
|
@@ -14,28 +14,30 @@ Pipeline position: analyze -> **ui-design** -> plan -> execute -> verify
|
|
|
14
14
|
|
|
15
15
|
## Prerequisites
|
|
16
16
|
|
|
17
|
-
- `.workflow/` directory initialized
|
|
18
|
-
- Phase directory exists at `.workflow/phases/{NN}-{slug}/` — OR scratch mode for standalone
|
|
17
|
+
- `.workflow/` directory initialized (or auto-bootstrap)
|
|
19
18
|
- Python 3 available (required by ui-ux-pro-max skill)
|
|
20
19
|
- ui-ux-pro-max skill installed (search.py available)
|
|
21
20
|
|
|
22
21
|
---
|
|
23
22
|
|
|
24
|
-
##
|
|
23
|
+
## Scope Resolution
|
|
25
24
|
|
|
26
25
|
```
|
|
27
|
-
Input: <phase> argument (number
|
|
26
|
+
Input: <phase> argument (number) OR topic text
|
|
28
27
|
|
|
29
|
-
|
|
30
|
-
1. Find .workflow/phases/{NN}-*/index.json
|
|
31
|
-
2. Set PHASE_DIR = resolved path, SCRATCH_MODE = false
|
|
28
|
+
All output goes to scratch: .workflow/scratch/ui-design-{slug}-{date}/
|
|
32
29
|
|
|
33
|
-
|
|
30
|
+
IF argument is a number:
|
|
31
|
+
1. Resolve phase slug from roadmap.md
|
|
32
|
+
2. OUTPUT_DIR = .workflow/scratch/ui-design-{phase-slug}-{date}
|
|
33
|
+
3. scope = "phase", register artifact with phase number
|
|
34
|
+
|
|
35
|
+
ELSE (topic text):
|
|
34
36
|
1. slug = slugify(topic)
|
|
35
|
-
2.
|
|
36
|
-
3.
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
2. OUTPUT_DIR = .workflow/scratch/ui-design-{slug}-{date}
|
|
38
|
+
3. scope = state.json.current_milestone ? "adhoc" : "standalone"
|
|
39
|
+
|
|
40
|
+
mkdir -p ${OUTPUT_DIR}
|
|
39
41
|
```
|
|
40
42
|
|
|
41
43
|
---
|
package/workflows/verify.md
CHANGED
|
@@ -12,14 +12,50 @@ Dual verification: Goal-Backward structural verification + Nyquist test coverage
|
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
-
##
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
Input:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
## Scope Resolution
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
Input: [phase] argument OR --dir <path>
|
|
19
|
+
|
|
20
|
+
# Worktree scope check
|
|
21
|
+
IF file_exists(".workflow/worktree-scope.json"):
|
|
22
|
+
scope = read(".workflow/worktree-scope.json")
|
|
23
|
+
IF <phase> is a number AND <phase> NOT IN scope.owned_phases:
|
|
24
|
+
ERROR "Phase {phase} not owned by this worktree. Owned: {scope.owned_phases}"
|
|
25
|
+
EXIT
|
|
26
|
+
|
|
27
|
+
IF --dir <path> is provided:
|
|
28
|
+
// Single plan verification
|
|
29
|
+
PLAN_DIRS = [<path>]
|
|
30
|
+
VERIFY_MODE = "single"
|
|
31
|
+
VERIFY_OUTPUT_DIR = <path> // verification.json written into plan dir
|
|
32
|
+
|
|
33
|
+
ELSE IF no arguments:
|
|
34
|
+
// Milestone-level verification
|
|
35
|
+
Read state.json.artifacts
|
|
36
|
+
PLAN_DIRS = artifacts.filter(a =>
|
|
37
|
+
a.milestone == current_milestone &&
|
|
38
|
+
a.type == "execute" &&
|
|
39
|
+
a.status == "completed"
|
|
40
|
+
).map(a => a.path)
|
|
41
|
+
IF PLAN_DIRS is empty: ERROR E001
|
|
42
|
+
VERIFY_MODE = "milestone"
|
|
43
|
+
milestone_slug = slugify(current_milestone name)
|
|
44
|
+
VERIFY_OUTPUT_DIR = .workflow/scratch/verify-{milestone_slug}-{date}/
|
|
45
|
+
mkdir -p VERIFY_OUTPUT_DIR
|
|
46
|
+
|
|
47
|
+
ELSE IF argument is a number:
|
|
48
|
+
// Phase-level verification
|
|
49
|
+
Read state.json.artifacts
|
|
50
|
+
PLAN_DIRS = artifacts.filter(a =>
|
|
51
|
+
a.milestone == current_milestone &&
|
|
52
|
+
a.type == "execute" &&
|
|
53
|
+
a.phase == arg &&
|
|
54
|
+
a.status == "completed"
|
|
55
|
+
).map(a => a.path)
|
|
56
|
+
IF PLAN_DIRS is empty: ERROR E001
|
|
57
|
+
VERIFY_MODE = "phase"
|
|
58
|
+
VERIFY_OUTPUT_DIR = first plan dir // single plan → write there
|
|
23
59
|
```
|
|
24
60
|
|
|
25
61
|
---
|