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
package/workflows/fork.md CHANGED
@@ -121,25 +121,17 @@ IF syncMode:
121
121
  ## Step 5: Validate & Confirm
122
122
 
123
123
  ```
124
- // Load phase status artifact registry first, fallback to legacy phases/
124
+ // Load phase status from artifact registry
125
125
  phaseList = []
126
126
  artifacts = projectState.artifacts ?? []
127
- useArtifactRegistry = artifacts.length > 0
128
-
129
- IF useArtifactRegistry:
130
- // Derive phase status from artifact registry
131
- for (phaseNum of milestonePhases):
132
- execArtifacts = artifacts.filter(a => a.type === 'execute' && a.phase === phaseNum)
133
- status = execArtifacts.some(a => a.status === 'completed') ? 'completed'
134
- : execArtifacts.length > 0 ? 'in_progress'
135
- : 'pending'
136
- phaseList.push({ phase: phaseNum, title: "Phase " + phaseNum, status })
137
- ELSE:
138
- // Legacy: load from phases/ directory
139
- for (phaseNum of milestonePhases):
140
- Glob: .workflow/phases/{NN}-*/index.json where NN matches phaseNum
141
- Read index.json → phaseIndex
142
- phaseList.push(phaseIndex)
127
+
128
+ // Derive phase status from artifact registry
129
+ for (phaseNum of milestonePhases):
130
+ execArtifacts = artifacts.filter(a => a.type === 'execute' && a.phase === phaseNum)
131
+ status = execArtifacts.some(a => a.status === 'completed') ? 'completed'
132
+ : execArtifacts.length > 0 ? 'in_progress'
133
+ : 'pending'
134
+ phaseList.push({ phase: phaseNum, title: "Phase " + phaseNum, status })
143
135
 
144
136
  // Validate: milestone should have at least one non-completed phase
145
137
  nonCompleted = phaseList.filter(p => p.status !== "completed")
@@ -198,63 +190,35 @@ IF directory_exists(".workflow/specs"):
198
190
  // 6e: Copy milestone artifacts to worktree
199
191
  ownedPhaseNumbers = milestonePhases.slice() // all phases in this milestone
200
192
 
201
- IF useArtifactRegistry:
202
- // Copy scratch dirs for this milestone's artifacts
203
- milestoneArtifacts = artifacts.filter(a =>
204
- a.milestone === milestoneName && a.path
205
- )
206
- for (art of milestoneArtifacts):
207
- IF directory_exists(".workflow/" + art.path):
208
- Copy .workflow/{art.path}/ → {wtPath}/.workflow/{art.path}/
209
- ELSE:
210
- // Legacy: copy phase directories
211
- Bash("mkdir -p {wtPath}/.workflow/phases")
212
- for (p of phaseList):
213
- NN = String(p.phase).padStart(2, '0')
214
- Copy .workflow/phases/{NN}-{p.slug}/ → {wtPath}/.workflow/phases/{NN}-{p.slug}/
193
+ // Copy scratch dirs for this milestone's artifacts
194
+ milestoneArtifacts = artifacts.filter(a =>
195
+ a.milestone === milestoneName && a.path
196
+ )
197
+ for (art of milestoneArtifacts):
198
+ IF directory_exists(".workflow/" + art.path):
199
+ Copy .workflow/{art.path}/ {wtPath}/.workflow/{art.path}/
215
200
 
216
201
  // 6f: Copy dependency artifacts (phases outside this milestone)
217
- IF useArtifactRegistry:
218
- // Collect dependency phases from roadmap milestone entry
219
- // (cross-milestone dependencies are defined in milestoneEntry.depends_on or roadmap)
220
- depPhases = new Set()
221
- IF milestoneEntry.depends_on:
222
- for (dep of milestoneEntry.depends_on):
223
- IF NOT ownedPhaseNumbers.includes(dep):
224
- depPhases.add(dep)
225
- // Copy dependency artifacts from main
226
- for (dep of depPhases):
227
- depArtifacts = artifacts.filter(a => a.phase === dep && a.path)
228
- for (art of depArtifacts):
229
- IF directory_exists(".workflow/" + art.path):
230
- Copy .workflow/{art.path}/ → {wtPath}/.workflow/{art.path}/
231
- ELSE:
232
- // Legacy: copy completed dependency phase dirs
233
- allDeps = new Set()
234
- for (p of phaseList):
235
- IF p.depends_on:
236
- for (dep of p.depends_on):
237
- IF NOT ownedPhaseNumbers.includes(dep):
238
- allDeps.add(dep)
239
- for (dep of allDeps):
240
- depNN = String(dep).padStart(2, '0')
241
- Glob: .workflow/phases/{depNN}-*/index.json
242
- Read → depIndex
243
- Copy .workflow/phases/{depNN}-{depIndex.slug}/ → {wtPath}/.workflow/phases/{depNN}-{depIndex.slug}/
202
+ // Collect dependency phases from roadmap milestone entry
203
+ // (cross-milestone dependencies are defined in milestoneEntry.depends_on or roadmap)
204
+ depPhases = new Set()
205
+ IF milestoneEntry.depends_on:
206
+ for (dep of milestoneEntry.depends_on):
207
+ IF NOT ownedPhaseNumbers.includes(dep):
208
+ depPhases.add(dep)
209
+ // Copy dependency artifacts from main
210
+ for (dep of depPhases):
211
+ depArtifacts = artifacts.filter(a => a.phase === dep && a.path)
212
+ for (art of depArtifacts):
213
+ IF directory_exists(".workflow/" + art.path):
214
+ Copy .workflow/{art.path}/ {wtPath}/.workflow/{art.path}/
244
215
 
245
216
  // 6g: Build phase_dependencies map for worktree-scope
246
217
  phaseDeps = {}
247
- IF useArtifactRegistry:
248
- IF milestoneEntry.depends_on:
249
- for (phaseNum of ownedPhaseNumbers):
250
- phaseDeps[String(phaseNum)] = milestoneEntry.depends_on
251
- .filter(d => !ownedPhaseNumbers.includes(d))
252
- ELSE:
253
- for (p of phaseList):
254
- IF p.depends_on:
255
- externalDeps = p.depends_on.filter(d => !ownedPhaseNumbers.includes(d))
256
- IF externalDeps.length > 0:
257
- phaseDeps[String(p.phase)] = externalDeps
218
+ IF milestoneEntry.depends_on:
219
+ for (phaseNum of ownedPhaseNumbers):
220
+ phaseDeps[String(phaseNum)] = milestoneEntry.depends_on
221
+ .filter(d => !ownedPhaseNumbers.includes(d))
258
222
 
259
223
  // 6h: Write worktree-scope.json
260
224
  Write {wtPath}/.workflow/worktree-scope.json:
@@ -275,12 +239,9 @@ Read .workflow/state.json → mainState
275
239
  firstPending = phaseList.find(p => p.status !== "completed")
276
240
  scopedState = {
277
241
  ...mainState,
278
- current_phase: firstPending?.phase ?? phaseList[0].phase,
279
242
  current_milestone: milestoneName,
280
243
  // Carry over milestone-scoped artifacts to worktree
281
- artifacts: useArtifactRegistry
282
- ? artifacts.filter(a => a.milestone === milestoneName || ownedPhaseNumbers.includes(a.phase))
283
- : []
244
+ artifacts: artifacts.filter(a => a.milestone === milestoneName || ownedPhaseNumbers.includes(a.phase))
284
245
  }
285
246
  Write {wtPath}/.workflow/state.json: scopedState
286
247
  ```
@@ -320,19 +281,9 @@ registry.fork_sessions.push({
320
281
  Write .workflow/worktrees.json: registry
321
282
 
322
283
  // Mark milestone phases as "forked"
323
- IF useArtifactRegistry:
324
- // In artifact registry model, worktrees.json tracks forked state.
325
- // No per-phase marking needed the registry entry signals ownership.
326
- // (worktrees.json already updated above with owned_phases)
327
- ELSE:
328
- // Legacy: mark phase index.json as forked
329
- for (p of phaseList):
330
- IF p.status !== "completed":
331
- NN = String(p.phase).padStart(2, '0')
332
- Read .workflow/phases/{NN}-{p.slug}/index.json → idx
333
- idx.status = "forked"
334
- idx.updated_at = getUtc8ISOString()
335
- Write .workflow/phases/{NN}-{p.slug}/index.json: idx
284
+ // In artifact registry model, worktrees.json tracks forked state.
285
+ // No per-phase marking needed the registry entry signals ownership.
286
+ // (worktrees.json already updated above with owned_phases)
336
287
 
337
288
  mainState.last_updated = getUtc8ISOString()
338
289
  Write .workflow/state.json: mainState
package/workflows/init.md CHANGED
@@ -88,7 +88,7 @@ CHECK .workflow/state.json exists?
88
88
 
89
89
  5. **Create project files:**
90
90
  - `.workflow/project.md` from @templates/project.md + user answers (include Core Value, Requirements, Key Decisions)
91
- - `.workflow/state.json` from template (status: "idle", current_phase: null)
91
+ - `.workflow/state.json` from template (status: "idle")
92
92
  - `.workflow/config.json` already created in step 2
93
93
 
94
94
  ### Path B: Brownfield (has code, no .workflow/)
@@ -119,14 +119,12 @@ If `.workflow/specs/` does not exist:
119
119
  1. Create `.workflow/specs/` directory
120
120
  2. Auto-trigger `/workflow:specs-setup` — **MUST follow `specs-setup.md` templates exactly**:
121
121
  - Scan codebase for conventions
122
- - Generate `project-tech.json`
123
122
  - Generate `specs/coding-conventions.md`
124
123
  - Generate `specs/architecture-constraints.md`
125
124
  - Generate `specs/quality-rules.md`
126
125
  - Generate `specs/debug-notes.md`
127
126
  - Generate `specs/test-conventions.md`
128
127
  - Generate `specs/review-standards.md`
129
- - Generate `specs/validation-rules.md`
130
128
  - Create empty `specs/learnings.md`
131
129
 
132
130
 
@@ -143,7 +141,6 @@ Verify all required directories and files exist:
143
141
  config.json ✓
144
142
  specs/ ✓
145
143
  research/ ✓ (if research enabled)
146
- phases/ ✓ (create empty)
147
144
  scratch/ ✓ (create empty)
148
145
  milestones/ ✓ (create empty)
149
146
  codebase/ ✓ (create empty)
@@ -15,7 +15,7 @@ L0-L3 progressive layers: Static Analysis -> Unit -> Integration -> E2E
15
15
  | Input | Result |
16
16
  |-------|--------|
17
17
  | No arguments | Error E001 |
18
- | Phase number | Resolve phase dir (artifact registry or legacy `.workflow/phases/{NN}-{slug}/`) |
18
+ | Phase number | Resolve phase dir from artifact registry |
19
19
  | `--max-iter N` | Set MAX_ITER = N (default 5) |
20
20
  | `--layer L2` | Start from L2 layer |
21
21
 
@@ -23,12 +23,11 @@ L0-L3 progressive layers: Static Analysis -> Unit -> Integration -> E2E
23
23
  ```
24
24
  Read .workflow/state.json → state
25
25
  artifacts = state.artifacts ?? []
26
- IF artifacts.length > 0:
27
- art = artifacts.find(a => a.type === 'execute' && a.phase === phaseNum)
26
+ art = artifacts.find(a => a.type === 'execute' && a.phase === phaseNum)
27
+ IF art:
28
28
  PHASE_DIR = ".workflow/" + art.path
29
29
  ELSE:
30
- Glob: .workflow/phases/{NN}-*/
31
- PHASE_DIR = resolved path
30
+ ERROR "Phase {phaseNum} not found in artifact registry"
32
31
  ```
33
32
 
34
33
  Check for existing integration test session:
@@ -180,11 +180,8 @@ Cross-milestone conflict check (for supplement issues):
180
180
  b. Identify phases belonging to OTHER milestones (not milestone_ref)
181
181
  c. For each other-milestone phase, resolve phase dir and check if plan.json exists:
182
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
+ art = artifacts.find(a => a.type === 'plan' && a.phase === phaseNum)
184
+ IF art: Read .workflow/{art.path}/plan.json (if exists)
188
185
  Collect files_to_create[] as planned_files
189
186
  d. IF affected_components in the new issue overlap with planned_files:
190
187
  WARNING: "Conflict detected: this supplement issue affects components planned in milestone {other_milestone}"
@@ -456,10 +453,7 @@ Process bidirectional link:
456
453
  2. Locate task file:
457
454
  - Read .workflow/state.json → state
458
455
  - 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)
456
+ - Search artifact registry paths: .workflow/{artifact.path}/.task/{TASK_ID}.json
463
457
  - Also search .workflow/scratch/*/.task/{TASK_ID}.json (standalone scratch tasks)
464
458
  - If still not found → error: "Task {TASK_ID} not found"
465
459
 
@@ -4,7 +4,7 @@ Atomic insight capture, search, and retrieval. Lightweight gstack-style "eureka
4
4
 
5
5
  Storage:
6
6
  - `.workflow/learning/lessons.jsonl` — append-only JSONL row per insight (shared with retrospective output)
7
- - `.workflow/learning/learning-index.json` — searchable index (mirrors `memory-index.json` schema)
7
+ - `.workflow/learning/learning-index.json` — searchable index (searchable index)
8
8
 
9
9
  This workflow does NOT spawn agents or call CLI tools. It is a thin file operation: parse → infer → append → confirm.
10
10
 
@@ -83,17 +83,21 @@ phase_slug = null
83
83
 
84
84
  IF .workflow/state.json exists:
85
85
  state = read JSON
86
- IF state.current_phase is not null:
87
- phase = state.current_phase
86
+ artifacts = state.artifacts ?? []
87
+
88
+ # Derive current phase from artifacts (first phase with in_progress, or first without completed execute)
89
+ phase = null
90
+ inProgressArt = artifacts.find(a => a.type === 'execute' && a.status === 'in_progress')
91
+ IF inProgressArt:
92
+ phase = inProgressArt.phase
93
+ ELSE:
94
+ phaseNums = [...new Set(artifacts.map(a => a.phase).filter(Boolean))].sort()
95
+ phase = phaseNums.find(p => !artifacts.some(a => a.phase === p && a.type === 'execute' && a.status === 'completed'))
88
96
 
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")
97
+ IF phase is not null:
98
+ # Resolve slug from artifact registry
99
+ art = artifacts.find(a => a.phase === phase)
100
+ phase_slug = art?.slug ?? "phase-" + phase
97
101
  ```
98
102
 
99
103
  If `--phase 0` is passed, force `phase = null, phase_slug = null` regardless.
@@ -304,15 +308,12 @@ IF row is null → error E004: "Insight {target_id} not found"
304
308
  ```
305
309
  phase_context = null
306
310
  IF row.phase_slug is not null:
307
- // Resolve phase dir artifact registry first, fallback to legacy phases/
311
+ // Resolve phase dir from artifact registry
308
312
  Read .workflow/state.json → state
309
313
  artifacts = state.artifacts ?? []
310
314
  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
315
+ art = artifacts.find(a => a.phase === row.phase && a.path)
316
+ IF art: phase_dir = ".workflow/" + art.path
316
317
 
317
318
  IF phase_dir AND directory exists:
318
319
  phase_context = {
@@ -382,7 +383,7 @@ PHASE CONTEXT:
382
383
  | E002 | error | Unknown `--category` (allowed: pattern, antipattern, decision, tool, gotcha, technique) |
383
384
  | E003 | error | `show` mode requires an INS-id argument |
384
385
  | E004 | error | Insight id not found in lessons.jsonl |
385
- | W001 | warning | Auto-phase detection found a current_phase but no matching directory; phase set to null |
386
+ | W001 | warning | Auto-phase detection found no matching artifact in registry; phase set to null |
386
387
  | W002 | warning | learning-index.json out of sync with lessons.jsonl (different row count); offer to rebuild |
387
388
 
388
389
  ---
@@ -392,7 +393,7 @@ PHASE CONTEXT:
392
393
  - [ ] Mode correctly routed (capture / list / search / show)
393
394
  - [ ] Capture mode: `lessons.jsonl` row appended, valid JSON, all required fields present
394
395
  - [ ] Capture mode: `learning-index.json` updated with matching entry
395
- - [ ] Capture mode: phase auto-link resolves correctly when state.json has current_phase
396
+ - [ ] Capture mode: phase auto-link resolves correctly from artifact registry
396
397
  - [ ] Capture mode: category inference produces a sensible default when --category absent
397
398
  - [ ] List mode: filters apply; output sorted newest-first
398
399
  - [ ] Search mode: results ranked by title > tags > summary match
@@ -37,7 +37,14 @@ if (fileExists(stateFile)) {
37
37
  const raw = JSON.parse(Read(stateFile));
38
38
  projectState = {
39
39
  initialized: true,
40
- current_phase: raw.current_phase,
40
+ // Derive current_phase from artifacts (first in_progress execute, or first without completed execute)
41
+ current_phase: (() => {
42
+ const arts = raw.artifacts ?? [];
43
+ const ip = arts.find(a => a.type === 'execute' && a.status === 'in_progress');
44
+ if (ip) return ip.phase;
45
+ const phases = [...new Set(arts.map(a => a.phase).filter(Boolean))].sort((a,b) => a - b);
46
+ return phases.find(p => !arts.some(a => a.phase === p && a.type === 'execute' && a.status === 'completed')) ?? raw.current_phase ?? null;
47
+ })(),
41
48
  phase_slug: raw.phase_slug,
42
49
  phase_status: raw.phase_status, // pending|exploring|planning|executing|verifying|testing|completed|blocked
43
50
  phase_artifacts: raw.phase_artifacts ?? {},
@@ -661,8 +661,17 @@ function resolvePhase(intent_analysis, project_state) {
661
661
  const phaseMatch = intent.match(/phase\s*(\d+)|^(\d+)$/);
662
662
  if (phaseMatch) return phaseMatch[1] || phaseMatch[2];
663
663
 
664
- // 3. From project state
665
- if (project_state.initialized) return project_state.current_phase;
664
+ // 3. From project state — derive from artifacts
665
+ if (project_state.initialized) {
666
+ // Derive current phase: first phase with in_progress execute, or first without completed execute
667
+ const arts = project_state.artifacts ?? [];
668
+ const inProgress = arts.find(a => a.type === 'execute' && a.status === 'in_progress');
669
+ if (inProgress) return inProgress.phase;
670
+ const phases = [...new Set(arts.map(a => a.phase).filter(Boolean))].sort((a,b) => a - b);
671
+ const current = phases.find(p => !arts.some(a => a.phase === p && a.type === 'execute' && a.status === 'completed'));
672
+ if (current) return current;
673
+ return project_state.latest_artifact?.phase ?? null;
674
+ }
666
675
 
667
676
  // 4. Scratch mode chains use {scratch_dir} instead of {phase}
668
677
  if (chainName === 'analyze-plan-execute') return null;
@@ -775,7 +784,7 @@ mkdir -p "${SESSION_DIR}"
775
784
  **Initialize execution context:**
776
785
  ```javascript
777
786
  const context = {
778
- current_phase: resolvedPhase,
787
+ current_phase: resolvedPhase, // derived from artifacts
779
788
  user_intent: intent,
780
789
  issue_id: resolvedIssueId,
781
790
  spec_session_id: null,
@@ -8,7 +8,7 @@ Two memory stores with different purposes:
8
8
 
9
9
  | Store | Path | Format | Index |
10
10
  |-------|------|--------|-------|
11
- | `workflow` | `.workflow/memory/` | `MEM-*.md`, `TIP-*.md` | `memory-index.json` |
11
+ | `workflow` | `.workflow/memory/` | `MEM-*.md`, `TIP-*.md` | `.workflow/wiki-index.json` (unified, auto-managed by WikiIndexer) |
12
12
  | `system` | `~/.claude/projects/{project}/memory/` | `MEMORY.md` + topic `.md` files | None (flat files) |
13
13
 
14
14
  **System memory path detection:**
@@ -30,7 +30,7 @@ Detect both memory store paths:
30
30
  ```bash
31
31
  # Workflow memory
32
32
  WF_MEMORY_DIR=".workflow/memory"
33
- WF_INDEX_FILE="$WF_MEMORY_DIR/memory-index.json"
33
+ WF_INDEX_FILE=".workflow/wiki-index.json" # unified index (auto-managed by WikiIndexer)
34
34
 
35
35
  # System memory — derive from project git root or cwd
36
36
  PROJECT_ROOT=$(pwd)
@@ -40,7 +40,7 @@ SYS_MEMORY_DIR="$HOME/.claude/projects/$(echo "$PROJECT_ROOT" | sed 's|[/\\:]|-|
40
40
  ```
41
41
 
42
42
  Verify which stores exist:
43
- - Workflow: check `$WF_INDEX_FILE` exists
43
+ - Workflow: check `.workflow/memory/` directory exists (index is auto-managed)
44
44
  - System: check `$SYS_MEMORY_DIR/MEMORY.md` exists
45
45
 
46
46
  If neither exists, report E001.
@@ -69,7 +69,7 @@ Parse arguments and detect subcommand:
69
69
  List entries from targeted stores.
70
70
 
71
71
  **Workflow store** (if exists):
72
- 1. Read `memory-index.json`
72
+ 1. Use `maestro wiki list --type memory --json` (reads unified `.workflow/wiki-index.json`)
73
73
  2. Apply filters (--tag, --type, --before, --after)
74
74
  3. Sort by timestamp descending
75
75
 
@@ -108,7 +108,7 @@ Hints:
108
108
  Full-text search across both stores.
109
109
 
110
110
  **Workflow store:**
111
- 1. Search `memory-index.json` fields: `summary`, `tags`, `id`
111
+ 1. Use `maestro wiki search "<query>" --json` or filter `.workflow/wiki-index.json` fields: `summary`, `tags`, `id`
112
112
  2. For deeper matches, read individual `.md` files and search content
113
113
 
114
114
  **System store:**
@@ -138,7 +138,7 @@ View: /manage-memory view <ID|filename>
138
138
  Display full content of a memory entry.
139
139
 
140
140
  **Workflow entry** (ID matches `MEM-*` or `TIP-*`):
141
- 1. Validate ID exists in `memory-index.json`
141
+ 1. Validate ID exists via `maestro wiki get <id>` or in `.workflow/wiki-index.json`
142
142
  2. Read the corresponding `.md` file
143
143
  3. Display with metadata header
144
144
 
@@ -188,9 +188,9 @@ Changes: {summary of edits}
188
188
  Remove a memory entry or file.
189
189
 
190
190
  **Workflow entry:**
191
- 1. Validate ID in `memory-index.json`
191
+ 1. Validate ID via `maestro wiki get <id>` or in `.workflow/wiki-index.json`
192
192
  2. Show summary, confirm with AskUserQuestion (unless --confirm)
193
- 3. Remove `.md` file + index entry
193
+ 3. Remove `.md` file (WikiIndexer auto-updates index on next access)
194
194
 
195
195
  **System file:**
196
196
  1. Validate file exists (NEVER allow deleting MEMORY.md — only topic files)
@@ -213,7 +213,7 @@ Bulk cleanup — workflow store only.
213
213
 
214
214
  At least one filter required: --tag, --type, --before, --after.
215
215
 
216
- 1. Read `memory-index.json`, apply filters
216
+ 1. Read `.workflow/wiki-index.json`, apply filters
217
217
  2. Display candidates table
218
218
  3. If `--dry-run`, stop after display
219
219
  4. Confirm with AskUserQuestion
@@ -232,9 +232,9 @@ Post-operation integrity check.
232
232
 
233
233
  **Workflow store:**
234
234
  1. Scan `.workflow/memory/` for `.md` files
235
- 2. Compare with `memory-index.json` entries
235
+ 2. Compare with `.workflow/wiki-index.json` entries (type=memory)
236
236
  3. Report orphaned files or dangling references
237
- 4. Offer to fix inconsistencies
237
+ 4. Offer to fix inconsistencies (WikiIndexer re-indexes on next write)
238
238
 
239
239
  **System store:**
240
240
  1. Check MEMORY.md links to topic files
@@ -260,13 +260,9 @@ Parse arguments and detect execution mode:
260
260
 
261
261
  ```bash
262
262
  MEMORY_DIR=".workflow/memory"
263
- INDEX_FILE="$MEMORY_DIR/memory-index.json"
264
263
  mkdir -p "$MEMORY_DIR"
265
-
266
- # Initialize index if not exists
267
- if [ ! -f "$INDEX_FILE" ]; then
268
- echo '{"entries":[],"_metadata":{"created":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","version":"1.0"}}' > "$INDEX_FILE"
269
- fi
264
+ # Note: wiki-index.json is auto-managed by WikiIndexer at .workflow/wiki-index.json
265
+ # No manual index initialization needed
270
266
  ```
271
267
 
272
268
  When ambiguous, use AskUserQuestion:
@@ -355,36 +351,14 @@ Write entry file with sections:
355
351
  - Tags (from --tag flag)
356
352
  - Context (auto-detected from recent conversation files)
357
353
 
358
- ### Step 4: Update Index
359
-
360
- Append entry metadata to memory-index.json.
361
-
362
- Read `memory-index.json`, append new entry to `entries[]`:
354
+ ### Step 4: Wiki Index (Auto-managed)
363
355
 
364
- ```json
365
- {
366
- "id": "MEM-20260315-143022",
367
- "type": "compact",
368
- "timestamp": "2026-03-15T14:30:22Z",
369
- "file": "MEM-20260315-143022.md",
370
- "summary": "Session objective in one line",
371
- "tags": [],
372
- "project_root": "/path/to/project",
373
- "session_id": "WFS-001"
374
- }
375
- ```
356
+ Memory files are automatically indexed by WikiIndexer into the unified `.workflow/wiki-index.json`. No manual index update is needed — the persistent index is regenerated on next `maestro wiki` access or any write operation.
376
357
 
377
- For tips:
378
- ```json
379
- {
380
- "id": "TIP-20260315-143022",
381
- "type": "tip",
382
- "timestamp": "2026-03-15T14:30:22Z",
383
- "file": "TIP-20260315-143022.md",
384
- "summary": "First 80 chars of note content",
385
- "tags": ["config", "redis"],
386
- "project_root": "/path/to/project"
387
- }
358
+ For immediate visibility after capture:
359
+ ```bash
360
+ maestro wiki get memory-{slug} # verify entry exists in wiki
361
+ maestro wiki list --type memory # list all memory entries
388
362
  ```
389
363
 
390
364
  ### Step 5: Report
@@ -400,7 +374,7 @@ Type: compact
400
374
  Plan: {plan_source} ({plan_line_count} lines preserved)
401
375
 
402
376
  To restore: Read .workflow/memory/{ENTRY_ID}.md
403
- To search: Read .workflow/memory/memory-index.json
377
+ To search: maestro wiki list --type memory
404
378
  ```
405
379
 
406
380
  **Tip mode:**
@@ -410,33 +384,14 @@ Entry: {ENTRY_ID}
410
384
  File: .workflow/memory/{ENTRY_ID}.md
411
385
  Tags: {tags}
412
386
 
413
- To search: Read .workflow/memory/memory-index.json
387
+ To search: maestro wiki list --type memory --tag {tags}
414
388
  ```
415
389
 
416
390
  ---
417
391
 
418
- ## Index Schema
419
-
420
- ```json
421
- {
422
- "entries": [
423
- {
424
- "id": "MEM-20260315-143022",
425
- "type": "compact | tip",
426
- "timestamp": "2026-03-15T14:30:22Z",
427
- "file": "MEM-20260315-143022.md",
428
- "summary": "One-line description",
429
- "tags": [],
430
- "project_root": "D:\\project",
431
- "session_id": "WFS-001 | null"
432
- }
433
- ],
434
- "_metadata": {
435
- "created": "2026-03-15T00:00:00Z",
436
- "version": "1.0"
437
- }
438
- }
439
- ```
392
+ ## Index
393
+
394
+ Memory entries are indexed in the unified `.workflow/wiki-index.json` by WikiIndexer. Each memory file becomes a wiki entry of type `memory` with fields derived from frontmatter (id, title, tags, summary). Use `maestro wiki list --type memory --json` to query the index programmatically.
440
395
 
441
396
  ## Compact Entry Structure
442
397
 
@@ -492,5 +447,5 @@ Quick note for ideas, snippets, reminders.
492
447
 
493
448
  ## Retrieval
494
449
 
495
- Read `.workflow/memory/memory-index.json` to find entries by type, tags, or date.
496
- Read individual `.md` files for full content.
450
+ Use `maestro wiki list --type memory` to find entries by type, tags, or date.
451
+ Use `maestro wiki get <id>` or read individual `.md` files for full content.