maestro-flow 0.3.10 → 0.3.12
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/conceptual-planning-agent.md +1 -0
- package/.claude/agents/workflow-analyzer.md +114 -114
- package/.claude/agents/workflow-collab-planner.md +144 -144
- package/.claude/agents/workflow-debugger.md +102 -103
- package/.claude/agents/workflow-executor.md +127 -128
- package/.claude/agents/workflow-integration-checker.md +82 -82
- package/.claude/agents/workflow-nyquist-auditor.md +85 -84
- package/.claude/agents/workflow-phase-researcher.md +85 -85
- package/.claude/agents/workflow-plan-checker.md +90 -90
- package/.claude/agents/workflow-planner.md +178 -178
- package/.claude/agents/workflow-roadmapper.md +81 -83
- package/.claude/agents/workflow-verifier.md +119 -119
- package/.claude/commands/learn-decompose.md +176 -176
- package/.claude/commands/learn-follow.md +167 -167
- package/.claude/commands/learn-retro.md +3 -3
- package/.claude/commands/learn-second-opinion.md +2 -2
- package/.claude/commands/maestro-brainstorm.md +1 -0
- package/.claude/commands/maestro-coordinate.md +1 -3
- package/.claude/commands/maestro-fork.md +133 -111
- package/.claude/commands/maestro-merge.md +85 -77
- package/.claude/commands/maestro-plan.md +88 -2
- package/.claude/commands/maestro-roadmap.md +113 -2
- package/.claude/commands/maestro.md +1 -0
- package/.claude/commands/manage-harvest.md +131 -131
- package/.claude/commands/manage-issue.md +2 -2
- package/.claude/commands/quality-business-test.md +5 -5
- package/.claude/commands/quality-debug.md +3 -2
- package/.claude/commands/quality-retrospective.md +6 -4
- package/.claude/commands/quality-review.md +1 -1
- package/.claude/commands/quality-test-gen.md +5 -4
- 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 +151 -279
- package/.codex/skills/maestro-analyze/SKILL.md +59 -71
- package/.codex/skills/maestro-brainstorm/SKILL.md +452 -463
- package/.codex/skills/maestro-chain/SKILL.md +95 -110
- package/.codex/skills/maestro-coordinate/SKILL.md +68 -234
- package/.codex/skills/maestro-execute/SKILL.md +435 -446
- package/.codex/skills/maestro-fork/SKILL.md +98 -0
- package/.codex/skills/maestro-init/SKILL.md +172 -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 +69 -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 +58 -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 +35 -32
- 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 +95 -107
- 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 +94 -105
- 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 +9 -4
- package/README.zh-CN.md +9 -4
- package/dashboard/dist/assets/{ArtifactsPage-DZNCi6tn.js → ArtifactsPage-CUrrDGgN.js} +1 -1
- package/dashboard/dist/assets/ChatInput-pUOLJIKE.js +49 -0
- package/dashboard/dist/assets/ChatPage-B8Xqkt0v.js +27 -0
- package/dashboard/dist/assets/{CollabPage-B4NAHXS2.js → CollabPage-DIUXeazv.js} +1 -1
- package/dashboard/dist/assets/{ExecutionPanel-CFt4LJyq.js → ExecutionPanel-VmYeADFj.js} +1 -1
- package/dashboard/dist/assets/KanbanPage-DLq8v7hg.js +21 -0
- package/dashboard/dist/assets/{MarkdownRenderer-X4af_WNb.js → MarkdownRenderer-D7AehrnR.js} +1 -1
- package/dashboard/dist/assets/{McpPage-BKfCVIyU.js → McpPage-BY0SjTgw.js} +2 -2
- package/dashboard/dist/assets/{OutputPanel-BlBQFJSW.js → OutputPanel-B-Rjwgmv.js} +1 -1
- package/dashboard/dist/assets/{ProblemsPanel-De3DLvoI.js → ProblemsPanel-GEpF-oi4.js} +1 -1
- package/dashboard/dist/assets/RequirementBoardPage-xs8uDM7I.js +6 -0
- package/dashboard/dist/assets/{RequirementPage-Bllxe2XI.js → RequirementPage-BKDSFwjA.js} +5 -10
- package/dashboard/dist/assets/SpecsPage-DLFb9ZH0.js +36 -0
- package/dashboard/dist/assets/SupervisorPage-SOki_kgz.js +6 -0
- package/dashboard/dist/assets/TeamsPage-BO2kP70F.js +11 -0
- package/dashboard/dist/assets/{TreeBrowser-Q12qobZs.js → TreeBrowser-B9DHdULE.js} +1 -1
- package/dashboard/dist/assets/{WorkflowPage-D_Fzdy3_.js → WorkflowPage-C8hWbYim.js} +1 -1
- package/dashboard/dist/assets/{check-u6fGOwQO.js → check-DJDk3A2a.js} +1 -1
- package/dashboard/dist/assets/{chevron-right-Csu22t58.js → chevron-right-C7bVDreZ.js} +1 -1
- package/dashboard/dist/assets/{circle-CMrkbRNg.js → circle-Qfgy4LB_.js} +1 -1
- package/dashboard/dist/assets/{circle-alert-c3tH1P4z.js → circle-alert-Na1vf6qQ.js} +1 -1
- package/dashboard/dist/assets/{circle-check-gYxxSYuH.js → circle-check-CEGgy3NV.js} +1 -1
- package/dashboard/dist/assets/{circle-check-big-TDSeWstm.js → circle-check-big-3JB8zRYj.js} +1 -1
- package/dashboard/dist/assets/{code-CFN2uX9V.js → code-Ble63Idz.js} +1 -1
- package/dashboard/dist/assets/{columns-3-38xIDlzy.js → columns-3-BUcKlxve.js} +1 -1
- package/dashboard/dist/assets/{download-DC7KkKyP.js → download-CMqkfn8x.js} +1 -1
- package/dashboard/dist/assets/{folder-CWq_lAnf.js → folder-B9ewx9LL.js} +1 -1
- package/dashboard/dist/assets/index-C2Mcb4TJ.js +231 -0
- package/dashboard/dist/assets/index-DyBbPc18.css +1 -0
- package/dashboard/dist/assets/{index-Do71weNR.js → index-JTmGteaT.js} +1 -1
- package/dashboard/dist/assets/{list-CgIP_2A-.js → list-DI8Wn2aT.js} +1 -1
- package/dashboard/dist/assets/loader-B5F6PzFT.js +11 -0
- package/dashboard/dist/assets/{minus-DYoN5UGk.js → minus-Lp_BfctG.js} +1 -1
- package/dashboard/dist/assets/{pen-line-Bh_WKYHm.js → pen-line-Ch7sphzZ.js} +1 -1
- package/dashboard/dist/assets/pencil-_yRMHmGT.js +6 -0
- package/dashboard/dist/assets/{proxy-BKxDAKTj.js → proxy-D72Y8a4Y.js} +1 -1
- package/dashboard/dist/assets/{search-SieXnOgr.js → search-BS6fI6Bg.js} +1 -1
- package/dashboard/dist/assets/{shallow-Bme1JY57.js → shallow-BXasQBvr.js} +1 -1
- package/dashboard/dist/assets/table-CeGlFjlP.js +6 -0
- package/dashboard/dist/assets/{terminal-BB3Xfuv5.js → terminal-BJic2yW-.js} +1 -1
- package/dashboard/dist/assets/{trash-2-C8f4vFFM.js → trash-2-Czz4X8Fb.js} +1 -1
- package/dashboard/dist/assets/{zap-4uwlzVm0.js → zap-C3H0jVFA.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js +16 -1
- package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/delegate-broker-monitor.js +1 -2
- package/dashboard/dist-server/dashboard/src/server/agents/delegate-broker-monitor.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/commander/commander-prompts.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/server/commander/commander-prompts.js +2 -1
- package/dashboard/dist-server/dashboard/src/server/commander/commander-prompts.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/index.js +3 -0
- package/dashboard/dist-server/dashboard/src/server/index.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/collab.js +124 -0
- package/dashboard/dist-server/dashboard/src/server/routes/collab.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/team-handler.d.ts +10 -0
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/team-handler.js +73 -0
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/team-handler.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/shared/collab-types.d.ts +31 -0
- package/dashboard/dist-server/dashboard/src/shared/collab-types.js +28 -0
- package/dashboard/dist-server/dashboard/src/shared/collab-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.js +10 -0
- package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/coordinate-types.d.ts +22 -0
- package/dashboard/dist-server/dashboard/src/shared/issue-types.d.ts +12 -0
- package/dashboard/dist-server/dashboard/src/shared/issue-types.js +12 -0
- package/dashboard/dist-server/dashboard/src/shared/issue-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/team-types.d.ts +22 -0
- package/dashboard/dist-server/dashboard/src/shared/team-types.js +7 -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 +28 -2
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.js.map +1 -1
- package/dashboard/dist-server/shared/agent-types.d.ts +4 -0
- package/dashboard/dist-server/src/hooks/constants.d.ts +3 -1
- package/dashboard/dist-server/src/hooks/constants.js +4 -2
- package/dashboard/dist-server/src/hooks/constants.js.map +1 -1
- package/dist/shared/agent-types.d.ts +4 -0
- package/dist/shared/agent-types.d.ts.map +1 -1
- package/dist/src/commands/collab.js +4 -4
- package/dist/src/commands/collab.js.map +1 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +66 -1
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/install-backend.d.ts.map +1 -1
- package/dist/src/commands/install-backend.js +29 -18
- package/dist/src/commands/install-backend.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.js +23 -1
- package/dist/src/hooks/__tests__/statusline-visual-test.js.map +1 -1
- package/dist/src/hooks/constants.d.ts +3 -1
- package/dist/src/hooks/constants.d.ts.map +1 -1
- package/dist/src/hooks/constants.js +4 -2
- package/dist/src/hooks/constants.js.map +1 -1
- package/dist/src/hooks/guards/index.d.ts +1 -0
- package/dist/src/hooks/guards/index.d.ts.map +1 -1
- package/dist/src/hooks/guards/index.js +1 -0
- package/dist/src/hooks/guards/index.js.map +1 -1
- 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/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/skill-context.d.ts +3 -0
- package/dist/src/hooks/skill-context.d.ts.map +1 -1
- package/dist/src/hooks/skill-context.js +95 -9
- package/dist/src/hooks/skill-context.js.map +1 -1
- 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.map +1 -1
- package/dist/src/hooks/statusline.js +6 -3
- package/dist/src/hooks/statusline.js.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/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.map +1 -1
- package/dist/src/tools/merge-validator.js +114 -16
- package/dist/src/tools/merge-validator.js.map +1 -1
- 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/package.json +2 -1
- package/shared/agent-types.ts +4 -0
- package/templates/worktree-scope.json +9 -10
- package/templates/worktrees.json +26 -27
- package/workflows/analyze.md +816 -816
- package/workflows/brainstorm.md +480 -471
- package/workflows/codebase-rebuild.md +332 -332
- package/workflows/codebase-refresh.md +240 -240
- package/workflows/debug.md +16 -6
- package/workflows/execute.md +1 -1
- package/workflows/fork.md +100 -36
- package/workflows/harvest.md +420 -420
- package/workflows/integration-test.md +355 -343
- package/workflows/issue-discover.md +414 -414
- package/workflows/issue.md +14 -4
- package/workflows/learn.md +19 -5
- package/workflows/maestro.md +1 -0
- package/workflows/map.md +111 -111
- package/workflows/merge.md +113 -55
- 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 +61 -22
- package/workflows/review.md +17 -4
- 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/workflows/test.md +12 -2
- package/workflows/ui-style.md +9 -2
- package/dashboard/dist/assets/ChatInput-Bvr-FeEq.js +0 -49
- package/dashboard/dist/assets/ChatPage-D9zTkJZo.js +0 -22
- package/dashboard/dist/assets/KanbanPage-C8USth6H.js +0 -21
- package/dashboard/dist/assets/RequirementBoardPage-Bf1trzqs.js +0 -11
- package/dashboard/dist/assets/SpecsPage-9lwxKT27.js +0 -36
- package/dashboard/dist/assets/SupervisorPage-SusdfHFq.js +0 -6
- package/dashboard/dist/assets/TeamsPage-DsuM6OwC.js +0 -6
- package/dashboard/dist/assets/arrow-left-Bqtb2hle.js +0 -6
- package/dashboard/dist/assets/index-DWG-WrzT.js +0 -231
- package/dashboard/dist/assets/index-GUNJodSR.css +0 -1
- package/dashboard/dist/assets/table-llyEtj-7.js +0 -6
package/workflows/issue.md
CHANGED
|
@@ -178,8 +178,13 @@ Cross-milestone conflict check (for supplement issues):
|
|
|
178
178
|
6. IF source == "supplement" AND milestone_ref is not null:
|
|
179
179
|
a. Read .workflow/roadmap.md
|
|
180
180
|
b. Identify phases belonging to OTHER milestones (not milestone_ref)
|
|
181
|
-
c. For each other-milestone phase, check if plan.json exists:
|
|
182
|
-
Read .workflow/
|
|
181
|
+
c. For each other-milestone phase, resolve phase dir and check if plan.json exists:
|
|
182
|
+
Read .workflow/state.json → state; artifacts = state.artifacts ?? []
|
|
183
|
+
IF artifacts.length > 0:
|
|
184
|
+
art = artifacts.find(a => a.type === 'plan' && a.phase === phaseNum)
|
|
185
|
+
IF art: Read .workflow/{art.path}/plan.json (if exists)
|
|
186
|
+
ELSE:
|
|
187
|
+
Read .workflow/phases/{NN}-{slug}/plan.json (if exists)
|
|
183
188
|
Collect files_to_create[] as planned_files
|
|
184
189
|
d. IF affected_components in the new issue overlap with planned_files:
|
|
185
190
|
WARNING: "Conflict detected: this supplement issue affects components planned in milestone {other_milestone}"
|
|
@@ -449,8 +454,13 @@ Process bidirectional link:
|
|
|
449
454
|
If not found → error: "Issue {ID} not found"
|
|
450
455
|
|
|
451
456
|
2. Locate task file:
|
|
452
|
-
-
|
|
453
|
-
-
|
|
457
|
+
- Read .workflow/state.json → state
|
|
458
|
+
- artifacts = state.artifacts ?? []
|
|
459
|
+
- IF artifacts.length > 0:
|
|
460
|
+
Search .workflow/scratch/*/.task/{TASK_ID}.json (artifact registry scratch paths)
|
|
461
|
+
ELSE:
|
|
462
|
+
Search .workflow/phases/*/.task/{TASK_ID}.json (legacy)
|
|
463
|
+
- Also search .workflow/scratch/*/.task/{TASK_ID}.json (standalone scratch tasks)
|
|
454
464
|
- If still not found → error: "Task {TASK_ID} not found"
|
|
455
465
|
|
|
456
466
|
3. Update issue record:
|
package/workflows/learn.md
CHANGED
|
@@ -86,9 +86,14 @@ IF .workflow/state.json exists:
|
|
|
86
86
|
IF state.current_phase is not null:
|
|
87
87
|
phase = state.current_phase
|
|
88
88
|
|
|
89
|
-
# Resolve slug
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
# Resolve slug — artifact registry first, fallback to legacy phases/
|
|
90
|
+
artifacts = state.artifacts ?? []
|
|
91
|
+
IF artifacts.length > 0:
|
|
92
|
+
art = artifacts.find(a => a.phase === phase)
|
|
93
|
+
phase_slug = art?.slug ?? "phase-" + phase
|
|
94
|
+
ELSE:
|
|
95
|
+
Glob ".workflow/phases/{NN}-*/" where NN == phase
|
|
96
|
+
phase_slug = matched directory basename (e.g. "01-auth")
|
|
92
97
|
```
|
|
93
98
|
|
|
94
99
|
If `--phase 0` is passed, force `phase = null, phase_slug = null` regardless.
|
|
@@ -299,8 +304,17 @@ IF row is null → error E004: "Insight {target_id} not found"
|
|
|
299
304
|
```
|
|
300
305
|
phase_context = null
|
|
301
306
|
IF row.phase_slug is not null:
|
|
302
|
-
|
|
303
|
-
|
|
307
|
+
// Resolve phase dir — artifact registry first, fallback to legacy phases/
|
|
308
|
+
Read .workflow/state.json → state
|
|
309
|
+
artifacts = state.artifacts ?? []
|
|
310
|
+
phase_dir = null
|
|
311
|
+
IF artifacts.length > 0:
|
|
312
|
+
art = artifacts.find(a => a.phase === row.phase && a.path)
|
|
313
|
+
IF art: phase_dir = ".workflow/" + art.path
|
|
314
|
+
ELSE:
|
|
315
|
+
phase_dir = ".workflow/phases/" + row.phase_slug
|
|
316
|
+
|
|
317
|
+
IF phase_dir AND directory exists:
|
|
304
318
|
phase_context = {
|
|
305
319
|
title: read index.json.title from phase_dir,
|
|
306
320
|
status: read index.json.status,
|
package/workflows/maestro.md
CHANGED
package/workflows/map.md
CHANGED
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
# Workflow: map
|
|
2
|
-
|
|
3
|
-
Codebase scanning with parallel mapper agents.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Step 1: Pre-check
|
|
8
|
-
|
|
9
|
-
1. Check if `.workflow/research/` already exists with documents:
|
|
10
|
-
- If documents exist and are recent (< 7 days):
|
|
11
|
-
- Ask user: "Codebase map exists. Refresh or skip?"
|
|
12
|
-
- "refresh" → continue to Step 2 (overwrite)
|
|
13
|
-
- "skip" → exit with route suggestions
|
|
14
|
-
- If documents are stale or missing → continue to Step 2
|
|
15
|
-
|
|
16
|
-
2. Create `.workflow/research/` directory if it does not exist.
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## Step 2: Spawn Parallel Mapper Agents
|
|
21
|
-
|
|
22
|
-
Spawn 4 parallel `workflow-codebase-mapper` agents. Each agent scans the codebase independently with a specific focus and writes its output directly to `.workflow/research/`.
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
Agent 1: tech focus
|
|
26
|
-
Scan: package.json, go.mod, requirements.txt, build files, dependencies
|
|
27
|
-
Output: .workflow/research/STACK.md
|
|
28
|
-
Content: languages, frameworks, build tools, key dependencies, versions
|
|
29
|
-
|
|
30
|
-
Agent 2: arch focus
|
|
31
|
-
Scan: directory structure, module boundaries, entry points, data flow
|
|
32
|
-
Output: .workflow/research/ARCHITECTURE.md
|
|
33
|
-
Content: architecture style, layer separation, module graph, key abstractions
|
|
34
|
-
|
|
35
|
-
Agent 3: features focus
|
|
36
|
-
Scan: routes, handlers, components, services, models
|
|
37
|
-
Output: .workflow/research/FEATURES.md
|
|
38
|
-
Content: feature inventory, feature-to-file mapping, completeness assessment
|
|
39
|
-
|
|
40
|
-
Agent 4: concerns focus
|
|
41
|
-
Scan: error handling, logging, tests, config, security, performance
|
|
42
|
-
Output: .workflow/research/PITFALLS.md
|
|
43
|
-
Content: tech debt, missing tests, security gaps, performance concerns, known issues
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
If `$ARGUMENTS` (focus area) is provided, pass it to each agent as a focus filter: "Prioritize analysis of {focus_area} subsystem."
|
|
47
|
-
|
|
48
|
-
**Load project specs for mapper context:**
|
|
49
|
-
```
|
|
50
|
-
specs_content = maestro spec load --category
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
**Agent spawn pattern:**
|
|
54
|
-
```
|
|
55
|
-
For each agent (1-4) in parallel:
|
|
56
|
-
Agent({
|
|
57
|
-
subagent_type: "workflow-codebase-mapper",
|
|
58
|
-
prompt: "Focus: {focus}. Scan the codebase and write {output_file}.
|
|
59
|
-
Project specs for reference: ${specs_content}
|
|
60
|
-
Write directly to the file. Return only a confirmation with line count.",
|
|
61
|
-
run_in_background: false
|
|
62
|
-
})
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Step 3: Verification
|
|
68
|
-
|
|
69
|
-
After all 4 agents complete:
|
|
70
|
-
|
|
71
|
-
1. Verify all documents exist with content:
|
|
72
|
-
```
|
|
73
|
-
.workflow/research/STACK.md — exists, >10 lines
|
|
74
|
-
.workflow/research/ARCHITECTURE.md — exists, >10 lines
|
|
75
|
-
.workflow/research/FEATURES.md — exists, >10 lines
|
|
76
|
-
.workflow/research/PITFALLS.md — exists, >10 lines
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
2. If any document is missing or empty:
|
|
80
|
-
- Log which agent failed
|
|
81
|
-
- Re-spawn that specific agent (max 1 retry per agent)
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Step 4: Summary
|
|
86
|
-
|
|
87
|
-
1. Create `.workflow/research/SUMMARY.md`:
|
|
88
|
-
- Read all 4 documents
|
|
89
|
-
- Write a consolidated executive summary covering:
|
|
90
|
-
- Tech stack overview (from STACK.md)
|
|
91
|
-
- Architecture highlights (from ARCHITECTURE.md)
|
|
92
|
-
- Feature inventory count (from FEATURES.md)
|
|
93
|
-
- Top 3 concerns (from PITFALLS.md)
|
|
94
|
-
- Recommendations for next steps
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## Step 5: Commit and Route
|
|
99
|
-
|
|
100
|
-
1. If git repo: commit `.workflow/research/` with message `"chore: map codebase"`
|
|
101
|
-
|
|
102
|
-
2. Display summary:
|
|
103
|
-
```
|
|
104
|
-
Codebase mapped successfully.
|
|
105
|
-
Documents: 5 files in .workflow/research/
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
3. Route next steps based on project state:
|
|
109
|
-
- No `.workflow/state.json` → "Run `/workflow:init` to initialize project"
|
|
110
|
-
- Has state, no roadmap → "Run `/workflow:init` to create roadmap"
|
|
111
|
-
- Has roadmap → "Run `/workflow:plan {next_phase}` to start planning"
|
|
1
|
+
# Workflow: map
|
|
2
|
+
|
|
3
|
+
Codebase scanning with parallel mapper agents.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Step 1: Pre-check
|
|
8
|
+
|
|
9
|
+
1. Check if `.workflow/research/` already exists with documents:
|
|
10
|
+
- If documents exist and are recent (< 7 days):
|
|
11
|
+
- Ask user: "Codebase map exists. Refresh or skip?"
|
|
12
|
+
- "refresh" → continue to Step 2 (overwrite)
|
|
13
|
+
- "skip" → exit with route suggestions
|
|
14
|
+
- If documents are stale or missing → continue to Step 2
|
|
15
|
+
|
|
16
|
+
2. Create `.workflow/research/` directory if it does not exist.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Step 2: Spawn Parallel Mapper Agents
|
|
21
|
+
|
|
22
|
+
Spawn 4 parallel `workflow-codebase-mapper` agents. Each agent scans the codebase independently with a specific focus and writes its output directly to `.workflow/research/`.
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Agent 1: tech focus
|
|
26
|
+
Scan: package.json, go.mod, requirements.txt, build files, dependencies
|
|
27
|
+
Output: .workflow/research/STACK.md
|
|
28
|
+
Content: languages, frameworks, build tools, key dependencies, versions
|
|
29
|
+
|
|
30
|
+
Agent 2: arch focus
|
|
31
|
+
Scan: directory structure, module boundaries, entry points, data flow
|
|
32
|
+
Output: .workflow/research/ARCHITECTURE.md
|
|
33
|
+
Content: architecture style, layer separation, module graph, key abstractions
|
|
34
|
+
|
|
35
|
+
Agent 3: features focus
|
|
36
|
+
Scan: routes, handlers, components, services, models
|
|
37
|
+
Output: .workflow/research/FEATURES.md
|
|
38
|
+
Content: feature inventory, feature-to-file mapping, completeness assessment
|
|
39
|
+
|
|
40
|
+
Agent 4: concerns focus
|
|
41
|
+
Scan: error handling, logging, tests, config, security, performance
|
|
42
|
+
Output: .workflow/research/PITFALLS.md
|
|
43
|
+
Content: tech debt, missing tests, security gaps, performance concerns, known issues
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
If `$ARGUMENTS` (focus area) is provided, pass it to each agent as a focus filter: "Prioritize analysis of {focus_area} subsystem."
|
|
47
|
+
|
|
48
|
+
**Load project specs for mapper context:**
|
|
49
|
+
```
|
|
50
|
+
specs_content = maestro spec load --category arch
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Agent spawn pattern:**
|
|
54
|
+
```
|
|
55
|
+
For each agent (1-4) in parallel:
|
|
56
|
+
Agent({
|
|
57
|
+
subagent_type: "workflow-codebase-mapper",
|
|
58
|
+
prompt: "Focus: {focus}. Scan the codebase and write {output_file}.
|
|
59
|
+
Project specs for reference: ${specs_content}
|
|
60
|
+
Write directly to the file. Return only a confirmation with line count.",
|
|
61
|
+
run_in_background: false
|
|
62
|
+
})
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Step 3: Verification
|
|
68
|
+
|
|
69
|
+
After all 4 agents complete:
|
|
70
|
+
|
|
71
|
+
1. Verify all documents exist with content:
|
|
72
|
+
```
|
|
73
|
+
.workflow/research/STACK.md — exists, >10 lines
|
|
74
|
+
.workflow/research/ARCHITECTURE.md — exists, >10 lines
|
|
75
|
+
.workflow/research/FEATURES.md — exists, >10 lines
|
|
76
|
+
.workflow/research/PITFALLS.md — exists, >10 lines
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
2. If any document is missing or empty:
|
|
80
|
+
- Log which agent failed
|
|
81
|
+
- Re-spawn that specific agent (max 1 retry per agent)
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Step 4: Summary
|
|
86
|
+
|
|
87
|
+
1. Create `.workflow/research/SUMMARY.md`:
|
|
88
|
+
- Read all 4 documents
|
|
89
|
+
- Write a consolidated executive summary covering:
|
|
90
|
+
- Tech stack overview (from STACK.md)
|
|
91
|
+
- Architecture highlights (from ARCHITECTURE.md)
|
|
92
|
+
- Feature inventory count (from FEATURES.md)
|
|
93
|
+
- Top 3 concerns (from PITFALLS.md)
|
|
94
|
+
- Recommendations for next steps
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Step 5: Commit and Route
|
|
99
|
+
|
|
100
|
+
1. If git repo: commit `.workflow/research/` with message `"chore: map codebase"`
|
|
101
|
+
|
|
102
|
+
2. Display summary:
|
|
103
|
+
```
|
|
104
|
+
Codebase mapped successfully.
|
|
105
|
+
Documents: 5 files in .workflow/research/
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
3. Route next steps based on project state:
|
|
109
|
+
- No `.workflow/state.json` → "Run `/workflow:init` to initialize project"
|
|
110
|
+
- Has state, no roadmap → "Run `/workflow:init` to create roadmap"
|
|
111
|
+
- Has roadmap → "Run `/workflow:plan {next_phase}` to start planning"
|
package/workflows/merge.md
CHANGED
|
@@ -103,15 +103,31 @@ IF NOT target:
|
|
|
103
103
|
completedPhases = []
|
|
104
104
|
incompletePhases = []
|
|
105
105
|
|
|
106
|
-
for
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
106
|
+
// Read worktree state for artifact registry check
|
|
107
|
+
Read {target.path}/.workflow/state.json → wtState (if exists)
|
|
108
|
+
wtArtifacts = wtState?.artifacts ?? []
|
|
109
|
+
useArtifactRegistry = wtArtifacts.length > 0
|
|
110
|
+
|
|
111
|
+
IF useArtifactRegistry:
|
|
112
|
+
// Check phase completeness via artifact registry
|
|
113
|
+
for (phaseNum of target.owned_phases):
|
|
114
|
+
execArtifacts = wtArtifacts.filter(a => a.type === 'execute' && a.phase === phaseNum)
|
|
115
|
+
IF execArtifacts.some(a => a.status === 'completed'):
|
|
116
|
+
completedPhases.push({ phase: phaseNum })
|
|
117
|
+
ELSE:
|
|
118
|
+
status = execArtifacts.length > 0 ? execArtifacts[0].status : 'no_execute_artifact'
|
|
119
|
+
incompletePhases.push({ phase: phaseNum, status })
|
|
120
|
+
ELSE:
|
|
121
|
+
// Legacy: check phases/ directory
|
|
122
|
+
for (phaseNum of target.owned_phases):
|
|
123
|
+
NN = String(phaseNum).padStart(2, '0')
|
|
124
|
+
Glob: {target.path}/.workflow/phases/{NN}-*/index.json
|
|
125
|
+
Read → wtIndex
|
|
110
126
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
127
|
+
IF wtIndex.status === "completed":
|
|
128
|
+
completedPhases.push({ phase: phaseNum, index: wtIndex })
|
|
129
|
+
ELSE:
|
|
130
|
+
incompletePhases.push({ phase: phaseNum, status: wtIndex.status })
|
|
115
131
|
|
|
116
132
|
IF incompletePhases.length > 0 AND NOT force:
|
|
117
133
|
WARN W002: "M{target.milestone_num} ({target.milestone}) has incomplete phases:"
|
|
@@ -181,51 +197,90 @@ Step_7:
|
|
|
181
197
|
|
|
182
198
|
Display "Syncing workflow artifacts for M{target.milestone_num} ({target.milestone})..."
|
|
183
199
|
|
|
184
|
-
// 7a: Copy all owned phase directories from worktree to main
|
|
185
|
-
for (phaseNum of target.owned_phases):
|
|
186
|
-
NN = String(phaseNum).padStart(2, '0')
|
|
187
|
-
Glob: {target.path}/.workflow/phases/{NN}-*/
|
|
188
|
-
phaseDir = matched directory name
|
|
189
|
-
|
|
190
|
-
srcDir = target.path + "/.workflow/phases/" + phaseDir + "/"
|
|
191
|
-
dstDir = ".workflow/phases/" + phaseDir + "/"
|
|
192
|
-
|
|
193
|
-
Bash("cp -r {srcDir}* {dstDir}")
|
|
194
|
-
|
|
195
|
-
// 7b: Atomic state reconciliation
|
|
196
200
|
Read .workflow/state.json → mainState
|
|
197
201
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
202
|
+
IF useArtifactRegistry:
|
|
203
|
+
// 7a: Copy scratch dirs from worktree to main
|
|
204
|
+
Read {target.path}/.workflow/state.json → wtState
|
|
205
|
+
wtArtifacts = wtState?.artifacts ?? []
|
|
206
|
+
milestoneArtifacts = wtArtifacts.filter(a =>
|
|
207
|
+
a.path && (a.milestone === target.milestone || target.owned_phases.includes(a.phase))
|
|
208
|
+
)
|
|
209
|
+
for (art of milestoneArtifacts):
|
|
210
|
+
srcDir = target.path + "/.workflow/" + art.path
|
|
211
|
+
dstDir = ".workflow/" + art.path
|
|
212
|
+
IF directory_exists(srcDir):
|
|
213
|
+
Bash("mkdir -p {dstDir} && cp -r {srcDir}/* {dstDir}/")
|
|
214
|
+
|
|
215
|
+
// 7b: Merge artifact registries
|
|
216
|
+
mainArtifacts = mainState.artifacts ?? []
|
|
217
|
+
existingIds = new Set(mainArtifacts.map(a => a.id))
|
|
218
|
+
for (art of wtArtifacts):
|
|
219
|
+
IF existingIds.has(art.id):
|
|
220
|
+
// Update existing artifact status
|
|
221
|
+
idx = mainArtifacts.findIndex(a => a.id === art.id)
|
|
222
|
+
mainArtifacts[idx] = art
|
|
223
|
+
ELSE:
|
|
224
|
+
mainArtifacts.push(art)
|
|
225
|
+
mainState.artifacts = mainArtifacts
|
|
226
|
+
|
|
227
|
+
// Record merge in transition history
|
|
228
|
+
mainState.transition_history = mainState.transition_history ?? []
|
|
229
|
+
mainState.transition_history.push({
|
|
230
|
+
milestone_num: target.milestone_num,
|
|
231
|
+
milestone: target.milestone,
|
|
232
|
+
action: "worktree_merge",
|
|
233
|
+
completed_at: getUtc8ISOString(),
|
|
234
|
+
branch: target.branch,
|
|
235
|
+
phases: target.owned_phases
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
ELSE:
|
|
239
|
+
// Legacy: copy phase directories from worktree to main
|
|
240
|
+
// 7a: Copy all owned phase directories
|
|
241
|
+
for (phaseNum of target.owned_phases):
|
|
242
|
+
NN = String(phaseNum).padStart(2, '0')
|
|
243
|
+
Glob: {target.path}/.workflow/phases/{NN}-*/
|
|
244
|
+
phaseDir = matched directory name
|
|
245
|
+
|
|
246
|
+
srcDir = target.path + "/.workflow/phases/" + phaseDir + "/"
|
|
247
|
+
dstDir = ".workflow/phases/" + phaseDir + "/"
|
|
248
|
+
|
|
249
|
+
Bash("cp -r {srcDir}* {dstDir}")
|
|
250
|
+
|
|
251
|
+
// 7b: Update phase summaries
|
|
252
|
+
for (phaseNum of target.owned_phases):
|
|
253
|
+
NN = String(phaseNum).padStart(2, '0')
|
|
254
|
+
Glob: .workflow/phases/{NN}-*/index.json
|
|
255
|
+
Read → phaseIndex
|
|
256
|
+
|
|
257
|
+
IF phaseIndex.status === "completed":
|
|
258
|
+
mainState.phases_summary.completed += 1
|
|
259
|
+
mainState.phases_summary.pending -= 1
|
|
260
|
+
IF mainState.phases_summary.pending < 0:
|
|
261
|
+
mainState.phases_summary.pending = 0
|
|
262
|
+
|
|
263
|
+
mainState.transition_history = mainState.transition_history ?? []
|
|
264
|
+
mainState.transition_history.push({
|
|
265
|
+
milestone_num: target.milestone_num,
|
|
266
|
+
milestone: target.milestone,
|
|
267
|
+
phase: phaseNum,
|
|
268
|
+
action: "worktree_merge",
|
|
269
|
+
completed_at: phaseIndex.completed_at ?? getUtc8ISOString(),
|
|
270
|
+
branch: target.branch
|
|
271
|
+
})
|
|
272
|
+
ELSE IF phaseIndex.status !== "forked":
|
|
273
|
+
mainState.phases_summary.in_progress += 1
|
|
274
|
+
mainState.phases_summary.pending -= 1
|
|
275
|
+
IF mainState.phases_summary.pending < 0:
|
|
276
|
+
mainState.phases_summary.pending = 0
|
|
277
|
+
|
|
278
|
+
phaseIndex.updated_at = getUtc8ISOString()
|
|
279
|
+
Write .workflow/phases/{NN}-{slug}/index.json: phaseIndex
|
|
280
|
+
|
|
281
|
+
// Merge accumulated context from worktree (both paths)
|
|
282
|
+
IF NOT useArtifactRegistry:
|
|
283
|
+
Read target.path + "/.workflow/state.json" → wtState (if exists)
|
|
229
284
|
IF wtState?.accumulated_context:
|
|
230
285
|
for (decision of (wtState.accumulated_context.key_decisions ?? [])):
|
|
231
286
|
IF NOT mainState.accumulated_context.key_decisions.includes(decision):
|
|
@@ -236,12 +291,15 @@ IF wtState?.accumulated_context:
|
|
|
236
291
|
mainState.last_updated = getUtc8ISOString()
|
|
237
292
|
Write .workflow/state.json: mainState
|
|
238
293
|
|
|
239
|
-
// 7c: Update roadmap.md
|
|
294
|
+
// 7c: Update roadmap.md (mark completed phases)
|
|
240
295
|
Read .workflow/roadmap.md → roadmap
|
|
241
296
|
for (phaseNum of target.owned_phases):
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
297
|
+
IF useArtifactRegistry:
|
|
298
|
+
isCompleted = completedPhases.some(p => p.phase === phaseNum)
|
|
299
|
+
ELSE:
|
|
300
|
+
Read phase index → isCompleted = (status === "completed")
|
|
301
|
+
IF isCompleted:
|
|
302
|
+
Append " ✅ COMPLETED" to phase title line in roadmap
|
|
245
303
|
Write .workflow/roadmap.md: roadmap
|
|
246
304
|
```
|
|
247
305
|
|