maestro-flow 0.3.12 → 0.3.13

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.
Files changed (235) hide show
  1. package/.claude/CLAUDE.md +7 -0
  2. package/.claude/agents/workflow-analyzer.md +0 -1
  3. package/.claude/agents/workflow-collab-planner.md +0 -1
  4. package/.claude/agents/workflow-debugger.md +0 -1
  5. package/.claude/agents/workflow-integration-checker.md +2 -2
  6. package/.claude/agents/workflow-nyquist-auditor.md +0 -1
  7. package/.claude/agents/workflow-phase-researcher.md +2 -2
  8. package/.claude/agents/workflow-plan-checker.md +1 -1
  9. package/.claude/agents/workflow-planner.md +1 -2
  10. package/.claude/agents/workflow-roadmapper.md +1 -1
  11. package/.claude/agents/workflow-verifier.md +0 -1
  12. package/.claude/commands/learn-retro.md +2 -2
  13. package/.claude/commands/learn-second-opinion.md +2 -2
  14. package/.claude/commands/maestro-analyze.md +10 -2
  15. package/.claude/commands/maestro-brainstorm.md +1 -1
  16. package/.claude/commands/maestro-execute.md +21 -4
  17. package/.claude/commands/maestro-milestone-complete.md +14 -0
  18. package/.claude/commands/maestro-plan.md +12 -6
  19. package/.claude/commands/maestro-roadmap.md +1 -1
  20. package/.claude/commands/maestro-ui-design.md +7 -7
  21. package/.claude/commands/maestro-update.md +176 -0
  22. package/.claude/commands/maestro-verify.md +18 -3
  23. package/.claude/commands/manage-codebase-rebuild.md +0 -1
  24. package/.claude/commands/manage-harvest.md +1 -1
  25. package/.claude/commands/manage-learn.md +5 -5
  26. package/.claude/commands/manage-memory-capture.md +4 -4
  27. package/.claude/commands/manage-memory.md +1 -1
  28. package/.claude/commands/manage-wiki.md +62 -0
  29. package/.claude/commands/quality-business-test.md +2 -2
  30. package/.claude/commands/quality-debug.md +53 -7
  31. package/.claude/commands/quality-retrospective.md +5 -5
  32. package/.claude/commands/quality-review.md +39 -7
  33. package/.claude/commands/quality-sync.md +1 -1
  34. package/.claude/commands/quality-test-gen.md +1 -1
  35. package/.claude/commands/quality-test.md +45 -12
  36. package/.claude/commands/spec-remove.md +51 -0
  37. package/.claude/commands/spec-setup.md +1 -3
  38. package/.claude/commands/wiki-connect.md +9 -5
  39. package/.claude/commands/wiki-digest.md +6 -3
  40. package/.codex/skills/maestro/SKILL.md +2 -2
  41. package/.codex/skills/maestro-analyze/SKILL.md +4 -4
  42. package/.codex/skills/maestro-brainstorm/SKILL.md +4 -4
  43. package/.codex/skills/maestro-coordinate/SKILL.md +2 -2
  44. package/.codex/skills/maestro-execute/SKILL.md +15 -5
  45. package/.codex/skills/maestro-init/SKILL.md +1 -1
  46. package/.codex/skills/maestro-milestone-complete/SKILL.md +18 -1
  47. package/.codex/skills/maestro-plan/SKILL.md +6 -6
  48. package/.codex/skills/maestro-roadmap/SKILL.md +3 -4
  49. package/.codex/skills/maestro-spec-generate/SKILL.md +2 -2
  50. package/.codex/skills/maestro-ui-design/SKILL.md +6 -6
  51. package/.codex/skills/maestro-verify/SKILL.md +20 -11
  52. package/.codex/skills/manage-codebase-rebuild/SKILL.md +4 -4
  53. package/.codex/skills/manage-harvest/SKILL.md +10 -1
  54. package/.codex/skills/manage-issue-discover/SKILL.md +3 -3
  55. package/.codex/skills/manage-learn/SKILL.md +3 -2
  56. package/.codex/skills/manage-memory/SKILL.md +3 -3
  57. package/.codex/skills/manage-memory-capture/SKILL.md +8 -14
  58. package/.codex/skills/manage-status/SKILL.md +9 -4
  59. package/.codex/skills/manage-wiki/SKILL.md +55 -0
  60. package/.codex/skills/quality-business-test/SKILL.md +8 -6
  61. package/.codex/skills/quality-debug/SKILL.md +22 -9
  62. package/.codex/skills/quality-integration-test/SKILL.md +11 -7
  63. package/.codex/skills/quality-retrospective/SKILL.md +45 -26
  64. package/.codex/skills/quality-review/SKILL.md +10 -7
  65. package/.codex/skills/quality-test/SKILL.md +9 -4
  66. package/.codex/skills/quality-test-gen/SKILL.md +13 -9
  67. package/.codex/skills/spec-add/SKILL.md +11 -3
  68. package/.codex/skills/spec-load/SKILL.md +7 -0
  69. package/.codex/skills/spec-map/SKILL.md +2 -2
  70. package/.codex/skills/spec-remove/SKILL.md +101 -0
  71. package/.codex/skills/spec-setup/SKILL.md +4 -8
  72. package/.codex/skills/wiki-connect/SKILL.md +6 -5
  73. package/.codex/skills/wiki-digest/SKILL.md +2 -2
  74. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.d.ts +9 -0
  75. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js +109 -9
  76. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js.map +1 -1
  77. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.test.js +49 -0
  78. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.test.js.map +1 -1
  79. package/dashboard/dist-server/dashboard/src/server/routes/index.js +5 -4
  80. package/dashboard/dist-server/dashboard/src/server/routes/index.js.map +1 -1
  81. package/dashboard/dist-server/dashboard/src/server/routes/specs.d.ts +5 -13
  82. package/dashboard/dist-server/dashboard/src/server/routes/specs.js +97 -155
  83. package/dashboard/dist-server/dashboard/src/server/routes/specs.js.map +1 -1
  84. package/dashboard/dist-server/dashboard/src/server/routes/wiki.d.ts +11 -1
  85. package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js +27 -6
  86. package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js.map +1 -1
  87. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js +25 -7
  88. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js.map +1 -1
  89. package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js +8 -0
  90. package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js.map +1 -1
  91. package/dashboard/dist-server/dashboard/src/server/wiki/search.js +1 -0
  92. package/dashboard/dist-server/dashboard/src/server/wiki/search.js.map +1 -1
  93. package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.d.ts +29 -0
  94. package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.js +148 -0
  95. package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.js.map +1 -0
  96. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +4 -2
  97. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
  98. package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js +8 -2
  99. package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js.map +1 -1
  100. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.d.ts +5 -0
  101. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +80 -38
  102. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
  103. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js +8 -6
  104. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js.map +1 -1
  105. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-types.d.ts +40 -5
  106. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js +21 -23
  107. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js.map +1 -1
  108. package/dashboard/dist-server/dashboard/src/server/wiki/writer.d.ts +33 -3
  109. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js +184 -12
  110. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js.map +1 -1
  111. package/dashboard/dist-server/src/commands/delegate.js +26 -0
  112. package/dashboard/dist-server/src/commands/delegate.js.map +1 -1
  113. package/dashboard/dist-server/src/coordinator/graph-types.d.ts +11 -1
  114. package/dashboard/dist-server/src/coordinator/graph-walker.js +29 -2
  115. package/dashboard/dist-server/src/coordinator/graph-walker.js.map +1 -1
  116. package/dashboard/dist-server/src/coordinator/prompt-assembler.js +3 -2
  117. package/dashboard/dist-server/src/coordinator/prompt-assembler.js.map +1 -1
  118. package/dashboard/dist-server/src/hooks/constants.d.ts +29 -60
  119. package/dashboard/dist-server/src/hooks/constants.js +105 -82
  120. package/dashboard/dist-server/src/hooks/constants.js.map +1 -1
  121. package/dashboard/dist-server/src/types/index.d.ts +2 -1
  122. package/dist/src/commands/delegate.d.ts.map +1 -1
  123. package/dist/src/commands/delegate.js +26 -0
  124. package/dist/src/commands/delegate.js.map +1 -1
  125. package/dist/src/commands/hooks.d.ts +2 -4
  126. package/dist/src/commands/hooks.d.ts.map +1 -1
  127. package/dist/src/commands/hooks.js +4 -7
  128. package/dist/src/commands/hooks.js.map +1 -1
  129. package/dist/src/commands/install-ui/InstallConfirm.d.ts +2 -3
  130. package/dist/src/commands/install-ui/InstallConfirm.d.ts.map +1 -1
  131. package/dist/src/commands/install-ui/InstallConfirm.js +1 -1
  132. package/dist/src/commands/install-ui/InstallConfirm.js.map +1 -1
  133. package/dist/src/commands/install-ui/InstallExecution.d.ts.map +1 -1
  134. package/dist/src/commands/install-ui/InstallExecution.js +1 -2
  135. package/dist/src/commands/install-ui/InstallExecution.js.map +1 -1
  136. package/dist/src/commands/install-ui/InstallFlow.d.ts.map +1 -1
  137. package/dist/src/commands/install-ui/InstallFlow.js +5 -7
  138. package/dist/src/commands/install-ui/InstallFlow.js.map +1 -1
  139. package/dist/src/commands/install-ui/StatuslineConfig.d.ts +3 -6
  140. package/dist/src/commands/install-ui/StatuslineConfig.d.ts.map +1 -1
  141. package/dist/src/commands/install-ui/StatuslineConfig.js +21 -17
  142. package/dist/src/commands/install-ui/StatuslineConfig.js.map +1 -1
  143. package/dist/src/commands/update.d.ts.map +1 -1
  144. package/dist/src/commands/update.js +95 -0
  145. package/dist/src/commands/update.js.map +1 -1
  146. package/dist/src/commands/wiki.d.ts.map +1 -1
  147. package/dist/src/commands/wiki.js +75 -11
  148. package/dist/src/commands/wiki.js.map +1 -1
  149. package/dist/src/coordinator/graph-types.d.ts +11 -1
  150. package/dist/src/coordinator/graph-types.d.ts.map +1 -1
  151. package/dist/src/coordinator/graph-walker.d.ts.map +1 -1
  152. package/dist/src/coordinator/graph-walker.js +29 -2
  153. package/dist/src/coordinator/graph-walker.js.map +1 -1
  154. package/dist/src/coordinator/prompt-assembler.d.ts.map +1 -1
  155. package/dist/src/coordinator/prompt-assembler.js +3 -2
  156. package/dist/src/coordinator/prompt-assembler.js.map +1 -1
  157. package/dist/src/hooks/__tests__/statusline-visual-test.d.ts +4 -1
  158. package/dist/src/hooks/__tests__/statusline-visual-test.d.ts.map +1 -1
  159. package/dist/src/hooks/__tests__/statusline-visual-test.js +55 -174
  160. package/dist/src/hooks/__tests__/statusline-visual-test.js.map +1 -1
  161. package/dist/src/hooks/constants.d.ts +29 -60
  162. package/dist/src/hooks/constants.d.ts.map +1 -1
  163. package/dist/src/hooks/constants.js +105 -82
  164. package/dist/src/hooks/constants.js.map +1 -1
  165. package/dist/src/hooks/skill-context.d.ts.map +1 -1
  166. package/dist/src/hooks/skill-context.js +54 -6
  167. package/dist/src/hooks/skill-context.js.map +1 -1
  168. package/dist/src/hooks/statusline.d.ts +11 -8
  169. package/dist/src/hooks/statusline.d.ts.map +1 -1
  170. package/dist/src/hooks/statusline.js +284 -182
  171. package/dist/src/hooks/statusline.js.map +1 -1
  172. package/dist/src/hooks/workspace.d.ts.map +1 -1
  173. package/dist/src/hooks/workspace.js +2 -1
  174. package/dist/src/hooks/workspace.js.map +1 -1
  175. package/dist/src/migrations/_template.d.ts +12 -0
  176. package/dist/src/migrations/_template.d.ts.map +1 -0
  177. package/dist/src/migrations/_template.js +55 -0
  178. package/dist/src/migrations/_template.js.map +1 -0
  179. package/dist/src/migrations/index.d.ts +14 -0
  180. package/dist/src/migrations/index.d.ts.map +1 -0
  181. package/dist/src/migrations/index.js +20 -0
  182. package/dist/src/migrations/index.js.map +1 -0
  183. package/dist/src/migrations/run.d.ts +12 -0
  184. package/dist/src/migrations/run.d.ts.map +1 -0
  185. package/dist/src/migrations/run.js +119 -0
  186. package/dist/src/migrations/run.js.map +1 -0
  187. package/dist/src/migrations/v1-to-v2.d.ts +10 -0
  188. package/dist/src/migrations/v1-to-v2.d.ts.map +1 -0
  189. package/dist/src/migrations/v1-to-v2.js +71 -0
  190. package/dist/src/migrations/v1-to-v2.js.map +1 -0
  191. package/dist/src/tools/team-activity.d.ts.map +1 -1
  192. package/dist/src/tools/team-activity.js +22 -0
  193. package/dist/src/tools/team-activity.js.map +1 -1
  194. package/dist/src/tools/transition-recorder.d.ts +2 -17
  195. package/dist/src/tools/transition-recorder.d.ts.map +1 -1
  196. package/dist/src/tools/transition-recorder.js +6 -3
  197. package/dist/src/tools/transition-recorder.js.map +1 -1
  198. package/dist/src/types/index.d.ts +2 -1
  199. package/dist/src/types/index.d.ts.map +1 -1
  200. package/dist/src/utils/migration-registry.d.ts +65 -0
  201. package/dist/src/utils/migration-registry.d.ts.map +1 -0
  202. package/dist/src/utils/migration-registry.js +117 -0
  203. package/dist/src/utils/migration-registry.js.map +1 -0
  204. package/dist/src/utils/state-schema.d.ts +153 -0
  205. package/dist/src/utils/state-schema.d.ts.map +1 -0
  206. package/dist/src/utils/state-schema.js +329 -0
  207. package/dist/src/utils/state-schema.js.map +1 -0
  208. package/package.json +1 -1
  209. package/templates/state.json +17 -39
  210. package/workflows/brainstorm.md +3 -3
  211. package/workflows/codebase-rebuild.md +2 -12
  212. package/workflows/debug.md +7 -8
  213. package/workflows/execute.md +18 -4
  214. package/workflows/fork.md +37 -86
  215. package/workflows/init.md +1 -4
  216. package/workflows/integration-test.md +4 -5
  217. package/workflows/issue.md +3 -9
  218. package/workflows/learn.md +20 -19
  219. package/workflows/maestro.codex.md +8 -1
  220. package/workflows/maestro.md +12 -3
  221. package/workflows/memory.md +26 -71
  222. package/workflows/merge.md +45 -107
  223. package/workflows/milestone-complete.md +24 -7
  224. package/workflows/retrospective.md +77 -109
  225. package/workflows/review.md +5 -12
  226. package/workflows/specs-remove.md +115 -0
  227. package/workflows/specs-setup.md +10 -32
  228. package/workflows/status.md +291 -290
  229. package/workflows/sync.md +5 -5
  230. package/workflows/test.md +4 -5
  231. package/workflows/ui-style.md +3 -4
  232. package/workflows/verify.md +2 -2
  233. package/workflows/wiki-connect.md +188 -0
  234. package/workflows/wiki-digest.md +221 -0
  235. package/workflows/wiki-manage.md +204 -0
@@ -1,290 +1,291 @@
1
- # Workflow: status
2
-
3
- Status dashboard with intelligent routing.
4
-
5
- ---
6
-
7
- ## Step 1: Load State
8
-
9
- 1. Check `.workflow/state.json` exists:
10
- - If missing → display "No project initialized. Run `/workflow:init` to start." → exit
11
-
12
- 2. Read `.workflow/state.json`:
13
- - Extract: project_name, current_milestone, current_phase, status, phases_summary
14
- - Extract: accumulated_context (key_decisions, blockers, deferred)
15
-
16
- 3. Read `.workflow/roadmap.md`:
17
- - Extract phase list with titles
18
-
19
- 4. Load Issue State:
20
- - If `.workflow/issues/issues.jsonl` exists:
21
- - Read all lines, parse each as JSON
22
- - Compute statistics:
23
- ```
24
- by_status: {
25
- registered: count(status == "registered"),
26
- diagnosed: count(status == "diagnosed"),
27
- planning: count(status == "planning"),
28
- planned: count(status == "planned"),
29
- executing: count(status == "executing")
30
- }
31
- by_severity: {
32
- critical: count(severity == "critical"),
33
- high: count(severity == "high"),
34
- medium: count(severity == "medium"),
35
- low: count(severity == "low")
36
- }
37
- total_open: count where status NOT in [completed, failed, deferred]
38
- critical_open: count where severity == "critical" AND status NOT in [completed, failed, deferred]
39
- critical_issues: list of {id, title, status} where severity == "critical" AND status NOT in [completed, failed, deferred]
40
- ```
41
- - Store as issue_state
42
- - Else:
43
- - issue_state = null (no issues tracked)
44
-
45
- ---
46
-
47
- ## Step 2: Build Virtual Phase View from Artifact Registry
48
-
49
- Derive phase progress from `state.json.artifacts[]`:
50
-
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
- ```
84
-
85
- ---
86
-
87
- ## Step 2.5: Artifact Registry Consistency Check
88
-
89
- ```
90
- IF .workflow/roadmap.md exists:
91
- roadmap_phases = parse phase headings from roadmap.md (count "### Phase N:" entries)
92
- artifact_phases = unique phase numbers from milestone_artifacts
93
-
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"
98
-
99
- ELSE IF NOT .workflow/roadmap.md exists AND state.json.phases_summary.total > 0:
100
- Display WARNING:
101
- ⚠️ Roadmap missing but state.json references {total} phases.
102
- This may indicate a completed milestone. Run /maestro continue to plan next milestone.
103
- ```
104
-
105
- ---
106
-
107
- ## Step 3: Compute Progress
108
-
109
- 1. Count by status:
110
- ```
111
- total = phases.length
112
- completed = phases.filter(status == "completed").length
113
- executing = phases.filter(status == "executing").length
114
- planning = phases.filter(status == "planning").length
115
- exploring = phases.filter(status == "exploring").length
116
- pending = phases.filter(status == "pending").length
117
- blocked = phases.filter(status == "blocked").length
118
- ```
119
-
120
- 2. Calculate overall progress:
121
- ```
122
- progress_pct = (completed / total) * 100
123
- ```
124
-
125
- ---
126
-
127
- ## Step 4: Display Dashboard
128
-
129
- ```
130
- ====================================================
131
- PROJECT: {project_name}
132
- MILESTONE: {current_milestone}
133
- STATUS: {status}
134
- PROGRESS: [{progress_bar}] {completed}/{total} phases ({progress_pct}%)
135
- ====================================================
136
-
137
- PHASES:
138
- {for each phase}
139
- [{status_icon}] Phase {number}: {title}
140
- Status: {status}
141
- Tasks: {tasks_completed}/{tasks_total}
142
- Verification: {verification_status}
143
- {/for}
144
-
145
- CONTEXT:
146
- Key Decisions: {key_decisions, comma-separated}
147
- Blockers: {blockers or "none"}
148
- Deferred: {deferred or "none"}
149
-
150
- ====================================================
151
- ```
152
-
153
- ### Step 4.1: Render Issue Summary
154
-
155
- If issue_state is not null:
156
-
157
- ```
158
- ┌─────────────────────────────────────────┐
159
- │ ISSUES │
160
- ├─────────────────────────────────────────┤
161
- │ Open: {total_open} │
162
- Critical: {critical_open}
163
- By Status:
164
- registered: {N} | diagnosed: {N}
165
- planning: {N} | planned: {N}
166
- executing: {N}
167
-
168
- Critical Issues:
169
- {id} | {title (truncated 40ch)} | {status}
170
- ...
171
- └─────────────────────────────────────────┘
172
- ```
173
-
174
- If critical_issues is empty, omit the "Critical Issues:" sub-section.
175
-
176
- If accumulated_context.blockers is non-empty AND issue_state has critical issues:
177
- - Print: "Note: Blockers are now tracked as critical issues in .workflow/issues/issues.jsonl"
178
-
179
- If accumulated_context.deferred is non-empty:
180
- - Print: "Note: Deferred items are tracked as deferred issues. Use /manage-issue list --status deferred"
181
-
182
- Else (issue_state is null):
183
- - Print: "ISSUES: No issues tracked. Use /manage-issue create or /maestro-verify to discover issues."
184
-
185
- Status icons:
186
- - `[x]` completed
187
- - `[>]` executing / in_progress
188
- - `[~]` planning / exploring
189
- - `[ ]` pending
190
- - `[!]` blocked
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
-
227
- ---
228
-
229
- ## Step 5: Route Next Step
230
-
231
- ### Step 5.0: Issue-Aware Routing
232
-
233
- If issue_state is not null, evaluate issue-based recommendations BEFORE status routing:
234
-
235
- If critical_open > 0:
236
- - Recommend: "{critical_open} critical issues require attention"
237
- - Suggest: Skill({ skill: "manage-issue", args: "list --severity critical" })
238
- - Suggest: Skill({ skill: "quality-debug", args: "--from-uat" })
239
-
240
- If by_status.diagnosed > 0:
241
- - Recommend: "{diagnosed} issues diagnosed and ready for planning"
242
- - Suggest: Skill({ skill: "maestro-plan", args: "--gaps" })
243
-
244
- If by_status.registered > 0:
245
- - Recommend: "{registered} new issues need investigation"
246
- - Suggest: Skill({ skill: "quality-debug" })
247
-
248
- ### Step 5.1: Status-Based Routing
249
-
250
- Based on current project status, suggest the next command:
251
-
252
- ```
253
- STATUS ROUTING TABLE:
254
- -------------------------------------------------------------
255
- Current Status | Suggested Command | Reason
256
- -------------------------------------------------------------
257
- idle | /workflow:init | Project needs initialization
258
- exploring | /maestro-analyze -q | Continue exploration, lock decisions
259
- | /workflow:plan {phase} | Ready to plan
260
- planning | /workflow:plan {phase} | Resume planning
261
- executing | /workflow:execute {phase} | Resume execution
262
- verifying | /workflow:verify {phase} | Complete verification
263
- | /workflow:review {phase} | Code quality review
264
- | /workflow:test {phase} | Run tests
265
- reviewing | /workflow:review {phase} | Complete review
266
- testing | /workflow:test {phase} | Complete testing
267
- completed (phase) | /workflow:phase-transition | Move to next phase
268
- completed (all) | /workflow:milestone-audit | Audit milestone
269
- blocked | /workflow:debug | Resolve blockers
270
- -------------------------------------------------------------
271
- ```
272
-
273
- Display:
274
- ```
275
- NEXT STEP: /workflow:{suggested_command}
276
- {reason}
277
- ```
278
-
279
- If there are blockers, display them prominently before the routing suggestion.
280
-
281
- ---
282
-
283
- ## Step 6: Scratch Tasks (if any)
284
-
285
- Check `.workflow/scratch/` for active tasks:
286
-
287
- 1. For each `scratch/*/index.json` where status != "completed":
288
- - Display: type, title, status, progress
289
- 2. If active scratch tasks exist:
290
- - Note: "Active scratch tasks found. These are independent of phase pipeline."
1
+ # Workflow: status
2
+
3
+ Status dashboard with intelligent routing.
4
+
5
+ ---
6
+
7
+ ## Step 1: Load State
8
+
9
+ 1. Check `.workflow/state.json` exists:
10
+ - If missing → display "No project initialized. Run `/workflow:init` to start." → exit
11
+
12
+ 2. Read `.workflow/state.json`:
13
+ - Extract: project_name, current_milestone, status, milestones, artifacts
14
+ - Derive current_phase and phases_summary from artifacts[] (see src/utils/state-schema.ts)
15
+ - Extract: accumulated_context (key_decisions, blockers, deferred)
16
+
17
+ 3. Read `.workflow/roadmap.md`:
18
+ - Extract phase list with titles
19
+
20
+ 4. Load Issue State:
21
+ - If `.workflow/issues/issues.jsonl` exists:
22
+ - Read all lines, parse each as JSON
23
+ - Compute statistics:
24
+ ```
25
+ by_status: {
26
+ registered: count(status == "registered"),
27
+ diagnosed: count(status == "diagnosed"),
28
+ planning: count(status == "planning"),
29
+ planned: count(status == "planned"),
30
+ executing: count(status == "executing")
31
+ }
32
+ by_severity: {
33
+ critical: count(severity == "critical"),
34
+ high: count(severity == "high"),
35
+ medium: count(severity == "medium"),
36
+ low: count(severity == "low")
37
+ }
38
+ total_open: count where status NOT in [completed, failed, deferred]
39
+ critical_open: count where severity == "critical" AND status NOT in [completed, failed, deferred]
40
+ critical_issues: list of {id, title, status} where severity == "critical" AND status NOT in [completed, failed, deferred]
41
+ ```
42
+ - Store as issue_state
43
+ - Else:
44
+ - issue_state = null (no issues tracked)
45
+
46
+ ---
47
+
48
+ ## Step 2: Build Virtual Phase View from Artifact Registry
49
+
50
+ Derive phase progress from `state.json.artifacts[]`:
51
+
52
+ ```
53
+ // Group artifacts by phase for current milestone
54
+ milestone_artifacts = state.json.artifacts.filter(a => a.milestone == current_milestone)
55
+
56
+ // Build phase view from roadmap + artifact registry
57
+ phases_from_roadmap = parse roadmap.md → list of { number, slug, title }
58
+
59
+ FOR each phase IN phases_from_roadmap:
60
+ phase_artifacts = milestone_artifacts.filter(a => a.phase == phase.number)
61
+ has_analyze = phase_artifacts.some(a => a.type == "analyze" && a.status == "completed")
62
+ has_plan = phase_artifacts.some(a => a.type == "plan" && a.status == "completed")
63
+ has_execute = phase_artifacts.some(a => a.type == "execute" && a.status == "completed")
64
+ has_verify = phase_artifacts.some(a => a.type == "verify" && a.status == "completed")
65
+
66
+ // Derive status from artifact chain
67
+ status = has_verify ? "verified" :
68
+ has_execute ? "executed" :
69
+ has_plan ? "planned" :
70
+ has_analyze ? "analyzed" :
71
+ "pending"
72
+
73
+ // Get task counts from plan artifacts
74
+ plan_artifact = phase_artifacts.find(a => a.type == "plan" && a.status == "completed")
75
+ IF plan_artifact:
76
+ plan_json = read .workflow/{plan_artifact.path}/plan.json
77
+ tasks_total = plan_json.task_ids.length
78
+ tasks_completed = count .task/TASK-*.json where status == "completed"
79
+
80
+ phases[] = { number, slug, title, status, tasks_total, tasks_completed, has_verify }
81
+
82
+ // Also show adhoc artifacts
83
+ adhoc_artifacts = milestone_artifacts.filter(a => a.scope == "adhoc")
84
+ ```
85
+
86
+ ---
87
+
88
+ ## Step 2.5: Artifact Registry Consistency Check
89
+
90
+ ```
91
+ IF .workflow/roadmap.md exists:
92
+ roadmap_phases = parse phase headings from roadmap.md (count "### Phase N:" entries)
93
+ artifact_phases = unique phase numbers from milestone_artifacts
94
+
95
+ // Check for unregistered work (artifacts without matching roadmap phases)
96
+ orphan_artifacts = milestone_artifacts.filter(a => a.phase && !roadmap_phases.includes(a.phase))
97
+ IF orphan_artifacts.length > 0:
98
+ Display WARNING: "Artifacts reference phases not in roadmap"
99
+
100
+ ELSE IF NOT .workflow/roadmap.md exists AND milestone_artifacts.length > 0:
101
+ Display WARNING:
102
+ ⚠️ Roadmap missing but artifact registry has {milestone_artifacts.length} entries.
103
+ This may indicate a completed milestone. Run /maestro continue to plan next milestone.
104
+ ```
105
+
106
+ ---
107
+
108
+ ## Step 3: Compute Progress
109
+
110
+ 1. Count by status:
111
+ ```
112
+ total = phases.length
113
+ completed = phases.filter(status == "completed").length
114
+ executing = phases.filter(status == "executing").length
115
+ planning = phases.filter(status == "planning").length
116
+ exploring = phases.filter(status == "exploring").length
117
+ pending = phases.filter(status == "pending").length
118
+ blocked = phases.filter(status == "blocked").length
119
+ ```
120
+
121
+ 2. Calculate overall progress:
122
+ ```
123
+ progress_pct = (completed / total) * 100
124
+ ```
125
+
126
+ ---
127
+
128
+ ## Step 4: Display Dashboard
129
+
130
+ ```
131
+ ====================================================
132
+ PROJECT: {project_name}
133
+ MILESTONE: {current_milestone}
134
+ STATUS: {status}
135
+ PROGRESS: [{progress_bar}] {completed}/{total} phases ({progress_pct}%)
136
+ ====================================================
137
+
138
+ PHASES:
139
+ {for each phase}
140
+ [{status_icon}] Phase {number}: {title}
141
+ Status: {status}
142
+ Tasks: {tasks_completed}/{tasks_total}
143
+ Verification: {verification_status}
144
+ {/for}
145
+
146
+ CONTEXT:
147
+ Key Decisions: {key_decisions, comma-separated}
148
+ Blockers: {blockers or "none"}
149
+ Deferred: {deferred or "none"}
150
+
151
+ ====================================================
152
+ ```
153
+
154
+ ### Step 4.1: Render Issue Summary
155
+
156
+ If issue_state is not null:
157
+
158
+ ```
159
+ ┌─────────────────────────────────────────┐
160
+ │ ISSUES │
161
+ ├─────────────────────────────────────────┤
162
+ Open: {total_open}
163
+ Critical: {critical_open}
164
+ By Status:
165
+ registered: {N} | diagnosed: {N}
166
+ planning: {N} | planned: {N}
167
+ executing: {N}
168
+
169
+ Critical Issues:
170
+ {id} | {title (truncated 40ch)} | {status}
171
+ │ ... │
172
+ └─────────────────────────────────────────┘
173
+ ```
174
+
175
+ If critical_issues is empty, omit the "Critical Issues:" sub-section.
176
+
177
+ If accumulated_context.blockers is non-empty AND issue_state has critical issues:
178
+ - Print: "Note: Blockers are now tracked as critical issues in .workflow/issues/issues.jsonl"
179
+
180
+ If accumulated_context.deferred is non-empty:
181
+ - Print: "Note: Deferred items are tracked as deferred issues. Use /manage-issue list --status deferred"
182
+
183
+ Else (issue_state is null):
184
+ - Print: "ISSUES: No issues tracked. Use /manage-issue create or /maestro-verify to discover issues."
185
+
186
+ Status icons:
187
+ - `[x]` completed
188
+ - `[>]` executing / in_progress
189
+ - `[~]` planning / exploring
190
+ - `[ ]` pending
191
+ - `[!]` blocked
192
+
193
+ ### Step 4.2: Render Worktree Status
194
+
195
+ ```
196
+ IF file_exists(".workflow/worktree-scope.json"):
197
+ // Running inside a worktree
198
+ Read .workflow/worktree-scope.json → scope
199
+ Display:
200
+ ┌─────────────────────────────────────────┐
201
+ │ WORKTREE MODE │
202
+ ├─────────────────────────────────────────┤
203
+ Milestone: {scope.milestone}
204
+ Branch: {scope.branch}
205
+ Phases: {scope.owned_phases}
206
+ │ Main: {scope.main_worktree} │
207
+ └─────────────────────────────────────────┘
208
+
209
+ ELSE IF file_exists(".workflow/worktrees.json"):
210
+ // Running in main worktree with active worktrees
211
+ Read .workflow/worktrees.json registry
212
+ activeWorktrees = registry.worktrees.filter(w => w.status === "active")
213
+
214
+ IF activeWorktrees.length > 0:
215
+ Display:
216
+ ┌─────────────────────────────────────────┐
217
+ │ ACTIVE WORKTREES │
218
+ ├─────────────────────────────────────────┤
219
+ {for each wt in activeWorktrees}
220
+ {wt.milestone} | {wt.branch} | {wt.path} │
221
+ {/for}
222
+
223
+ Sync: /maestro-fork <milestone> --sync
224
+ │ Merge: /maestro-merge <milestone> │
225
+ └─────────────────────────────────────────┘
226
+ ```
227
+
228
+ ---
229
+
230
+ ## Step 5: Route Next Step
231
+
232
+ ### Step 5.0: Issue-Aware Routing
233
+
234
+ If issue_state is not null, evaluate issue-based recommendations BEFORE status routing:
235
+
236
+ If critical_open > 0:
237
+ - Recommend: "{critical_open} critical issues require attention"
238
+ - Suggest: Skill({ skill: "manage-issue", args: "list --severity critical" })
239
+ - Suggest: Skill({ skill: "quality-debug", args: "--from-uat" })
240
+
241
+ If by_status.diagnosed > 0:
242
+ - Recommend: "{diagnosed} issues diagnosed and ready for planning"
243
+ - Suggest: Skill({ skill: "maestro-plan", args: "--gaps" })
244
+
245
+ If by_status.registered > 0:
246
+ - Recommend: "{registered} new issues need investigation"
247
+ - Suggest: Skill({ skill: "quality-debug" })
248
+
249
+ ### Step 5.1: Status-Based Routing
250
+
251
+ Based on current project status, suggest the next command:
252
+
253
+ ```
254
+ STATUS ROUTING TABLE:
255
+ -------------------------------------------------------------
256
+ Current Status | Suggested Command | Reason
257
+ -------------------------------------------------------------
258
+ idle | /workflow:init | Project needs initialization
259
+ exploring | /maestro-analyze -q | Continue exploration, lock decisions
260
+ | /workflow:plan {phase} | Ready to plan
261
+ planning | /workflow:plan {phase} | Resume planning
262
+ executing | /workflow:execute {phase} | Resume execution
263
+ verifying | /workflow:verify {phase} | Complete verification
264
+ | /workflow:review {phase} | Code quality review
265
+ | /workflow:test {phase} | Run tests
266
+ reviewing | /workflow:review {phase} | Complete review
267
+ testing | /workflow:test {phase} | Complete testing
268
+ completed (phase) | /workflow:phase-transition | Move to next phase
269
+ completed (all) | /workflow:milestone-audit | Audit milestone
270
+ blocked | /workflow:debug | Resolve blockers
271
+ -------------------------------------------------------------
272
+ ```
273
+
274
+ Display:
275
+ ```
276
+ NEXT STEP: /workflow:{suggested_command}
277
+ {reason}
278
+ ```
279
+
280
+ If there are blockers, display them prominently before the routing suggestion.
281
+
282
+ ---
283
+
284
+ ## Step 6: Scratch Tasks (if any)
285
+
286
+ Check `.workflow/scratch/` for active tasks:
287
+
288
+ 1. For each `scratch/*/index.json` where status != "completed":
289
+ - Display: type, title, status, progress
290
+ 2. If active scratch tasks exist:
291
+ - Note: "Active scratch tasks found. These are independent of phase pipeline."
package/workflows/sync.md CHANGED
@@ -159,14 +159,14 @@ Check if changes warrant spec updates:
159
159
  - If new architectural patterns emerged: note in appropriate spec
160
160
  - Skip if no spec-relevant changes detected
161
161
 
162
- Check if dependency manifests changed (project-tech.json refresh):
162
+ Check if dependency manifests changed (project.md Tech Stack refresh):
163
163
  dependency_files = ["package.json", "go.mod", "pyproject.toml", "Cargo.toml",
164
164
  "requirements.txt", "pom.xml", "build.gradle", "Gemfile"]
165
165
  changed_deps = changed_files.filter(f => dependency_files.includes(basename(f)))
166
- If changed_deps.length > 0 AND .workflow/project-tech.json exists:
166
+ If changed_deps.length > 0 AND .workflow/project.md exists:
167
167
  Re-scan dependency manifests for current tech stack
168
- Update .workflow/project-tech.json with detected changes
169
- Display: "project-tech.json: refreshed from {changed_deps.join(', ')}"
168
+ Update .workflow/project.md Tech Stack section with detected changes
169
+ Display: "project.md: Tech Stack refreshed from {changed_deps.join(', ')}"
170
170
  ```
171
171
 
172
172
  ### Step 8: Create Action Log
@@ -241,4 +241,4 @@ Sync complete:
241
241
  | `.workflow/codebase/tech-registry/{slug}.md` | Regenerated for affected components |
242
242
  | `.workflow/codebase/feature-maps/{slug}.md` | Regenerated for affected features |
243
243
  | `.workflow/codebase/action-logs/{hash}.md` | Created |
244
- | `.workflow/project-tech.json` | Updated if dependency manifests changed |
244
+ | `.workflow/project.md` | Tech Stack section updated if dependency manifests changed |
package/workflows/test.md CHANGED
@@ -26,11 +26,11 @@ Determine test target from $ARGUMENTS:
26
26
  ```
27
27
  Read .workflow/state.json → state
28
28
  artifacts = state.artifacts ?? []
29
- IF artifacts.length > 0:
30
- art = artifacts.find(a => a.type === 'execute' && a.phase === phaseNum)
29
+ art = artifacts.find(a => a.type === 'execute' && a.phase === phaseNum)
30
+ IF art:
31
31
  PHASE_DIR = ".workflow/" + art.path
32
32
  ELSE:
33
- PHASE_DIR = ".workflow/phases/{NN}-{slug}/"
33
+ ERROR "Phase {phaseNum} not found in artifact registry"
34
34
  ```
35
35
  - Load `$PHASE_DIR/index.json` for context
36
36
 
@@ -54,9 +54,8 @@ Validate target exists and has been verified (verification.json present). (E002)
54
54
  ### Step 2: Check Active Sessions
55
55
 
56
56
  ```bash
57
- # Check both scratch (artifact registry) and legacy phases for active UAT sessions
57
+ # Check scratch dirs (resolved via artifact registry) for active UAT sessions
58
58
  find .workflow/scratch -name "uat.md" -type f 2>/dev/null | head -5
59
- find .workflow/phases -name "uat.md" -type f 2>/dev/null | head -5
60
59
  ```
61
60
 
62
61
  Read each file's frontmatter (status, target) and Current Test section.