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
@@ -0,0 +1,329 @@
1
+ /**
2
+ * state-schema.ts — Canonical state.json v2 types, derivation, migration, and I/O.
3
+ *
4
+ * Single source of truth for the `.workflow/state.json` schema.
5
+ * All hooks, tools, and workflows should import from here.
6
+ */
7
+ import { readFileSync, writeFileSync, renameSync, unlinkSync, existsSync, readdirSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ /**
10
+ * Cross-platform atomic rename with retry for Windows EPERM/EBUSY.
11
+ * Attempts unlinkSync on target before retry to handle Windows semantics.
12
+ */
13
+ export function safeRename(src, dest) {
14
+ for (let i = 0; i < 3; i++) {
15
+ try {
16
+ renameSync(src, dest);
17
+ return;
18
+ }
19
+ catch (e) {
20
+ if (i < 2 && ['EPERM', 'EACCES', 'EBUSY'].includes(e.code)) {
21
+ try {
22
+ unlinkSync(dest);
23
+ }
24
+ catch { }
25
+ continue;
26
+ }
27
+ throw e;
28
+ }
29
+ }
30
+ }
31
+ /** Local-time ISO 8601 string with timezone offset, e.g. "2026-04-24T14:30:00+08:00" */
32
+ export function localISO() {
33
+ const d = new Date();
34
+ const off = -d.getTimezoneOffset();
35
+ const sign = off >= 0 ? '+' : '-';
36
+ const p = (n) => String(n).padStart(2, '0');
37
+ return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}T${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}${sign}${p(Math.floor(Math.abs(off) / 60))}:${p(Math.abs(off) % 60)}`;
38
+ }
39
+ // ---------------------------------------------------------------------------
40
+ // Derivation functions — replace stored current_phase / phases_summary
41
+ // ---------------------------------------------------------------------------
42
+ /**
43
+ * Derive the "current phase" from artifact registry.
44
+ * Priority: phase with in_progress artifact → first phase without completed execute.
45
+ */
46
+ export function deriveCurrentPhase(state) {
47
+ const milestone = state.milestones?.find(m => m.name === state.current_milestone || m.id === state.current_milestone);
48
+ if (!milestone?.phases?.length)
49
+ return null;
50
+ // Phase with in_progress work → current
51
+ for (const p of milestone.phases) {
52
+ if (state.artifacts.some(a => a.phase === p
53
+ && a.milestone === state.current_milestone
54
+ && a.status === 'in_progress'))
55
+ return p;
56
+ }
57
+ // First phase without completed execute
58
+ for (const p of milestone.phases) {
59
+ if (!state.artifacts.some(a => a.type === 'execute'
60
+ && a.phase === p
61
+ && a.milestone === state.current_milestone
62
+ && a.status === 'completed'))
63
+ return p;
64
+ }
65
+ return null; // all phases done
66
+ }
67
+ /**
68
+ * Derive phases_summary from artifact registry.
69
+ */
70
+ export function derivePhasesSummary(state) {
71
+ const milestone = state.milestones?.find(m => m.name === state.current_milestone || m.id === state.current_milestone);
72
+ if (!milestone?.phases?.length) {
73
+ return { total: 0, completed: 0, in_progress: 0, pending: 0 };
74
+ }
75
+ const total = milestone.phases.length;
76
+ let completed = 0;
77
+ let in_progress = 0;
78
+ for (const p of milestone.phases) {
79
+ const arts = state.artifacts.filter(a => a.phase === p && a.milestone === state.current_milestone);
80
+ if (arts.some(a => a.type === 'execute' && a.status === 'completed')) {
81
+ completed++;
82
+ }
83
+ else if (arts.length > 0) {
84
+ in_progress++;
85
+ }
86
+ }
87
+ return { total, completed, in_progress, pending: total - completed - in_progress };
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // Artifact ID generation
91
+ // ---------------------------------------------------------------------------
92
+ const TYPE_PREFIX = {
93
+ analyze: 'ANL',
94
+ plan: 'PLN',
95
+ execute: 'EXC',
96
+ verify: 'VRF',
97
+ brainstorm: 'BST',
98
+ spec: 'SPC',
99
+ review: 'REV',
100
+ debug: 'DBG',
101
+ test: 'TST',
102
+ };
103
+ export function nextArtifactId(artifacts, type) {
104
+ const prefix = TYPE_PREFIX[type];
105
+ let max = 0;
106
+ for (const a of artifacts) {
107
+ if (!a.id.startsWith(prefix + '-'))
108
+ continue;
109
+ const n = parseInt(a.id.slice(prefix.length + 1), 10);
110
+ if (n > max)
111
+ max = n;
112
+ }
113
+ return `${prefix}-${String(max + 1).padStart(3, '0')}`;
114
+ }
115
+ /**
116
+ * Build artifact entries from legacy phases/ directory structure.
117
+ * Scans .workflow/phases/{NN}-{slug}/ for analysis.md, plan.json, .summaries/, verification.json.
118
+ */
119
+ function harvestLegacyPhaseArtifacts(workflowRoot, currentMilestone) {
120
+ const phasesDir = join(workflowRoot, 'phases');
121
+ if (!existsSync(phasesDir))
122
+ return [];
123
+ const entries = [];
124
+ let idCounters = { ANL: 0, PLN: 0, EXC: 0, VRF: 0 };
125
+ const now = localISO();
126
+ let dirs;
127
+ try {
128
+ dirs = readdirSync(phasesDir);
129
+ }
130
+ catch {
131
+ return [];
132
+ }
133
+ for (const d of dirs) {
134
+ const match = d.match(/^(\d+)-(.+)$/);
135
+ if (!match)
136
+ continue;
137
+ const phaseNum = parseInt(match[1], 10);
138
+ const slug = match[2];
139
+ const phaseDir = join(phasesDir, d);
140
+ // Check what artifacts exist in this phase dir
141
+ const hasAnalysis = existsSync(join(phaseDir, 'analysis.md'));
142
+ const hasPlan = existsSync(join(phaseDir, 'plan.json'));
143
+ const hasSummaries = existsSync(join(phaseDir, '.summaries'));
144
+ const hasVerification = existsSync(join(phaseDir, 'verification.json'));
145
+ // Legacy paths are relative to .workflow/
146
+ const legacyPath = `phases/${d}`;
147
+ if (hasAnalysis) {
148
+ idCounters.ANL++;
149
+ const anlId = `ANL-${String(idCounters.ANL).padStart(3, '0')}`;
150
+ entries.push({
151
+ id: anlId,
152
+ type: 'analyze',
153
+ milestone: currentMilestone,
154
+ phase: phaseNum,
155
+ scope: 'phase',
156
+ path: legacyPath,
157
+ status: 'completed',
158
+ depends_on: null,
159
+ harvested: true,
160
+ created_at: now,
161
+ completed_at: now,
162
+ });
163
+ }
164
+ if (hasPlan) {
165
+ idCounters.PLN++;
166
+ const plnId = `PLN-${String(idCounters.PLN).padStart(3, '0')}`;
167
+ const anlId = idCounters.ANL > 0 ? `ANL-${String(idCounters.ANL).padStart(3, '0')}` : null;
168
+ entries.push({
169
+ id: plnId,
170
+ type: 'plan',
171
+ milestone: currentMilestone,
172
+ phase: phaseNum,
173
+ scope: 'phase',
174
+ path: legacyPath,
175
+ status: 'completed',
176
+ depends_on: anlId,
177
+ harvested: hasSummaries,
178
+ created_at: now,
179
+ completed_at: now,
180
+ });
181
+ }
182
+ if (hasSummaries) {
183
+ idCounters.EXC++;
184
+ const excId = `EXC-${String(idCounters.EXC).padStart(3, '0')}`;
185
+ const plnId = idCounters.PLN > 0 ? `PLN-${String(idCounters.PLN).padStart(3, '0')}` : null;
186
+ entries.push({
187
+ id: excId,
188
+ type: 'execute',
189
+ milestone: currentMilestone,
190
+ phase: phaseNum,
191
+ scope: 'phase',
192
+ path: legacyPath,
193
+ status: 'completed',
194
+ depends_on: plnId,
195
+ harvested: true,
196
+ created_at: now,
197
+ completed_at: now,
198
+ });
199
+ }
200
+ if (hasVerification) {
201
+ idCounters.VRF++;
202
+ const vrfId = `VRF-${String(idCounters.VRF).padStart(3, '0')}`;
203
+ const excId = idCounters.EXC > 0 ? `EXC-${String(idCounters.EXC).padStart(3, '0')}` : null;
204
+ entries.push({
205
+ id: vrfId,
206
+ type: 'verify',
207
+ milestone: currentMilestone,
208
+ phase: phaseNum,
209
+ scope: 'phase',
210
+ path: legacyPath,
211
+ status: 'completed',
212
+ depends_on: excId ? [excId] : null,
213
+ harvested: true,
214
+ created_at: now,
215
+ completed_at: now,
216
+ });
217
+ }
218
+ }
219
+ return entries;
220
+ }
221
+ /**
222
+ * Normalize v1 status string to v2 enum.
223
+ */
224
+ function normalizeStatus(old) {
225
+ if (!old)
226
+ return 'idle';
227
+ if (old === 'idle')
228
+ return 'idle';
229
+ if (old.includes('executing'))
230
+ return 'executing';
231
+ if (old === 'completed')
232
+ return 'completed';
233
+ if (old === 'active')
234
+ return 'active';
235
+ // "phase_N_pending", "verifying", etc → active
236
+ return 'active';
237
+ }
238
+ /**
239
+ * Migrate v1 state.json to v2. Optionally harvests legacy phases/ artifacts.
240
+ */
241
+ export function migrateV1toV2(raw, workflowRoot) {
242
+ const currentMilestone = raw.current_milestone ?? null;
243
+ // Enrich milestones with id + status
244
+ const milestones = (raw.milestones ?? []).map((m, i) => ({
245
+ id: m.id ?? `M${i + 1}`,
246
+ name: m.name,
247
+ title: m.title ?? m.name,
248
+ status: m.status
249
+ ?? (m.name === currentMilestone ? 'active' : 'pending'),
250
+ phases: m.phases ?? [],
251
+ }));
252
+ // Start with any existing artifacts from state.json
253
+ let artifacts = Array.isArray(raw.artifacts) ? [...raw.artifacts] : [];
254
+ // Harvest from legacy phases/ if workflowRoot provided and no artifacts exist yet
255
+ if (artifacts.length === 0 && workflowRoot) {
256
+ artifacts = harvestLegacyPhaseArtifacts(workflowRoot, currentMilestone);
257
+ }
258
+ return {
259
+ version: '2.0',
260
+ project_name: raw.project_name ?? null,
261
+ status: normalizeStatus(raw.status),
262
+ current_milestone: currentMilestone,
263
+ current_task_id: raw.current_task_id ?? null,
264
+ milestones,
265
+ artifacts,
266
+ accumulated_context: raw.accumulated_context ?? {
267
+ key_decisions: [],
268
+ blockers: [],
269
+ deferred: [],
270
+ },
271
+ transition_history: (raw.transition_history ?? []),
272
+ milestone_history: (raw.milestone_history ?? []),
273
+ last_updated: raw.last_updated ?? localISO(),
274
+ };
275
+ }
276
+ // ---------------------------------------------------------------------------
277
+ // I/O helpers — atomic read/write
278
+ // ---------------------------------------------------------------------------
279
+ /**
280
+ * Read state.json from a workspace. Auto-migrates v1 to v2 in memory (does not write back).
281
+ * Returns null if file doesn't exist.
282
+ */
283
+ export function readStateJson(workflowRoot) {
284
+ const statePath = join(workflowRoot, '.workflow', 'state.json');
285
+ if (!existsSync(statePath))
286
+ return null;
287
+ try {
288
+ const raw = JSON.parse(readFileSync(statePath, 'utf8'));
289
+ if (raw.version === '2.0')
290
+ return raw;
291
+ // Auto-migrate v1
292
+ return migrateV1toV2(raw, join(workflowRoot, '.workflow'));
293
+ }
294
+ catch {
295
+ return null;
296
+ }
297
+ }
298
+ /**
299
+ * Write state.json atomically (write-tmp + rename).
300
+ */
301
+ export function writeStateJson(workflowRoot, state) {
302
+ const statePath = join(workflowRoot, '.workflow', 'state.json');
303
+ const tmpPath = statePath + '.tmp';
304
+ state.last_updated = localISO();
305
+ writeFileSync(tmpPath, JSON.stringify(state, null, 2), 'utf8');
306
+ safeRename(tmpPath, statePath);
307
+ }
308
+ /**
309
+ * Read, migrate if needed, and write back v2 state.json.
310
+ * Returns the migrated state. Use this for one-shot migration.
311
+ */
312
+ export function migrateStateFile(workflowRoot) {
313
+ const statePath = join(workflowRoot, '.workflow', 'state.json');
314
+ if (!existsSync(statePath))
315
+ return null;
316
+ let raw;
317
+ try {
318
+ raw = JSON.parse(readFileSync(statePath, 'utf8'));
319
+ }
320
+ catch {
321
+ return null;
322
+ }
323
+ if (raw.version === '2.0')
324
+ return raw;
325
+ const v2 = migrateV1toV2(raw, join(workflowRoot, '.workflow'));
326
+ writeStateJson(workflowRoot, v2);
327
+ return v2;
328
+ }
329
+ //# sourceMappingURL=state-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-schema.js","sourceRoot":"","sources":["../../../src/utils/state-schema.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "maestro-flow",
3
- "version": "0.3.12",
3
+ "version": "0.3.14",
4
4
  "description": "Workflow orchestration CLI with MCP endpoint support and extensible architecture",
5
5
  "type": "module",
6
6
  "imports": {
@@ -1,39 +1,17 @@
1
- {
2
- "version": "1.0",
3
- "project_name": "{{PROJECT_NAME}}",
4
- "current_milestone": "{{MILESTONE_NAME}}",
5
- "current_phase": 1,
6
- "status": "idle",
7
- "phases_summary": {
8
- "total": 0,
9
- "completed": 0,
10
- "in_progress": 0,
11
- "pending": 0
12
- },
13
- "last_updated": "{{TIMESTAMP}}",
14
- "accumulated_context": {
15
- "key_decisions": [],
16
- "blockers": [],
17
- "deferred": [
18
- {
19
- "id": "{{DEFERRED_ID}}",
20
- "severity": "{{critical|high|medium|low}}",
21
- "fix_direction": "{{FIX_DIRECTION}}",
22
- "description": "{{DESCRIPTION}}"
23
- }
24
- ]
25
- },
26
- "transition_history": [],
27
- "milestone_history": [
28
- {
29
- "name": "{{MILESTONE_NAME}}",
30
- "slug": "{{MILESTONE_SLUG}}",
31
- "status": "{{pending|in_progress|completed}}",
32
- "completed_at": null,
33
- "phases": [],
34
- "audit_verdict": null,
35
- "force_completed": false,
36
- "archive_path": null
37
- }
38
- ]
39
- }
1
+ {
2
+ "version": "2.0",
3
+ "project_name": "{{PROJECT_NAME}}",
4
+ "status": "idle",
5
+ "current_milestone": null,
6
+ "current_task_id": null,
7
+ "milestones": [],
8
+ "artifacts": [],
9
+ "last_updated": "{{TIMESTAMP}}",
10
+ "accumulated_context": {
11
+ "key_decisions": [],
12
+ "blockers": [],
13
+ "deferred": []
14
+ },
15
+ "transition_history": [],
16
+ "milestone_history": []
17
+ }
@@ -130,11 +130,11 @@ Parse $ARGUMENTS to determine execution mode:
130
130
  ```
131
131
  Read .workflow/state.json → state
132
132
  artifacts = state.artifacts ?? []
133
- IF artifacts.length > 0:
134
- art = artifacts.find(a => a.phase === phaseNum)
133
+ art = artifacts.find(a => a.phase === phaseNum)
134
+ IF art:
135
135
  output_dir = ".workflow/" + art.path + "/.brainstorming/"
136
136
  ELSE:
137
- output_dir = ".workflow/phases/{NN}-{slug}/.brainstorming/"
137
+ ERROR "Phase {phaseNum} not found in artifact registry"
138
138
  ```
139
139
  - All output: `.workflow/scratch/brainstorm-{slug}-{date}/`
140
140
  - Existing session: use existing session directory
@@ -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,9 @@ When root causes found, auto-updates originating uat.md with diagnosis.
14
14
  ### Step 1: Check Active Sessions
15
15
 
16
16
  ```bash
17
- # Check both scratch (artifact registry) and legacy phases for debug sessions
17
+ # Check scratch dirs (resolved via artifact registry) for debug sessions
18
18
  find .workflow/scratch -path "*/.debug/*" -name "understanding.md" 2>/dev/null | head -5
19
19
  find .workflow/scratch -type d -name "debug-*" 2>/dev/null | head -5
20
- find .workflow/phases -path "*/.debug/*" -name "understanding.md" 2>/dev/null | head -5
21
20
  ```
22
21
 
23
22
  **If active sessions exist AND no $ARGUMENTS:**
@@ -30,7 +29,7 @@ Display:
30
29
 
31
30
  | # | Location | Status | Current Hypothesis |
32
31
  |---|----------|--------|--------------------|
33
- | 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 |
34
33
  | 2 | scratch/debug-nav-crash-2026-03-14/ | checkpoint | Awaiting user input |
35
34
 
36
35
  Reply with a number to resume, or describe a new issue.
@@ -65,7 +64,7 @@ Pass to debug agents as prior knowledge (known issues, root causes, workarounds)
65
64
 
66
65
  Skip if --from-uat is not set. Go to Step 3 instead.
67
66
 
68
- 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:
69
68
  ```yaml
70
69
  - test: T-003
71
70
  truth: "User can reply to comments"
@@ -136,18 +135,18 @@ Create debug session directory and proceed to Step 6.
136
135
 
137
136
  | Mode | Directory |
138
137
  |------|-----------|
139
- | Phase-scoped (from UAT) | `{PHASE_DIR}/.debug/{gap-slug}/` (PHASE_DIR resolved via artifact registry or legacy phases/) |
138
+ | Phase-scoped (from UAT) | `{ARTIFACT_DIR}/.debug/{gap-slug}/` (ARTIFACT_DIR resolved from artifact registry) |
140
139
  | Standalone | `.workflow/scratch/debug-{slug}-{date}/` |
141
140
 
142
141
  ```
143
142
  IF TARGET_TYPE == "phase":
144
143
  Read .workflow/state.json → state
145
144
  artifacts = state.artifacts ?? []
146
- IF artifacts.length > 0:
147
- art = artifacts.find(a => a.type === 'execute' && a.phase === phaseNum)
145
+ art = artifacts.find(a => a.type === 'execute' && a.phase === phaseNum)
146
+ IF art:
148
147
  DEBUG_DIR = ".workflow/" + art.path + "/.debug/{gap-slug}/"
149
148
  ELSE:
150
- DEBUG_DIR = ".workflow/phases/{NN}-{slug}/.debug/{gap-slug}/"
149
+ ERROR "Phase {phaseNum} not found in artifact registry"
151
150
  ELSE:
152
151
  DEBUG_DIR = ".workflow/scratch/debug-{slug}-{date}/"
153
152
 
@@ -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
  ```