Skip to content
🎯 场景实战第 9 / 12 节

让 Claw 写代码:exec、补丁与审批 ​

💡 一句话总结:用 OpenClaw 写代码,建立「命令可执行、补丁可审、落地有人把关」的本地编码工作流 —— exec 跑命令、apply_patch 出补丁、审批策略守边界。

学完你能做什么 ​

  • 让 Claw 在你的工作区真正执行 npm test 这类命令,并读懂失败原因。
  • 让 Claw 用 apply_patch 一次改多个文件、多段代码,产出结构化补丁。
  • 配好 tools.exec.mode 审批策略,高风险命令逐条确认后才执行。
  • 需要时启用 Code Mode,让模型写小段 JavaScript 程序来搜索和调用工具。

为什么用 OpenClaw,而不是网页版 AI? ​

能力网页版 AIOpenClaw
执行命令❌ 只能给建议,你自己复制粘贴✅ exec 在所选主机或沙箱文件系统允许范围内执行
多文件改动❌ 一次贴一个文件,容易漏✅ apply_patch 一个补丁串起增、改、移、删
安全把关❌ 无本地策略可言✅ policy + allowlist + 可选用户审批三层把关
自托管❌ 代码要上传到别人的服务器✅ Gateway 跑在本机,命令留在本地工作区

你现在的困境 ​

  • 每次让 AI 改代码,都是「贴代码 → 复制回编辑器 → 手动跑测试」,来回搬运。
  • AI 给的改动散落在多段对话里,你不知道它到底改了哪几个文件。
  • 想让 AI 直接跑命令,又怕它执行了不该执行的东西。

什么时候用这一招 ​

  • 修一个 bug 需要同时改源码、加测试、跑一遍验证。
  • 重构涉及多个文件的移动或重命名。
  • 你想让「跑命令」和「改文件」都发生在自己机器上,且每一步可审。

🎒 开始前的准备 ​

  1. Gateway 已在本机运行,模型 provider 已接好(Node 24.16.0+ 或 26.1.0+)。
  2. 想清楚工作区边界:exec 在所选主机或沙箱文件系统允许的范围内执行,命令可以创建、编辑、删除文件。
  3. 定好审批尺度:OpenClaw 2.0 的审批绑定确切的请求、命令、会话与人,批的是「这一次这条命令」,不是给整个工具放行。

跟我做 ​

第 1 步:用 exec 执行命令 ​

为什么:先让 Claw 能跑命令,后面的改码、验证才有基础。

直接对 Claw 说:

text
在工作区执行 npm test,把失败的测试名和报错信息整理给我。

你应该看到:前台命令完成后直接返回输出。只有当 exec 提示命令仍在运行并给出 sessionId 时,才用 process 接管——命令自己打印出来的 ID 只是普通输出,不是进程句柄。命令失败时,message 字段带简短诊断,与 aggregated 里的命令输出分开。

第 2 步:生成并应用补丁 ​

为什么:结构化补丁比「拼字符串重写文件」集中、可审,一次能覆盖多个文件。

对 Claw 说:

text
用 apply_patch 修复刚才失败的测试:把 src/index.ts 里的 foo 从 1 改成 2,
并在 tests/foo.test.ts 里补一个断言。

你应该看到:Claw 调用 apply_patch,它接受单个必填的 input 参数,补丁格式如下:

text
*** 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 调用形如:

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 里的命令,不询问
askallowlist 策略 + 未命中时询问
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 先跑测试定位失败,再用补丁修复,全程不碰工作区之外的路径。

text
角色:本地编码助手
任务:在工作区跑 npm test,找出失败的测试,用 apply_patch 修复源码或测试
输入信息:
### 必填项 ###
【失败测试的报错信息】
### 选填项 ###
【不许改动的文件列表?】
输出规范:先给失败原因一句话,再给补丁内容,最后重跑测试并贴结果
约束条件:
✅ 只用 apply_patch 改文件
✅ 补丁路径保持在【工作区目录】内
❌ 不要用 exec 重写整个文件
❌ 不要改动工作区之外的任何路径

🚀 重构移动 ​

预期效果:一次补丁完成重命名与引用更新。

text
角色:重构助手
任务:把 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 系列模型配置实战。

搞懂AI关于我们怎么写隐私说明

独立的第三方教程,与文中提到的任何产品及其公司没有隶属或合作关系;产品名称和商标归各自所有者。价格和政策以官方页面为准。