maestro-flow 0.4.14 → 0.4.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.
- package/.agents/skills/maestro/SKILL.md +11 -31
- package/.agents/skills/maestro-ralph/SKILL.md +49 -47
- package/.agents/skills/maestro-ralph-execute/SKILL.md +31 -57
- package/.agy/skills/maestro/SKILL.md +11 -31
- package/.agy/skills/maestro-ralph/SKILL.md +49 -47
- package/.agy/skills/maestro-ralph-execute/SKILL.md +31 -57
- package/.claude/commands/maestro-ralph-execute.md +31 -57
- package/.claude/commands/maestro-ralph.md +49 -47
- package/.claude/commands/maestro.md +11 -31
- package/dist/src/commands/hooks.d.ts +30 -3
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +138 -11
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/install-backend.d.ts +49 -4
- package/dist/src/commands/install-backend.d.ts.map +1 -1
- package/dist/src/commands/install-backend.js +163 -53
- package/dist/src/commands/install-backend.js.map +1 -1
- package/dist/src/commands/install.d.ts.map +1 -1
- package/dist/src/commands/install.js +45 -10
- package/dist/src/commands/install.js.map +1 -1
- package/dist/src/commands/uninstall.d.ts.map +1 -1
- package/dist/src/commands/uninstall.js +25 -38
- package/dist/src/commands/uninstall.js.map +1 -1
- package/dist/src/core/manifest.d.ts +43 -0
- package/dist/src/core/manifest.d.ts.map +1 -1
- package/dist/src/core/manifest.js +37 -1
- package/dist/src/core/manifest.js.map +1 -1
- package/dist/src/tui/install-ui/ExecutionView.d.ts.map +1 -1
- package/dist/src/tui/install-ui/ExecutionView.js +13 -5
- package/dist/src/tui/install-ui/ExecutionView.js.map +1 -1
- package/dist/src/tui/install-ui/InstallExecution.d.ts.map +1 -1
- package/dist/src/tui/install-ui/InstallExecution.js +87 -45
- package/dist/src/tui/install-ui/InstallExecution.js.map +1 -1
- package/dist/src/tui/uninstall-ui/UninstallFlow.d.ts.map +1 -1
- package/dist/src/tui/uninstall-ui/UninstallFlow.js +12 -28
- package/dist/src/tui/uninstall-ui/UninstallFlow.js.map +1 -1
- package/package.json +1 -1
|
@@ -15,7 +15,7 @@ Closed-loop decision engine for the maestro workflow lifecycle.
|
|
|
15
15
|
Reads project state → infers position → builds adaptive chain → delegates execution.
|
|
16
16
|
|
|
17
17
|
Entry points:
|
|
18
|
-
- **`/maestro-ralph "intent"`** — New session: infer → decompose → build →
|
|
18
|
+
- **`/maestro-ralph "intent"`** — New session: infer → decompose → build → emit /goal prompt(如有 decomposition)→ dispatch ralph-execute
|
|
19
19
|
- **`/maestro-ralph continue`** — Wrapper; dispatches to ralph-execute(首选直接 `/maestro-ralph-execute` 推进 step)
|
|
20
20
|
- **`/maestro-ralph status`** — Display session progress
|
|
21
21
|
|
|
@@ -23,10 +23,9 @@ Entry points:
|
|
|
23
23
|
|
|
24
24
|
Initial decomposition (S_DECOMPOSE): boundary-clarified via ≤3 questions for broad intents (重构/全面/迁移/重写). 写入 status.json 的 `boundary_contract` / `execution_criteria` / `task_decomposition`,附 `/goal` prompt。
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
- **decision**:
|
|
29
|
-
- **external**: 仅在显式声明时使用(`maestro delegate --to claude`)
|
|
26
|
+
Step kinds:
|
|
27
|
+
- **执行 step**: ralph-execute `view_file({command_path})` 命令 .md,按内容内联执行
|
|
28
|
+
- **decision step**: `step.decision` 字段非空;回 ralph 评估(CLI 只读分析)
|
|
30
29
|
|
|
31
30
|
Key difference from maestro coordinator:
|
|
32
31
|
- maestro: static chain → one-time selection → runs all steps
|
|
@@ -43,8 +42,8 @@ Mutual invocation with `/maestro-ralph-execute` forms a self-perpetuating work l
|
|
|
43
42
|
│ writes status.json
|
|
44
43
|
│ emits /goal prompt
|
|
45
44
|
▼
|
|
46
|
-
ralph-execute ◀─┐
|
|
47
|
-
│ │ decision → Skill("maestro-ralph")
|
|
45
|
+
ralph-execute ◀─┐ 执行 step → view_file(command_path) inline
|
|
46
|
+
│ │ decision step → Skill("maestro-ralph")
|
|
48
47
|
└─────────┘ writes step.completion_confirmed
|
|
49
48
|
loop until all completion_confirmed | paused
|
|
50
49
|
```
|
|
@@ -68,14 +67,14 @@ Remaining → intent
|
|
|
68
67
|
|
|
69
68
|
<invariants>
|
|
70
69
|
1. **Ralph never executes steps** — only creates sessions and evaluates decisions
|
|
71
|
-
2. **Handoff via Skill("maestro-ralph-execute")** —
|
|
70
|
+
2. **Handoff via Skill("maestro-ralph-execute")** — 创建 session 后始终自动 handoff;decision 评估后始终 handoff
|
|
72
71
|
3. **Decision delegates read-only** — `maestro delegate --role analyze --mode analysis`
|
|
73
|
-
4.
|
|
72
|
+
4. **执行 step 通过 Read 命令 .md 内联执行**
|
|
74
73
|
5. **status.json 是唯一真源** — 不生成 markdown 清单或侧文件
|
|
75
74
|
6. **每个 step 必须 `completion_confirmed: true`** — 基于 `--- COMPLETION STATUS ---` 的 `STATUS: DONE`;缺失则视为未完成
|
|
76
75
|
7. **command_path 在 A_BUILD_STEPS 解析** — 全局优先 `~/.claude/commands/{name}.md`,fallback 项目 `.claude/commands/{name}.md`,写入 status.json
|
|
77
|
-
8.
|
|
78
|
-
9. **Decomposition is outcome-oriented** — sub-goals 为可观测交付,禁止 lifecycle 复刻;`/goal` 用户绑定,ralph
|
|
76
|
+
8. **执行 step 加载契约** — ralph-execute 读 `command_path` 后,必须解析并加载该命令 `<required_reading>` 引用的所有文件("入口 + workflow"形式的核心),并把 `<deferred_reading>` 路径记录到 `step.deferred_reads`;加载完成后输出 `✓ skill {name} 加载完成`。ralph 在 build 阶段只解析路径,不读 .md 内容
|
|
77
|
+
9. **Decomposition is outcome-oriented** — sub-goals 为可观测交付,禁止 lifecycle 复刻;`/goal` 用户绑定,ralph 输出提示词后继续 handoff,用户可在执行过程中随时输入 `/goal`
|
|
79
78
|
10. **planning_mode governs arg granularity** — `unified` → skill args 无 `{phase}`;`independent` → 含 `{phase}`
|
|
80
79
|
11. **task_decomposition 驱动 steps[] 动态生长** — `post-goal-audit` 按 unmet 子目标插入 scoped mini-loop;字段可选/累加,既有字段不删不改
|
|
81
80
|
</invariants>
|
|
@@ -147,9 +146,8 @@ S_BUILD_CHAIN:
|
|
|
147
146
|
→ S_CREATE_SESSION DO: A_BUILD_STEPS
|
|
148
147
|
|
|
149
148
|
S_CREATE_SESSION:
|
|
150
|
-
→
|
|
151
|
-
→
|
|
152
|
-
→ S_DISPATCH WHEN: auto_confirm AND no decomposition DO: A_CREATE_SESSION
|
|
149
|
+
→ S_CONFIRM WHEN: not auto_confirm DO: A_CREATE_SESSION
|
|
150
|
+
→ S_DISPATCH WHEN: auto_confirm DO: A_CREATE_SESSION
|
|
153
151
|
|
|
154
152
|
S_CONFIRM:
|
|
155
153
|
→ S_DISPATCH WHEN: user selects "Proceed"
|
|
@@ -159,7 +157,7 @@ S_CONFIRM:
|
|
|
159
157
|
S_DISPATCH:
|
|
160
158
|
→ END DO: view_file(AbsolutePath="<agy-skills-dir>/maestro-ralph-execute/SKILL.md") + execute inline
|
|
161
159
|
|
|
162
|
-
S_DECISION_EVAL:
|
|
160
|
+
S_DECISION_EVAL: (decision 节点 == `step.decision` 非空,下述 gate 名取自该字段)
|
|
163
161
|
→ S_APPLY_VERDICT WHEN: quality-gate (post-verify, post-business-test, post-review, post-test)
|
|
164
162
|
DO: A_DELEGATE_EVALUATE
|
|
165
163
|
→ S_APPLY_VERDICT WHEN: goal-gate (post-goal-audit)
|
|
@@ -198,7 +196,7 @@ S_FALLBACK:
|
|
|
198
196
|
|
|
199
197
|
1. Find latest ralph session (by created_at)
|
|
200
198
|
2. Display: Session, Status, Position, Progress, Current step
|
|
201
|
-
3. List steps: [✓] completion_confirmed, [▸] current, [ ] pending, [◆] decision
|
|
199
|
+
3. List steps: [✓] completion_confirmed, [▸] current, [ ] pending, [◆] decision(`step.decision` 非空);执行 step 附 `command_scope`(global/project) + `command_path`
|
|
202
200
|
4. If `task_decomposition` present (absent → skip):
|
|
203
201
|
```
|
|
204
202
|
Sub-goals ({done}/{total}) source: {session_dir}/status.json#/task_decomposition
|
|
@@ -378,24 +376,26 @@ narrow → derive defaults from intent + codebase, skip questions.
|
|
|
378
376
|
|
|
379
377
|
Generate steps from `session.lifecycle_position` to `milestone-complete`.
|
|
380
378
|
|
|
381
|
-
| Stage | Skill (independent) | Skill (unified) |
|
|
382
|
-
|
|
383
|
-
| brainstorm | `maestro-brainstorm "{intent}"` | *(same)* |
|
|
384
|
-
| blueprint | `maestro-blueprint "{intent}"` | *(same)* |
|
|
385
|
-
| init | `maestro-init` | *(same)* |
|
|
386
|
-
| analyze-macro | `maestro-analyze "{intent}"` | *(same)* |
|
|
387
|
-
| roadmap | `maestro-roadmap --from analyze:{analyze_macro_id}` | *(same)* |
|
|
388
|
-
| analyze | `maestro-analyze {phase}` | `maestro-analyze` |
|
|
389
|
-
| plan | `maestro-plan {phase}` *(scope=phase)* / `maestro-plan --from analyze:{analyze_macro_id}` *(scope=standalone)* / `maestro-plan --from blueprint:{blueprint_id}` *(scope=standalone)* | `maestro-plan` |
|
|
390
|
-
| execute | `maestro-execute {phase}` | `maestro-execute` |
|
|
391
|
-
| verify | `maestro-verify {phase}` | `maestro-verify` |
|
|
392
|
-
| business-test | `quality-auto-test {phase}` | `quality-auto-test` |
|
|
393
|
-
| review | `quality-review {phase}` | `quality-review` |
|
|
394
|
-
| test-gen | `quality-auto-test {phase}` | `quality-auto-test` |
|
|
395
|
-
| test | `quality-test {phase}` | `quality-test` |
|
|
396
|
-
| milestone-audit | `maestro-milestone-audit` | *(same)* |
|
|
397
|
-
| goal-audit | *(decision-only)* | *(same)* |
|
|
398
|
-
| milestone-complete | `maestro-milestone-complete` | *(same)* |
|
|
379
|
+
| Stage | Skill (independent) | Skill (unified) | Decision after | quality_mode |
|
|
380
|
+
|-------|---------------------|-----------------|----------------|--------------|
|
|
381
|
+
| brainstorm | `maestro-brainstorm "{intent}"` | *(same)* | — | all |
|
|
382
|
+
| blueprint | `maestro-blueprint "{intent}"` | *(same)* | — | all |
|
|
383
|
+
| init | `maestro-init` | *(same)* | — | all |
|
|
384
|
+
| analyze-macro | `maestro-analyze "{intent}"` | *(same)* | `post-analyze-scope` | all |
|
|
385
|
+
| roadmap | `maestro-roadmap --from analyze:{analyze_macro_id}` | *(same)* | — | all |
|
|
386
|
+
| analyze | `maestro-analyze {phase}` | `maestro-analyze` | — | all |
|
|
387
|
+
| plan | `maestro-plan {phase}` *(scope=phase)* / `maestro-plan --from analyze:{analyze_macro_id}` *(scope=standalone)* / `maestro-plan --from blueprint:{blueprint_id}` *(scope=standalone)* | `maestro-plan` | — | all |
|
|
388
|
+
| execute | `maestro-execute {phase}` | `maestro-execute` | — | all |
|
|
389
|
+
| verify | `maestro-verify {phase}` | `maestro-verify` | `post-verify` | all |
|
|
390
|
+
| business-test | `quality-auto-test {phase}` | `quality-auto-test` | `post-business-test` | full only |
|
|
391
|
+
| review | `quality-review {phase}` | `quality-review` | `post-review` | all (quick: append `--tier quick`) |
|
|
392
|
+
| test-gen | `quality-auto-test {phase}` | `quality-auto-test` | — | full / standard if coverage<80% |
|
|
393
|
+
| test | `quality-test {phase}` | `quality-test` | `post-test` | full, standard |
|
|
394
|
+
| milestone-audit | `maestro-milestone-audit` | *(same)* | — | all |
|
|
395
|
+
| goal-audit | *(decision-only)* | *(same)* | `post-goal-audit` | all (only if decomposed) |
|
|
396
|
+
| milestone-complete | `maestro-milestone-complete` | *(same)* | `post-milestone` | all |
|
|
397
|
+
|
|
398
|
+
> 所有执行 stage 统一通过 Read .md 内联执行;decision 节点单独作为独立 step 插入(见规则 4)。
|
|
399
399
|
|
|
400
400
|
**Build rules (按顺序应用):**
|
|
401
401
|
|
|
@@ -403,17 +403,17 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
|
|
|
403
403
|
1. **起点**:从 `session.lifecycle_position` 开始
|
|
404
404
|
2. **跳过已完成**:跳过当前 milestone+phase 下已有 completed artifact 的 stage(按 `session.phase` 过滤);unified 按 milestone 过滤
|
|
405
405
|
3. **quality_mode 过滤**:按 `session.quality_mode` 排除不匹配 stage
|
|
406
|
-
4. **决策节点**:每个 Decision after 非空的 stage 之后插入 `{
|
|
406
|
+
4. **决策节点**:每个 Decision after 非空的 stage 之后插入 `{ decision: "<gate>", retry_count: 0, max_retries: 2, command_scope: null, command_path: null }`
|
|
407
407
|
5. **goal-audit 插入**:`task_decomposition` 存在时,在最后一个 evidence-producing stage(verify/review/test)之后、`milestone-complete` 之前插入 `decision:post-goal-audit`
|
|
408
408
|
6. **终点硬约束**:chain 以 `milestone-complete` 结尾
|
|
409
409
|
7. **goal_ref 传播**:`task_decomposition` 存在时,每个 step 按 `step.stage ∈ g.lifecycle` 匹配 `step.goal_ref = g.id`(多匹配取字典序最小);decision 节点不打 goal_ref
|
|
410
410
|
8. **占位符**:independent 保留 `{phase}` `{intent}`;unified 不带 `{phase}`
|
|
411
|
-
9. **command_path
|
|
411
|
+
9. **command_path 解析**(每个执行 step,decision 节点跳过):
|
|
412
412
|
- 取 skill 名(args 前的第一个 token)
|
|
413
413
|
- 全局优先:`~/.claude/commands/{name}.md` 存在 → `command_scope = "global"`
|
|
414
414
|
- Fallback:`.claude/commands/{name}.md` 存在 → `command_scope = "project"`
|
|
415
415
|
- 两者都缺 → `command_scope = "missing"`, `command_path = null`,A_CREATE_SESSION 报错 E006
|
|
416
|
-
- **不在 build 阶段读取 .md 内容**;`<required_reading>` / `<deferred_reading>` 解析与加载由 ralph-execute
|
|
416
|
+
- **不在 build 阶段读取 .md 内容**;`<required_reading>` / `<deferred_reading>` 解析与加载由 ralph-execute A_EXEC_STEP 负责(保持入口/工作流分离)
|
|
417
417
|
10. **每个 step 初始化** `completion_confirmed: false`, `completion_status: null`, `completion_evidence: null`, `deferred_reads: []`
|
|
418
418
|
11. **scope_verdict gating**(仅当 chain 起点 = `analyze-macro`):
|
|
419
419
|
- `scope_verdict ∈ {medium, small}` → 跳过 `roadmap` + `analyze` 两 stage;`plan` 选 standalone 列(`--from analyze:{analyze_macro_id}`),不带 `{phase}`
|
|
@@ -432,7 +432,7 @@ Generate steps from `session.lifecycle_position` to `milestone-complete`.
|
|
|
432
432
|
1. Validate: 所有 step 的 `command_scope != "missing"`;否则 raise E006 + 列出缺失 skill
|
|
433
433
|
2. Write `.workflow/.maestro/ralph-{YYYYMMDD-HHmmss}/status.json` (Appendix: Session Schema)
|
|
434
434
|
3. Display chain overview:每步显示 `{index}. {skill} [{type}] [{command_scope}]`
|
|
435
|
-
4. If `task_decomposition` present: display **Goal Prompt block** (Appendix)
|
|
435
|
+
4. If `task_decomposition` present: display **Goal Prompt block** (Appendix),不阻塞流程,继续 handoff
|
|
436
436
|
|
|
437
437
|
### A_DELEGATE_EVALUATE
|
|
438
438
|
|
|
@@ -607,12 +607,14 @@ Runs only when `task_decomposition` present.
|
|
|
607
607
|
"analysis_dir": null, "brainstorm_dir": null, "blueprint_dir": null },
|
|
608
608
|
"steps": [{
|
|
609
609
|
"index": 0,
|
|
610
|
-
"
|
|
611
|
-
"skill": "",
|
|
610
|
+
"skill": "", // 执行 step 有值;decision 节点为空字符串/null
|
|
612
611
|
"args": "",
|
|
613
612
|
"stage": "", // brainstorm|blueprint|init|analyze-macro|roadmap|analyze|plan|execute|verify|...
|
|
614
613
|
"scope": null, // "phase"|"standalone"|"milestone"|null(plan 等需要)
|
|
615
|
-
"
|
|
614
|
+
"decision": null, // 非 null → decision 节点(值为 gate 名,如 "post-verify");null → 执行 step
|
|
615
|
+
"retry_count": 0, // decision 节点专用
|
|
616
|
+
"max_retries": 2, // decision 节点专用
|
|
617
|
+
"command_scope": "global|project|missing|null", // 执行 step;decision 节点固定 null
|
|
616
618
|
"command_path": "~/.claude/commands/{name}.md | .claude/commands/{name}.md | null",
|
|
617
619
|
"milestone_id": null, // D-007 反查注入;仅含 {phase} 占位符的 step 有
|
|
618
620
|
"source_artifact_ref": null, // "analyze:ANL-xxx" | "blueprint:BLP-xxx" | null
|
|
@@ -622,7 +624,7 @@ Runs only when `task_decomposition` present.
|
|
|
622
624
|
"completion_status": null,
|
|
623
625
|
"completion_evidence": null,
|
|
624
626
|
"completed_at": null,
|
|
625
|
-
"deferred_reads": [] // 由 ralph-execute
|
|
627
|
+
"deferred_reads": [] // 由 ralph-execute A_EXEC_STEP 解析 .md 时填充
|
|
626
628
|
}],
|
|
627
629
|
"waves": [], "current_step": 0,
|
|
628
630
|
|
|
@@ -644,7 +646,7 @@ Runs only when `task_decomposition` present.
|
|
|
644
646
|
|
|
645
647
|
### Fix-Loop Templates
|
|
646
648
|
|
|
647
|
-
|
|
649
|
+
所有插入的执行 step 按 A_BUILD_STEPS 规则 9 解析 `command_path` + `command_scope`;`decision:*` 条目为 decision 节点(`step.decision` 字段)。
|
|
648
650
|
|
|
649
651
|
**post-verify:**
|
|
650
652
|
```
|
|
@@ -706,12 +708,12 @@ decision:post-goal-audit {retry+1}
|
|
|
706
708
|
链路概览后逐字显示(仅当 decomposition 已产出):
|
|
707
709
|
|
|
708
710
|
```
|
|
709
|
-
📋
|
|
711
|
+
📋 任务分解完成。可随时复制以下 /goal 设定终止条件(执行过程中输入即可):
|
|
710
712
|
|
|
711
713
|
/goal 直到 {session_dir}/status.json 的 task_decomposition[*] 与 steps[*] 全部 completion_confirmed=true 才停。每轮以 status.json 为唯一行动手册,通过 /maestro-ralph-execute 推进 step;decision 节点由其自动 handoff 回 ralph 评估。禁止手动执行 skill 或修改 boundary_contract.out_of_scope。
|
|
712
714
|
```
|
|
713
715
|
|
|
714
|
-
`/goal` 由用户输入;ralph
|
|
716
|
+
`/goal` 由用户输入;ralph 输出提示词后继续 handoff,不阻塞。
|
|
715
717
|
|
|
716
718
|
### Error Codes
|
|
717
719
|
|
|
@@ -743,8 +745,8 @@ decision:post-goal-audit {retry+1}
|
|
|
743
745
|
- [ ] quality_mode 由 A_DETERMINE_QUALITY_MODE 决定,过滤 build steps
|
|
744
746
|
- [ ] Decomposition: broad intent ≤3 question clarify;narrow auto-derive
|
|
745
747
|
- [ ] status.json 唯一真源:boundary_contract + execution_criteria + task_decomposition;无外部清单
|
|
746
|
-
- [ ]
|
|
747
|
-
- [ ] Ralph build 阶段只解析路径,不读 .md 内容;`<required_reading>` 加载由 ralph-execute
|
|
748
|
+
- [ ] 执行 step 含 `command_scope` + `command_path`(全局优先 fallback 项目);decision step 通过 `step.decision` 字段标识
|
|
749
|
+
- [ ] Ralph build 阶段只解析路径,不读 .md 内容;`<required_reading>` 加载由 ralph-execute A_EXEC_STEP 完成
|
|
748
750
|
- [ ] 每个 step 含 `completion_confirmed` + `completion_status` + `completion_evidence` + `deferred_reads`(初始 false/null/[])
|
|
749
751
|
- [ ] 每个 sub-goal 含 `completion_confirmed`(初始 false)
|
|
750
752
|
- [ ] post-goal-audit decision 仅在 decomposed 时插入,位于 milestone-complete 之前
|
|
@@ -27,32 +27,29 @@ Remaining → session_id (if matches maestro-* or ralph-*)
|
|
|
27
27
|
```
|
|
28
28
|
Also read `session.auto_mode` from status.json — if true, treat as `-y`.
|
|
29
29
|
|
|
30
|
-
**
|
|
30
|
+
**Step kinds:**
|
|
31
31
|
|
|
32
|
-
|
|
|
33
|
-
|
|
34
|
-
| decision
|
|
35
|
-
|
|
|
36
|
-
| external (opt-in) | `maestro delegate --to claude --mode write` (STOP → callback) | Self-invoke next |
|
|
32
|
+
| Kind | Identifier | Execution | Flow after |
|
|
33
|
+
|------|-----------|-----------|------------|
|
|
34
|
+
| decision step | `step.decision` 非空 | `Skill("maestro-ralph")` | Execution ends here |
|
|
35
|
+
| 执行 step | `step.decision == null` | `view_file({file_path: step.command_path})` + 内联解释执行 | Self-invoke next |
|
|
37
36
|
|
|
38
37
|
HARD RULES:
|
|
39
|
-
-
|
|
40
|
-
- **必须遵循 `<required_reading>` / `<deferred_reading>` 标签**:命令 .md 通常采用"入口 + workflow"形式,主体逻辑放在 workflow 文件中并通过 `<required_reading>`
|
|
41
|
-
- decision
|
|
42
|
-
- `command_path` 由 ralph 在 A_BUILD_STEPS 写入 status.json
|
|
43
|
-
- external 仅在 `step.type == "external"` 显式声明时使用,并 always append `-y` 到 prompt args
|
|
38
|
+
- 执行 step:通过 `view_file({command_path})` 把命令 .md 加载进当前会话,再按内容执行
|
|
39
|
+
- **必须遵循 `<required_reading>` / `<deferred_reading>` 标签**:命令 .md 通常采用"入口 + workflow"形式,主体逻辑放在 workflow 文件中并通过 `<required_reading>` 引用;缺失 required_reading 视为加载失败
|
|
40
|
+
- decision step:A_EXEC_DECISION 通过 `view_file(AbsolutePath="<agy-skills-dir>/maestro-ralph/SKILL.md") + execute inline` handoff 给 ralph 评估
|
|
41
|
+
- `command_path` 由 ralph 在 A_BUILD_STEPS 写入 status.json(缺失 → 报错 E002)
|
|
44
42
|
- 每个 step 必须产出 `--- COMPLETION STATUS ---` 块,否则视为 NEEDS_RETRY
|
|
45
43
|
</context>
|
|
46
44
|
|
|
47
45
|
<invariants>
|
|
48
|
-
1.
|
|
46
|
+
1. **执行 = Read + inline** — 通过 Read 读取 `step.command_path`,按其指令在当前 session 内执行
|
|
49
47
|
2. **Required reading must be loaded** — 命令 .md 中的 `<required_reading>` 引用的所有文件必须立即 Read;缺一 → 视为加载失败,pause session(E007)
|
|
50
48
|
3. **Deferred reading recorded only** — `<deferred_reading>` 列出的文件路径需记录,执行过程按需 Read;不在加载阶段读取
|
|
51
49
|
4. **Skill loaded confirmation** — 所有 required_reading 加载完成后必须输出一行确认:`✓ skill {step.skill} 加载完成 (required: N, deferred: M)`
|
|
52
|
-
5.
|
|
53
|
-
6.
|
|
54
|
-
7. **
|
|
55
|
-
8. **status.json 每步骤后写盘** — resume-safe
|
|
50
|
+
5. **必须显式 completion confirmation** — 每个 step 完成时需有 `STATUS: DONE` 且写入 `step.completion_confirmed = true`
|
|
51
|
+
6. **Self-invocation chain** — 持续直到全部 `completion_confirmed` 或 paused
|
|
52
|
+
7. **status.json 每步骤后写盘** — resume-safe
|
|
56
53
|
</invariants>
|
|
57
54
|
|
|
58
55
|
<state_machine>
|
|
@@ -78,11 +75,9 @@ S_RESOLVE_ARGS:
|
|
|
78
75
|
→ S_EXECUTE DO: A_RESOLVE_ARGS
|
|
79
76
|
|
|
80
77
|
S_EXECUTE:
|
|
81
|
-
→ END WHEN: step.
|
|
82
|
-
→ S_POST_EXEC WHEN: step.
|
|
83
|
-
→ S_HANDLE_FAIL WHEN: step.
|
|
84
|
-
→ END WHEN: step.type == "external" DO: A_EXEC_EXTERNAL
|
|
85
|
-
(STOP after background delegate; on callback → S_POST_EXEC or S_HANDLE_FAIL)
|
|
78
|
+
→ END WHEN: step.decision != null DO: A_EXEC_DECISION
|
|
79
|
+
→ S_POST_EXEC WHEN: step.decision == null + success DO: A_EXEC_STEP
|
|
80
|
+
→ S_HANDLE_FAIL WHEN: step.decision == null + failure DO: A_EXEC_STEP
|
|
86
81
|
|
|
87
82
|
S_POST_EXEC:
|
|
88
83
|
→ S_LOCATE DO: A_MARK_COMPLETE + Skill("maestro-ralph-execute")
|
|
@@ -151,16 +146,16 @@ Write enriched args back to status.json.
|
|
|
151
146
|
### A_EXEC_DECISION
|
|
152
147
|
|
|
153
148
|
1. Mark step running, write status.json
|
|
154
|
-
2. Display: `[{index}/{total}] ◆ {decision} Retry: {retry}/{max}`
|
|
149
|
+
2. Display: `[{index}/{total}] ◆ {step.decision} Retry: {retry}/{max}`
|
|
155
150
|
3. `view_file(AbsolutePath="<agy-skills-dir>/maestro-ralph/SKILL.md") + execute inline` — ralph 评估 + handoff
|
|
156
151
|
4. 执行在此结束
|
|
157
152
|
|
|
158
|
-
###
|
|
153
|
+
### A_EXEC_STEP
|
|
159
154
|
|
|
160
155
|
1. Validate `step.command_path != null`;否则 raise E002,pause session
|
|
161
156
|
2. Mark step running, write status.json
|
|
162
|
-
3. Display: `[{index}/{total}] {step.skill} [
|
|
163
|
-
4. `view_file({ file_path: step.command_path })` — 把命令 .md
|
|
157
|
+
3. Display: `[{index}/{total}] {step.skill} [{step.command_scope}]`
|
|
158
|
+
4. `view_file({ file_path: step.command_path })` — 把命令 .md 全文加载进当前会话
|
|
164
159
|
5. **解析 reading 标签**("入口 + workflow"形式核心步骤):
|
|
165
160
|
- 抽取 frontmatter `argument-hint` / `allowed-tools`
|
|
166
161
|
- 抽取 `<required_reading>` 块的所有 `@path` 引用 → 立刻 `view_file({ file_path: <expanded path> })` 加载(`~/` / `@~/` 展开为用户主目录);任一文件缺失或读取失败 → raise E007,pause session
|
|
@@ -171,30 +166,11 @@ Write enriched args back to status.json.
|
|
|
171
166
|
✓ skill {step.skill} 加载完成 (required: {N}, deferred: {M})
|
|
172
167
|
```
|
|
173
168
|
其中 N = required_reading 引用数,M = deferred_reading 路径数(缺省块按 0 计)
|
|
174
|
-
7. 计算 `effective_args`:`step.args` + auto
|
|
175
|
-
8.
|
|
169
|
+
7. 计算 `effective_args`:`step.args` + (`auto ? " -y" : ""`)
|
|
170
|
+
8. 按读到的指令在本会话中**内联执行**:调用允许的工具完成命令所规定的工作;执行过程中如触发 deferred_reading 引用的资源 → 按需 Read
|
|
176
171
|
9. 执行结束:要求最后一段必须包含 `--- COMPLETION STATUS ---` 块(见 A_MARK_COMPLETE)
|
|
177
172
|
10. Return success / failure
|
|
178
173
|
|
|
179
|
-
**Auto flag map**: 所有 lifecycle skill → `-y`; `quality-test` → `-y --auto-fix`; 未列出 → 无 flag
|
|
180
|
-
|
|
181
|
-
### A_EXEC_EXTERNAL
|
|
182
|
-
|
|
183
|
-
仅当 `step.type == "external"` 时使用(默认链路不产生)。
|
|
184
|
-
|
|
185
|
-
1. Mark step running, write status.json
|
|
186
|
-
2. Display: `[{index}/{total}] ⚡ {step.skill} [external]`
|
|
187
|
-
3. 始终在 prompt 内追加 `-y`(delegate session 非交互):`flag = flag_map[step.skill] || "-y"`
|
|
188
|
-
4. Execute:
|
|
189
|
-
```
|
|
190
|
-
run_command({
|
|
191
|
-
command: `maestro delegate "/${step.skill} ${effective_args}" --to claude --mode write`,
|
|
192
|
-
run_in_background: true, timeout: 600000
|
|
193
|
-
})
|
|
194
|
-
STOP — wait for callback.
|
|
195
|
-
```
|
|
196
|
-
5. On callback: 把回调输出视为 step 的执行结果 → S_POST_EXEC / S_HANDLE_FAIL
|
|
197
|
-
|
|
198
174
|
### A_MARK_COMPLETE
|
|
199
175
|
|
|
200
176
|
1. 从 step 输出中提取 `--- COMPLETION STATUS ---` 块(required)
|
|
@@ -238,14 +214,14 @@ Write enriched args back to status.json.
|
|
|
238
214
|
Session: {session_id} [{source}]
|
|
239
215
|
Steps: {completed}/{total} confirmed: {confirmed}/{completed}
|
|
240
216
|
|
|
241
|
-
[✓] 0. maestro-plan 1 [
|
|
242
|
-
[✓] 1. maestro-execute 1 [
|
|
243
|
-
[✓] 2. maestro-verify 1 [
|
|
217
|
+
[✓] 0. maestro-plan 1 [global]
|
|
218
|
+
[✓] 1. maestro-execute 1 [project]
|
|
219
|
+
[✓] 2. maestro-verify 1 [global]
|
|
244
220
|
[✓] 3. ◆ post-verify [decision]
|
|
245
221
|
...
|
|
246
222
|
============================================================
|
|
247
223
|
```
|
|
248
|
-
Icons: `✓` confirmed, `—` skipped, `✗` failed, `◆` decision
|
|
224
|
+
Icons: `✓` confirmed, `—` skipped, `✗` failed, `◆` decision
|
|
249
225
|
|
|
250
226
|
</actions>
|
|
251
227
|
|
|
@@ -258,9 +234,8 @@ Write enriched args back to status.json.
|
|
|
258
234
|
| Code | Severity | Description | Recovery |
|
|
259
235
|
|------|----------|-------------|----------|
|
|
260
236
|
| E001 | error | No running session found | Suggest /maestro or /maestro-ralph |
|
|
261
|
-
| E002 | error | step.command_path missing for
|
|
237
|
+
| E002 | error | step.command_path missing for 执行 step | Pause, ask ralph to rebuild step |
|
|
262
238
|
| E003 | error | status.json corrupt | Show path, manual check |
|
|
263
|
-
| E004 | error | Delegate failed + user abort | Mark paused, suggest resume |
|
|
264
239
|
| E005 | error | COMPLETION STATUS block missing | Trigger NEEDS_RETRY |
|
|
265
240
|
| E007 | error | required_reading file 缺失或读取失败 | List missing paths, pause session |
|
|
266
241
|
| W001 | warning | Step completed with concerns | Log and continue |
|
|
@@ -269,14 +244,13 @@ Write enriched args back to status.json.
|
|
|
269
244
|
### Success Criteria
|
|
270
245
|
|
|
271
246
|
- [ ] Session discovery covers maestro-* and ralph-*
|
|
272
|
-
- [ ] `-y` parsed from args 或 session.auto_mode
|
|
247
|
+
- [ ] `-y` parsed from args 或 session.auto_mode;auto=true 时透传 `-y` 到 skill args
|
|
273
248
|
- [ ] Placeholders resolved;per-skill enrichment 正确
|
|
274
|
-
- [ ] Decision
|
|
275
|
-
- [ ]
|
|
276
|
-
- [ ]
|
|
249
|
+
- [ ] Decision 节点(`step.decision != null`)Skill("maestro-ralph") handoff
|
|
250
|
+
- [ ] 执行 step 通过 view_file({step.command_path}) 内联执行
|
|
251
|
+
- [ ] 执行 step Read 后必须解析并加载 `<required_reading>` 引用的文件;缺失 → E007 pause
|
|
277
252
|
- [ ] `<deferred_reading>` 仅记录路径到 `step.deferred_reads`,执行阶段按需 Read
|
|
278
253
|
- [ ] required_reading 加载完成后输出 `✓ skill {name} 加载完成 (required: N, deferred: M)`
|
|
279
|
-
- [ ] External 仅在显式声明时走 delegate,prompt 必带 `-y`
|
|
280
254
|
- [ ] 每个 step 强制 `--- COMPLETION STATUS ---`;缺失 → NEEDS_RETRY
|
|
281
255
|
- [ ] step.completion_confirmed = true 仅在 STATUS: DONE/DONE_WITH_CONCERNS 时设置
|
|
282
256
|
- [ ] step.completion_evidence 记录 artifact path / 输出节选
|
|
@@ -29,32 +29,29 @@ Remaining → session_id (if matches maestro-* or ralph-*)
|
|
|
29
29
|
```
|
|
30
30
|
Also read `session.auto_mode` from status.json — if true, treat as `-y`.
|
|
31
31
|
|
|
32
|
-
**
|
|
32
|
+
**Step kinds:**
|
|
33
33
|
|
|
34
|
-
|
|
|
35
|
-
|
|
36
|
-
| decision
|
|
37
|
-
|
|
|
38
|
-
| external (opt-in) | `maestro delegate --to claude --mode write` (STOP → callback) | Self-invoke next |
|
|
34
|
+
| Kind | Identifier | Execution | Flow after |
|
|
35
|
+
|------|-----------|-----------|------------|
|
|
36
|
+
| decision step | `step.decision` 非空 | `Skill("maestro-ralph")` | Execution ends here |
|
|
37
|
+
| 执行 step | `step.decision == null` | `Read({file_path: step.command_path})` + 内联解释执行 | Self-invoke next |
|
|
39
38
|
|
|
40
39
|
HARD RULES:
|
|
41
|
-
-
|
|
42
|
-
- **必须遵循 `<required_reading>` / `<deferred_reading>` 标签**:命令 .md 通常采用"入口 + workflow"形式,主体逻辑放在 workflow 文件中并通过 `<required_reading>`
|
|
43
|
-
- decision
|
|
44
|
-
- `command_path` 由 ralph 在 A_BUILD_STEPS 写入 status.json
|
|
45
|
-
- external 仅在 `step.type == "external"` 显式声明时使用,并 always append `-y` 到 prompt args
|
|
40
|
+
- 执行 step:通过 `Read({command_path})` 把命令 .md 加载进当前会话,再按内容执行
|
|
41
|
+
- **必须遵循 `<required_reading>` / `<deferred_reading>` 标签**:命令 .md 通常采用"入口 + workflow"形式,主体逻辑放在 workflow 文件中并通过 `<required_reading>` 引用;缺失 required_reading 视为加载失败
|
|
42
|
+
- decision step:A_EXEC_DECISION 通过 `Skill({ skill: "maestro-ralph" })` handoff 给 ralph 评估
|
|
43
|
+
- `command_path` 由 ralph 在 A_BUILD_STEPS 写入 status.json(缺失 → 报错 E002)
|
|
46
44
|
- 每个 step 必须产出 `--- COMPLETION STATUS ---` 块,否则视为 NEEDS_RETRY
|
|
47
45
|
</context>
|
|
48
46
|
|
|
49
47
|
<invariants>
|
|
50
|
-
1.
|
|
48
|
+
1. **执行 = Read + inline** — 通过 Read 读取 `step.command_path`,按其指令在当前 session 内执行
|
|
51
49
|
2. **Required reading must be loaded** — 命令 .md 中的 `<required_reading>` 引用的所有文件必须立即 Read;缺一 → 视为加载失败,pause session(E007)
|
|
52
50
|
3. **Deferred reading recorded only** — `<deferred_reading>` 列出的文件路径需记录,执行过程按需 Read;不在加载阶段读取
|
|
53
51
|
4. **Skill loaded confirmation** — 所有 required_reading 加载完成后必须输出一行确认:`✓ skill {step.skill} 加载完成 (required: N, deferred: M)`
|
|
54
|
-
5.
|
|
55
|
-
6.
|
|
56
|
-
7. **
|
|
57
|
-
8. **status.json 每步骤后写盘** — resume-safe
|
|
52
|
+
5. **必须显式 completion confirmation** — 每个 step 完成时需有 `STATUS: DONE` 且写入 `step.completion_confirmed = true`
|
|
53
|
+
6. **Self-invocation chain** — 持续直到全部 `completion_confirmed` 或 paused
|
|
54
|
+
7. **status.json 每步骤后写盘** — resume-safe
|
|
58
55
|
</invariants>
|
|
59
56
|
|
|
60
57
|
<state_machine>
|
|
@@ -80,11 +77,9 @@ S_RESOLVE_ARGS:
|
|
|
80
77
|
→ S_EXECUTE DO: A_RESOLVE_ARGS
|
|
81
78
|
|
|
82
79
|
S_EXECUTE:
|
|
83
|
-
→ END WHEN: step.
|
|
84
|
-
→ S_POST_EXEC WHEN: step.
|
|
85
|
-
→ S_HANDLE_FAIL WHEN: step.
|
|
86
|
-
→ END WHEN: step.type == "external" DO: A_EXEC_EXTERNAL
|
|
87
|
-
(STOP after background delegate; on callback → S_POST_EXEC or S_HANDLE_FAIL)
|
|
80
|
+
→ END WHEN: step.decision != null DO: A_EXEC_DECISION
|
|
81
|
+
→ S_POST_EXEC WHEN: step.decision == null + success DO: A_EXEC_STEP
|
|
82
|
+
→ S_HANDLE_FAIL WHEN: step.decision == null + failure DO: A_EXEC_STEP
|
|
88
83
|
|
|
89
84
|
S_POST_EXEC:
|
|
90
85
|
→ S_LOCATE DO: A_MARK_COMPLETE + Skill("maestro-ralph-execute")
|
|
@@ -153,16 +148,16 @@ Write enriched args back to status.json.
|
|
|
153
148
|
### A_EXEC_DECISION
|
|
154
149
|
|
|
155
150
|
1. Mark step running, write status.json
|
|
156
|
-
2. Display: `[{index}/{total}] ◆ {decision} Retry: {retry}/{max}`
|
|
151
|
+
2. Display: `[{index}/{total}] ◆ {step.decision} Retry: {retry}/{max}`
|
|
157
152
|
3. `Skill({ skill: "maestro-ralph" })` — ralph 评估 + handoff
|
|
158
153
|
4. 执行在此结束
|
|
159
154
|
|
|
160
|
-
###
|
|
155
|
+
### A_EXEC_STEP
|
|
161
156
|
|
|
162
157
|
1. Validate `step.command_path != null`;否则 raise E002,pause session
|
|
163
158
|
2. Mark step running, write status.json
|
|
164
|
-
3. Display: `[{index}/{total}] {step.skill} [
|
|
165
|
-
4. `Read({ file_path: step.command_path })` — 把命令 .md
|
|
159
|
+
3. Display: `[{index}/{total}] {step.skill} [{step.command_scope}]`
|
|
160
|
+
4. `Read({ file_path: step.command_path })` — 把命令 .md 全文加载进当前会话
|
|
166
161
|
5. **解析 reading 标签**("入口 + workflow"形式核心步骤):
|
|
167
162
|
- 抽取 frontmatter `argument-hint` / `allowed-tools`
|
|
168
163
|
- 抽取 `<required_reading>` 块的所有 `@path` 引用 → 立刻 `Read({ file_path: <expanded path> })` 加载(`~/` / `@~/` 展开为用户主目录);任一文件缺失或读取失败 → raise E007,pause session
|
|
@@ -173,30 +168,11 @@ Write enriched args back to status.json.
|
|
|
173
168
|
✓ skill {step.skill} 加载完成 (required: {N}, deferred: {M})
|
|
174
169
|
```
|
|
175
170
|
其中 N = required_reading 引用数,M = deferred_reading 路径数(缺省块按 0 计)
|
|
176
|
-
7. 计算 `effective_args`:`step.args` + auto
|
|
177
|
-
8.
|
|
171
|
+
7. 计算 `effective_args`:`step.args` + (`auto ? " -y" : ""`)
|
|
172
|
+
8. 按读到的指令在本会话中**内联执行**:调用允许的工具完成命令所规定的工作;执行过程中如触发 deferred_reading 引用的资源 → 按需 Read
|
|
178
173
|
9. 执行结束:要求最后一段必须包含 `--- COMPLETION STATUS ---` 块(见 A_MARK_COMPLETE)
|
|
179
174
|
10. Return success / failure
|
|
180
175
|
|
|
181
|
-
**Auto flag map**: 所有 lifecycle skill → `-y`; `quality-test` → `-y --auto-fix`; 未列出 → 无 flag
|
|
182
|
-
|
|
183
|
-
### A_EXEC_EXTERNAL
|
|
184
|
-
|
|
185
|
-
仅当 `step.type == "external"` 时使用(默认链路不产生)。
|
|
186
|
-
|
|
187
|
-
1. Mark step running, write status.json
|
|
188
|
-
2. Display: `[{index}/{total}] ⚡ {step.skill} [external]`
|
|
189
|
-
3. 始终在 prompt 内追加 `-y`(delegate session 非交互):`flag = flag_map[step.skill] || "-y"`
|
|
190
|
-
4. Execute:
|
|
191
|
-
```
|
|
192
|
-
Bash({
|
|
193
|
-
command: `maestro delegate "/${step.skill} ${effective_args}" --to claude --mode write`,
|
|
194
|
-
run_in_background: true, timeout: 600000
|
|
195
|
-
})
|
|
196
|
-
STOP — wait for callback.
|
|
197
|
-
```
|
|
198
|
-
5. On callback: 把回调输出视为 step 的执行结果 → S_POST_EXEC / S_HANDLE_FAIL
|
|
199
|
-
|
|
200
176
|
### A_MARK_COMPLETE
|
|
201
177
|
|
|
202
178
|
1. 从 step 输出中提取 `--- COMPLETION STATUS ---` 块(required)
|
|
@@ -240,14 +216,14 @@ Write enriched args back to status.json.
|
|
|
240
216
|
Session: {session_id} [{source}]
|
|
241
217
|
Steps: {completed}/{total} confirmed: {confirmed}/{completed}
|
|
242
218
|
|
|
243
|
-
[✓] 0. maestro-plan 1 [
|
|
244
|
-
[✓] 1. maestro-execute 1 [
|
|
245
|
-
[✓] 2. maestro-verify 1 [
|
|
219
|
+
[✓] 0. maestro-plan 1 [global]
|
|
220
|
+
[✓] 1. maestro-execute 1 [project]
|
|
221
|
+
[✓] 2. maestro-verify 1 [global]
|
|
246
222
|
[✓] 3. ◆ post-verify [decision]
|
|
247
223
|
...
|
|
248
224
|
============================================================
|
|
249
225
|
```
|
|
250
|
-
Icons: `✓` confirmed, `—` skipped, `✗` failed, `◆` decision
|
|
226
|
+
Icons: `✓` confirmed, `—` skipped, `✗` failed, `◆` decision
|
|
251
227
|
|
|
252
228
|
</actions>
|
|
253
229
|
|
|
@@ -260,9 +236,8 @@ Write enriched args back to status.json.
|
|
|
260
236
|
| Code | Severity | Description | Recovery |
|
|
261
237
|
|------|----------|-------------|----------|
|
|
262
238
|
| E001 | error | No running session found | Suggest /maestro or /maestro-ralph |
|
|
263
|
-
| E002 | error | step.command_path missing for
|
|
239
|
+
| E002 | error | step.command_path missing for 执行 step | Pause, ask ralph to rebuild step |
|
|
264
240
|
| E003 | error | status.json corrupt | Show path, manual check |
|
|
265
|
-
| E004 | error | Delegate failed + user abort | Mark paused, suggest resume |
|
|
266
241
|
| E005 | error | COMPLETION STATUS block missing | Trigger NEEDS_RETRY |
|
|
267
242
|
| E007 | error | required_reading file 缺失或读取失败 | List missing paths, pause session |
|
|
268
243
|
| W001 | warning | Step completed with concerns | Log and continue |
|
|
@@ -271,14 +246,13 @@ Write enriched args back to status.json.
|
|
|
271
246
|
### Success Criteria
|
|
272
247
|
|
|
273
248
|
- [ ] Session discovery covers maestro-* and ralph-*
|
|
274
|
-
- [ ] `-y` parsed from args 或 session.auto_mode
|
|
249
|
+
- [ ] `-y` parsed from args 或 session.auto_mode;auto=true 时透传 `-y` 到 skill args
|
|
275
250
|
- [ ] Placeholders resolved;per-skill enrichment 正确
|
|
276
|
-
- [ ] Decision
|
|
277
|
-
- [ ]
|
|
278
|
-
- [ ]
|
|
251
|
+
- [ ] Decision 节点(`step.decision != null`)Skill("maestro-ralph") handoff
|
|
252
|
+
- [ ] 执行 step 通过 Read({step.command_path}) 内联执行
|
|
253
|
+
- [ ] 执行 step Read 后必须解析并加载 `<required_reading>` 引用的文件;缺失 → E007 pause
|
|
279
254
|
- [ ] `<deferred_reading>` 仅记录路径到 `step.deferred_reads`,执行阶段按需 Read
|
|
280
255
|
- [ ] required_reading 加载完成后输出 `✓ skill {name} 加载完成 (required: N, deferred: M)`
|
|
281
|
-
- [ ] External 仅在显式声明时走 delegate,prompt 必带 `-y`
|
|
282
256
|
- [ ] 每个 step 强制 `--- COMPLETION STATUS ---`;缺失 → NEEDS_RETRY
|
|
283
257
|
- [ ] step.completion_confirmed = true 仅在 STATUS: DONE/DONE_WITH_CONCERNS 时设置
|
|
284
258
|
- [ ] step.completion_evidence 记录 artifact path / 输出节选
|