From f3f991de2a4a44ed551754d6f43d0c141ba081d0 Mon Sep 17 00:00:00 2001 From: AirLongDian Date: Thu, 11 Jun 2026 15:04:13 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20spawn=5Fworkers=20skill=20=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E4=BF=AE=E6=AD=A3=20=E2=80=94=20airplan=20=E2=86=92?= =?UTF-8?q?=20airplan-v2:do?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit skill 目录名是 airplan-v2,不是 airplan。Claude Code 按目录名注册。 正确的 Skill 调用格式为 Skill("airplan-v2:do")。 同步更新: - eng_mode.py spawn_workers() 返回值 - commands/eng.md dispatch 操作步骤 - test_t_121_122.py 测试断言 - 设计文档 3.2.11b spawn_workers 伪代码 Co-Authored-By: Claude Opus 4.7 --- airplanV2-Qwen3.7-Max设计.md | 4 ++-- commands/eng.md | 4 ++-- lib/air_runtime/modes/eng_mode.py | 4 ++-- test_t_121_122.py | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/airplanV2-Qwen3.7-Max设计.md b/airplanV2-Qwen3.7-Max设计.md index 7aaceee..7802223 100644 --- a/airplanV2-Qwen3.7-Max设计.md +++ b/airplanV2-Qwen3.7-Max设计.md @@ -682,8 +682,8 @@ def spawn_workers(project_root: Path, task_ids: list[str]) -> list[dict]: node = graph.nodes.get(tid) task_text = node.task if node else "" instructions.append({ - "skill": "airplan", - "args": f"do --sub enter --task-id {tid} --task-text '{task_text}' --project .", + "skill": "airplan-v2:do", + "args": f"--sub enter --task-id {tid} --task-text '{task_text}' --project .", "taskId": tid, "taskText": task_text, }) diff --git a/commands/eng.md b/commands/eng.md index 87d72eb..05b1205 100644 --- a/commands/eng.md +++ b/commands/eng.md @@ -59,8 +59,8 @@ dispatch 返回 `{waveId, taskIds, dispatchPath}`。**然后按以下步骤操 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 ."` + - `skill`: `"airplan-v2:do"` + - `args`: `"--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 ` diff --git a/lib/air_runtime/modes/eng_mode.py b/lib/air_runtime/modes/eng_mode.py index 4c6a799..8d2b1cf 100644 --- a/lib/air_runtime/modes/eng_mode.py +++ b/lib/air_runtime/modes/eng_mode.py @@ -625,8 +625,8 @@ def spawn_workers(project_root: Path, task_ids: list[str]) -> list[dict]: node = graph.nodes.get(tid) task_text = node.task if node else "" instructions.append({ - "skill": "airplan", - "args": f"do --sub enter --task-id {tid} --task-text '{task_text}' --project .", + "skill": "airplan-v2:do", + "args": f"--sub enter --task-id {tid} --task-text '{task_text}' --project .", "taskId": tid, "taskText": task_text, }) diff --git a/test_t_121_122.py b/test_t_121_122.py index 1db5714..a640568 100644 --- a/test_t_121_122.py +++ b/test_t_121_122.py @@ -29,8 +29,8 @@ def test_spawn_workers(): instructions = spawn_workers(root, ["G-001", "G-002"]) assert len(instructions) == 2 - assert instructions[0]["skill"] == "airplan" - assert "do --sub enter --task-id G-001" in instructions[0]["args"] + assert instructions[0]["skill"] == "airplan-v2:do" + assert "--sub enter --task-id G-001" in instructions[0]["args"] assert "实现视频解码器" in instructions[0]["args"] assert instructions[1]["taskId"] == "G-002" @@ -151,8 +151,8 @@ def test_full_pipeline_e2e(): instructions = spawn_workers(root, dispatch["taskIds"]) assert len(instructions) >= 2 for inst in instructions: - assert inst["skill"] == "airplan" - assert "do --sub enter --task-id" in inst["args"] + assert inst["skill"] == "airplan-v2:do" + assert "--sub enter --task-id" in inst["args"] assert inst["taskText"] # 不能为空 print(f"4. spawn_workers: {len(instructions)} 个 Worker 指令准备完成") for inst in instructions: