Files
AirPlan-V2/commands/eng.md
AirLongDian cda601a73a fix: spawn_workers 返回 Agent 指令(非 Skill)+ run_in_background
根因:Skill 工具只加载指令到当前上下文,不会创建子 Agent。
      Agent 工具默认阻塞调用,Eng 派发后卡住无法进入 monitor。

修复:
- spawn_workers() 返回 Agent 调用参数:{description, subagent_type, prompt, run_in_background}
- run_in_background: true 确保 Eng 不被子 Worker 阻塞
- commands/eng.md 明确标注 Agent 工具 + run_in_background

派发模式:Eng → Agent(run_in_background:true) × N → monitor 轮询 → merge

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-11 15:24:30 +08:00

127 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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`,在同一条消息中并发调用 `Agent` 工具(**必须** `run_in_background: true`,否则 Eng 会被阻塞等待子 Agent 完成):
```
Agent(
description: "Do Worker: {tid}",
subagent_type: "general-purpose",
run_in_background: true,
prompt: """你是 AirDo Worker任务 ID: {tid}。
项目路径: {project_root}
## 任务
{task_text}
## 文件范围
{files}
## 完成标准
{done_when}
## 工作流程
1. 先运行 `python scripts/airplan.py --mode do --sub enter --task-id {tid} --task-text '{task_text}' --project .` 初始化
2. 读取项目文件,理解现有代码结构
3. 实现任务需求,修改/创建源代码文件
4. 完成后运行 `python scripts/airplan.py --mode do --sub finish --task-id {tid} --result <result_path>`
## 约束
- 只修改属于此任务的文件
- 完成后必须运行 finish 命令
- 遇到无法解决的问题时返回 blocked 状态
"""
)
```
3. 每个 `Agent` 创建**独立子 Agent**,上下文不继承 Eng 对话(满足 INV-2 `fork_context=false`
4. 所有 Worker spawn 完成后,进入 monitor 状态
5. Worker 完成后,对其 `result.json` 调用 `--sub merge --result <path>`
6. merge 后 `task-graph.json` 节点状态自动同步为 DONE不会被重复派发
**注意**
- 使用 `Agent` 工具,不是 `Skill` 工具——`Skill` 只加载指令到当前上下文,不创建子 Agent
- `Agent` 创建的每个子 Agent 拥有独立上下文,天然满足上下文隔离
- 多个 `Agent` 调用可以在同一条消息中并发发起
- prompt 中的 task-text/files/done_when 从 `task-graph.json` 获取
### 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 或用户决策阻塞时停止