maestro-flow 0.3.12 → 0.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/CLAUDE.md +7 -0
- package/.claude/agents/workflow-analyzer.md +0 -1
- package/.claude/agents/workflow-collab-planner.md +0 -1
- package/.claude/agents/workflow-debugger.md +0 -1
- package/.claude/agents/workflow-integration-checker.md +2 -2
- package/.claude/agents/workflow-nyquist-auditor.md +0 -1
- package/.claude/agents/workflow-phase-researcher.md +2 -2
- package/.claude/agents/workflow-plan-checker.md +1 -1
- package/.claude/agents/workflow-planner.md +1 -2
- package/.claude/agents/workflow-roadmapper.md +1 -1
- package/.claude/agents/workflow-verifier.md +0 -1
- package/.claude/commands/learn-retro.md +2 -2
- package/.claude/commands/learn-second-opinion.md +2 -2
- package/.claude/commands/maestro-analyze.md +10 -2
- package/.claude/commands/maestro-brainstorm.md +1 -1
- package/.claude/commands/maestro-execute.md +21 -4
- package/.claude/commands/maestro-milestone-complete.md +14 -0
- package/.claude/commands/maestro-plan.md +12 -6
- package/.claude/commands/maestro-roadmap.md +1 -1
- package/.claude/commands/maestro-ui-design.md +7 -7
- package/.claude/commands/maestro-update.md +176 -0
- package/.claude/commands/maestro-verify.md +18 -3
- package/.claude/commands/manage-codebase-rebuild.md +0 -1
- package/.claude/commands/manage-harvest.md +1 -1
- package/.claude/commands/manage-learn.md +5 -5
- package/.claude/commands/manage-memory-capture.md +4 -4
- package/.claude/commands/manage-memory.md +1 -1
- package/.claude/commands/manage-wiki.md +62 -0
- package/.claude/commands/quality-business-test.md +2 -2
- package/.claude/commands/quality-debug.md +53 -7
- package/.claude/commands/quality-retrospective.md +5 -5
- package/.claude/commands/quality-review.md +39 -7
- package/.claude/commands/quality-sync.md +1 -1
- package/.claude/commands/quality-test-gen.md +1 -1
- package/.claude/commands/quality-test.md +45 -12
- package/.claude/commands/spec-remove.md +51 -0
- package/.claude/commands/spec-setup.md +1 -3
- package/.claude/commands/wiki-connect.md +9 -5
- package/.claude/commands/wiki-digest.md +6 -3
- package/.codex/skills/maestro/SKILL.md +2 -2
- package/.codex/skills/maestro-analyze/SKILL.md +4 -4
- package/.codex/skills/maestro-brainstorm/SKILL.md +4 -4
- package/.codex/skills/maestro-coordinate/SKILL.md +2 -2
- package/.codex/skills/maestro-execute/SKILL.md +15 -5
- package/.codex/skills/maestro-init/SKILL.md +1 -1
- package/.codex/skills/maestro-milestone-complete/SKILL.md +18 -1
- package/.codex/skills/maestro-plan/SKILL.md +6 -6
- package/.codex/skills/maestro-roadmap/SKILL.md +3 -4
- package/.codex/skills/maestro-spec-generate/SKILL.md +2 -2
- package/.codex/skills/maestro-ui-design/SKILL.md +6 -6
- package/.codex/skills/maestro-verify/SKILL.md +20 -11
- package/.codex/skills/manage-codebase-rebuild/SKILL.md +4 -4
- package/.codex/skills/manage-harvest/SKILL.md +10 -1
- package/.codex/skills/manage-issue-discover/SKILL.md +3 -3
- package/.codex/skills/manage-learn/SKILL.md +3 -2
- package/.codex/skills/manage-memory/SKILL.md +3 -3
- package/.codex/skills/manage-memory-capture/SKILL.md +8 -14
- package/.codex/skills/manage-status/SKILL.md +9 -4
- package/.codex/skills/manage-wiki/SKILL.md +55 -0
- package/.codex/skills/quality-business-test/SKILL.md +8 -6
- package/.codex/skills/quality-debug/SKILL.md +22 -9
- package/.codex/skills/quality-integration-test/SKILL.md +11 -7
- package/.codex/skills/quality-retrospective/SKILL.md +45 -26
- package/.codex/skills/quality-review/SKILL.md +10 -7
- package/.codex/skills/quality-test/SKILL.md +9 -4
- package/.codex/skills/quality-test-gen/SKILL.md +13 -9
- package/.codex/skills/spec-add/SKILL.md +11 -3
- package/.codex/skills/spec-load/SKILL.md +7 -0
- package/.codex/skills/spec-map/SKILL.md +2 -2
- package/.codex/skills/spec-remove/SKILL.md +101 -0
- package/.codex/skills/spec-setup/SKILL.md +4 -8
- package/.codex/skills/wiki-connect/SKILL.md +6 -5
- package/.codex/skills/wiki-digest/SKILL.md +2 -2
- package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.d.ts +9 -0
- package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js +109 -9
- package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.test.js +49 -0
- package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/index.js +5 -4
- package/dashboard/dist-server/dashboard/src/server/routes/index.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/specs.d.ts +5 -13
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js +97 -155
- package/dashboard/dist-server/dashboard/src/server/routes/specs.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.d.ts +11 -1
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js +27 -6
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.js +25 -7
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js +8 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/graph-analysis.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/search.js +1 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/search.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.d.ts +29 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.js +148 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +4 -2
- package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js +8 -2
- package/dashboard/dist-server/dashboard/src/server/wiki/virtual-wiki-adapters.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.d.ts +5 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +80 -38
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js +8 -6
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-types.d.ts +40 -5
- package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js +21 -23
- package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/writer.d.ts +33 -3
- package/dashboard/dist-server/dashboard/src/server/wiki/writer.js +184 -12
- package/dashboard/dist-server/dashboard/src/server/wiki/writer.js.map +1 -1
- package/dashboard/dist-server/src/commands/delegate.js +26 -0
- package/dashboard/dist-server/src/commands/delegate.js.map +1 -1
- package/dashboard/dist-server/src/coordinator/graph-types.d.ts +11 -1
- package/dashboard/dist-server/src/coordinator/graph-walker.js +29 -2
- package/dashboard/dist-server/src/coordinator/graph-walker.js.map +1 -1
- package/dashboard/dist-server/src/coordinator/prompt-assembler.js +3 -2
- package/dashboard/dist-server/src/coordinator/prompt-assembler.js.map +1 -1
- package/dashboard/dist-server/src/hooks/constants.d.ts +29 -60
- package/dashboard/dist-server/src/hooks/constants.js +105 -82
- package/dashboard/dist-server/src/hooks/constants.js.map +1 -1
- package/dashboard/dist-server/src/types/index.d.ts +2 -1
- package/dist/src/commands/delegate.d.ts.map +1 -1
- package/dist/src/commands/delegate.js +26 -0
- package/dist/src/commands/delegate.js.map +1 -1
- package/dist/src/commands/hooks.d.ts +2 -4
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +4 -7
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/install-ui/InstallConfirm.d.ts +2 -3
- package/dist/src/commands/install-ui/InstallConfirm.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallConfirm.js +1 -1
- package/dist/src/commands/install-ui/InstallConfirm.js.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.js +1 -2
- package/dist/src/commands/install-ui/InstallExecution.js.map +1 -1
- package/dist/src/commands/install-ui/InstallFlow.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallFlow.js +5 -7
- package/dist/src/commands/install-ui/InstallFlow.js.map +1 -1
- package/dist/src/commands/install-ui/StatuslineConfig.d.ts +3 -6
- package/dist/src/commands/install-ui/StatuslineConfig.d.ts.map +1 -1
- package/dist/src/commands/install-ui/StatuslineConfig.js +21 -17
- package/dist/src/commands/install-ui/StatuslineConfig.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +95 -0
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/wiki.d.ts.map +1 -1
- package/dist/src/commands/wiki.js +75 -11
- package/dist/src/commands/wiki.js.map +1 -1
- package/dist/src/coordinator/graph-types.d.ts +11 -1
- package/dist/src/coordinator/graph-types.d.ts.map +1 -1
- package/dist/src/coordinator/graph-walker.d.ts.map +1 -1
- package/dist/src/coordinator/graph-walker.js +29 -2
- package/dist/src/coordinator/graph-walker.js.map +1 -1
- package/dist/src/coordinator/prompt-assembler.d.ts.map +1 -1
- package/dist/src/coordinator/prompt-assembler.js +3 -2
- package/dist/src/coordinator/prompt-assembler.js.map +1 -1
- package/dist/src/hooks/__tests__/statusline-visual-test.d.ts +4 -1
- package/dist/src/hooks/__tests__/statusline-visual-test.d.ts.map +1 -1
- package/dist/src/hooks/__tests__/statusline-visual-test.js +55 -174
- package/dist/src/hooks/__tests__/statusline-visual-test.js.map +1 -1
- package/dist/src/hooks/constants.d.ts +29 -60
- package/dist/src/hooks/constants.d.ts.map +1 -1
- package/dist/src/hooks/constants.js +105 -82
- package/dist/src/hooks/constants.js.map +1 -1
- package/dist/src/hooks/skill-context.d.ts.map +1 -1
- package/dist/src/hooks/skill-context.js +54 -6
- package/dist/src/hooks/skill-context.js.map +1 -1
- package/dist/src/hooks/statusline.d.ts +11 -8
- package/dist/src/hooks/statusline.d.ts.map +1 -1
- package/dist/src/hooks/statusline.js +284 -182
- package/dist/src/hooks/statusline.js.map +1 -1
- package/dist/src/hooks/workspace.d.ts.map +1 -1
- package/dist/src/hooks/workspace.js +2 -1
- package/dist/src/hooks/workspace.js.map +1 -1
- package/dist/src/migrations/_template.d.ts +12 -0
- package/dist/src/migrations/_template.d.ts.map +1 -0
- package/dist/src/migrations/_template.js +55 -0
- package/dist/src/migrations/_template.js.map +1 -0
- package/dist/src/migrations/index.d.ts +14 -0
- package/dist/src/migrations/index.d.ts.map +1 -0
- package/dist/src/migrations/index.js +20 -0
- package/dist/src/migrations/index.js.map +1 -0
- package/dist/src/migrations/run.d.ts +12 -0
- package/dist/src/migrations/run.d.ts.map +1 -0
- package/dist/src/migrations/run.js +119 -0
- package/dist/src/migrations/run.js.map +1 -0
- package/dist/src/migrations/v1-to-v2.d.ts +10 -0
- package/dist/src/migrations/v1-to-v2.d.ts.map +1 -0
- package/dist/src/migrations/v1-to-v2.js +71 -0
- package/dist/src/migrations/v1-to-v2.js.map +1 -0
- package/dist/src/tools/team-activity.d.ts.map +1 -1
- package/dist/src/tools/team-activity.js +22 -0
- package/dist/src/tools/team-activity.js.map +1 -1
- package/dist/src/tools/transition-recorder.d.ts +2 -17
- package/dist/src/tools/transition-recorder.d.ts.map +1 -1
- package/dist/src/tools/transition-recorder.js +6 -3
- package/dist/src/tools/transition-recorder.js.map +1 -1
- package/dist/src/types/index.d.ts +2 -1
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/utils/migration-registry.d.ts +65 -0
- package/dist/src/utils/migration-registry.d.ts.map +1 -0
- package/dist/src/utils/migration-registry.js +117 -0
- package/dist/src/utils/migration-registry.js.map +1 -0
- package/dist/src/utils/state-schema.d.ts +153 -0
- package/dist/src/utils/state-schema.d.ts.map +1 -0
- package/dist/src/utils/state-schema.js +329 -0
- package/dist/src/utils/state-schema.js.map +1 -0
- package/package.json +1 -1
- package/templates/state.json +17 -39
- package/workflows/brainstorm.md +3 -3
- package/workflows/codebase-rebuild.md +2 -12
- package/workflows/debug.md +7 -8
- package/workflows/execute.md +18 -4
- package/workflows/fork.md +37 -86
- package/workflows/init.md +1 -4
- package/workflows/integration-test.md +4 -5
- package/workflows/issue.md +3 -9
- package/workflows/learn.md +20 -19
- package/workflows/maestro.codex.md +8 -1
- package/workflows/maestro.md +12 -3
- package/workflows/memory.md +26 -71
- package/workflows/merge.md +45 -107
- package/workflows/milestone-complete.md +24 -7
- package/workflows/retrospective.md +77 -109
- package/workflows/review.md +5 -12
- package/workflows/specs-remove.md +115 -0
- package/workflows/specs-setup.md +10 -32
- package/workflows/status.md +291 -290
- package/workflows/sync.md +5 -5
- package/workflows/test.md +4 -5
- package/workflows/ui-style.md +3 -4
- package/workflows/verify.md +2 -2
- package/workflows/wiki-connect.md +188 -0
- package/workflows/wiki-digest.md +221 -0
- package/workflows/wiki-manage.md +204 -0
|
@@ -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
package/templates/state.json
CHANGED
|
@@ -1,39 +1,17 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "
|
|
3
|
-
"project_name": "{{PROJECT_NAME}}",
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
+
}
|
package/workflows/brainstorm.md
CHANGED
|
@@ -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
|
-
|
|
134
|
-
|
|
133
|
+
art = artifacts.find(a => a.phase === phaseNum)
|
|
134
|
+
IF art:
|
|
135
135
|
output_dir = ".workflow/" + art.path + "/.brainstorming/"
|
|
136
136
|
ELSE:
|
|
137
|
-
|
|
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
|
-
-
|
|
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
|
|
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 |
|
package/workflows/debug.md
CHANGED
|
@@ -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
|
|
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 |
|
|
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 `{
|
|
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) | `{
|
|
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
|
-
|
|
147
|
-
|
|
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
|
-
|
|
149
|
+
ERROR "Phase {phaseNum} not found in artifact registry"
|
|
151
150
|
ELSE:
|
|
152
151
|
DEBUG_DIR = ".workflow/scratch/debug-{slug}-{date}/"
|
|
153
152
|
|
package/workflows/execute.md
CHANGED
|
@@ -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
|
-
|
|
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
|
```
|