Auto Mode / Permission Modes:让 Claude Code 自己决定要不要问
以前每次 Claude Code 要改文件我都得手动确认,后来才发现 Permission Modes 和 Auto Mode 能把这种机械操作彻底省掉。
我在 ReviX 项目里有个习惯:每次 Claude Code 说要改代码,我都会点确认。哪怕只是加一行日志,我也要盯着看一遍。倒不是不信任它,而是怕它改多了、改偏了,事后追查起来麻烦。
结果一个下午下来,我发现自己干了最多的活不是写代码,而是当"人工批准机"。每改一个文件弹一次确认框,我已经形成了条件反射,眼睛都没离开过屏幕,手已经先把 Yes 按了。
更麻烦的是,有些改动是它上下文里已经确认过的,但每次重启会话又要重新来一遍。我像是被困在一个无限循环的审批流程里。
后来我才知道 Permission Modes 和 Auto Mode 是干嘛的。
两种模式,解决两个问题
Permission Modes 控制的是"要不要问"。Auto Mode 控制的是"问了之后要不要我自己每次都回答"。
先说 Permission Modes。Claude Code 默认是 default 模式,只要涉及文件写入、命令执行,它都会弹出来问你"要执行吗?"。这个设计很安全,但问题是它不问对错,只问有没有权限。
如果你已经在一个受控环境里工作(比如本地开发机、CI 流水线),每次都问就纯纯浪费时间。
Auto Mode 则是更进一步。它不只是"允许执行",而是"允许它自己判断要不要执行"。说白了就是:它觉得安全的事直接干,觉得 risky 的事再问你。
我是怎么开的
我日常开发用的是 auto 模式,加一个白名单过滤:
/permissions
然后选 auto。它会问你要不要设置例外规则,我一般是这样配的:
允许:
- src/**/*.java 的读写
- pom.xml 的读写
- README.md 的读写
禁止:
- .env 文件的修改
- 任何 git push 操作
- rm -rf 类命令
这样配置完之后,Claude Code 在改 Java 代码的时候不会再弹我,但碰环境文件或者危险命令时还是会停下来问。
还有一个更细粒度的方式是用 .claude/settings.json 在项目级别配置:
{
"permissions": {
"mode": "auto",
"allow": [
"src/**/*",
"pom.xml",
"README.md"
],
"deny": [
".env",
"*.key",
"git push"
]
}
}
这样团队成员 clone 下来之后,权限配置也跟着走,不会出现"在我电脑上能跑,你电脑上不行"的问题。
我实际写的代码是什么样的
为了验证 Auto Mode 是不是真的能提升效率,我在一次小重构里做了对比。
// 统计手动确认模式下的时间消耗
public class ManualApprovalMetrics {
private int confirmationCount = 0;
private long totalWaitMs = 0;
public void onConfirmation() {
confirmationCount++;
// 假设每次人工确认平均需要 8 秒
totalWaitMs += 8_000;
}
public void printReport() {
System.out.printf("确认次数: %d, 浪费总时间: %.1f 分钟%n",
confirmationCount, totalWaitMs / 60000.0);
}
}
一次把 JPA 换成 MyBatis-Plus 的重构,手动确认模式让我按了 47 次 Yes,浪费了大约 6 分钟纯等待时间。
换成 Auto Mode 之后,同样的改动只被拦了 2 次——一次是它试图删 .env,一次是它想 git push 到远程。两次都是我设置规则时故意留下的保护项。
// Auto Mode 下的统计
public class AutoModeMetrics {
private int blockedCount = 0;
private long totalWaitMs = 0;
public void onBlocked(String reason) {
blockedCount++;
totalWaitMs += 5_000; // 平均每次拦截确认 5 秒
}
public void printReport() {
System.out.printf("拦截次数: %d, 浪费总时间: %.1f 秒%n",
blockedCount, totalWaitMs / 1000.0);
}
}
差距很明显。手动模式浪费 6 分钟,Auto Mode 只浪费 10 秒。
Tricks
Trick 1:用 --allowedTools 临时放宽
有时候你不想全局开 Auto Mode,只是在某一个任务里需要它更放开手脚。可以在单次调用时指定:
claude "重构所有 Service 层的 JPA 查询" --allowedTools Edit,Write
这样这个会话里它就能自由读写 Java 文件,但不会去碰其他东西。
Trick 2:危险操作单独标记
有些文件你允许它改,但不允许它随便提交。我的做法是在白名单里放文件,但在 git 相关命令上保持 deny:
{
"permissions": {
"mode": "auto",
"allow": ["src/**/*"],
"deny": ["git push", "git commit -m 'auto'"]
}
}
这样它改完代码可以,但不会偷偷帮你提交。提交还是得我亲自来,至少看一遍 diff。
Trick 3:在 CI 里用 --auto-approve
CI 环境里根本没有人在线确认,这时候 Auto Mode 是刚需。我一般这样用:
claude "运行测试并修复失败项" --auto-approve --permissions auto
加上 --auto-approve 之后,连那 2 次拦截都不会有,完全静默执行。但前提是你在 CI 里已经做了充分的环境隔离。
注意事项/踩坑
第一个坑:Auto Mode 不是"无条件信任"。它只是信任你对权限规则的配置。如果你把 allow 配成了 **/*,那它跟裸奔没区别。我见过有人在本地图省事直接全开,结果 Claude Code 把 node_modules 里的某个文件当成模板改了,半天没找到问题在哪。
第二个坑:/compact 之后权限规则不会丢失,但临时放宽的 --allowedTools 会失效。这个很反直觉。我遇到过 compact 之后它突然开始弹确认,排查了半天才发现是那次会话用的临时权限。
第三个坑:某些 MCP Server 工具需要特殊权限,你需要在 MCP 配置里单独声明。比如文件系统 MCP 默认只能读,要写的话得显式加上 write 权限。我一开始以为开了 Auto Mode 就万事大吉,结果 MCP 工具还是被拦住了。
结尾
我现在已经习惯了 Auto Mode 的生活。每天早上开机,第一件事就是确认权限规则还是我想要的,然后就可以把 Claude Code 扔进去干活,我喝我的咖啡。
但说真的,全自动不是目的。Permission Modes 真正的价值是帮你区分"哪些事值得你盯着,哪些事不值得"。当你不必为每个回车键都做一次心理建设的时候,注意力才能真正放在值得关注的地方。
你有没有过"我在审批 Claude Code,而不是在用 Claude Code"的时刻?
评论
发表评论