让 AI 重构项目时,你真正需要回答的是:哪些命令能自动执行,哪些操作必须停下来,以及一个任务出错后会影响哪里。Claude Code Hooks、Cursor 的删除审批与 Codex worktree 分别处理其中一部分。选型时先分清控制层,再决定怎么组合,才能避免装了一个护栏就以为项目已经安全。
假设有两个并行任务:一个迁移目录,另一个清理废弃文件。你希望它们各自工作,同时限制危险操作。
这时要分别解决三个问题:
01动作检查
要回答的问题这次工具调用符合规则吗?
本文对应方案Claude Code PreToolUse Hook
02执行审批
要回答的问题这个高风险动作能否直接运行?
本文对应方案Cursor Auto-review及人工确认
03工作副本
要回答的问题两个任务的代码修改放在哪里?
本文对应方案Codex管理的Git worktree
文件系统和网络沙箱还要单独配置。worktree分开的是代码工作副本;要约束进程能写哪些路径、能访问哪些资源,需要权限和运行环境参与。
下面按“官方确认的能力—最小配置—失败边界”逐项拆解。
02二、Claude Code:在工具执行前检查,故障时也能阻断Hook匹配与拒绝流程。图源:Claude Code官方文档
Claude Code官方Hooks文档说明,PreToolUse可以在工具调用前作出决定;command或http类型的Hook可以设置onFailure: "block"。该字段要求Claude Code v2.1.295或更新版本。官方参考
这里有两个不同的失败:
- 业务拒绝:脚本发现操作不符合规则,主动阻止。
- 检查器故障:脚本不存在、无法启动、超时或产生符合文档定义的错误,检查根本没有可靠完成。
使用故障阻断,是为了让第二种情况也停下来。它不能弥补脚本规则本身的遗漏。
最小配置:先验证阻断链路
把下面的内容合并到项目的.claude/settings.json,保留项目已有的其他设置:
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "node", "args": [ "${CLAUDE_PROJECT_DIR}/.claude/hooks/guard-bash.cjs" ], "timeout": 10, "onFailure": "block" } ] } ] }}
下面是演示用的严格允许列表。保存为.claude/hooks/guard-bash.cjs。它只接受三条完全匹配的Git检查命令;其他输入全部拒绝,便于先确认检查器是否被调用。
const fs = require('node:fs');const allowed = new Set([ 'git status --short', 'git diff --stat', 'git diff --check',]);try { const input = JSON.parse(fs.readFileSync(0, 'utf8')); const command = input?.tool_input?.command; if (typeof command !== 'string' || !allowed.has(command)) { console.error('演示护栏拒绝:命令不在允许列表中。'); process.exit(2); } process.exit(0);} catch { console.error('演示护栏拒绝:输入无法解析。'); process.exit(2);}
这不是完整的生产安全策略。它会阻止安装依赖、运行测试等大量正常任务,也没有验证执行目录、Git配置、环境变量或其他工具入口。不要把三条允许命令解释为任何环境下的安全保证。
这段示例刻意避免把“多写几个危险命令正则”包装成完整防护:Shell可以通过脚本、变量展开、子进程和多种命令写法改变实际行为。
退出码与故障处理别混淆
在可阻断事件中,退出码2用于阻止动作。其他非零退出码通常属于非阻断错误;设置故障阻断后,再按官方的失败契约处理。不要直接把“所有非零退出都等于拒绝”写进团队规范。
配置完成后,还要在实际客户端中检查:正常输入、拒绝输入、脚本缺失和超时是否分别符合预期。本轮只验证脚本自身,没有把这些客户端集成结果当作已通过。
03三、Cursor:危险删除需要审批,配置要对准Auto-reviewAuto-review、沙箱与审批的执行关系。图源:Cursor Run Modes官方文档
Cursor CLI的v2026.10.08官方日志写明:对于目标路径可能与字面含义不同的递归、强制、通配符或镜像删除,Auto-review会要求审批。未定义变量、路径里的多余空格等是文档列出的风险例子。发布日志
这不能概括成“任何删src都必拦、任何删dist都自动放行”。实际行为取决于运行模式、命令、沙箱、允许规则及团队策略。
用官方支持的配置表达审批要求
当前Run Modes文档给出的项目配置路径是.cursor/permissions.json。可以按团队需要合并类似指令:
{ "autoRun": { "allow_instructions": [], "block_instructions": [ "Every recursive or force file deletion should go through approval first.", "Every force push should go through approval first." ] }}
这两条是本文示例策略,意思是递归或强制删除、强制推送先走审批;它们不是产品内置规则清单。
官方说明,这类自然语言指令用于引导Auto-review判断;permissions.json和约束路径、网络的sandbox.json承担不同职责。团队配置也可能覆盖本地配置。运行模式、审批策略、沙箱边界应分别检查。Run Modes官方说明
失败边界:审批分类器也会判断错
Cursor明确说明,Auto-review分类器本身不是安全边界,可能误放行,也可能误拒绝。需要强约束的资源,应交给独立的权限控制和隔离环境。
因此,不把某次出现审批卡片推导为“同类操作永远无法绕过”,也不把自然语言策略当成操作系统访问控制。
04四、Codex:worktree分开代码,沙箱限制访问工作树中的创建分支界面。图源:腾讯云开发者社区「代码简单说」
Codex官方文档把worktree用于同一Git项目中的并行工作:每个工作树有自己的检出文件,多个工作树共享Git元数据。托管worktree方便组织独立任务、检查修改和后续交接。官方worktree文档
这能减少多个任务直接改同一目录的冲突,但不能仅凭“在worktree里运行”就承诺主仓库、凭据或其他目录完全不可访问。
可复用的起步命令
已有Git仓库时,可以用标准Git命令准备独立工作副本;以下分支名和目录名仅为示例,运行前确认它们尚未占用:
git worktree add ../guard-demo -b codex/guard-demo HEADgit worktree list
检查工作树和分支后,再进入新目录,按官方支持的CLI参数启动:
cd ../guard-democodex --sandbox workspace-write --ask-for-approval on-request
workspace-write与审批策略组合用于约束访问和升级请求;具体边界还受平台、配置及执行环境影响。它不意味着工作区内的每次危险删除都会额外询问。官方权限与沙箱说明
Git命令负责工作副本管理,Codex参数负责会话权限设置。这里没有使用未经核对的codex parallel命令、codex.yaml字段,也不声称worktree会自动完成CI路由、创建Issue或解决合并冲突。
失败边界:恢复能力也有范围
Git中的已提交内容便于恢复;未跟踪文件、被忽略文件、外部数据库、远程服务和凭据不因此获得备份保护。不同分支修改同一公共文件,合并时仍可能冲突。
在团队工作流里,还应把主分支推送限制放到代码托管平台的权限与分支规则中,不能只靠本地目录约定。Git worktree文档
05五、本轮验证了什么:10条Hook输入,未执行其中的命令为了给示例代码留下可检查的证据,本轮向脚本传入10个测试输入。脚本只读取字符串并返回退出码,没有执行任何输入里的Git、删除或Python命令。
01git status --short
预期退出码0
本轮结果0
02git diff --stat
预期退出码0
本轮结果0
03git diff --check
预期退出码0
本轮结果0
04rm -rf ./src
预期退出码2
本轮结果2
05find . -name '*.ts' -delete
预期退出码2
本轮结果2
06git push --force origin main
预期退出码2
本轮结果2
07python -c 'print(1)'
预期退出码2
本轮结果2
08git status --short; echo extra
预期退出码2
本轮结果2
结果口径:3个允许样例、7个拒绝样例均符合这段严格允许列表的预期。这是脚本逻辑验证,不是安全覆盖率;不证明Claude Code已经加载配置,也不能与Cursor、Codex组成三家产品准确率排名。
配套交付中的examples/test-guard.mjs可重复运行,并记录预期与实际退出码。日期、Node版本、平台和原始结果保存在qa/hook-test-log.json。
01主要价值
Claude Code Hook检查匹配到的工具调用
Cursor Auto-review在自动执行与审批间作判断
Codex worktree分开任务的代码工作副本
02配置工作
Claude Code Hook编写、维护并验证检查器
Cursor Auto-review核对模式和审批指令
Codex worktree管理工作树、分支与权限
03故障重点
Claude Code Hook检查器坏了是否仍放行
Cursor Auto-review规则未生效、模式绕过或误判
Codex worktree把目录分开误当访问隔离
04配套控制
Claude Code Hook沙箱及策略文件保护
Cursor Auto-review沙箱及团队权限策略
Codex worktree沙箱、凭据与远端权限
这个表比较的是职责和验证成本,没有对三家产品打“安全分”。
建议先验证三组边界:
- 故障边界
- 路径边界用一次性测试目录检查绝对路径、变量、符号链接和工作区外写入。
- 权限边界检查其他工具入口、远端写操作、审批后的升级权限,以及策略文件能否被改写。
验收记录至少包含客户端版本、操作系统、配置、输入、预期、实际结果与日志位置。不要在真实源码、生产服务或含真实凭据的目录上验证破坏性操作。
把正则命中当成安全覆盖。拦住rm -rf,不能说明拦住了脚本里的同类动作。检测规则需要回归样例,访问边界需要独立约束。
把检查器故障当成检查通过。故障阻断值得单独验证,尤其是缺失脚本、超时和异常输出;单测成功不等于客户端集成成功。
把worktree当成沙箱。代码分支、磁盘工作目录、操作系统权限和远端授权是不同层面的控制,需要分别核对。
实际选型可以从现有工具出发:已有Claude Code流程,就先补齐Hook故障验证;用Cursor,就核对Auto-review模式及团队策略;需要并行任务,就使用worktree整理修改,同时单独配置运行权限。
你的团队会把哪些动作强制留给人工确认:递归删除、远端推送、数据库变更,还是读取敏感配置?欢迎带着配置与失败样例讨论。关注「AGI工程化」,一起把AI工作流做成可验证、可恢复的工程系统。
- The End -
转发、赞、在看,一键三连👇