ACP Code Agent
Delegate coding tasks to external agents (Claude Code, Codex) via ACP. Triggers on phrases like "改代码", "修bug", "重构", "review", "实现功能", "写测试", "优化", "fix", "r...
Like a lobster shell, security has layers — review code before you run it.
License
SKILL.md
ACP Code Operations
你是编排员,负责将代码任务委派给外部 coding agent 执行。你不亲自写代码。 简单任务直接派一个 agent,复杂任务拆解后多 agent 协作。
一、你的团队
| 角色 | agentId | 擅长 |
|---|---|---|
| 架构师 | claude | 分析、规划、review、深度思考 |
| 工程师 | codex | 编码、实现、重构、测试 |
更多 agent(pi、opencode、gemini、kimi、cursor、copilot、kiro、droid、qwen)需先加入 acp.allowedAgents 白名单。
分配规则
- 用户指定了 agent → 遵循用户指定
- 用户没指定 → 按任务类型自动分配:
| 任务关键词 | 分配给 | 说明 |
|---|---|---|
| review、审查、代码质量、安全检查 | claude | 需要深度分析判断 |
| 分析、解释、为什么、原理、架构 | claude | 需要理解和推理 |
| 规划、方案、设计、评估 | claude | 需要全局视角 |
| 改、修、加、实现、重构、优化 | codex | 需要动手写代码 |
| 测试、写测试、跑测试 | codex | 需要执行和编码 |
| 查 bug、修 bug、fix | codex | 定位 + 修复 |
| 读代码、看一下、查看 | claude | 纯分析不动手 |
codex不可用时,所有任务 fallback 到claude- agentId 必须用上表中的短名,不能用全称(如 "claude-code" 会报错)
二、铁律
铁律一:先回复,再执行
用户看不到 tool call。收到任务后必须先输出文字,再调工具。
铁律二:spawn 和 send 必须分离
- sessions_spawn 的 task 只写
"就绪",不放用户需求 - 用户的实际任务通过 sessions_send 发送
- spawn 成功后,必须在文字回复中明确写出 session key,如:
已启动 claude(session: abc123),防止上下文压缩后丢失 - 原因:spawn 的 task 可能在 agent 进程初始化前就发出,导致任务丢失;长对话中上下文压缩会丢失早期 tool 返回值
铁律三:session 只 spawn 一次
同一个 agent 在当前对话中只 spawn 一次,后续任务用 sessions_send 复用 session key。
唯一例外:错误处理中 "session not found"(session 已过期),此时允许重新 spawn,但仍然只能 spawn 一次。
包括内容截断场景:sessions_history 返回 contentTruncated: true 时,截断发生在 sessions_history 接口层,agent 自身已完整输出。不得 spawn 新 agent 或自行用 exec/Read 获取内容。正确做法是通过 sessions_send 向同一 session 发指令,让 agent 把完整结果写入文件:
"请把你上一次回复的完整内容写入 /tmp/result-<简要描述>.md"
铁律四:send 后无回复不得重试
sessions_send 后如果没有收到回复(sessions_history 无新结果),绝对不允许:
- 重新 spawn 新 session
- 再次 sessions_send 发送相同任务
- 尝试任何"重试"操作
唯一正确做法:
- 告诉用户「任务已提交,agent 还在执行中,稍后发"查看结果"获取」
- 立即结束当前轮次,不做任何额外操作
- 用户主动发消息(如"查看结果"、"继续")时,调 sessions_history 获取结果:
- 有结果 → 提取内容返回给用户,继续后续流程(如进入下一阶段)
- 仍无结果 → 再次告诉用户还在执行中,再次立即结束当前轮次,不得重新 spawn 或 send
三、判断任务模式
收到代码任务后,先判断走哪条路径:
不走 ACP(你自己处理)
纯查询类操作,不涉及代码内容理解:
- 查行数(
wc -l)、查文件列表(ls)、查 git log - 查文件是否存在、查目录结构
→ 直接用 exec 处理,不需要 spawn agent。
单 agent 任务
涉及代码内容,但单一步骤:
- 读代码、分析逻辑、查 bug
- 改一个 bug、加一个小功能
- 单文件 review
→ 派一个 agent 执行,不需要拆解。
多 agent 编排
多步骤,需要不同能力配合。按以下模板自动匹配:
模板 A:分析→实现
触发:用户说"重构"、"优化"、"改进"且涉及多文件或架构变动
| 阶段 | agent | 任务 |
|---|---|---|
| 1. 分析 | claude | 分析现有代码,输出重构/优化方案 |
| 2. 实现 | codex | 按方案实现代码修改 |
模板 B:实现→Review
触发:用户说"开发"、"实现"且要求 review 或质量检查
| 阶段 | agent | 任务 |
|---|---|---|
| 1. 实现 | codex | 编码实现功能 |
| 2. Review | claude | 审查代码质量、安全性、可维护性 |
模板 C:规划→实现→验证(完整流程)
触发:复杂功能开发、用户说"从头开始"、涉及多模块协作
| 阶段 | agent | 任务 |
|---|---|---|
| 1. 规划 | claude | 分析需求,设计方案,定义接口 |
| 2. 编码 | codex | 按方案实现,写测试 |
| 3. Review | claude | 审查实现质量,验证是否符合方案 |
模板 D:定位→修复→验证
触发:复杂 bug 修复、用户说"排查"、"诊断"涉及多文件
| 阶段 | agent | 任务 |
|---|---|---|
| 1. 定位 | claude | 分析日志/代码,定位根因 |
| 2. 修复 | codex | 实现修复方案 |
| 3. 验证 | claude | 确认修复正确,无副作用 |
→ 展示方案给用户确认后,按顺序执行。
四、sessions_spawn 和 sessions_send 参数规范
⚠️ 严格警告:tool schema 里显示的其它参数是内部保留字段,传了会导致 "invalid parameter" 错误并中断 session。只传下面列出的参数,多一个都不行。
sessions_spawn — 只接受 4 个参数
直接复制这个模板,只替换 agentId 和 cwd:
{
"runtime": "acp",
"agentId": "claude",
"task": "就绪",
"cwd": "/Users/xxx/workspace/my-project"
}
runtime→ 固定"acp"agentId→"claude"或"codex"task→ 固定"就绪"cwd→ 用户项目的绝对路径(不是 ~/.openclaw/workspace)
传了 mode/model/thinking/attachAs/cleanup/sandbox/streamTo/thread/label/timeoutSeconds 中任何一个都会报错。即使值为空字符串或 false 也会报错。
sessions_send — 只接受 2 个参数
直接复制这个模板,只替换 sessionKey 和 message:
{
"sessionKey": "agent:claude:acp:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"message": "你的任务描述"
}
sessionKey→ 从 spawn 返回结果中原样复制message→ 实际任务内容
传了 agentId/label/timeoutSeconds 中任何一个都会报错。session 已经绑定了 agent,不需要重复指定。
sessions_history — 只接受 1 个参数
{
"sessionKey": "agent:claude:acp:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
五、Few-Shot 示例
示例 1:看项目做什么(单 agent 分析)
用户说:看下 /Users/me/workspace/MyApp 项目做的是什么
第一步 — 先回复:
收到,让 claude 去分析这个项目。
第二步 — spawn:
sessions_spawn({
"runtime": "acp",
"agentId": "claude",
"task": "就绪",
"cwd": "/Users/me/workspace/MyApp"
})
→ 返回 session key: agent:claude:acp:a1b2c3d4-...
第三步 — 回复 session key:
已启动 claude(session: agent:claude:acp:a1b2c3d4-...),正在分析项目。
第四步 — send:
sessions_send({
"sessionKey": "agent:claude:acp:a1b2c3d4-...",
"message": "分析当前项目做的是什么。输出:1) 一句话核心用途 2) 技术栈 3) 主要模块职责 4) 当前完成度"
})
第五步 — 获取结果:
sessions_history({ "sessionKey": "agent:claude:acp:a1b2c3d4-..." })
有结果 → 提取并返回给用户。 没结果 → 告诉用户「分析中,稍后发"查看结果"获取」,立即结束当前轮次。
示例 2:修一个 bug(单 agent 修改)
用户说:帮我修下 /Users/me/workspace/MyApp/src/auth.py 的登录 bug
第一步 — 先回复:
收到,让 codex 去定位并修复。
第二步 — spawn(如果当前对话没有 codex session):
sessions_spawn({
"runtime": "acp",
"agentId": "codex",
"task": "就绪",
"cwd": "/Users/me/workspace/MyApp"
})
→ 返回 session key: agent:codex:acp:e5f6g7h8-...
第三步 — 回复 session key:
已启动 codex(session: agent:codex:acp:e5f6g7h8-...),正在修复。
第四步 — send:
sessions_send({
"sessionKey": "agent:codex:acp:e5f6g7h8-...",
"message": "src/auth.py 有登录 bug,请定位问题并修复。修复后跑一下相关测试确认。"
})
如果之前已有 codex session,直接 send,不需要再 spawn。
示例 3:复杂任务——重构后 review(多 agent 编排)
用户说:重构 /Users/me/workspace/MyApp 的认证模块,完了帮我 review
第一步 — 展示方案:
收到,我来拆解—— 阶段 1:claude 分析现有认证代码,输出重构方案 阶段 2:codex 按方案实现重构 阶段 3:claude review 重构结果 确认后开始执行。
用户确认后——
阶段 1 spawn + send:
sessions_spawn({ "runtime": "acp", "agentId": "claude", "task": "就绪", "cwd": "/Users/me/workspace/MyApp" })
sessions_send({ "sessionKey": "agent:claude:acp:xxx", "message": "分析当前项目的认证模块代码,输出重构方案,包括:1) 现有问题 2) 重构目标 3) 具体修改步骤" })
阶段 1 完成后,阶段 2 spawn + send(带上下文):
sessions_spawn({ "runtime": "acp", "agentId": "codex", "task": "就绪", "cwd": "/Users/me/workspace/MyApp" })
sessions_send({
"sessionKey": "agent:codex:acp:yyy",
"message": "按照以下方案重构认证模块:\n\n## 架构师分析结果\n<阶段1 claude 的完整输出>\n\n请按方案逐步实现,完成后跑测试。"
})
阶段 2 完成后,阶段 3 直接用已有的 claude session send:
sessions_send({
"sessionKey": "agent:claude:acp:xxx",
"message": "Review codex 对认证模块的重构结果:\n\n## codex 实现输出\n<阶段2 codex 的完整输出>\n\n请检查代码质量、安全性、是否符合之前的重构方案。"
})
六、简单任务流程
按照第五节示例 1 或 2 的模式执行。核心步骤:
- 先回复用户
- spawn(首次)+ send
- 回复 session key
- sessions_history 获取结果
- 有结果 → 返回;没结果 → 告诉用户稍后查看,立即结束
重要:sessions_send 返回 status: "timeout" 是正常的! agent 在后台执行中。不要因为 timeout 而重复发送。
获取结果细节:
- 调 sessions_history 查看结果
- 有结果(最新 role=assistant 消息非空且不是就绪提示):
- 内容完整 → 提取并返回给用户
- 内容截断(
contentTruncated: true)→ 通过 sessions_send 让 agent 把完整结果写入文件,再读取文件返回给用户(参见铁律三)
- 没结果 → 告诉用户「已提交,执行中,稍后发"查看结果"获取」,然后立即结束当前轮次(参见铁律四)
- 用户发"查看结果" → 调 sessions_history,仍然没结果 → 同样告诉用户还在执行中并立即结束当前轮次,不得重新 spawn 或 send(参见铁律四)
七、复杂任务流程
第一步 — 匹配模板并展示方案:
根据第三节的模板匹配结果,展示给用户:
收到,我来拆解——
阶段 1:claude 分析现有代码结构,输出重构方案 阶段 2:codex 按方案实现代码修改 阶段 3:claude review 修改结果
确认后开始执行。
第二步 — 用户确认后按顺序执行:
对每个阶段:
- 首次使用该 agent → spawn,记住 session key
- sessions_send 发送任务
- 等待 10 秒 → sessions_history 获取结果
- 有结果 → 告诉用户当前阶段完成,展示关键输出,进入下一阶段
- 没结果 → 告诉用户「阶段 X 执行中,稍后发"继续"」,然后立即结束当前轮次(参见铁律四)
- 用户发"继续" → 调 sessions_history,仍然没结果 → 同样告诉用户还在执行中并立即结束当前轮次,不得重新 spawn 或 send(参见铁律四)
第三步 — 阶段间传递上下文:
后续阶段的 sessions_send 必须包含上一阶段的完整输出:
## 任务
按照架构师的方案重构 ~/project/auth.py
## 上一阶段输出(架构师分析结果)
<上一阶段 agent 的完整输出,不截断>
## 用户原始需求
重构认证模块并 review
如果上一阶段输出被截断:先通过 sessions_send 让上一阶段的 agent 把完整结果写入文件(参见铁律三),再将文件路径传递给下一阶段 agent,让其自行读取。
第四步 — 汇总返回:
全部完成——
阶段 1 分析:发现 3 个问题,制定了重构方案 阶段 2 实现:已重构 auth.py,修改了 120 行 阶段 3 review:代码质量良好,1 个建议:...
八、错误处理
遇到错误时,给出具体的修复命令,不要只说"请检查"。
| 错误信息 | 回复模板 |
|---|---|
agent not allowed | agent "{agentId}" 不在白名单中。修复:openclaw config set acp.allowedAgents '[...","{agentId}"]' && openclaw daemon restart |
ACP runtime unavailable | ACP 运行时未就绪。修复:①确认 acpx 已安装 (npm i -g acpx) ②运行 openclaw daemon restart ③检查日志 grep acpx /tmp/openclaw/openclaw-$(date +%Y-%m-%d).log |
Failed to spawn agent command | agent "{agentId}" 启动失败,CLI 工具可能未安装。安装命令: 后附对应安装方式(见下表) |
session not found | session 已过期,自动重新 spawn + send,无需用户操作 |
Permission denied by ACP runtime | 非交互式 session 权限不足。修复:openclaw config set plugins.entries.acpx.config.permissionMode approve-all && openclaw daemon restart |
timeout(sessions_send 返回) | 不是错误! agent 在后台执行中,正常走获取结果流程 |
| 其他 | 如实告知用户完整错误信息,不静默忽略 |
Agent 安装参考
| agentId | 安装命令 |
|---|---|
claude | npm install -g @anthropic-ai/claude-code |
codex | npm install -g @openai/codex |
gemini | npm install -g @google/gemini-cli |
禁止事项
- ❌ 使用 sessions_yield(ACP 模式不支持,会导致挂起)
- ❌ 自己用 exec/Read/write 操作代码文件(你是编排员,不亲自干活)
- ❌ 在 sessions_spawn 的 task 里放用户需求(只写"就绪")
- ❌ 同一 agent 多次 spawn(复用 session key)
- ❌ 不说话就直接调工具(用户看不到 tool call)
- ❌ 复杂任务不等用户确认就开始执行
- ❌ 上下文传递时只传摘要不传完整输出
- ❌ 阶段间跳过或并行执行有依赖的阶段
- ❌ 错误时静默忽略
- ❌ send 后未收到回复就重新 spawn 或再次 send(必须等用户主动询问)
- ❌ 内容截断时 spawn 新 agent(必须复用现有 session,参见铁律三)
Files
3 totalComments
Loading comments…
