让 Claw 写代码:exec、补丁与审批
💡 一句话总结:用 OpenClaw 写代码,建立「命令可执行、补丁可审、落地有人把关」的本地编码工作流 —— exec 跑命令、apply_patch 出补丁、审批策略守边界。
学完你能做什么
- 让 Claw 在你的工作区真正执行
npm test这类命令,并读懂失败原因。 - 让 Claw 用
apply_patch一次改多个文件、多段代码,产出结构化补丁。 - 配好
tools.exec.mode审批策略,高风险命令逐条确认后才执行。 - 需要时启用 Code Mode,让模型写小段 JavaScript 程序来搜索和调用工具。
为什么用 OpenClaw,而不是网页版 AI?
| 能力 | 网页版 AI | OpenClaw |
|---|---|---|
| 执行命令 | ❌ 只能给建议,你自己复制粘贴 | ✅ exec 在所选主机或沙箱文件系统允许范围内执行 |
| 多文件改动 | ❌ 一次贴一个文件,容易漏 | ✅ apply_patch 一个补丁串起增、改、移、删 |
| 安全把关 | ❌ 无本地策略可言 | ✅ policy + allowlist + 可选用户审批三层把关 |
| 自托管 | ❌ 代码要上传到别人的服务器 | ✅ Gateway 跑在本机,命令留在本地工作区 |
你现在的困境
- 每次让 AI 改代码,都是「贴代码 → 复制回编辑器 → 手动跑测试」,来回搬运。
- AI 给的改动散落在多段对话里,你不知道它到底改了哪几个文件。
- 想让 AI 直接跑命令,又怕它执行了不该执行的东西。
什么时候用这一招
- 修一个 bug 需要同时改源码、加测试、跑一遍验证。
- 重构涉及多个文件的移动或重命名。
- 你想让「跑命令」和「改文件」都发生在自己机器上,且每一步可审。
🎒 开始前的准备
- Gateway 已在本机运行,模型 provider 已接好(Node 24.16.0+ 或 26.1.0+)。
- 想清楚工作区边界:
exec在所选主机或沙箱文件系统允许的范围内执行,命令可以创建、编辑、删除文件。 - 定好审批尺度:OpenClaw 2.0 的审批绑定确切的请求、命令、会话与人,批的是「这一次这条命令」,不是给整个工具放行。
跟我做
第 1 步:用 exec 执行命令
为什么:先让 Claw 能跑命令,后面的改码、验证才有基础。
直接对 Claw 说:
在工作区执行 npm test,把失败的测试名和报错信息整理给我。你应该看到:前台命令完成后直接返回输出。只有当 exec 提示命令仍在运行并给出 sessionId 时,才用 process 接管——命令自己打印出来的 ID 只是普通输出,不是进程句柄。命令失败时,message 字段带简短诊断,与 aggregated 里的命令输出分开。
第 2 步:生成并应用补丁
为什么:结构化补丁比「拼字符串重写文件」集中、可审,一次能覆盖多个文件。
对 Claw 说:
用 apply_patch 修复刚才失败的测试:把 src/index.ts 里的 foo 从 1 改成 2,
并在 tests/foo.test.ts 里补一个断言。你应该看到:Claw 调用 apply_patch,它接受单个必填的 input 参数,补丁格式如下:
*** Begin Patch
*** Add File: path/to/file.txt
+line 1
+line 2
*** Update File: src/app.ts
@@
-old line
+new line
*** Update File: src/old-name.ts
*** Move to: src/new-name.ts
*** End of File
*** Delete File: obsolete.txt
*** End Patch对应的 JSON 调用形如:
{
"tool": "apply_patch",
"input": "*** Begin Patch\n*** Update File: src/index.ts\n@@\n-const foo = 1\n+const foo = 2\n*** End Patch"
}*** Move to: 写在对应 *** Update File: 头的下一行;*** End of File 标记该 hunk 一直延伸到文件末尾。补丁路径支持相对路径(相对工作区目录)与绝对路径。
💡 这就是 OpenClaw 的独有价值
apply_patch 是 exec 的子工具、默认启用。tools.exec.applyPatch.workspaceOnly 缺省为 false,设为 true 可把补丁限制在工作区内;还可用 tools.exec.applyPatch.allowModels 限定哪些模型能用它。注意:把 tools.exec.mode 设成 "full" 并不会解除这个工作区边界。
第 3 步:审批后再落地
为什么:命令真的要改你的机器了,这一步由人把关。
高风险命令执行前会走审批:exec 审批是 policy + allowlist +(可选)用户审批三层,命令只有三者都同意才运行。补丁写入不走这个审批面板,而是受工具策略、workspaceOnly 与会话权限模式约束(full 解除限制,guarded/workspace 收紧,read-only 直接不给这个工具)。
你应该看到:审批面板上选 Allow Once(或按 Command-Return)只授权这一次执行;Always Allow Here 仅在策略允许持久批准时出现,确认会存成绑定确切命令参数与批准时工作目录的持久允许规则。
第 4 步:配置审批策略
为什么:默认策略未必符合你的尺度,用配置字段把它定下来。
在配置里用 tools.exec.mode 定主策略:
| 值 | 行为 |
|---|---|
deny | 阻止 host exec |
allowlist | 只跑 allowlist 里的命令,不询问 |
ask | allowlist 策略 + 未命中时询问 |
auto | 命中直接跑;未命中的可 allow(一次)、deny(理由返回给 agent)或 ask(人工审批) |
full | 不走常规策略提示 |
配套字段:exec.ask(off/on-miss/always,默认 off)、askFallback(无 UI 可达或超时时的兜底,缺省 deny)、tools.exec.strictInlineEval(把 python -c、node -e 这类内联求值形式划为需审批)、tools.exec.commandHighlighting(仅影响审批面板高亮)。
你应该看到:改完配置后,有效策略取 tools.exec.* 与 approvals 默认值中较严格者——approvals 只收紧、不放宽配置推导出的策略。
第 5 步:需要时启用 Code Mode
为什么:工具一多,模型面对的 schema 也多;Code Mode 让它写小段 JavaScript 程序去搜索、描述并调用工具目录。
启用方式:tools.codeMode 缺省走 "auto" 档,只对标记为 Code Mode 优选的模型生效;在 Settings → Agents & Tools → Labs → Code Mode 选择全局设置,也可经 global / agent / model 三层激活覆盖。
你应该看到:启用后模型只看到 exec、wait 等少数工具,exec 接受 JSON { code } 载荷——注意这里的 command 是 code 的 JavaScript 别名,不是 shell 命令。
📋 魔法 Prompt
🔧 跑测试并修复
预期效果:Claw 先跑测试定位失败,再用补丁修复,全程不碰工作区之外的路径。
角色:本地编码助手
任务:在工作区跑 npm test,找出失败的测试,用 apply_patch 修复源码或测试
输入信息:
### 必填项 ###
【失败测试的报错信息】
### 选填项 ###
【不许改动的文件列表?】
输出规范:先给失败原因一句话,再给补丁内容,最后重跑测试并贴结果
约束条件:
✅ 只用 apply_patch 改文件
✅ 补丁路径保持在【工作区目录】内
❌ 不要用 exec 重写整个文件
❌ 不要改动工作区之外的任何路径🚀 重构移动
预期效果:一次补丁完成重命名与引用更新。
角色:重构助手
任务:把 src/old-name.ts 重命名为 src/new-name.ts,并更新所有引用
输入信息:
### 必填项 ###
【旧文件路径】【新文件路径】
### 选填项 ###
【需要同步更新的目录范围?】
输出规范:一个 apply_patch 补丁,用 Move to 完成重命名
约束条件:
✅ 重命名与引用更新放在同一个补丁里
✅ 改完跑一次构建验证
❌ 不要留下旧文件
❌ 不要改无关文件检查点 ✅
- 命令真的结束了吗?无头 node 主机上被系统信号终止的命令,结果里会带信号名;终止前打印过输出,不代表命令成功。
- 长任务要不要后台?Linux 上 Gateway 托管的后台命令可启用 durable execution,Gateway 重启后仍存活。
- 内存够不够?Linux 上 Gateway 托管的 exec 默认有内存上限:取主机内存四分之一(或 cgroup 约束)与 Gateway 自身驻留后剩余内存一半中的较小者,无需配置。
踩坑提醒
exec是可变的 shell 面:禁用write、edit、apply_patch并不会让exec变成只读。别用「关工具」兜底,该配沙箱就配沙箱。- 远程
host=node执行走同步system.run,不创建process会话;process被禁止时,本地 exec 同步执行,忽略yieldMs与background,durable execution 会被拒绝。 tools.fs.workspaceOnly与tools.exec.applyPatch.workspaceOnly各自独立包含apply_patch,清掉一个另一个可能还在生效。
本课小结
用 OpenClaw 写代码,这一课你打通了完整链路:exec 在本地工作区跑命令并带回失败诊断,apply_patch 用结构化补丁一次改多个文件,审批策略(tools.exec.mode + allowlist + 用户确认)守住高风险命令,Code Mode 则在工具很多时给模型一条更省的调用路径。补丁写入不走审批面板,靠 workspaceOnly、会话权限模式与沙箱边界约束——两条线各管各的,别混。
下一课预告
代码改完了,下一步让 Claw 盯仓库:GitHub 值班:PR 摘要与 issue 自动处理。要收紧工具权限,读安全加固(二):工具权限与沙箱;想用更省的国产模型跑编码,看接入 DeepSeek:V4 系列模型配置实战。