maestro-flow 0.3.11 → 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 (339) hide show
  1. package/.claude/CLAUDE.md +7 -0
  2. package/.claude/agents/conceptual-planning-agent.md +1 -0
  3. package/.claude/agents/workflow-analyzer.md +113 -114
  4. package/.claude/agents/workflow-collab-planner.md +143 -144
  5. package/.claude/agents/workflow-debugger.md +101 -103
  6. package/.claude/agents/workflow-executor.md +127 -128
  7. package/.claude/agents/workflow-integration-checker.md +82 -82
  8. package/.claude/agents/workflow-nyquist-auditor.md +84 -84
  9. package/.claude/agents/workflow-phase-researcher.md +85 -85
  10. package/.claude/agents/workflow-plan-checker.md +90 -90
  11. package/.claude/agents/workflow-planner.md +177 -178
  12. package/.claude/agents/workflow-roadmapper.md +81 -83
  13. package/.claude/agents/workflow-verifier.md +118 -119
  14. package/.claude/commands/learn-retro.md +2 -2
  15. package/.claude/commands/learn-second-opinion.md +2 -2
  16. package/.claude/commands/maestro-analyze.md +10 -2
  17. package/.claude/commands/maestro-brainstorm.md +2 -1
  18. package/.claude/commands/maestro-execute.md +21 -4
  19. package/.claude/commands/maestro-fork.md +133 -111
  20. package/.claude/commands/maestro-merge.md +85 -77
  21. package/.claude/commands/maestro-milestone-complete.md +14 -0
  22. package/.claude/commands/maestro-plan.md +100 -8
  23. package/.claude/commands/maestro-roadmap.md +113 -2
  24. package/.claude/commands/maestro-ui-design.md +7 -7
  25. package/.claude/commands/maestro-update.md +176 -0
  26. package/.claude/commands/maestro-verify.md +18 -3
  27. package/.claude/commands/maestro.md +1 -0
  28. package/.claude/commands/manage-codebase-rebuild.md +0 -1
  29. package/.claude/commands/manage-harvest.md +1 -1
  30. package/.claude/commands/manage-learn.md +5 -5
  31. package/.claude/commands/manage-memory-capture.md +4 -4
  32. package/.claude/commands/manage-memory.md +1 -1
  33. package/.claude/commands/manage-wiki.md +62 -0
  34. package/.claude/commands/quality-business-test.md +5 -5
  35. package/.claude/commands/quality-debug.md +53 -6
  36. package/.claude/commands/quality-retrospective.md +9 -7
  37. package/.claude/commands/quality-review.md +39 -7
  38. package/.claude/commands/quality-sync.md +1 -1
  39. package/.claude/commands/quality-test-gen.md +5 -4
  40. package/.claude/commands/quality-test.md +45 -12
  41. package/.claude/commands/spec-remove.md +51 -0
  42. package/.claude/commands/spec-setup.md +1 -3
  43. package/.claude/commands/wiki-connect.md +9 -5
  44. package/.claude/commands/wiki-digest.md +6 -3
  45. package/.codex/skills/maestro/SKILL.md +2 -2
  46. package/.codex/skills/maestro-analyze/SKILL.md +4 -4
  47. package/.codex/skills/maestro-brainstorm/SKILL.md +4 -4
  48. package/.codex/skills/maestro-coordinate/SKILL.md +2 -2
  49. package/.codex/skills/maestro-execute/SKILL.md +15 -5
  50. package/.codex/skills/maestro-fork/SKILL.md +98 -68
  51. package/.codex/skills/maestro-init/SKILL.md +5 -4
  52. package/.codex/skills/maestro-merge/SKILL.md +69 -62
  53. package/.codex/skills/maestro-milestone-complete/SKILL.md +18 -1
  54. package/.codex/skills/maestro-plan/SKILL.md +6 -6
  55. package/.codex/skills/maestro-roadmap/SKILL.md +3 -4
  56. package/.codex/skills/maestro-spec-generate/SKILL.md +2 -2
  57. package/.codex/skills/maestro-ui-design/SKILL.md +6 -6
  58. package/.codex/skills/maestro-verify/SKILL.md +29 -20
  59. package/.codex/skills/manage-codebase-rebuild/SKILL.md +4 -4
  60. package/.codex/skills/manage-harvest/SKILL.md +10 -1
  61. package/.codex/skills/manage-issue-discover/SKILL.md +3 -3
  62. package/.codex/skills/manage-learn/SKILL.md +3 -2
  63. package/.codex/skills/manage-memory/SKILL.md +3 -3
  64. package/.codex/skills/manage-memory-capture/SKILL.md +8 -14
  65. package/.codex/skills/manage-status/SKILL.md +9 -4
  66. package/.codex/skills/manage-wiki/SKILL.md +55 -0
  67. package/.codex/skills/quality-business-test/SKILL.md +8 -6
  68. package/.codex/skills/quality-debug/SKILL.md +22 -9
  69. package/.codex/skills/quality-integration-test/SKILL.md +11 -7
  70. package/.codex/skills/quality-retrospective/SKILL.md +48 -29
  71. package/.codex/skills/quality-review/SKILL.md +10 -7
  72. package/.codex/skills/quality-test/SKILL.md +10 -5
  73. package/.codex/skills/quality-test-gen/SKILL.md +13 -9
  74. package/.codex/skills/spec-add/SKILL.md +11 -3
  75. package/.codex/skills/spec-load/SKILL.md +7 -0
  76. package/.codex/skills/spec-map/SKILL.md +2 -2
  77. package/.codex/skills/spec-remove/SKILL.md +101 -0
  78. package/.codex/skills/spec-setup/SKILL.md +4 -8
  79. package/.codex/skills/wiki-connect/SKILL.md +6 -5
  80. package/.codex/skills/wiki-digest/SKILL.md +2 -2
  81. package/README.md +2 -0
  82. package/README.zh-CN.md +2 -0
  83. package/dashboard/dist/assets/{ArtifactsPage-DZNCi6tn.js → ArtifactsPage-CUrrDGgN.js} +1 -1
  84. package/dashboard/dist/assets/ChatInput-pUOLJIKE.js +49 -0
  85. package/dashboard/dist/assets/ChatPage-B8Xqkt0v.js +27 -0
  86. package/dashboard/dist/assets/{CollabPage-B4NAHXS2.js → CollabPage-DIUXeazv.js} +1 -1
  87. package/dashboard/dist/assets/{ExecutionPanel-CFt4LJyq.js → ExecutionPanel-VmYeADFj.js} +1 -1
  88. package/dashboard/dist/assets/KanbanPage-DLq8v7hg.js +21 -0
  89. package/dashboard/dist/assets/{MarkdownRenderer-X4af_WNb.js → MarkdownRenderer-D7AehrnR.js} +1 -1
  90. package/dashboard/dist/assets/{McpPage-BKfCVIyU.js → McpPage-BY0SjTgw.js} +2 -2
  91. package/dashboard/dist/assets/{OutputPanel-BlBQFJSW.js → OutputPanel-B-Rjwgmv.js} +1 -1
  92. package/dashboard/dist/assets/{ProblemsPanel-De3DLvoI.js → ProblemsPanel-GEpF-oi4.js} +1 -1
  93. package/dashboard/dist/assets/RequirementBoardPage-xs8uDM7I.js +6 -0
  94. package/dashboard/dist/assets/{RequirementPage-Bllxe2XI.js → RequirementPage-BKDSFwjA.js} +5 -10
  95. package/dashboard/dist/assets/SpecsPage-DLFb9ZH0.js +36 -0
  96. package/dashboard/dist/assets/SupervisorPage-SOki_kgz.js +6 -0
  97. package/dashboard/dist/assets/TeamsPage-BO2kP70F.js +11 -0
  98. package/dashboard/dist/assets/{TreeBrowser-Q12qobZs.js → TreeBrowser-B9DHdULE.js} +1 -1
  99. package/dashboard/dist/assets/{WorkflowPage-D_Fzdy3_.js → WorkflowPage-C8hWbYim.js} +1 -1
  100. package/dashboard/dist/assets/{check-u6fGOwQO.js → check-DJDk3A2a.js} +1 -1
  101. package/dashboard/dist/assets/{chevron-right-Csu22t58.js → chevron-right-C7bVDreZ.js} +1 -1
  102. package/dashboard/dist/assets/{circle-CMrkbRNg.js → circle-Qfgy4LB_.js} +1 -1
  103. package/dashboard/dist/assets/{circle-alert-c3tH1P4z.js → circle-alert-Na1vf6qQ.js} +1 -1
  104. package/dashboard/dist/assets/{circle-check-gYxxSYuH.js → circle-check-CEGgy3NV.js} +1 -1
  105. package/dashboard/dist/assets/{circle-check-big-TDSeWstm.js → circle-check-big-3JB8zRYj.js} +1 -1
  106. package/dashboard/dist/assets/{code-CFN2uX9V.js → code-Ble63Idz.js} +1 -1
  107. package/dashboard/dist/assets/{columns-3-38xIDlzy.js → columns-3-BUcKlxve.js} +1 -1
  108. package/dashboard/dist/assets/{download-DC7KkKyP.js → download-CMqkfn8x.js} +1 -1
  109. package/dashboard/dist/assets/{folder-CWq_lAnf.js → folder-B9ewx9LL.js} +1 -1
  110. package/dashboard/dist/assets/index-C2Mcb4TJ.js +231 -0
  111. package/dashboard/dist/assets/index-DyBbPc18.css +1 -0
  112. package/dashboard/dist/assets/{index-Do71weNR.js → index-JTmGteaT.js} +1 -1
  113. package/dashboard/dist/assets/{list-CgIP_2A-.js → list-DI8Wn2aT.js} +1 -1
  114. package/dashboard/dist/assets/loader-B5F6PzFT.js +11 -0
  115. package/dashboard/dist/assets/{minus-DYoN5UGk.js → minus-Lp_BfctG.js} +1 -1
  116. package/dashboard/dist/assets/{pen-line-Bh_WKYHm.js → pen-line-Ch7sphzZ.js} +1 -1
  117. package/dashboard/dist/assets/pencil-_yRMHmGT.js +6 -0
  118. package/dashboard/dist/assets/{proxy-BKxDAKTj.js → proxy-D72Y8a4Y.js} +1 -1
  119. package/dashboard/dist/assets/{search-SieXnOgr.js → search-BS6fI6Bg.js} +1 -1
  120. package/dashboard/dist/assets/{shallow-Bme1JY57.js → shallow-BXasQBvr.js} +1 -1
  121. package/dashboard/dist/assets/table-CeGlFjlP.js +6 -0
  122. package/dashboard/dist/assets/{terminal-BB3Xfuv5.js → terminal-BJic2yW-.js} +1 -1
  123. package/dashboard/dist/assets/{trash-2-C8f4vFFM.js → trash-2-Czz4X8Fb.js} +1 -1
  124. package/dashboard/dist/assets/{zap-4uwlzVm0.js → zap-C3H0jVFA.js} +1 -1
  125. package/dashboard/dist/index.html +2 -2
  126. package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js +16 -1
  127. package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js.map +1 -1
  128. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.d.ts +9 -0
  129. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js +109 -9
  130. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js.map +1 -1
  131. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.test.js +49 -0
  132. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.test.js.map +1 -1
  133. package/dashboard/dist-server/dashboard/src/server/agents/delegate-broker-monitor.js +1 -2
  134. package/dashboard/dist-server/dashboard/src/server/agents/delegate-broker-monitor.js.map +1 -1
  135. package/dashboard/dist-server/dashboard/src/server/commander/commander-prompts.d.ts +1 -1
  136. package/dashboard/dist-server/dashboard/src/server/commander/commander-prompts.js +2 -1
  137. package/dashboard/dist-server/dashboard/src/server/commander/commander-prompts.js.map +1 -1
  138. package/dashboard/dist-server/dashboard/src/server/index.js +3 -0
  139. package/dashboard/dist-server/dashboard/src/server/index.js.map +1 -1
  140. package/dashboard/dist-server/dashboard/src/server/routes/collab.js +124 -0
  141. package/dashboard/dist-server/dashboard/src/server/routes/collab.js.map +1 -1
  142. package/dashboard/dist-server/dashboard/src/server/routes/index.js +5 -4
  143. package/dashboard/dist-server/dashboard/src/server/routes/index.js.map +1 -1
  144. package/dashboard/dist-server/dashboard/src/server/routes/specs.d.ts +5 -13
  145. package/dashboard/dist-server/dashboard/src/server/routes/specs.js +97 -155
  146. package/dashboard/dist-server/dashboard/src/server/routes/specs.js.map +1 -1
  147. package/dashboard/dist-server/dashboard/src/server/routes/wiki.d.ts +11 -1
  148. package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js +27 -6
  149. package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js.map +1 -1
  150. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js +25 -7
  151. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js.map +1 -1
  152. package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js +8 -0
  153. package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js.map +1 -1
  154. package/dashboard/dist-server/dashboard/src/server/wiki/search.js +1 -0
  155. package/dashboard/dist-server/dashboard/src/server/wiki/search.js.map +1 -1
  156. package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.d.ts +29 -0
  157. package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.js +148 -0
  158. package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.js.map +1 -0
  159. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +4 -2
  160. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
  161. package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js +8 -2
  162. package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js.map +1 -1
  163. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.d.ts +5 -0
  164. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +80 -38
  165. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
  166. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js +8 -6
  167. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js.map +1 -1
  168. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-types.d.ts +40 -5
  169. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js +21 -23
  170. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js.map +1 -1
  171. package/dashboard/dist-server/dashboard/src/server/wiki/writer.d.ts +33 -3
  172. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js +184 -12
  173. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js.map +1 -1
  174. package/dashboard/dist-server/dashboard/src/server/ws/handlers/team-handler.d.ts +10 -0
  175. package/dashboard/dist-server/dashboard/src/server/ws/handlers/team-handler.js +73 -0
  176. package/dashboard/dist-server/dashboard/src/server/ws/handlers/team-handler.js.map +1 -0
  177. package/dashboard/dist-server/dashboard/src/shared/collab-types.d.ts +31 -0
  178. package/dashboard/dist-server/dashboard/src/shared/collab-types.js +28 -0
  179. package/dashboard/dist-server/dashboard/src/shared/collab-types.js.map +1 -1
  180. package/dashboard/dist-server/dashboard/src/shared/constants.js +5 -0
  181. package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
  182. package/dashboard/dist-server/dashboard/src/shared/coordinate-types.d.ts +22 -0
  183. package/dashboard/dist-server/dashboard/src/shared/issue-types.d.ts +12 -0
  184. package/dashboard/dist-server/dashboard/src/shared/issue-types.js +12 -0
  185. package/dashboard/dist-server/dashboard/src/shared/issue-types.js.map +1 -1
  186. package/dashboard/dist-server/dashboard/src/shared/team-types.d.ts +1 -0
  187. package/dashboard/dist-server/dashboard/src/shared/team-types.js +7 -0
  188. package/dashboard/dist-server/dashboard/src/shared/team-types.js.map +1 -1
  189. package/dashboard/dist-server/dashboard/src/shared/ws-protocol.d.ts +27 -1
  190. package/dashboard/dist-server/dashboard/src/shared/ws-protocol.js.map +1 -1
  191. package/dashboard/dist-server/shared/agent-types.d.ts +4 -0
  192. package/dashboard/dist-server/src/commands/delegate.js +26 -0
  193. package/dashboard/dist-server/src/commands/delegate.js.map +1 -1
  194. package/dashboard/dist-server/src/coordinator/graph-types.d.ts +11 -1
  195. package/dashboard/dist-server/src/coordinator/graph-walker.js +29 -2
  196. package/dashboard/dist-server/src/coordinator/graph-walker.js.map +1 -1
  197. package/dashboard/dist-server/src/coordinator/prompt-assembler.js +3 -2
  198. package/dashboard/dist-server/src/coordinator/prompt-assembler.js.map +1 -1
  199. package/dashboard/dist-server/src/hooks/constants.d.ts +29 -60
  200. package/dashboard/dist-server/src/hooks/constants.js +105 -82
  201. package/dashboard/dist-server/src/hooks/constants.js.map +1 -1
  202. package/dashboard/dist-server/src/types/index.d.ts +2 -1
  203. package/dist/shared/agent-types.d.ts +4 -0
  204. package/dist/shared/agent-types.d.ts.map +1 -1
  205. package/dist/src/commands/delegate.d.ts.map +1 -1
  206. package/dist/src/commands/delegate.js +26 -0
  207. package/dist/src/commands/delegate.js.map +1 -1
  208. package/dist/src/commands/hooks.d.ts +2 -4
  209. package/dist/src/commands/hooks.d.ts.map +1 -1
  210. package/dist/src/commands/hooks.js +4 -7
  211. package/dist/src/commands/hooks.js.map +1 -1
  212. package/dist/src/commands/install-backend.d.ts.map +1 -1
  213. package/dist/src/commands/install-backend.js +29 -18
  214. package/dist/src/commands/install-backend.js.map +1 -1
  215. package/dist/src/commands/install-ui/InstallConfirm.d.ts +2 -3
  216. package/dist/src/commands/install-ui/InstallConfirm.d.ts.map +1 -1
  217. package/dist/src/commands/install-ui/InstallConfirm.js +1 -1
  218. package/dist/src/commands/install-ui/InstallConfirm.js.map +1 -1
  219. package/dist/src/commands/install-ui/InstallExecution.d.ts.map +1 -1
  220. package/dist/src/commands/install-ui/InstallExecution.js +1 -2
  221. package/dist/src/commands/install-ui/InstallExecution.js.map +1 -1
  222. package/dist/src/commands/install-ui/InstallFlow.d.ts.map +1 -1
  223. package/dist/src/commands/install-ui/InstallFlow.js +5 -7
  224. package/dist/src/commands/install-ui/InstallFlow.js.map +1 -1
  225. package/dist/src/commands/install-ui/StatuslineConfig.d.ts +3 -6
  226. package/dist/src/commands/install-ui/StatuslineConfig.d.ts.map +1 -1
  227. package/dist/src/commands/install-ui/StatuslineConfig.js +21 -17
  228. package/dist/src/commands/install-ui/StatuslineConfig.js.map +1 -1
  229. package/dist/src/commands/update.d.ts.map +1 -1
  230. package/dist/src/commands/update.js +95 -0
  231. package/dist/src/commands/update.js.map +1 -1
  232. package/dist/src/commands/wiki.d.ts.map +1 -1
  233. package/dist/src/commands/wiki.js +75 -11
  234. package/dist/src/commands/wiki.js.map +1 -1
  235. package/dist/src/coordinator/graph-types.d.ts +11 -1
  236. package/dist/src/coordinator/graph-types.d.ts.map +1 -1
  237. package/dist/src/coordinator/graph-walker.d.ts.map +1 -1
  238. package/dist/src/coordinator/graph-walker.js +29 -2
  239. package/dist/src/coordinator/graph-walker.js.map +1 -1
  240. package/dist/src/coordinator/prompt-assembler.d.ts.map +1 -1
  241. package/dist/src/coordinator/prompt-assembler.js +3 -2
  242. package/dist/src/coordinator/prompt-assembler.js.map +1 -1
  243. package/dist/src/hooks/__tests__/statusline-visual-test.d.ts +4 -1
  244. package/dist/src/hooks/__tests__/statusline-visual-test.d.ts.map +1 -1
  245. package/dist/src/hooks/__tests__/statusline-visual-test.js +55 -152
  246. package/dist/src/hooks/__tests__/statusline-visual-test.js.map +1 -1
  247. package/dist/src/hooks/constants.d.ts +29 -60
  248. package/dist/src/hooks/constants.d.ts.map +1 -1
  249. package/dist/src/hooks/constants.js +105 -82
  250. package/dist/src/hooks/constants.js.map +1 -1
  251. package/dist/src/hooks/skill-context.d.ts +3 -0
  252. package/dist/src/hooks/skill-context.d.ts.map +1 -1
  253. package/dist/src/hooks/skill-context.js +149 -15
  254. package/dist/src/hooks/skill-context.js.map +1 -1
  255. package/dist/src/hooks/statusline.d.ts +11 -8
  256. package/dist/src/hooks/statusline.d.ts.map +1 -1
  257. package/dist/src/hooks/statusline.js +284 -179
  258. package/dist/src/hooks/statusline.js.map +1 -1
  259. package/dist/src/hooks/workspace.d.ts.map +1 -1
  260. package/dist/src/hooks/workspace.js +2 -1
  261. package/dist/src/hooks/workspace.js.map +1 -1
  262. package/dist/src/migrations/_template.d.ts +12 -0
  263. package/dist/src/migrations/_template.d.ts.map +1 -0
  264. package/dist/src/migrations/_template.js +55 -0
  265. package/dist/src/migrations/_template.js.map +1 -0
  266. package/dist/src/migrations/index.d.ts +14 -0
  267. package/dist/src/migrations/index.d.ts.map +1 -0
  268. package/dist/src/migrations/index.js +20 -0
  269. package/dist/src/migrations/index.js.map +1 -0
  270. package/dist/src/migrations/run.d.ts +12 -0
  271. package/dist/src/migrations/run.d.ts.map +1 -0
  272. package/dist/src/migrations/run.js +119 -0
  273. package/dist/src/migrations/run.js.map +1 -0
  274. package/dist/src/migrations/v1-to-v2.d.ts +10 -0
  275. package/dist/src/migrations/v1-to-v2.d.ts.map +1 -0
  276. package/dist/src/migrations/v1-to-v2.js +71 -0
  277. package/dist/src/migrations/v1-to-v2.js.map +1 -0
  278. package/dist/src/tools/merge-validator.d.ts.map +1 -1
  279. package/dist/src/tools/merge-validator.js +114 -16
  280. package/dist/src/tools/merge-validator.js.map +1 -1
  281. package/dist/src/tools/team-activity.d.ts.map +1 -1
  282. package/dist/src/tools/team-activity.js +22 -0
  283. package/dist/src/tools/team-activity.js.map +1 -1
  284. package/dist/src/tools/transition-recorder.d.ts +2 -17
  285. package/dist/src/tools/transition-recorder.d.ts.map +1 -1
  286. package/dist/src/tools/transition-recorder.js +6 -3
  287. package/dist/src/tools/transition-recorder.js.map +1 -1
  288. package/dist/src/types/index.d.ts +2 -1
  289. package/dist/src/types/index.d.ts.map +1 -1
  290. package/dist/src/utils/migration-registry.d.ts +65 -0
  291. package/dist/src/utils/migration-registry.d.ts.map +1 -0
  292. package/dist/src/utils/migration-registry.js +117 -0
  293. package/dist/src/utils/migration-registry.js.map +1 -0
  294. package/dist/src/utils/state-schema.d.ts +153 -0
  295. package/dist/src/utils/state-schema.d.ts.map +1 -0
  296. package/dist/src/utils/state-schema.js +329 -0
  297. package/dist/src/utils/state-schema.js.map +1 -0
  298. package/package.json +1 -1
  299. package/shared/agent-types.ts +4 -0
  300. package/templates/state.json +17 -39
  301. package/templates/worktree-scope.json +9 -10
  302. package/templates/worktrees.json +26 -27
  303. package/workflows/brainstorm.md +10 -1
  304. package/workflows/codebase-rebuild.md +2 -12
  305. package/workflows/debug.md +17 -8
  306. package/workflows/execute.md +18 -4
  307. package/workflows/fork.md +52 -37
  308. package/workflows/init.md +1 -4
  309. package/workflows/integration-test.md +13 -2
  310. package/workflows/issue.md +8 -4
  311. package/workflows/learn.md +25 -10
  312. package/workflows/maestro.codex.md +8 -1
  313. package/workflows/maestro.md +13 -3
  314. package/workflows/memory.md +26 -71
  315. package/workflows/merge.md +48 -52
  316. package/workflows/milestone-complete.md +24 -7
  317. package/workflows/retrospective.md +87 -80
  318. package/workflows/review.md +11 -5
  319. package/workflows/specs-remove.md +115 -0
  320. package/workflows/specs-setup.md +10 -32
  321. package/workflows/status.md +291 -290
  322. package/workflows/sync.md +5 -5
  323. package/workflows/test.md +11 -2
  324. package/workflows/ui-style.md +8 -2
  325. package/workflows/verify.md +2 -2
  326. package/workflows/wiki-connect.md +188 -0
  327. package/workflows/wiki-digest.md +221 -0
  328. package/workflows/wiki-manage.md +204 -0
  329. package/dashboard/dist/assets/ChatInput-Bvr-FeEq.js +0 -49
  330. package/dashboard/dist/assets/ChatPage-D9zTkJZo.js +0 -22
  331. package/dashboard/dist/assets/KanbanPage-C8USth6H.js +0 -21
  332. package/dashboard/dist/assets/RequirementBoardPage-Bf1trzqs.js +0 -11
  333. package/dashboard/dist/assets/SpecsPage-9lwxKT27.js +0 -36
  334. package/dashboard/dist/assets/SupervisorPage-SusdfHFq.js +0 -6
  335. package/dashboard/dist/assets/TeamsPage-DsuM6OwC.js +0 -6
  336. package/dashboard/dist/assets/arrow-left-Bqtb2hle.js +0 -6
  337. package/dashboard/dist/assets/index-DWG-WrzT.js +0 -231
  338. package/dashboard/dist/assets/index-GUNJodSR.css +0 -1
  339. package/dashboard/dist/assets/table-llyEtj-7.js +0 -6
@@ -126,7 +126,16 @@ Parse $ARGUMENTS to determine execution mode:
126
126
  - None + single role mode → error E002
127
127
 
128
128
  **Output Directory Resolution**:
129
- - Phase mode (number): `.workflow/phases/{NN}-{slug}/.brainstorming/`
129
+ - Phase mode (number):
130
+ ```
131
+ Read .workflow/state.json → state
132
+ artifacts = state.artifacts ?? []
133
+ art = artifacts.find(a => a.phase === phaseNum)
134
+ IF art:
135
+ output_dir = ".workflow/" + art.path + "/.brainstorming/"
136
+ ELSE:
137
+ ERROR "Phase {phaseNum} not found in artifact registry"
138
+ ```
130
139
  - All output: `.workflow/scratch/brainstorm-{slug}-{date}/`
131
140
  - Existing session: use existing session directory
132
141
 
@@ -49,7 +49,7 @@ Scan src/ (and other source directories) for components:
49
49
 
50
50
  a. Identify source directories:
51
51
  - Check for: src/, lib/, app/, packages/
52
- - Use project-tech.json source_dirs if available
52
+ - Read project.md Tech Stack section if available for context
53
53
 
54
54
  b. For each source directory, scan for component-forming files:
55
55
  - Directories that represent modules (contain index.ts/index.js or multiple files)
@@ -267,16 +267,7 @@ a. Update state.json:
267
267
  Set last_updated: "{ISO timestamp}"
268
268
  Write updated state.json
269
269
 
270
- b. Update project-tech.json (if exists):
271
- Read .workflow/project-tech.json
272
- Compare detected tech stack (from Step 2 scan) against existing entries:
273
- - New languages, frameworks, databases, tools discovered
274
- - Version changes detected (from package.json, go.mod, pyproject.toml, etc.)
275
- If differences found:
276
- Update project-tech.json with current detected stack
277
- Display: "project-tech.json: updated with {count} changes"
278
-
279
- c. Update project.md Tech Stack (if exists):
270
+ b. Update project.md Tech Stack (if exists):
280
271
  Read .workflow/project.md
281
272
  Compare "## Tech Stack" section against detected stack from Step 2
282
273
  If new entries or changes detected:
@@ -328,5 +319,4 @@ Suggest next:
328
319
  | `.workflow/codebase/feature-maps/_index.md` | Feature index |
329
320
  | `.workflow/codebase/feature-maps/{slug}.md` | Per-feature documentation |
330
321
  | `.workflow/state.json` | Updated: last_codebase_rebuild timestamp |
331
- | `.workflow/project-tech.json` | Updated: detected tech stack changes |
332
322
  | `.workflow/project.md` | Updated: Tech Stack section refreshed |
@@ -14,10 +14,8 @@ When root causes found, auto-updates originating uat.md with diagnosis.
14
14
  ### Step 1: Check Active Sessions
15
15
 
16
16
  ```bash
17
- # Phase-scoped debug sessions
18
- find .workflow/phases -path "*/.debug/*" -name "understanding.md" 2>/dev/null | head -5
19
-
20
- # Standalone scratch debug sessions
17
+ # Check scratch dirs (resolved via artifact registry) for debug sessions
18
+ find .workflow/scratch -path "*/.debug/*" -name "understanding.md" 2>/dev/null | head -5
21
19
  find .workflow/scratch -type d -name "debug-*" 2>/dev/null | head -5
22
20
  ```
23
21
 
@@ -31,7 +29,7 @@ Display:
31
29
 
32
30
  | # | Location | Status | Current Hypothesis |
33
31
  |---|----------|--------|--------------------|
34
- | 1 | phases/03-auth/.debug/jwt-expiry/ | investigating | Token not refreshed on 401 |
32
+ | 1 | scratch/plan-auth-2026-04-20/.debug/jwt-expiry/ | investigating | Token not refreshed on 401 |
35
33
  | 2 | scratch/debug-nav-crash-2026-03-14/ | checkpoint | Awaiting user input |
36
34
 
37
35
  Reply with a number to resume, or describe a new issue.
@@ -66,7 +64,7 @@ Pass to debug agents as prior knowledge (known issues, root causes, workarounds)
66
64
 
67
65
  Skip if --from-uat is not set. Go to Step 3 instead.
68
66
 
69
- Read `{phase_dir}/uat.md` Gaps section. For each gap:
67
+ Read `{artifact_dir}/uat.md` Gaps section (artifact_dir resolved from artifact registry). For each gap:
70
68
  ```yaml
71
69
  - test: T-003
72
70
  truth: "User can reply to comments"
@@ -137,10 +135,21 @@ Create debug session directory and proceed to Step 6.
137
135
 
138
136
  | Mode | Directory |
139
137
  |------|-----------|
140
- | Phase-scoped (from UAT) | `.workflow/phases/{NN}-{slug}/.debug/{gap-slug}/` |
138
+ | Phase-scoped (from UAT) | `{ARTIFACT_DIR}/.debug/{gap-slug}/` (ARTIFACT_DIR resolved from artifact registry) |
141
139
  | Standalone | `.workflow/scratch/debug-{slug}-{date}/` |
142
140
 
143
- ```bash
141
+ ```
142
+ IF TARGET_TYPE == "phase":
143
+ Read .workflow/state.json → state
144
+ artifacts = state.artifacts ?? []
145
+ art = artifacts.find(a => a.type === 'execute' && a.phase === phaseNum)
146
+ IF art:
147
+ DEBUG_DIR = ".workflow/" + art.path + "/.debug/{gap-slug}/"
148
+ ELSE:
149
+ ERROR "Phase {phaseNum} not found in artifact registry"
150
+ ELSE:
151
+ DEBUG_DIR = ".workflow/scratch/debug-{slug}-{date}/"
152
+
144
153
  mkdir -p "$DEBUG_DIR"
145
154
  ```
146
155
 
@@ -221,9 +221,6 @@ For each wave in execution_queue (sequential):
221
221
  Read .workflow/state.json
222
222
  If state.json.status != "executing":
223
223
  state.json.status = "executing"
224
- # Worktree mode: skip phases_summary (reconciled on merge)
225
- IF NOT file_exists(".workflow/worktree-scope.json"):
226
- state.json.phases_summary.in_progress += 1
227
224
  state.json.last_updated = now()
228
225
  Write .workflow/state.json
229
226
 
@@ -565,7 +562,24 @@ Write state.json (atomic)
565
562
  // Incremental learning extraction
566
563
  Read all ${PLAN_DIR}/.summaries/TASK-*-summary.md
567
564
  Extract: strategy adjustments, patterns discovered, pitfalls encountered
568
- Append to .workflow/specs/learnings.md under "## Entries"
565
+
566
+ // Check existing entries to avoid duplicates
567
+ existing_learnings = maestro spec load --category learning
568
+
569
+ // Append using <spec-entry> closed-tag format:
570
+ FOR each extracted learning:
571
+ keywords = extract_keywords(learning.content) // 3-5 domain-specific terms
572
+ IF not duplicate of existing_learnings:
573
+ Append to .workflow/specs/learnings.md:
574
+ <spec-entry category="learning" keywords="{keywords}" date="{YYYY-MM-DD}" source="execute">
575
+
576
+ ### {learning.summary}
577
+
578
+ {learning.content}
579
+ Phase: {phase} | Plan: {PLAN_DIR}
580
+
581
+ </spec-entry>
582
+
569
583
  Mark artifact.harvested = true
570
584
  Write state.json (atomic)
571
585
  ```
package/workflows/fork.md CHANGED
@@ -121,12 +121,17 @@ IF syncMode:
121
121
  ## Step 5: Validate & Confirm
122
122
 
123
123
  ```
124
- // Load phase index files for all milestone phases
124
+ // Load phase status from artifact registry
125
125
  phaseList = []
126
+ artifacts = projectState.artifacts ?? []
127
+
128
+ // Derive phase status from artifact registry
126
129
  for (phaseNum of milestonePhases):
127
- Glob: .workflow/phases/{NN}-*/index.json where NN matches phaseNum
128
- Read index.json phaseIndex
129
- phaseList.push(phaseIndex)
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 })
130
135
 
131
136
  // Validate: milestone should have at least one non-completed phase
132
137
  nonCompleted = phaseList.filter(p => p.status !== "completed")
@@ -172,7 +177,7 @@ Bash("git branch -D {branch}") // ignore errors (may not exist)
172
177
  Bash("git worktree add -b {branch} {wtPath} {baseBranch}")
173
178
 
174
179
  // 6c: Create .workflow/ structure in worktree
175
- Bash("mkdir -p {wtPath}/.workflow/phases")
180
+ Bash("mkdir -p {wtPath}/.workflow/scratch")
176
181
 
177
182
  // 6d: Copy shared context (read-only)
178
183
  Copy .workflow/project.md → {wtPath}/.workflow/project.md
@@ -182,46 +187,61 @@ IF file_exists(".workflow/config.json"):
182
187
  IF directory_exists(".workflow/specs"):
183
188
  Copy .workflow/specs/ → {wtPath}/.workflow/specs/
184
189
 
185
- // 6e: Copy ALL phase directories for this milestone
186
- ownedPhaseNumbers = []
187
- for (p of phaseList):
188
- NN = String(p.phase).padStart(2, '0')
189
- Copy .workflow/phases/{NN}-{p.slug}/ → {wtPath}/.workflow/phases/{NN}-{p.slug}/
190
- ownedPhaseNumbers.push(p.phase)
191
-
192
- // 6f: Copy completed dependency phase dirs outside this milestone (read-only reference)
193
- allDeps = new Set()
194
- for (p of phaseList):
195
- for (dep of p.depends_on):
190
+ // 6e: Copy milestone artifacts to worktree
191
+ ownedPhaseNumbers = milestonePhases.slice() // all phases in this milestone
192
+
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}/
200
+
201
+ // 6f: Copy dependency artifacts (phases outside this milestone)
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):
196
207
  IF NOT ownedPhaseNumbers.includes(dep):
197
- allDeps.add(dep)
198
-
199
- for (dep of allDeps):
200
- depNN = String(dep).padStart(2, '0')
201
- Glob: .workflow/phases/{depNN}-*/index.json
202
- Read depIndex
203
- Copy .workflow/phases/{depNN}-{depIndex.slug}/ → {wtPath}/.workflow/phases/{depNN}-{depIndex.slug}/
204
-
205
- // 6g: Write worktree-scope.json
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}/
215
+
216
+ // 6g: Build phase_dependencies map for worktree-scope
217
+ phaseDeps = {}
218
+ IF milestoneEntry.depends_on:
219
+ for (phaseNum of ownedPhaseNumbers):
220
+ phaseDeps[String(phaseNum)] = milestoneEntry.depends_on
221
+ .filter(d => !ownedPhaseNumbers.includes(d))
222
+
223
+ // 6h: Write worktree-scope.json
206
224
  Write {wtPath}/.workflow/worktree-scope.json:
207
225
  {
208
226
  "worktree": true,
209
227
  "milestone_num": milestoneNum,
210
228
  "milestone": milestoneName,
211
229
  "owned_phases": ownedPhaseNumbers,
230
+ "phase_dependencies": phaseDeps,
212
231
  "main_worktree": resolve(cwd),
213
232
  "branch": branch,
214
233
  "base_commit": baseCommit,
215
234
  "created_at": getUtc8ISOString()
216
235
  }
217
236
 
218
- // 6h: Write scoped state.json
237
+ // 6i: Write scoped state.json
219
238
  Read .workflow/state.json → mainState
220
239
  firstPending = phaseList.find(p => p.status !== "completed")
221
240
  scopedState = {
222
241
  ...mainState,
223
- current_phase: firstPending?.phase ?? phaseList[0].phase,
224
- current_milestone: milestoneName
242
+ current_milestone: milestoneName,
243
+ // Carry over milestone-scoped artifacts to worktree
244
+ artifacts: artifacts.filter(a => a.milestone === milestoneName || ownedPhaseNumbers.includes(a.phase))
225
245
  }
226
246
  Write {wtPath}/.workflow/state.json: scopedState
227
247
  ```
@@ -260,14 +280,10 @@ registry.fork_sessions.push({
260
280
 
261
281
  Write .workflow/worktrees.json: registry
262
282
 
263
- // Mark milestone phases as "forked" in main
264
- for (p of phaseList):
265
- IF p.status !== "completed":
266
- NN = String(p.phase).padStart(2, '0')
267
- Read .workflow/phases/{NN}-{p.slug}/index.json → idx
268
- idx.status = "forked"
269
- idx.updated_at = getUtc8ISOString()
270
- Write .workflow/phases/{NN}-{p.slug}/index.json: idx
283
+ // Mark milestone phases as "forked"
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)
271
287
 
272
288
  mainState.last_updated = getUtc8ISOString()
273
289
  Write .workflow/state.json: mainState
@@ -295,7 +311,6 @@ Display:
295
311
  /maestro-plan {firstPending.phase}
296
312
  /maestro-execute {firstPending.phase}
297
313
  /maestro-verify {firstPending.phase}
298
- /maestro-phase-transition {firstPending.phase}
299
314
  # ... repeat for next phases in milestone
300
315
 
301
316
  Or delegate (automated):
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,13 +15,24 @@ 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 `.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
 
22
+ **Resolve phase dir:**
23
+ ```
24
+ Read .workflow/state.json → state
25
+ artifacts = state.artifacts ?? []
26
+ art = artifacts.find(a => a.type === 'execute' && a.phase === phaseNum)
27
+ IF art:
28
+ PHASE_DIR = ".workflow/" + art.path
29
+ ELSE:
30
+ ERROR "Phase {phaseNum} not found in artifact registry"
31
+ ```
32
+
22
33
  Check for existing integration test session:
23
34
  ```bash
24
- ls .workflow/phases/{NN}-*/.tests/integration/state.json 2>/dev/null
35
+ ls ${PHASE_DIR}/.tests/integration/state.json 2>/dev/null
25
36
  ```
26
37
 
27
38
  If session exists: offer resume or restart.
@@ -178,8 +178,10 @@ 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/phases/{NN}-{slug}/plan.json (if exists)
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
+ art = artifacts.find(a => a.type === 'plan' && a.phase === phaseNum)
184
+ IF art: Read .workflow/{art.path}/plan.json (if exists)
183
185
  Collect files_to_create[] as planned_files
184
186
  d. IF affected_components in the new issue overlap with planned_files:
185
187
  WARNING: "Conflict detected: this supplement issue affects components planned in milestone {other_milestone}"
@@ -449,8 +451,10 @@ Process bidirectional link:
449
451
  If not found → error: "Issue {ID} not found"
450
452
 
451
453
  2. Locate task file:
452
- - Search .workflow/phases/*/.task/{TASK_ID}.json
453
- - If not found search .workflow/scratch/*/.task/{TASK_ID}.json
454
+ - Read .workflow/state.json → state
455
+ - artifacts = state.artifacts ?? []
456
+ - Search artifact registry paths: .workflow/{artifact.path}/.task/{TASK_ID}.json
457
+ - Also search .workflow/scratch/*/.task/{TASK_ID}.json (standalone scratch tasks)
454
458
  - If still not found → error: "Task {TASK_ID} not found"
455
459
 
456
460
  3. Update issue record:
@@ -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,12 +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 ?? []
88
87
 
89
- # Resolve slug
90
- Glob ".workflow/phases/{NN}-*/" where NN == phase
91
- phase_slug = matched directory basename (e.g. "01-auth")
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'))
96
+
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
92
101
  ```
93
102
 
94
103
  If `--phase 0` is passed, force `phase = null, phase_slug = null` regardless.
@@ -299,8 +308,14 @@ IF row is null → error E004: "Insight {target_id} not found"
299
308
  ```
300
309
  phase_context = null
301
310
  IF row.phase_slug is not null:
302
- phase_dir = ".workflow/phases/" + row.phase_slug
303
- IF directory exists:
311
+ // Resolve phase dir from artifact registry
312
+ Read .workflow/state.json → state
313
+ artifacts = state.artifacts ?? []
314
+ phase_dir = null
315
+ art = artifacts.find(a => a.phase === row.phase && a.path)
316
+ IF art: phase_dir = ".workflow/" + art.path
317
+
318
+ IF phase_dir AND directory exists:
304
319
  phase_context = {
305
320
  title: read index.json.title from phase_dir,
306
321
  status: read index.json.status,
@@ -368,7 +383,7 @@ PHASE CONTEXT:
368
383
  | E002 | error | Unknown `--category` (allowed: pattern, antipattern, decision, tool, gotcha, technique) |
369
384
  | E003 | error | `show` mode requires an INS-id argument |
370
385
  | E004 | error | Insight id not found in lessons.jsonl |
371
- | 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 |
372
387
  | W002 | warning | learning-index.json out of sync with lessons.jsonl (different row count); offer to rebuild |
373
388
 
374
389
  ---
@@ -378,7 +393,7 @@ PHASE CONTEXT:
378
393
  - [ ] Mode correctly routed (capture / list / search / show)
379
394
  - [ ] Capture mode: `lessons.jsonl` row appended, valid JSON, all required fields present
380
395
  - [ ] Capture mode: `learning-index.json` updated with matching entry
381
- - [ ] Capture mode: phase auto-link resolves correctly when state.json has current_phase
396
+ - [ ] Capture mode: phase auto-link resolves correctly from artifact registry
382
397
  - [ ] Capture mode: category inference produces a sensible default when --category absent
383
398
  - [ ] List mode: filters apply; output sorted newest-first
384
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,
@@ -789,6 +798,7 @@ const context = {
789
798
  const AUTO_FLAG_MAP = {
790
799
  'maestro-analyze': '-y',
791
800
  'maestro-brainstorm': '-y',
801
+ 'maestro-roadmap': '-y',
792
802
  'maestro-ui-design': '-y',
793
803
  'maestro-plan': '--auto',
794
804
  'maestro-spec-generate': '-y',