maestro-flow 0.3.12 → 0.3.14

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 (251) 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-link-coordinate/SKILL.md +430 -224
  47. package/.codex/skills/maestro-milestone-complete/SKILL.md +18 -1
  48. package/.codex/skills/maestro-plan/SKILL.md +6 -6
  49. package/.codex/skills/maestro-roadmap/SKILL.md +3 -4
  50. package/.codex/skills/maestro-spec-generate/SKILL.md +2 -2
  51. package/.codex/skills/maestro-ui-design/SKILL.md +6 -6
  52. package/.codex/skills/maestro-verify/SKILL.md +20 -11
  53. package/.codex/skills/manage-codebase-rebuild/SKILL.md +4 -4
  54. package/.codex/skills/manage-harvest/SKILL.md +10 -1
  55. package/.codex/skills/manage-issue-discover/SKILL.md +3 -3
  56. package/.codex/skills/manage-learn/SKILL.md +3 -2
  57. package/.codex/skills/manage-memory/SKILL.md +3 -3
  58. package/.codex/skills/manage-memory-capture/SKILL.md +8 -14
  59. package/.codex/skills/manage-status/SKILL.md +9 -4
  60. package/.codex/skills/manage-wiki/SKILL.md +55 -0
  61. package/.codex/skills/quality-business-test/SKILL.md +8 -6
  62. package/.codex/skills/quality-debug/SKILL.md +22 -9
  63. package/.codex/skills/quality-integration-test/SKILL.md +11 -7
  64. package/.codex/skills/quality-retrospective/SKILL.md +45 -26
  65. package/.codex/skills/quality-review/SKILL.md +10 -7
  66. package/.codex/skills/quality-test/SKILL.md +9 -4
  67. package/.codex/skills/quality-test-gen/SKILL.md +13 -9
  68. package/.codex/skills/spec-add/SKILL.md +11 -3
  69. package/.codex/skills/spec-load/SKILL.md +7 -0
  70. package/.codex/skills/spec-map/SKILL.md +2 -2
  71. package/.codex/skills/spec-remove/SKILL.md +101 -0
  72. package/.codex/skills/spec-setup/SKILL.md +4 -8
  73. package/.codex/skills/wiki-connect/SKILL.md +6 -5
  74. package/.codex/skills/wiki-digest/SKILL.md +2 -2
  75. package/chains/milestone-fork-merge.json +6 -6
  76. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.d.ts +9 -0
  77. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js +109 -9
  78. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js.map +1 -1
  79. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.test.js +49 -0
  80. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.test.js.map +1 -1
  81. package/dashboard/dist-server/dashboard/src/server/routes/index.js +5 -4
  82. package/dashboard/dist-server/dashboard/src/server/routes/index.js.map +1 -1
  83. package/dashboard/dist-server/dashboard/src/server/routes/specs.d.ts +5 -13
  84. package/dashboard/dist-server/dashboard/src/server/routes/specs.js +97 -155
  85. package/dashboard/dist-server/dashboard/src/server/routes/specs.js.map +1 -1
  86. package/dashboard/dist-server/dashboard/src/server/routes/wiki.d.ts +11 -1
  87. package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js +27 -6
  88. package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js.map +1 -1
  89. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js +25 -7
  90. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js.map +1 -1
  91. package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js +8 -0
  92. package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js.map +1 -1
  93. package/dashboard/dist-server/dashboard/src/server/wiki/search.js +1 -0
  94. package/dashboard/dist-server/dashboard/src/server/wiki/search.js.map +1 -1
  95. package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.d.ts +29 -0
  96. package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.js +148 -0
  97. package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.js.map +1 -0
  98. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +4 -2
  99. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
  100. package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js +8 -2
  101. package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js.map +1 -1
  102. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.d.ts +5 -0
  103. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +80 -38
  104. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
  105. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js +8 -6
  106. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js.map +1 -1
  107. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-types.d.ts +40 -5
  108. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js +21 -23
  109. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js.map +1 -1
  110. package/dashboard/dist-server/dashboard/src/server/wiki/writer.d.ts +33 -3
  111. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js +184 -12
  112. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js.map +1 -1
  113. package/dashboard/dist-server/src/commands/delegate.js +26 -0
  114. package/dashboard/dist-server/src/commands/delegate.js.map +1 -1
  115. package/dashboard/dist-server/src/coordinator/graph-types.d.ts +11 -1
  116. package/dashboard/dist-server/src/coordinator/graph-walker.js +29 -2
  117. package/dashboard/dist-server/src/coordinator/graph-walker.js.map +1 -1
  118. package/dashboard/dist-server/src/coordinator/prompt-assembler.js +3 -2
  119. package/dashboard/dist-server/src/coordinator/prompt-assembler.js.map +1 -1
  120. package/dashboard/dist-server/src/hooks/constants.d.ts +29 -60
  121. package/dashboard/dist-server/src/hooks/constants.js +105 -82
  122. package/dashboard/dist-server/src/hooks/constants.js.map +1 -1
  123. package/dashboard/dist-server/src/types/index.d.ts +2 -1
  124. package/dist/src/commands/delegate.d.ts.map +1 -1
  125. package/dist/src/commands/delegate.js +26 -0
  126. package/dist/src/commands/delegate.js.map +1 -1
  127. package/dist/src/commands/hooks.d.ts +2 -4
  128. package/dist/src/commands/hooks.d.ts.map +1 -1
  129. package/dist/src/commands/hooks.js +4 -7
  130. package/dist/src/commands/hooks.js.map +1 -1
  131. package/dist/src/commands/install-ui/InstallConfirm.d.ts +2 -3
  132. package/dist/src/commands/install-ui/InstallConfirm.d.ts.map +1 -1
  133. package/dist/src/commands/install-ui/InstallConfirm.js +1 -1
  134. package/dist/src/commands/install-ui/InstallConfirm.js.map +1 -1
  135. package/dist/src/commands/install-ui/InstallExecution.d.ts.map +1 -1
  136. package/dist/src/commands/install-ui/InstallExecution.js +1 -2
  137. package/dist/src/commands/install-ui/InstallExecution.js.map +1 -1
  138. package/dist/src/commands/install-ui/InstallFlow.d.ts.map +1 -1
  139. package/dist/src/commands/install-ui/InstallFlow.js +5 -7
  140. package/dist/src/commands/install-ui/InstallFlow.js.map +1 -1
  141. package/dist/src/commands/install-ui/StatuslineConfig.d.ts +3 -6
  142. package/dist/src/commands/install-ui/StatuslineConfig.d.ts.map +1 -1
  143. package/dist/src/commands/install-ui/StatuslineConfig.js +21 -17
  144. package/dist/src/commands/install-ui/StatuslineConfig.js.map +1 -1
  145. package/dist/src/commands/update.d.ts.map +1 -1
  146. package/dist/src/commands/update.js +95 -0
  147. package/dist/src/commands/update.js.map +1 -1
  148. package/dist/src/commands/wiki.d.ts.map +1 -1
  149. package/dist/src/commands/wiki.js +75 -11
  150. package/dist/src/commands/wiki.js.map +1 -1
  151. package/dist/src/coordinator/graph-types.d.ts +11 -1
  152. package/dist/src/coordinator/graph-types.d.ts.map +1 -1
  153. package/dist/src/coordinator/graph-walker.d.ts.map +1 -1
  154. package/dist/src/coordinator/graph-walker.js +29 -2
  155. package/dist/src/coordinator/graph-walker.js.map +1 -1
  156. package/dist/src/coordinator/prompt-assembler.d.ts.map +1 -1
  157. package/dist/src/coordinator/prompt-assembler.js +3 -2
  158. package/dist/src/coordinator/prompt-assembler.js.map +1 -1
  159. package/dist/src/hooks/__tests__/statusline-visual-test.d.ts +4 -1
  160. package/dist/src/hooks/__tests__/statusline-visual-test.d.ts.map +1 -1
  161. package/dist/src/hooks/__tests__/statusline-visual-test.js +55 -174
  162. package/dist/src/hooks/__tests__/statusline-visual-test.js.map +1 -1
  163. package/dist/src/hooks/auto-mode.d.ts +18 -0
  164. package/dist/src/hooks/auto-mode.d.ts.map +1 -0
  165. package/dist/src/hooks/auto-mode.js +28 -0
  166. package/dist/src/hooks/auto-mode.js.map +1 -0
  167. package/dist/src/hooks/constants.d.ts +29 -60
  168. package/dist/src/hooks/constants.d.ts.map +1 -1
  169. package/dist/src/hooks/constants.js +105 -82
  170. package/dist/src/hooks/constants.js.map +1 -1
  171. package/dist/src/hooks/context-monitor.d.ts.map +1 -1
  172. package/dist/src/hooks/context-monitor.js +14 -3
  173. package/dist/src/hooks/context-monitor.js.map +1 -1
  174. package/dist/src/hooks/coordinator-tracker.d.ts +1 -0
  175. package/dist/src/hooks/coordinator-tracker.d.ts.map +1 -1
  176. package/dist/src/hooks/coordinator-tracker.js +19 -9
  177. package/dist/src/hooks/coordinator-tracker.js.map +1 -1
  178. package/dist/src/hooks/skill-context.d.ts.map +1 -1
  179. package/dist/src/hooks/skill-context.js +54 -6
  180. package/dist/src/hooks/skill-context.js.map +1 -1
  181. package/dist/src/hooks/statusline.d.ts +11 -8
  182. package/dist/src/hooks/statusline.d.ts.map +1 -1
  183. package/dist/src/hooks/statusline.js +284 -182
  184. package/dist/src/hooks/statusline.js.map +1 -1
  185. package/dist/src/hooks/workspace.d.ts.map +1 -1
  186. package/dist/src/hooks/workspace.js +2 -1
  187. package/dist/src/hooks/workspace.js.map +1 -1
  188. package/dist/src/migrations/_template.d.ts +12 -0
  189. package/dist/src/migrations/_template.d.ts.map +1 -0
  190. package/dist/src/migrations/_template.js +55 -0
  191. package/dist/src/migrations/_template.js.map +1 -0
  192. package/dist/src/migrations/index.d.ts +14 -0
  193. package/dist/src/migrations/index.d.ts.map +1 -0
  194. package/dist/src/migrations/index.js +20 -0
  195. package/dist/src/migrations/index.js.map +1 -0
  196. package/dist/src/migrations/run.d.ts +12 -0
  197. package/dist/src/migrations/run.d.ts.map +1 -0
  198. package/dist/src/migrations/run.js +119 -0
  199. package/dist/src/migrations/run.js.map +1 -0
  200. package/dist/src/migrations/v1-to-v2.d.ts +10 -0
  201. package/dist/src/migrations/v1-to-v2.d.ts.map +1 -0
  202. package/dist/src/migrations/v1-to-v2.js +71 -0
  203. package/dist/src/migrations/v1-to-v2.js.map +1 -0
  204. package/dist/src/tools/team-activity.d.ts.map +1 -1
  205. package/dist/src/tools/team-activity.js +22 -0
  206. package/dist/src/tools/team-activity.js.map +1 -1
  207. package/dist/src/tools/transition-recorder.d.ts +2 -17
  208. package/dist/src/tools/transition-recorder.d.ts.map +1 -1
  209. package/dist/src/tools/transition-recorder.js +6 -3
  210. package/dist/src/tools/transition-recorder.js.map +1 -1
  211. package/dist/src/types/index.d.ts +2 -1
  212. package/dist/src/types/index.d.ts.map +1 -1
  213. package/dist/src/utils/migration-registry.d.ts +65 -0
  214. package/dist/src/utils/migration-registry.d.ts.map +1 -0
  215. package/dist/src/utils/migration-registry.js +117 -0
  216. package/dist/src/utils/migration-registry.js.map +1 -0
  217. package/dist/src/utils/state-schema.d.ts +153 -0
  218. package/dist/src/utils/state-schema.d.ts.map +1 -0
  219. package/dist/src/utils/state-schema.js +329 -0
  220. package/dist/src/utils/state-schema.js.map +1 -0
  221. package/package.json +1 -1
  222. package/templates/state.json +17 -39
  223. package/workflows/brainstorm.md +3 -3
  224. package/workflows/codebase-rebuild.md +2 -12
  225. package/workflows/debug.md +7 -8
  226. package/workflows/execute.md +18 -4
  227. package/workflows/fork.md +37 -86
  228. package/workflows/init.md +1 -4
  229. package/workflows/integration-test.md +4 -5
  230. package/workflows/issue.md +3 -9
  231. package/workflows/learn.md +20 -19
  232. package/workflows/maestro-coordinate.codex.md +9 -9
  233. package/workflows/maestro-coordinate.md +9 -9
  234. package/workflows/maestro.codex.md +8 -1
  235. package/workflows/maestro.md +14 -5
  236. package/workflows/memory.md +26 -71
  237. package/workflows/merge.md +45 -107
  238. package/workflows/milestone-complete.md +24 -7
  239. package/workflows/retrospective.md +77 -109
  240. package/workflows/review.md +5 -12
  241. package/workflows/specs-remove.md +115 -0
  242. package/workflows/specs-setup.md +10 -32
  243. package/workflows/status.md +291 -290
  244. package/workflows/sync.md +5 -5
  245. package/workflows/test.md +4 -5
  246. package/workflows/ui-style.md +3 -4
  247. package/workflows/verify.md +2 -2
  248. package/workflows/wiki-connect.md +188 -0
  249. package/workflows/wiki-digest.md +221 -0
  250. package/workflows/wiki-manage.md +204 -0
  251. package/.codex/skills/maestro-chain/SKILL.md +0 -233
@@ -9,7 +9,7 @@ This is a **post-execution analysis** workflow. It reads only — until the rout
9
9
  ## Prerequisites
10
10
 
11
11
  - `.workflow/` initialized (`.workflow/state.json` exists)
12
- - At least one completed phase (via artifact registry in state.json, or legacy `.workflow/phases/{NN}-{slug}/`)
12
+ - At least one completed phase (via artifact registry in state.json)
13
13
  - Target phase has been executed (has `.task/` and `.summaries/`)
14
14
  - `maestro delegate` available (used for the four lens analyses via Agent calls)
15
15
 
@@ -64,43 +64,24 @@ candidates = []
64
64
 
65
65
  Read .workflow/state.json → state
66
66
  artifacts = state.artifacts ?? []
67
- useArtifactRegistry = artifacts.length > 0
68
-
69
- IF useArtifactRegistry:
70
- // Resolve completed phases from artifact registry
71
- phaseNums = [...new Set(artifacts.map(a => a.phase).filter(Boolean))]
72
- FOR each phaseNum in phaseNums:
73
- execArt = artifacts.find(a => a.type === 'execute' && a.phase === phaseNum && a.status === 'completed')
74
- IF execArt:
75
- scratchDir = ".workflow/" + execArt.path
76
- has_retro = file exists at "{scratchDir}/retrospective.json"
77
- candidates.push({
78
- number: phaseNum,
79
- slug: execArt.slug ?? "phase-" + phaseNum,
80
- title: execArt.title ?? execArt.slug ?? "Phase " + phaseNum,
81
- completed_at: execArt.completed_at,
82
- has_retro: has_retro,
83
- phase_dir: scratchDir,
84
- gaps: 0,
85
- review_verdict: "—"
86
- })
87
- ELSE:
88
- // Legacy: scan phases/ directory
89
- FOR each .workflow/phases/{NN}-{slug}/index.json:
90
- Read index.json
91
- IF index.json.status == "completed":
92
- phase_dir = ".workflow/phases/{NN}-{slug}"
93
- has_retro = file exists at "{phase_dir}/retrospective.json"
94
- candidates.push({
95
- number: NN,
96
- slug: slug,
97
- title: index.json.title or slug,
98
- completed_at: index.json.completed_at,
99
- has_retro: has_retro,
100
- phase_dir: phase_dir,
101
- gaps: index.json.verification?.gaps?.length or 0,
102
- review_verdict: index.json.review?.verdict or "—"
103
- })
67
+
68
+ // Resolve completed phases from artifact registry
69
+ phaseNums = [...new Set(artifacts.map(a => a.phase).filter(Boolean))]
70
+ FOR each phaseNum in phaseNums:
71
+ execArt = artifacts.find(a => a.type === 'execute' && a.phase === phaseNum && a.status === 'completed')
72
+ IF execArt:
73
+ artifact_dir = ".workflow/" + execArt.path
74
+ has_retro = file exists at "{artifact_dir}/retrospective.json"
75
+ candidates.push({
76
+ number: phaseNum,
77
+ slug: execArt.slug ?? "phase-" + phaseNum,
78
+ title: execArt.title ?? execArt.slug ?? "Phase " + phaseNum,
79
+ completed_at: execArt.completed_at,
80
+ has_retro: has_retro,
81
+ phase_dir: artifact_dir,
82
+ gaps: 0,
83
+ review_verdict: "—"
84
+ })
104
85
  ```
105
86
 
106
87
  ### Display backlog
@@ -130,7 +111,7 @@ ELSE:
130
111
 
131
112
  If overwriting existing retrospective.json:
132
113
  ```
133
- mkdir -p "{candidate.phase_dir}/.history"
114
+ mkdir -p "{candidate.phase_dir}/.history" // phase_dir is artifact_dir from registry
134
115
  TIMESTAMP = format(now(), "YYYY-MM-DDTHH-mm-ss")
135
116
  mv "{candidate.phase_dir}/retrospective.json" "{candidate.phase_dir}/.history/retrospective-{TIMESTAMP}.json"
136
117
  mv "{candidate.phase_dir}/retrospective.md" "{candidate.phase_dir}/.history/retrospective-{TIMESTAMP}.md"
@@ -143,20 +124,20 @@ mv "{candidate.phase_dir}/retrospective.md" "{candidate.phase_dir}/.history/re
143
124
  For each selected phase (using `candidate.phase_dir` resolved in Stage 2), build the in-memory artifacts bundle:
144
125
 
145
126
  ```
146
- phase_dir = candidate.phase_dir // already resolved: scratch path (artifact registry) or legacy phases/ path
127
+ phase_dir = candidate.phase_dir // already resolved from artifact registry (e.g. .workflow/scratch/plan-auth-2026-04-20)
147
128
 
148
129
  artifacts = {
149
130
  phase_num: NN,
150
131
  phase_slug: slug,
151
- phase_dir: phase_dir,
152
- index: read "{phase_dir}/index.json" or null,
132
+ artifact_dir: artifact_dir,
133
+ index: read "{artifact_dir}/index.json" or null,
153
134
  state: read .workflow/state.json,
154
- plan: read "{phase_dir}/plan.json" or null,
155
- verification: read "{phase_dir}/verification.json" or null,
156
- review: read "{phase_dir}/review.json" or null,
157
- uat: read "{phase_dir}/uat.md" or null,
158
- task_summaries: read all "{phase_dir}/.summaries/TASK-*-summary.md",
159
- task_jsons: read all "{phase_dir}/.task/TASK-*.json",
135
+ plan: read "{artifact_dir}/plan.json" or null,
136
+ verification: read "{artifact_dir}/verification.json" or null,
137
+ review: read "{artifact_dir}/review.json" or null,
138
+ uat: read "{artifact_dir}/uat.md" or null,
139
+ task_summaries: read all "{artifact_dir}/.summaries/TASK-*-summary.md",
140
+ task_jsons: read all "{artifact_dir}/.task/TASK-*.json",
160
141
  phase_issues: filter ".workflow/issues/issues.jsonl" + ".workflow/issues/issue-history.jsonl"
161
142
  where issue.phase_ref == phase_slug or issue.phase_ref == NN,
162
143
  prior_retro: null
@@ -164,12 +145,9 @@ artifacts = {
164
145
 
165
146
  // Resolve --compare target
166
147
  IF --compare M:
167
- IF useArtifactRegistry:
168
- compareArt = state.artifacts.find(a => a.type === 'execute' && a.phase === M)
169
- IF compareArt:
170
- artifacts.prior_retro = read ".workflow/" + compareArt.path + "/retrospective.json"
171
- ELSE:
172
- artifacts.prior_retro = read .workflow/phases/{MM}-*/retrospective.json
148
+ compareArt = state.artifacts.find(a => a.type === 'execute' && a.phase === M)
149
+ IF compareArt:
150
+ artifacts.prior_retro = read ".workflow/" + compareArt.path + "/retrospective.json"
173
151
  }
174
152
  ```
175
153
 
@@ -245,12 +223,12 @@ the project's spec / note / issue stores.
245
223
  - Completed at: {index.completed_at}
246
224
 
247
225
  ## Artifacts (read these from disk)
248
- - Plan: {phase_dir}/plan.json
249
- - Verification: {phase_dir}/verification.json
250
- - Review: {phase_dir}/review.json
251
- - UAT notes: {phase_dir}/uat.md
252
- - Task summaries: {phase_dir}/.summaries/
253
- - Task JSONs: {phase_dir}/.task/
226
+ - Plan: {artifact_dir}/plan.json
227
+ - Verification: {artifact_dir}/verification.json
228
+ - Review: {artifact_dir}/review.json
229
+ - UAT notes: {artifact_dir}/uat.md
230
+ - Task summaries: {artifact_dir}/.summaries/
231
+ - Task JSONs: {artifact_dir}/.task/
254
232
  - Phase issues: .workflow/issues/issues.jsonl (filter phase_ref == "{phase_slug}")
255
233
  - Project state: .workflow/state.json (decisions, deferred)
256
234
 
@@ -287,7 +265,7 @@ Return ONLY a single JSON object, no prose, matching this schema:
287
265
  "title": "Short imperative title",
288
266
  "summary": "1–3 sentences a future planner can act on",
289
267
  "confidence": "high|medium|low",
290
- "evidence_refs": ["{phase_dir}/verification.json#gaps[2]", "..."],
268
+ "evidence_refs": ["{artifact_dir}/verification.json#gaps[2]", "..."],
291
269
  "routed_to": "spec|note|issue|none",
292
270
  "tags": ["..."]
293
271
  }
@@ -463,8 +441,8 @@ retrospective = {
463
441
 
464
442
  Write both files (phase_dir already resolved in Stage 2):
465
443
  ```
466
- Write "{phase_dir}/retrospective.json"
467
- Write "{phase_dir}/retrospective.md"
444
+ Write "{artifact_dir}/retrospective.json"
445
+ Write "{artifact_dir}/retrospective.md"
468
446
  ```
469
447
 
470
448
  ---
@@ -493,46 +471,31 @@ Accept all? [Y/n/i for individual]
493
471
 
494
472
  #### Target: spec
495
473
 
496
- Write a stub spec file directly. Do NOT invoke `spec-generate` (heavyweight 7-phase pipeline).
474
+ Route spec-routed insights as `<spec-entry>` entries into the appropriate category file. Map insight type to category:
475
+ - `pattern` / `convention` → `coding`
476
+ - `adr-candidate` / architecture → `arch`
477
+ - quality-related → `quality`
497
478
 
498
479
  ```
499
- mkdir -p ".workflow/specs"
500
- slug = slugify(insight.title)
501
- spec_file = ".workflow/specs/SPEC-retro-{phase_num}-{INS_id}-{slug}.md"
502
-
503
- Write spec_file:
504
- ---
505
- status: draft
506
- type: pattern | convention | adr-candidate
507
- source: retrospective
508
- source_phase: {NN}
509
- source_insight: {INS_id}
510
- created_at: {now ISO}
511
- tags: {insight.tags}
512
- confidence: {insight.confidence}
513
- ---
514
-
515
- # {insight.title}
480
+ category = map_insight_to_category(insight.type)
481
+ target_file = category_to_file(category) # e.g., coding → coding-conventions.md
516
482
 
517
- ## Context
483
+ keywords = extract_keywords(insight.title + insight.summary) # 3-5 domain-specific terms
518
484
 
519
- Extracted from phase {NN} ({phase_slug}) retrospective by the {lens} lens.
520
- This stub captures a reusable {category} surfaced during execution; expand it
521
- into a full spec via `/maestro-spec-generate` if it warrants project-wide adoption.
485
+ Append to .workflow/specs/{target_file}:
486
+ <spec-entry category="{category}" keywords="{keywords}" date="{YYYY-MM-DD}" source="retrospective">
522
487
 
523
- ## Pattern / Convention
488
+ ### {insight.title}
524
489
 
525
- {insight.summary}
490
+ {insight.summary}
526
491
 
527
- ## Evidence
492
+ **Evidence:** {FOR ref in evidence_refs:} `{ref}` {END FOR}
493
+ **Phase:** {NN} ({phase_slug}) | **Lens:** {lens} | **Insight:** {INS_id} | **Confidence:** {insight.confidence}
528
494
 
529
- {FOR ref in evidence_refs:} - `{ref}`{END FOR}
530
-
531
- ## Open Questions
495
+ </spec-entry>
496
+ ```
532
497
 
533
- - Is this pattern already documented elsewhere?
534
- - Should existing code be migrated to this pattern, or is it forward-only?
535
- - What is the failure mode if this pattern is violated?
498
+ If the target file does not exist, create it with category frontmatter first (same as `spec-add` on-demand creation).
536
499
 
537
500
  ## Routing trail
538
501
 
@@ -541,7 +504,7 @@ into a full spec via `/maestro-spec-generate` if it warrants project-wide adopti
541
504
  - Insight: {INS_id}
542
505
  - Confidence: {confidence}
543
506
 
544
- insight.routed_id = "SPEC-retro-{phase_num}-{INS_id}-{slug}.md"
507
+ insight.routed_id = "{category_file}#INS-{INS_id}" # e.g., coding-conventions.md#INS-a1b2c3d4
545
508
  ```
546
509
 
547
510
  #### Target: note
@@ -561,7 +524,7 @@ Capture the returned TIP-{id} from the skill output.
561
524
  insight.routed_id = "TIP-{captured_id}"
562
525
  ```
563
526
 
564
- If the skill call cannot be intercepted to capture the ID, fall back to writing the tip file directly using the schema in `workflows/memory.md` Part B Step 3 (Tip mode), and update `memory-index.json` per Step 4.
527
+ If the skill call cannot be intercepted to capture the ID, fall back to writing the tip file directly using the schema in `workflows/memory.md` Part B Step 3 (Tip mode), and update `wiki-index.json` per Step 4.
565
528
 
566
529
  #### Target: issue
567
530
 
@@ -706,19 +669,24 @@ Write .workflow/learning/learning-index.json
706
669
 
707
670
  ### Backward-compat append to specs/learnings.md
708
671
 
709
- Append learnings to `.workflow/specs/learnings.md` (shared with milestone-complete's learning extraction). Append a one-line summary per insight:
672
+ Append learnings to `.workflow/specs/learnings.md` (shared with milestone-complete's learning extraction) using `<spec-entry>` closed-tag format:
710
673
 
711
674
  ```
712
675
  IF .workflow/specs/learnings.md exists:
713
676
  FOR each insight:
714
- Append under "## Entries":
715
- ### [{YYYY-MM-DD HH:mm}] {category}: {title}
677
+ keywords = extract_keywords(insight.title + insight.summary) # 3-5 domain-specific terms
678
+ Append:
679
+ <spec-entry category="learning" keywords="{keywords}" date="{YYYY-MM-DD}" source="retrospective">
680
+
681
+ ### {title}
716
682
 
717
683
  {summary}
718
- Phase: {NN} | Source: retrospective | Insight: {INS_id} | Lens: {lens}
684
+ Phase: {NN} | Lens: {lens} | Insight: {INS_id}
685
+
686
+ </spec-entry>
719
687
  ```
720
688
 
721
- If the file does not exist, create it with a `## Entries` header.
689
+ If the file does not exist, create it with category frontmatter and a `## Entries` header.
722
690
 
723
691
  ---
724
692
 
@@ -733,14 +701,14 @@ Lenses run: {lenses joined by ", "}
733
701
  Insights: {count}
734
702
 
735
703
  Routing summary:
736
- Specs drafted: {N} → .workflow/specs/SPEC-retro-*
704
+ Spec entries: {N} → .workflow/specs/{category-file}.md
737
705
  Notes saved: {N} → .workflow/memory/TIP-*
738
706
  Issues opened: {N} → .workflow/issues/issues.jsonl
739
707
  Lessons logged: {N} → .workflow/learning/lessons.jsonl
740
708
 
741
709
  Files:
742
- {phase_dir}/retrospective.md
743
- {phase_dir}/retrospective.json
710
+ {artifact_dir}/retrospective.md
711
+ {artifact_dir}/retrospective.json
744
712
 
745
713
  Next steps (suggested):
746
714
  Skill({ skill: "manage-status" }) — Review project state
@@ -809,12 +777,12 @@ Total issues: {sum}
809
777
  "summary": "Refresh-on-use prevents replay attacks. Implemented in src/auth/refresh.ts; should become a project-wide convention.",
810
778
  "confidence": "high",
811
779
  "evidence_refs": [
812
- ".workflow/phases/01-auth/verification.json#gaps[2]",
813
- ".workflow/phases/01-auth/.summaries/TASK-005-summary.md:42"
780
+ ".workflow/scratch/plan-auth-2026-04-15/verification.json#gaps[2]",
781
+ ".workflow/scratch/plan-auth-2026-04-15/.summaries/TASK-005-summary.md:42"
814
782
  ],
815
783
  "tags": ["auth", "jwt", "security"],
816
784
  "routed_to": "spec",
817
- "routed_id": "SPEC-retro-1-INS-a1b2c3d4-jwt-refresh-rotation.md"
785
+ "routed_id": "coding-conventions.md#INS-a1b2c3d4"
818
786
  }
819
787
  ],
820
788
  "routing_recommendations": [
@@ -829,7 +797,7 @@ Total issues: {sum}
829
797
  One JSON object per line:
830
798
 
831
799
  ```json
832
- {"id":"INS-a1b2c3d4","phase":1,"phase_slug":"01-auth","lens":"technical","category":"pattern","title":"JWT refresh tokens must rotate on every use","summary":"...","confidence":"high","tags":["auth","jwt","security"],"evidence_refs":["..."],"routed_to":"spec","routed_id":"SPEC-retro-1-INS-a1b2c3d4-jwt-refresh-rotation.md","source":"retrospective","captured_at":"2026-04-11T10:00:00Z"}
800
+ {"id":"INS-a1b2c3d4","phase":1,"phase_slug":"01-auth","lens":"technical","category":"pattern","title":"JWT refresh tokens must rotate on every use","summary":"...","confidence":"high","tags":["auth","jwt","security"],"evidence_refs":["..."],"routed_to":"spec","routed_id":"coding-conventions.md#INS-a1b2c3d4","source":"retrospective","captured_at":"2026-04-11T10:00:00Z"}
833
801
  ```
834
802
 
835
803
  ### learning-index.json
@@ -850,7 +818,7 @@ One JSON object per line:
850
818
  "phase_slug": "01-auth",
851
819
  "confidence": "high",
852
820
  "routed_to": "spec",
853
- "routed_id": "SPEC-retro-1-INS-a1b2c3d4-jwt-refresh-rotation.md"
821
+ "routed_id": "coding-conventions.md#INS-a1b2c3d4"
854
822
  }
855
823
  ],
856
824
  "_metadata": {
@@ -18,18 +18,11 @@ Input: <phase> argument (number or slug)
18
18
 
19
19
  Read .workflow/state.json → state
20
20
  artifacts = state.artifacts ?? []
21
- useArtifactRegistry = artifacts.length > 0
22
21
 
23
- IF useArtifactRegistry:
24
- IF number: art = artifacts.find(a => a.type === 'execute' && a.phase === number)
25
- IF slug: art = artifacts.find(a => a.type === 'execute' && a.slug?.includes(slug))
26
- IF art: PHASE_DIR = ".workflow/" + art.path
27
- ELSE: ERROR "Phase not found in artifact registry"
28
- ELSE:
29
- // Legacy: resolve from phases/ directory
30
- IF number: find .workflow/phases/{NN}-*/index.json
31
- IF slug: find .workflow/phases/*-{slug}/index.json
32
- PHASE_DIR = resolved path
22
+ IF number: art = artifacts.find(a => a.type === 'execute' && a.phase === number)
23
+ IF slug: art = artifacts.find(a => a.type === 'execute' && a.slug?.includes(slug))
24
+ IF art: PHASE_DIR = ".workflow/" + art.path
25
+ ELSE: ERROR "Phase not found in artifact registry"
33
26
 
34
27
  Validate execution has occurred (tasks_completed > 0 or .task/ exists)
35
28
  ```
@@ -587,7 +580,7 @@ Verdict: {PASS | WARN | BLOCK}
587
580
  Issues Created: {count}
588
581
 
589
582
  Files:
590
- {phase_dir}/review.json
583
+ {artifact_dir}/review.json
591
584
 
592
585
  Next steps:
593
586
  {suggested_next_command}
@@ -0,0 +1,115 @@
1
+ # Spec Remove Workflow
2
+
3
+ Remove a `<spec-entry>` block from a specs container file. Symmetric with `specs-add.md`.
4
+
5
+ Uses `maestro wiki remove-entry` for atomic removal — the entry is deleted from the markdown file and the unified wiki index is auto-updated by WikiIndexer.
6
+
7
+ ---
8
+
9
+ ## Prerequisites
10
+
11
+ - `.workflow/specs/` initialized (at least one specs file exists)
12
+ - `maestro wiki` CLI available
13
+ - Entry ID known (use `maestro wiki list --type spec` to discover)
14
+
15
+ ---
16
+
17
+ ## Argument Shape
18
+
19
+ ```
20
+ /spec-remove spec-learnings-003 → remove entry 003 from learnings.md
21
+ /spec-remove spec-coding-conventions-001 → remove entry 001 from coding-conventions.md
22
+ /spec-remove spec-quality-rules-005 -y → remove without confirmation
23
+ ```
24
+
25
+ | Flag | Effect |
26
+ |------|--------|
27
+ | `<entry-id>` | Required. The spec sub-node ID to remove |
28
+ | `-y` / `--yes` | Skip confirmation prompt |
29
+
30
+ ---
31
+
32
+ ## Stage 1: Parse Input
33
+
34
+ 1. Extract entry ID from arguments
35
+ 2. Validate non-empty (E001 if missing)
36
+ 3. Check `.workflow/specs/` exists (E002 if not)
37
+
38
+ ---
39
+
40
+ ## Stage 2: Lookup Entry
41
+
42
+ 1. Run `maestro wiki get <entry-id> --json` to fetch entry metadata
43
+ 2. Validate entry exists (E003 if not found)
44
+ 3. Validate entry is a spec sub-node — must have:
45
+ - `type` = "spec"
46
+ - `parent` field set (sub-nodes have parent pointing to container)
47
+ - If not a sub-node, error E004
48
+ 4. Extract: title, category, keywords, container file path, body preview
49
+
50
+ ---
51
+
52
+ ## Stage 3: Confirm Removal
53
+
54
+ Display entry details for user confirmation:
55
+
56
+ ```
57
+ == Spec Entry to Remove ==
58
+ ID: {entry-id}
59
+ Title: {title}
60
+ Category: {category}
61
+ Keywords: {keywords}
62
+ Container: .workflow/specs/{filename}
63
+ Preview: {first 80 chars of body}
64
+
65
+ Remove this entry? [y/N]
66
+ ```
67
+
68
+ If `-y` flag: skip confirmation.
69
+ If user declines: abort with "Cancelled."
70
+
71
+ ---
72
+
73
+ ## Stage 4: Remove Entry
74
+
75
+ Execute removal via wiki CLI:
76
+
77
+ ```bash
78
+ maestro wiki remove-entry <entry-id>
79
+ ```
80
+
81
+ This command:
82
+ 1. Reads the container file
83
+ 2. Locates the `<spec-entry>` block by index position
84
+ 3. Removes the block (including opening tag, body, closing tag)
85
+ 4. Writes the updated file
86
+ 5. WikiIndexer auto-updates `.workflow/wiki-index.json`
87
+
88
+ ---
89
+
90
+ ## Stage 5: Verify & Report
91
+
92
+ 1. Verify entry no longer appears: `maestro wiki get <entry-id>` should return not-found
93
+ 2. Display confirmation:
94
+
95
+ ```
96
+ == Entry Removed ==
97
+ ID: {entry-id}
98
+ From: .workflow/specs/{filename}
99
+ Remaining: {remaining entry count} entries in {filename}
100
+
101
+ To verify: maestro wiki list --type spec --category {category}
102
+ To re-add: /spec-add {category} {content}
103
+ ```
104
+
105
+ ---
106
+
107
+ ## Error Codes
108
+
109
+ | Code | Severity | Condition | Recovery |
110
+ |------|----------|-----------|----------|
111
+ | E001 | fatal | Entry ID required | Usage: `/spec-remove <entry-id>` |
112
+ | E002 | fatal | `.workflow/specs/` not initialized | Run `/spec-setup` first |
113
+ | E003 | fatal | Entry ID not found in wiki index | Check ID with `maestro wiki list --type spec` |
114
+ | E004 | fatal | Entry is not a spec sub-node | Only `<spec-entry>` sub-nodes can be removed this way |
115
+ | W001 | warning | Container file empty after removal | File kept but has no entries |
@@ -52,28 +52,7 @@ Framework detection (from dependency files):
52
52
  spring --> Java Spring
53
53
  ```
54
54
 
55
- ### Step 3: Write project-tech.json
56
-
57
- Output: `.workflow/project-tech.json`
58
-
59
- ```json
60
- {
61
- "detected_at": "{ISO timestamp}",
62
- "languages": ["TypeScript", "..."],
63
- "frameworks": ["Next.js", "..."],
64
- "package_manager": "npm | yarn | pnpm | ...",
65
- "build_system": "tsc | webpack | vite | ...",
66
- "test_framework": "jest | vitest | pytest | ...",
67
- "linter": "eslint | prettier | ...",
68
- "architecture": {
69
- "type": "monorepo | single-package | ...",
70
- "entry_points": ["src/index.ts", "..."],
71
- "key_directories": ["src/", "lib/", "..."]
72
- }
73
- }
74
- ```
75
-
76
- ### Step 4: Detect Code Patterns
55
+ ### Step 3: Detect Code Patterns
77
56
 
78
57
  Scan source files for coding conventions:
79
58
 
@@ -85,9 +64,9 @@ Formatting: Check for .prettierrc, .editorconfig, eslint config
85
64
  File naming: kebab-case vs camelCase vs PascalCase for source files
86
65
  ```
87
66
 
88
- ### Step 5: Generate Core Files (always created)
67
+ ### Step 4: Generate Core Files (always created)
89
68
 
90
- #### 5a: coding-conventions.md
69
+ #### 4a: coding-conventions.md
91
70
 
92
71
  Output: `.workflow/specs/coding-conventions.md`
93
72
 
@@ -124,7 +103,7 @@ Auto-generated from project analysis. Update manually as patterns evolve.
124
103
  {empty section for spec-add entries}
125
104
  ```
126
105
 
127
- #### 5b: architecture-constraints.md
106
+ #### 4b: architecture-constraints.md
128
107
 
129
108
  Output: `.workflow/specs/architecture-constraints.md`
130
109
 
@@ -156,7 +135,7 @@ Auto-generated from project structure. Update manually as architecture evolves.
156
135
  {empty section for spec-add entries}
157
136
  ```
158
137
 
159
- #### 5c: learnings.md
138
+ #### 4c: learnings.md
160
139
 
161
140
  Output: `.workflow/specs/learnings.md`
162
141
 
@@ -175,9 +154,9 @@ Add entries with: `/spec-add learning <description>`
175
154
  {empty -- entries added via spec-add}
176
155
  ```
177
156
 
178
- ### Step 6: Generate Optional Files (when signals detected)
157
+ ### Step 5: Generate Optional Files (when signals detected)
179
158
 
180
- #### 6a: quality-rules.md (when linter config or CI detected)
159
+ #### 5a: quality-rules.md (when linter config or CI detected)
181
160
 
182
161
  Output: `.workflow/specs/quality-rules.md`
183
162
 
@@ -193,7 +172,7 @@ category: quality
193
172
  {empty -- entries added via spec-add}
194
173
  ```
195
174
 
196
- #### 6b: test-conventions.md (when test framework or test files detected)
175
+ #### 5b: test-conventions.md (when test framework or test files detected)
197
176
 
198
177
  Scan existing test files for conventions (framework, naming, directory structure, patterns).
199
178
 
@@ -225,16 +204,15 @@ Auto-generated from project analysis. Update manually as patterns evolve.
225
204
  {empty section for spec-add entries}
226
205
  ```
227
206
 
228
- #### 6c: debug-notes.md and review-standards.md
207
+ #### 5c: debug-notes.md and review-standards.md
229
208
 
230
209
  These are NOT created during setup. They are created on demand when `spec-add debug` or `spec-add review` is first used.
231
210
 
232
- ### Step 7: Summary
211
+ ### Step 6: Summary
233
212
 
234
213
  Display what was created:
235
214
  ```
236
215
  Specs initialized:
237
- .workflow/project-tech.json -- Tech stack analysis
238
216
  .workflow/specs/coding-conventions.md (category: coding)
239
217
  .workflow/specs/architecture-constraints.md (category: arch)
240
218
  .workflow/specs/learnings.md (category: learning)