maestro-flow 0.3.13 → 0.3.15

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 (38) hide show
  1. package/.claude/commands/maestro-composer.md +354 -0
  2. package/.claude/commands/maestro-player.md +404 -0
  3. package/.claude/skills/skill-iter-tune/SKILL.md +382 -0
  4. package/.claude/skills/skill-iter-tune/phases/01-setup.md +144 -0
  5. package/.claude/skills/skill-iter-tune/phases/02-execute.md +292 -0
  6. package/.claude/skills/skill-iter-tune/phases/03-evaluate.md +312 -0
  7. package/.claude/skills/skill-iter-tune/phases/04-improve.md +186 -0
  8. package/.claude/skills/skill-iter-tune/phases/05-report.md +166 -0
  9. package/.claude/skills/skill-iter-tune/specs/evaluation-criteria.md +63 -0
  10. package/.claude/skills/skill-iter-tune/templates/eval-prompt.md +134 -0
  11. package/.claude/skills/skill-iter-tune/templates/execute-prompt.md +97 -0
  12. package/.claude/skills/workflow-skill-designer/SKILL.md +496 -0
  13. package/.claude/skills/workflow-skill-designer/phases/01-requirements-analysis.md +356 -0
  14. package/.claude/skills/workflow-skill-designer/phases/02-orchestrator-design.md +444 -0
  15. package/.claude/skills/workflow-skill-designer/phases/03-phase-design.md +458 -0
  16. package/.claude/skills/workflow-skill-designer/phases/04-validation.md +471 -0
  17. package/.codex/skills/maestro-composer/SKILL.md +285 -0
  18. package/.codex/skills/maestro-link-coordinate/SKILL.md +430 -224
  19. package/.codex/skills/maestro-player/SKILL.md +448 -0
  20. package/chains/milestone-fork-merge.json +6 -6
  21. package/dist/src/hooks/auto-mode.d.ts +18 -0
  22. package/dist/src/hooks/auto-mode.d.ts.map +1 -0
  23. package/dist/src/hooks/auto-mode.js +28 -0
  24. package/dist/src/hooks/auto-mode.js.map +1 -0
  25. package/dist/src/hooks/context-monitor.d.ts.map +1 -1
  26. package/dist/src/hooks/context-monitor.js +14 -3
  27. package/dist/src/hooks/context-monitor.js.map +1 -1
  28. package/dist/src/hooks/coordinator-tracker.d.ts +1 -0
  29. package/dist/src/hooks/coordinator-tracker.d.ts.map +1 -1
  30. package/dist/src/hooks/coordinator-tracker.js +19 -9
  31. package/dist/src/hooks/coordinator-tracker.js.map +1 -1
  32. package/package.json +1 -1
  33. package/templates/workflows/specs/node-catalog.md +170 -0
  34. package/templates/workflows/specs/template-schema.md +157 -0
  35. package/workflows/maestro-coordinate.codex.md +9 -9
  36. package/workflows/maestro-coordinate.md +9 -9
  37. package/workflows/maestro.md +2 -2
  38. package/.codex/skills/maestro-chain/SKILL.md +0 -233
@@ -0,0 +1,448 @@
1
+ ---
2
+ name: maestro-player
3
+ description: Workflow template player — load JSON template, bind variables, execute DAG nodes wave-by-wave via spawn_agents_on_csv, persist state at checkpoints, support resume. Coordinator assembles skill_call from template nodes — never executes skills directly.
4
+ argument-hint: "<template-slug|path> [--context key=value...] [-c [session-id]] [--list] [--dry-run]"
5
+ allowed-tools: spawn_agents_on_csv, Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion
6
+ ---
7
+
8
+ <purpose>
9
+ Wave-based template executor using `spawn_agents_on_csv`. Loads a workflow template
10
+ (produced by maestro-composer), binds context variables, converts DAG nodes into
11
+ CSV waves via topological sort, executes wave-by-wave with barrier/non-barrier grouping.
12
+
13
+ Aligned with maestro codex coordinator pattern:
14
+ - ALL skill execution via `spawn_agents_on_csv` — coordinator never executes directly
15
+ - Barrier nodes (checkpoints + artifact-producing skills) execute solo
16
+ - Non-barrier nodes grouped into parallel waves
17
+ - Session state at `.workflow/.maestro-coordinate/{session-id}/`
18
+ - Resume from last completed wave via `-c`
19
+
20
+ ```
21
+ Load Template → Bind Variables → Build Wave CSV → spawn → read results →
22
+ (barrier: read artifacts, update context) → next wave → report
23
+ ```
24
+ </purpose>
25
+
26
+ <invariants>
27
+ 1. **ALL skills via spawn_agents_on_csv**: Every node execution goes through spawn. Coordinator NEVER directly executes any skill.
28
+ 2. **Coordinator = prompt assembler only**: Load template → resolve refs → build CSV → spawn → read results → assemble next CSV.
29
+ 3. **Barrier = solo wave**: Checkpoint nodes and artifact-producing skills execute alone (wave size = 1).
30
+ 4. **Non-barriers can parallel**: Consecutive non-barrier nodes grouped into one wave.
31
+ 5. **Wave-by-wave**: Never start wave N+1 before wave N results are read and analyzed.
32
+ 6. **Coordinator owns context**: Sub-agents never read prior results — coordinator assembles full `skill_call` with resolved args.
33
+ 7. **Resume from wave**: `-c` finds last completed wave, resumes from next pending step.
34
+ </invariants>
35
+
36
+ <context>
37
+ $ARGUMENTS — template slug/path, or flags.
38
+
39
+ **Flags:**
40
+ - `--context key=value` — Bind context variables (repeatable)
41
+ - `-c` / `--continue [session-id]` — Resume paused/interrupted session
42
+ - `--list` — List available templates
43
+ - `--dry-run` — Show wave plan without executing
44
+
45
+ **Entry routing:**
46
+
47
+ | Detection | Condition | Handler |
48
+ |-----------|-----------|---------|
49
+ | List | `--list` | handleList |
50
+ | Resume | `-c [session-id]` | Phase 0: Resume |
51
+ | Dry run | `--dry-run` | Phase 1 + 2, print plan, exit |
52
+ | Normal | Template slug/path | Phase 1 |
53
+ | No args | Empty | handleList + AskUserQuestion |
54
+
55
+ **Session tracking (aligned with maestro codex):**
56
+
57
+ | Constant | Value |
58
+ |----------|-------|
59
+ | Session prefix | `MCP` (Maestro Composer Player) |
60
+ | Session dir | `.workflow/.maestro-coordinate/MCP-<YYYYMMDD>-<HHmmss>/` |
61
+ | State file | `state.json` |
62
+ | Wave CSV | `wave-{N}.csv` |
63
+ | Wave results | `wave-{N}-results.csv` |
64
+ | Template dir | `~/.maestro/templates/workflows/` |
65
+ | Template index | `~/.maestro/templates/workflows/index.json` |
66
+
67
+ **Barrier nodes** (solo wave, coordinator reads artifacts after):
68
+
69
+ | Node type | Artifacts to Read | Context Updates |
70
+ |-----------|------------------|-----------------|
71
+ | `checkpoint` | — (state save only) | `last_checkpoint` |
72
+ | `maestro-plan` | `plan.json`, `.task/TASK-*.json` | `plan_dir`, `task_count` |
73
+ | `maestro-execute` | `results.csv` | `exec_status`, `completed_tasks` |
74
+ | `maestro-analyze` | `context.md` | `analysis_dir`, `gaps`, `phase` |
75
+ | `maestro-brainstorm` | `.brainstorming/` | `brainstorm_dir` |
76
+ | `maestro-spec-generate` | `specs/` | `spec_session_id` |
77
+
78
+ All other skill nodes are **non-barrier** (groupable into parallel waves).
79
+
80
+ **state.json schema:**
81
+
82
+ ```json
83
+ {
84
+ "id": "MCP-<YYYYMMDD>-<HHmmss>",
85
+ "intent": "<template_name> with context",
86
+ "chain": "<template_id>",
87
+ "template_path": "~/.maestro/templates/workflows/<slug>.json",
88
+ "template_name": "<name>",
89
+ "auto_yes": false,
90
+ "status": "in_progress | paused | completed | aborted",
91
+ "started_at": "<ISO>",
92
+ "context": {
93
+ "goal": "...", "scope": "...",
94
+ "phase": null, "plan_dir": null, "analysis_dir": null,
95
+ "last_checkpoint": null
96
+ },
97
+ "waves": [],
98
+ "steps": [
99
+ {
100
+ "step_n": 1, "node_id": "N-001",
101
+ "skill": "<executor>", "args": "<args_template>",
102
+ "type": "skill | cli | checkpoint",
103
+ "is_barrier": true,
104
+ "status": "pending | completed | failed | skipped",
105
+ "wave_n": null, "findings": null, "artifacts": null
106
+ }
107
+ ]
108
+ }
109
+ ```
110
+ </context>
111
+
112
+ <execution>
113
+
114
+ ### handleList
115
+
116
+ Scan `~/.maestro/templates/workflows/index.json`. Display:
117
+ ```
118
+ Available workflow templates:
119
+ feature-tdd-review [feature, complex] 3 work nodes, 2 checkpoints
120
+ quick-bugfix [bugfix, simple] 2 work nodes, 1 checkpoint
121
+
122
+ Run: $maestro-player <slug> --context goal="..."
123
+ ```
124
+
125
+ If not found: "No templates. Create with $maestro-composer"
126
+
127
+ ---
128
+
129
+ ### Phase 0: Resume
130
+
131
+ **Trigger**: `-c [session-id]`
132
+
133
+ 1. If session-id given: load `.workflow/.maestro-coordinate/<session-id>/state.json`
134
+ 2. If no session-id: Glob `.workflow/.maestro-coordinate/MCP-*/state.json` sorted desc, find `status = "in_progress" | "paused"`
135
+ 3. None found → error E005
136
+ 4. Identify last completed wave, resume from next pending step
137
+ 5. Jump to Phase 3 (Wave Execution)
138
+
139
+ ---
140
+
141
+ ### Phase 1: Load & Bind
142
+
143
+ **Step 1.1** — Resolve template path:
144
+ 1. Absolute path → use as-is
145
+ 2. Slug → look up in `~/.maestro/templates/workflows/index.json`
146
+ 3. Partial match → confirm with user
147
+ 4. Not found → show `--list`, AskUserQuestion
148
+
149
+ **Step 1.2** — Parse `--context key=value` pairs into `bound_context`.
150
+
151
+ **Step 1.3** — Load and validate template JSON.
152
+
153
+ **Step 1.4** — Collect missing required variables via AskUserQuestion.
154
+
155
+ **Step 1.5** — Bind `{variable_name}` in all `args_template` strings. Leave `{N-xxx.field}` and `{prev_*}` unresolved (runtime Phase 3).
156
+
157
+ **Step 1.6** — If `--dry-run`: print wave plan and exit (see Phase 2 output).
158
+
159
+ ---
160
+
161
+ ### Phase 2: Init Session & Build Wave Plan
162
+
163
+ **Step 2.1** — Generate session ID: `MCP-<YYYYMMDD>-<HHmmss>`.
164
+
165
+ **Step 2.2** — Topological sort (Kahn's algorithm) on template nodes + edges.
166
+
167
+ **Step 2.3** — Classify barrier vs non-barrier per node:
168
+
169
+ ```javascript
170
+ const BARRIER_SKILLS = new Set([
171
+ 'maestro-analyze', 'maestro-plan', 'maestro-brainstorm',
172
+ 'maestro-spec-generate', 'maestro-execute'
173
+ ]);
174
+
175
+ function isBarrier(node) {
176
+ if (node.type === 'checkpoint') return true;
177
+ return BARRIER_SKILLS.has(node.executor);
178
+ }
179
+ ```
180
+
181
+ **Step 2.4** — Group into waves:
182
+
183
+ ```javascript
184
+ function buildWaves(sortedNodes) {
185
+ const waves = [];
186
+ let currentWave = [];
187
+ for (const node of sortedNodes) {
188
+ if (isBarrier(node)) {
189
+ if (currentWave.length > 0) waves.push(currentWave);
190
+ waves.push([node]); // barrier = solo wave
191
+ currentWave = [];
192
+ } else {
193
+ currentWave.push(node);
194
+ }
195
+ }
196
+ if (currentWave.length > 0) waves.push(currentWave);
197
+ return waves;
198
+ }
199
+ ```
200
+
201
+ **Step 2.5** — Build steps array from waves. Write `state.json` to `.workflow/.maestro-coordinate/<session-id>/`.
202
+
203
+ **Step 2.6** — Display start banner:
204
+ ```
205
+ ============================================================
206
+ MAESTRO PLAYER
207
+ ============================================================
208
+ Template: <template.name>
209
+ Session: <session_id>
210
+ Context: goal="<value>"
211
+
212
+ Wave Plan:
213
+ [W1] N-001 maestro-plan "{goal}" [BARRIER]
214
+ [W2] N-002 maestro-execute {phase} [BARRIER]
215
+ [W3] N-003 quality-test {phase}
216
+ N-004 quality-review {phase}
217
+ ============================================================
218
+ ```
219
+
220
+ **`--dry-run`**: Display above and exit.
221
+
222
+ ---
223
+
224
+ ### Phase 3: Wave Execution Loop
225
+
226
+ ```javascript
227
+ let waveNum = 0;
228
+ while (state.steps.some(s => s.status === 'pending')) {
229
+ waveNum++;
230
+ const waveSteps = getNextWave(state.steps);
231
+ ```
232
+
233
+ **3a. Resolve runtime references** in each step's args:
234
+
235
+ ```javascript
236
+ function resolveArgs(args, steps, context) {
237
+ return args
238
+ .replace(/{(\w+)}/g, (_, key) => context[key] ?? '')
239
+ .replace(/{N-(\d+)\.(\w+)}/g, (_, id, field) => {
240
+ const step = steps.find(s => s.node_id === `N-${id}`);
241
+ return step?.[field] ?? '';
242
+ })
243
+ .replace(/{prev_(\w+)}/g, (_, field) => {
244
+ const prev = [...steps].reverse().find(s =>
245
+ s.status === 'completed' && s.type !== 'checkpoint');
246
+ return prev?.[field] ?? '';
247
+ });
248
+ }
249
+ ```
250
+
251
+ **3b. Handle checkpoint nodes** (no CSV spawn needed):
252
+
253
+ ```javascript
254
+ if (waveSteps[0].type === 'checkpoint') {
255
+ const cp = waveSteps[0];
256
+ // Save checkpoint snapshot
257
+ Write(`${sessionDir}/checkpoints/${cp.node_id}.json`, JSON.stringify({
258
+ session_id: state.id, checkpoint_id: cp.node_id,
259
+ saved_at: new Date().toISOString(),
260
+ steps_snapshot: state.steps, context: state.context
261
+ }, null, 2));
262
+
263
+ state.context.last_checkpoint = cp.node_id;
264
+ cp.status = 'completed'; cp.wave_n = waveNum;
265
+
266
+ // If auto_continue == false: pause for user
267
+ if (!cp.auto_continue) {
268
+ AskUserQuestion: Continue / Pause / Abort
269
+ on Pause: state.status = 'paused', save, exit
270
+ on Abort: state.status = 'aborted', skip remaining, exit
271
+ }
272
+
273
+ Write(stateFile, JSON.stringify(state, null, 2));
274
+ continue;
275
+ }
276
+ ```
277
+
278
+ **3c. Build wave CSV** for skill nodes:
279
+
280
+ ```javascript
281
+ const csvContent = 'id,skill_call,topic\n' + waveSteps.map(step => {
282
+ const resolvedArgs = resolveArgs(step.args, state.steps, state.context);
283
+ const skillCall = `$${step.skill} ${resolvedArgs}`.trim();
284
+ return `"${step.step_n}","${skillCall.replace(/"/g, '""')}","Template \"${state.template_name}\" step ${step.step_n}/${state.steps.length}"`;
285
+ }).join('\n');
286
+
287
+ Write(`${sessionDir}/wave-${waveNum}.csv`, csvContent);
288
+ ```
289
+
290
+ **3d. Spawn agents**:
291
+
292
+ ```javascript
293
+ spawn_agents_on_csv({
294
+ csv_path: `${sessionDir}/wave-${waveNum}.csv`,
295
+ id_column: "id",
296
+ instruction: PLAYER_INSTRUCTION,
297
+ max_workers: waveSteps.length,
298
+ max_runtime_seconds: 1800,
299
+ output_csv_path: `${sessionDir}/wave-${waveNum}-results.csv`,
300
+ output_schema: RESULT_SCHEMA
301
+ });
302
+ ```
303
+
304
+ **3e. Read results, update state**:
305
+
306
+ ```javascript
307
+ const results = readCSV(`${sessionDir}/wave-${waveNum}-results.csv`);
308
+ for (const row of results) {
309
+ const step = state.steps.find(s => s.step_n === parseInt(row.id));
310
+ step.status = row.status;
311
+ step.findings = row.summary;
312
+ step.artifacts = row.artifacts;
313
+ step.wave_n = waveNum;
314
+ }
315
+ ```
316
+
317
+ **3f. Barrier analysis** (if barrier wave):
318
+
319
+ ```javascript
320
+ if (isBarrier(waveSteps[0])) {
321
+ analyzeBarrierArtifacts(waveSteps[0], results[0], state.context);
322
+ }
323
+ ```
324
+
325
+ **3g. Persist + abort check**:
326
+
327
+ ```javascript
328
+ state.waves.push({ wave_n: waveNum, steps: waveSteps.map(s => s.step_n) });
329
+ Write(stateFile, JSON.stringify(state, null, 2));
330
+
331
+ if (results.some(r => r.status === 'failed')) {
332
+ state.status = 'aborted';
333
+ state.steps.filter(s => s.status === 'pending').forEach(s => s.status = 'skipped');
334
+ Write(stateFile, JSON.stringify(state, null, 2));
335
+ break;
336
+ }
337
+ ```
338
+
339
+ ### Sub-Agent Instruction Template
340
+
341
+ ```
342
+ 你是 CSV job 子 agent。
343
+
344
+ 先原样执行这一段技能调用:
345
+ {skill_call}
346
+
347
+ 然后基于结果完成这一行任务说明:
348
+ {topic}
349
+
350
+ 限制:
351
+ - 不要修改 .workflow/.maestro-coordinate/ 下的 state 文件
352
+ - skill 内部有自己的 session 管理,按 skill SKILL.md 执行即可
353
+
354
+ 最后必须调用 `report_agent_job_result`,返回 JSON:
355
+ {"status":"completed|failed","skill_call":"{skill_call}","summary":"一句话结果","artifacts":"产物路径或空字符串","error":"失败原因或空字符串"}
356
+ ```
357
+
358
+ ### Result Schema
359
+
360
+ ```javascript
361
+ const RESULT_SCHEMA = {
362
+ type: "object",
363
+ properties: {
364
+ status: { type: "string", enum: ["completed", "failed"] },
365
+ skill_call: { type: "string" },
366
+ summary: { type: "string" },
367
+ artifacts: { type: "string" },
368
+ error: { type: "string" }
369
+ },
370
+ required: ["status", "skill_call", "summary", "artifacts", "error"]
371
+ };
372
+ ```
373
+
374
+ ---
375
+
376
+ ### Phase 4: Completion Report
377
+
378
+ ```
379
+ ============================================================
380
+ MAESTRO PLAYER SESSION COMPLETE
381
+ ============================================================
382
+ Session: <session_id>
383
+ Template: <template_name> (<template_id>)
384
+ Waves: <N> executed
385
+ Steps: <completed>/<total>
386
+ Context: goal="<value>"
387
+
388
+ WAVE RESULTS:
389
+ [W1] $maestro-plan "{goal}" → ✓ plan created
390
+ [W2] $maestro-execute {phase} → ✓ 12/12 tasks
391
+ [W3] $quality-test {phase} → ✓ all tests pass
392
+ $quality-review {phase} → ✓ no issues
393
+
394
+ State: .workflow/.maestro-coordinate/<session_id>/state.json
395
+ Resume: $maestro-player -c
396
+ ============================================================
397
+ ```
398
+
399
+ Update `state.status = "completed"`, write final `state.json`.
400
+ </execution>
401
+
402
+ <csv_schema>
403
+ ### wave-{N}.csv (Per-Wave Input)
404
+
405
+ ```csv
406
+ id,skill_call,topic
407
+ "1","$maestro-plan \"implement user auth\"","Template \"feature-plan-test\" step 1/5"
408
+ ```
409
+
410
+ | Column | Description |
411
+ |--------|-------------|
412
+ | `id` | Step number (string) |
413
+ | `skill_call` | Full skill invocation with resolved context args |
414
+ | `topic` | Brief description for the agent |
415
+
416
+ ### wave-{N}-results.csv (Per-Wave Output)
417
+
418
+ Written by `spawn_agents_on_csv`. Contains result per agent.
419
+ </csv_schema>
420
+
421
+ <error_codes>
422
+ | Code | Severity | Condition | Recovery |
423
+ |------|----------|-----------|----------|
424
+ | E001 | error | Template not found | Show --list, suggest closest match |
425
+ | E002 | error | Template JSON invalid | Point to file for fix |
426
+ | E003 | error | Required variable missing, user declined | Cannot proceed |
427
+ | E004 | error | DAG cycle in template | Suggest $maestro-composer --edit |
428
+ | E005 | error | Resume session not found | List sessions |
429
+ | E006 | error | Wave timeout | Mark failed, abort chain |
430
+ | E007 | error | Barrier artifact not found | Retry wave once, then abort |
431
+ | W001 | warning | Runtime reference resolved to empty | Log, continue |
432
+ | W002 | warning | Barrier artifact partial | Continue with available context |
433
+ </error_codes>
434
+
435
+ <success_criteria>
436
+ - [ ] Template loaded from `~/.maestro/templates/workflows/` and validated
437
+ - [ ] All required context variables bound
438
+ - [ ] Session dir at `.workflow/.maestro-coordinate/MCP-*/` with `state.json`
439
+ - [ ] DAG nodes converted to waves (barrier=solo, non-barrier=parallel)
440
+ - [ ] Every skill invocation goes through `spawn_agents_on_csv` — none in coordinator
441
+ - [ ] Checkpoint nodes handled inline (state save, optional user pause)
442
+ - [ ] Barrier artifacts read and context updated before next wave
443
+ - [ ] Runtime references ({N-xxx.field}, {prev_*}) resolved before each wave CSV
444
+ - [ ] Failed step → remaining marked skipped → abort reported
445
+ - [ ] `--dry-run` shows wave plan with [BARRIER] markers, no execution
446
+ - [ ] `-c` resumes from last completed wave
447
+ - [ ] Completion report with per-wave status
448
+ </success_criteria>
@@ -27,12 +27,12 @@
27
27
  },
28
28
  "merge_decision": {
29
29
  "type": "decision",
30
- "description": "Check if all milestone phases are completed",
31
- "condition": "all_phases_completed",
32
- "branches": {
33
- "true": "merge",
34
- "false": "lifecycle_in_worktree"
35
- }
30
+ "strategy": "expr",
31
+ "eval": "all_phases_completed",
32
+ "edges": [
33
+ { "value": true, "target": "merge", "description": "All phases completed — merge back" },
34
+ { "value": false, "target": "lifecycle_in_worktree", "default": true, "description": "Phases remaining — continue lifecycle" }
35
+ ]
36
36
  },
37
37
  "merge": {
38
38
  "type": "command",
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Auto-mode detection — shared helper for hooks
3
+ *
4
+ * Detects whether the current session is running in `-y` (auto) mode.
5
+ * Two-layer strategy:
6
+ * 1. Bridge file (fast, written by coordinator-tracker on Stop)
7
+ * 2. Direct status.json scan (fallback for first turn before Stop fires)
8
+ */
9
+ interface AutoModeInput {
10
+ session_id?: string;
11
+ cwd?: string;
12
+ }
13
+ /**
14
+ * Returns true if the current maestro session has auto_mode enabled.
15
+ */
16
+ export declare function isAutoMode(data: AutoModeInput): boolean;
17
+ export {};
18
+ //# sourceMappingURL=auto-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-mode.d.ts","sourceRoot":"","sources":["../../../src/hooks/auto-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAYvD"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Auto-mode detection — shared helper for hooks
3
+ *
4
+ * Detects whether the current session is running in `-y` (auto) mode.
5
+ * Two-layer strategy:
6
+ * 1. Bridge file (fast, written by coordinator-tracker on Stop)
7
+ * 2. Direct status.json scan (fallback for first turn before Stop fires)
8
+ */
9
+ import { readCoordBridge, readMaestroSession } from './coordinator-tracker.js';
10
+ import { resolveWorkspace } from './workspace.js';
11
+ /**
12
+ * Returns true if the current maestro session has auto_mode enabled.
13
+ */
14
+ export function isAutoMode(data) {
15
+ // Fast path: bridge file (written by coordinator-tracker on previous Stop)
16
+ if (data.session_id) {
17
+ const bridge = readCoordBridge(data.session_id);
18
+ if (bridge?.auto_mode)
19
+ return true;
20
+ }
21
+ // Fallback: scan status.json directly (works on first turn before Stop fires)
22
+ const workspace = resolveWorkspace(data);
23
+ if (!workspace)
24
+ return false;
25
+ const session = readMaestroSession(workspace);
26
+ return session?.auto_mode ?? false;
27
+ }
28
+ //# sourceMappingURL=auto-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-mode.js","sourceRoot":"","sources":["../../../src/hooks/auto-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAOlD;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC5C,2EAA2E;IAC3E,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,SAAS;YAAE,OAAO,IAAI,CAAC;IACrC,CAAC;IAED,8EAA8E;IAC9E,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC9C,OAAO,OAAO,EAAE,SAAS,IAAI,KAAK,CAAC;AACrC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"context-monitor.d.ts","sourceRoot":"","sources":["../../../src/hooks/context-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAcH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAcD,UAAU,UAAU;IAClB,kBAAkB,EAAE;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAuBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI,CA6DrE;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,IAAI,IAAI,CAmBxC"}
1
+ {"version":3,"file":"context-monitor.d.ts","sourceRoot":"","sources":["../../../src/hooks/context-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAeH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAcD,UAAU,UAAU;IAClB,kBAAkB,EAAE;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAiCD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI,CA8DrE;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,IAAI,IAAI,CAmBxC"}
@@ -17,8 +17,18 @@ import { join } from 'node:path';
17
17
  import { tmpdir } from 'node:os';
18
18
  import { WARNING_THRESHOLD, CRITICAL_THRESHOLD, STALE_SECONDS, DEBOUNCE_CALLS, BRIDGE_PREFIX, } from './constants.js';
19
19
  import { resolveWorkspace } from './workspace.js';
20
- /** Build the warning message based on severity and workflow presence */
21
- function buildMessage(usedPct, remaining, isCritical, hasWorkflow) {
20
+ import { isAutoMode } from './auto-mode.js';
21
+ /** Build the warning message based on severity, workflow presence, and auto mode */
22
+ function buildMessage(usedPct, remaining, isCritical, hasWorkflow, autoMode) {
23
+ // Auto mode (-y): never instruct the model to stop — let the chain finish
24
+ if (autoMode) {
25
+ return isCritical
26
+ ? `CONTEXT CRITICAL: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +
27
+ 'Finish current chain step. Progress tracked in status.json. ' +
28
+ 'Chain can resume with /maestro -c in a new session.'
29
+ : `CONTEXT WARNING: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +
30
+ 'Finish current chain step, then stop chain. Resume with /maestro -c.';
31
+ }
22
32
  if (isCritical) {
23
33
  return hasWorkflow
24
34
  ? `CONTEXT CRITICAL: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +
@@ -85,7 +95,8 @@ export function evaluateContext(data) {
85
95
  writeFileSync(warnPath, JSON.stringify(warnData));
86
96
  // Detect maestro workflow state via workspace resolver
87
97
  const hasWorkflow = resolveWorkspace(data) !== null;
88
- const message = buildMessage(usedPct, remaining, isCritical, hasWorkflow);
98
+ const autoMode = hasWorkflow && isAutoMode(data);
99
+ const message = buildMessage(usedPct, remaining, isCritical, hasWorkflow, autoMode);
89
100
  return {
90
101
  hookSpecificOutput: {
91
102
  hookEventName: 'PostToolUse',
@@ -1 +1 @@
1
- {"version":3,"file":"context-monitor.js","sourceRoot":"","sources":["../../../src/hooks/context-monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-monitor.js","sourceRoot":"","sources":["../../../src/hooks/context-monitor.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,7 @@ export interface CoordBridgeData {
31
31
  args: string;
32
32
  }>;
33
33
  status: string;
34
+ auto_mode?: boolean;
34
35
  updated_at: number;
35
36
  }
36
37
  /** Parsed output from `maestro coordinate start/next` JSON */
@@ -1 +1 @@
1
- {"version":3,"file":"coordinator-tracker.d.ts","sourceRoot":"","sources":["../../../src/hooks/coordinator-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,oBAAoB,GAAG,yBAAyB,CAAC;AAE3F,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,eAAe,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE;AAsBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAuBhF;AA0CD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAwBpF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAsCrG;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA0BxC;AA2CD,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAM/E;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAQzE;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,eAAe,GAAG,IAAI,GACtC,eAAe,GAAG,IAAI,CAUxB;AA6BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CA8BtE"}
1
+ {"version":3,"file":"coordinator-tracker.d.ts","sourceRoot":"","sources":["../../../src/hooks/coordinator-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,oBAAoB,GAAG,yBAAyB,CAAC;AAE3F,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,eAAe,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE;AAsBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAuBhF;AA2CD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAwBpF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAuCrG;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA0BxC;AA2CD,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAM/E;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAQzE;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,eAAe,GAAG,IAAI,GACtC,eAAe,GAAG,IAAI,CAUxB;AAyCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CA8BtE"}
@@ -73,6 +73,7 @@ function parseMaestroStatus(raw, mtime, dirName) {
73
73
  next_step: nextStep,
74
74
  remaining_steps: remaining,
75
75
  status: raw.status ?? 'unknown',
76
+ auto_mode: raw.auto_mode ?? false,
76
77
  updated_at: Math.floor(mtime),
77
78
  };
78
79
  }
@@ -142,6 +143,7 @@ export function readWalkerState(workspaceRoot, coordSessionId) {
142
143
  next_step: nextNode ? { index: completed + 1, skill: nextNode.skill, args: nextNode.args } : null,
143
144
  remaining_steps: nextNode ? [{ skill: nextNode.skill, args: nextNode.args }] : [],
144
145
  status: raw.status ?? 'unknown',
146
+ auto_mode: raw.auto_mode ?? false,
145
147
  updated_at: Math.floor(statSync(statePath).mtimeMs),
146
148
  };
147
149
  }
@@ -272,21 +274,29 @@ function readLatestCoordinateSession(workspaceRoot) {
272
274
  const sessions = readdirSync(coordDir)
273
275
  .filter(name => name.startsWith('coord-'))
274
276
  .map(name => {
275
- const statePath = join(coordDir, name, 'walker-state.json');
276
- if (!existsSync(statePath))
277
- return null;
278
- try {
279
- return { name, mtime: statSync(statePath).mtimeMs };
280
- }
281
- catch {
282
- return null;
277
+ // Try walker-state.json (link-coordinate) then status.json (maestro-coordinate)
278
+ for (const file of ['walker-state.json', 'status.json']) {
279
+ const statePath = join(coordDir, name, file);
280
+ if (existsSync(statePath)) {
281
+ try {
282
+ return { name, mtime: statSync(statePath).mtimeMs, file };
283
+ }
284
+ catch { /* skip */ }
285
+ }
283
286
  }
287
+ return null;
284
288
  })
285
289
  .filter((s) => s !== null)
286
290
  .sort((a, b) => b.mtime - a.mtime);
287
291
  if (sessions.length === 0)
288
292
  return null;
289
- return readWalkerState(workspaceRoot, sessions[0].name);
293
+ const latest = sessions[0];
294
+ if (latest.file === 'walker-state.json') {
295
+ return readWalkerState(workspaceRoot, latest.name);
296
+ }
297
+ // status.json uses same format as maestro status.json
298
+ const raw = JSON.parse(readFileSync(join(coordDir, latest.name, 'status.json'), 'utf8'));
299
+ return parseMaestroStatus(raw, latest.mtime, latest.name);
290
300
  }
291
301
  catch {
292
302
  return null;