Files
AirPlan-V2/commands/eng.md
AirLongDian dd4aa6b345 feat: T-1.21 + T-1.22 + P1-23 — 打通 dispatch→Worker→merge 全链路
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>
2026-06-11 14:58:04 +08:00

3.8 KiB
Raw Blame History

description, argument-hint, allowed-tools
description argument-hint allowed-tools
AirPlan eng - scheduler engine, dispatches isolated workers, never codes directly [run|status|plan|dispatch|monitor|merge|intervene] [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 (默认) — 一次完整调度步骤

python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub status

然后:

  • 无活跃波次 → 执行 dispatch 流程(见下方 dispatch 段)
  • 有活跃 Worker → 执行 monitor不要盲目重新派发
  • 就绪结果出现时merge through --sub merge --result <path>

status

python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub status

plan

python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub plan --todo AirPlan/todo.md

dispatch

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

python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub monitor

合并就绪结果,检测停滞 Worker更新 nextAction。

merge

python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub merge --result <result-json>

intervene

python "$HOME/plugins/airplan/scripts/airplan.py" --mode eng --project . --sub intervene

仅用于无法通过常规监控或重新派发解决的硬阻塞。

无人值守模式

  • 每 300 秒重新检查活跃 Worker
  • 当前波次收敛后自动派发下一波次
  • 仅在状态达到 completed 或用户决策阻塞时停止