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"的时刻?

评论

此博客中的热门博文

我写了半年 prompt,这是我发现的最好的技巧