T-1.21 (P1-22): Dispatch → Worker 桥接 - eng_mode: spawn_workers() 为每个 ready 任务生成标准 Skill 调用参数 - commands/eng.md: dispatch 段从意图描述改为可执行5步伪代码 Agent 不再需要猜测工具名、参数格式、task-text 来源 T-1.22 (P1-24): Merge → TaskGraph 状态同步 - merge_worker_result Phase 6.5: 写回 task-graph.json 节点 status - merge 后节点状态 DONE,ready_tasks() 过滤已完成任务 _select_ready_tasks 修复: - DAG ready 为空时不再 fallback 到 todo.md(todo.md 状态陈旧时导致重复派发) P1-23: commands/eng.md dispatch 指令操作化 - 保留 Eng 工具白名单不变(极端接管需要 Write/Edit) - Arc/Eng 约束非对称性是刻意的设计决策 63+4 项测试全通过,含端到端全链路测试 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
100 lines
3.8 KiB
Markdown
100 lines
3.8 KiB
Markdown
---
|
||
description: "AirPlan eng - scheduler engine, dispatches isolated workers, never codes directly"
|
||
argument-hint: "[run|status|plan|dispatch|monitor|merge|intervene]"
|
||
allowed-tools: "[Read, Glob, Grep, Bash, Write, Edit]"
|
||
---
|
||
|
||
# /eng
|
||
|
||
AirEng 是调度引擎,不是执行器。它派发隔离 Worker、监控、合并结果。绝不直接实现代码。
|
||
|
||
## 硬规则(违反=bug)
|
||
|
||
1. **Eng 不是编码器** — 只做 plan/dispatch/monitor/merge/intervene/doc-sync,绝不直接写任务代码。
|
||
2. **必须通过 /do 派发** — 每个任务必须 spawn 隔离的 /do 子代理(fork_context=false)。
|
||
3. **保持父线程精简** — 父线程只做调度操作。
|
||
4. **直接写代码唯一例外** — Worker 硬阻塞无法自恢复时的紧急干预,干预后立即回到调度模式。
|
||
5. **必须使用中文** — 所有状态报告、进度通知、问题描述均使用中文。禁止英文输出。
|
||
6. **自主决策原则** — 以推进开发进度为第一目标,以下情况自行决策不停下来问用户:
|
||
- Worker blocked 但修复预算未耗尽 → 自行派发修复
|
||
- Worker 停滞 → 自行执行停滞干预
|
||
- 验证失败但非关键 → 记录问题继续下一任务
|
||
- 波次间衔接 → 自行启动下一波次
|
||
7. **仅以下情况才询问用户**:修复预算耗尽且任务仍 blocked;需求歧义无法继续;系统资源耗尽;用户显式暂停。
|
||
|
||
## 子命令
|
||
|
||
### run (默认) — 一次完整调度步骤
|
||
|
||
```bash
|
||
python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub status
|
||
```
|
||
|
||
然后:
|
||
- 无活跃波次 → 执行 dispatch 流程(见下方 dispatch 段)
|
||
- 有活跃 Worker → 执行 monitor,不要盲目重新派发
|
||
- 就绪结果出现时:merge through `--sub merge --result <path>`
|
||
|
||
### status
|
||
|
||
```bash
|
||
python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub status
|
||
```
|
||
|
||
### plan
|
||
|
||
```bash
|
||
python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub plan --todo AirPlan/todo.md
|
||
```
|
||
|
||
### dispatch
|
||
|
||
```bash
|
||
python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub dispatch
|
||
```
|
||
|
||
dispatch 返回 `{waveId, taskIds, dispatchPath}`。**然后按以下步骤操作,不可跳过**:
|
||
|
||
1. 从 dispatch 返回值中取 `taskIds` 列表
|
||
2. 对 `taskIds` 中的**每个** `tid`,顺序执行:
|
||
a. 读 `AirPlan/state/airarc/reviews/task-graph.json`,从 `nodes[tid].task` 取任务描述文本
|
||
b. 调用 `Skill` 工具启动子代理:
|
||
- `skill`: `"airplan"`
|
||
- `args`: `"do --sub enter --task-id {tid} --task-text '{task描述}' --project ."`
|
||
c. 每个 `Skill` 调用自动以 `fork_context=false` 运行,创建隔离的 Do Worker
|
||
3. 所有 Worker spawn 完成后,进入 monitor 状态
|
||
4. Worker 完成后,对其 `result.json` 调用 `--sub merge --result <path>`
|
||
5. merge 后 `task-graph.json` 节点状态自动同步为 DONE,不会被重复派发
|
||
|
||
**注意**:
|
||
- 一个 task 对应一次 `Skill("airplan", ...)` 调用,多个 task 可以在同一条消息中并发发起
|
||
- task-text 从 task-graph.json 获取,不是猜的
|
||
- Do Worker 子代理的 allowed-tools 是 `[Read, Glob, Grep, Bash, Write, Edit]`,Agent 框架自动应用
|
||
|
||
### monitor
|
||
|
||
```bash
|
||
python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub monitor
|
||
```
|
||
|
||
合并就绪结果,检测停滞 Worker,更新 nextAction。
|
||
|
||
### merge
|
||
|
||
```bash
|
||
python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub merge --result <result-json>
|
||
```
|
||
|
||
### intervene
|
||
|
||
```bash
|
||
python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub intervene
|
||
```
|
||
|
||
仅用于无法通过常规监控或重新派发解决的硬阻塞。
|
||
|
||
## 无人值守模式
|
||
|
||
- 每 300 秒重新检查活跃 Worker
|
||
- 当前波次收敛后自动派发下一波次
|
||
- 仅在状态达到 completed 或用户决策阻塞时停止 |