Cursor Agent 用 ApplyPatch 创建或修改文件时反复弹出确认框,Auto-Run Mode 已经设成 Run Everything,开发者也执行了 Reload Window,甚至明确告诉 Agent「本次会话不用再确认」,但每次写入还是被拦。有人怀疑是 API 通道或 Key 的问题,于是先去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建了一把 TaoToken 的 Key,把 Cursor 模型设置的 Base URL 指到 https://taotoken.net/api,重测后确认弹窗依旧存在。这里先给结论:换 Key、换 Base URL 都解决不了,因为拦截逻辑在本地settings.json的 PreToolUse Hook 里,跟模型通道没有任何关系。下面把完整的排障路径和最终修法写清楚,下次再遇到可以少走弯路。
1. 问题现象:ApplyPatch 写文件为什么一直被确认
复现条件不复杂:在 Cursor 的 Agent 模式下,让 Agent 用 ApplyPatch 工具创建或修改文件,每执行一次文件写入,界面就弹一次确认框。即使把 Cursor 的 Auto-Run Mode 调成最宽松的 Run Everything,确认框仍然出现。更让人费解的是,同一个目录、同一份文件,在 Claude Code 终端里用 Write/Edit 工具却能直接写入,不触发任何确认。两边行为不一致,自然会让人怀疑是 Cursor 的配置没生效,或者是某个未知的规则文件在起副作用。
我先把无效操作列在这里,它们都是排障过程中真实试过的,省得你再踩一遍。
- Auto-Run Mode 已设为 Run Everything,属于 Cursor 里最宽松的自动化执行模式。
- 执行过 Developer: Reload Window,希望重载配置生效,结果确认框没有消失。
- 用户明确要求「本次会话不用再确认」,Agent 仍然在 ApplyPatch 之前停顿并等待确认。
- 检查过 Pro 订阅与工作区信任状态,排除了免费版额度限制和工作区未信任的问题。
这四条都没解决问题,说明拦截点藏在更深的地方。因为 Claude Code 终端能写入同一目录,文件系统权限和目录只读这两个因素也可以直接排除。问题不在文件系统,而在 Cursor Agent 启动时注入的某层规则里。
1.1 先区分两个容易被混淆的现象
一个容易混淆的点是「运行命令确认」和「文件写入确认」不是同一类限制。设置 Auto-Run Mode 为 Run Everything,管的是工具调用和命令执行这一层;而 ApplyPatch 的确认,走的是 Agent 在调用Edit/Write这类文件工具前的 permission 或 hook 检查。也就是说,即使 Auto-Run 开到最大,只要存在一个针对Edit|Write的 PreToolUse Hook,它都会在真正改动文件之前弹出提示。
1.2 为什么 Claude Code 终端不受影响
Claude Code 终端不受影响,不是因为它比 Cursor 权限更高,而是它和应用内 Agent 读取配置的路径可能不一致。Cursor Agent 除了读项目里的.cursorrules,还会读用户主目录下~/.claude/中的规则和配置。这个目录本来是给 Claude Code 用的,但 Cursor 也会读取其中的部分文件,导致两边共享同一套权限与 Hook 配置。这个现象后面第 4 节会重点展开。
2. 第一次对照实验:把 Cursor Agent 换到 TaoToken
在还没找到本地规则之前,最直接的怀疑对象是 API 通道。我当时想,如果 Cursor Agent 和 Claude Code 终端用的是同一套底层的执行逻辑,那会不会是代理通道的响应差异导致写入确认?要验证这个猜想,需要一把新的 Key 和一个可落地的 Base URL。
2.1 先拿一把 Key:TaoToken 创建和模型确认
创建 Key 的入口是 TaoToken。注册登录后,在控制台的 API Keys 页面创建一把密钥,把生成的字符串记下来用于下一步。模型 ID 不要凭记忆填,打开模型广场看当时列表里的实际 ID,我用的是YOUR_API_KEY作为占位,正式配置时替换成你自己的 Key。
2.2 Cursor 模型设置里填 Base URL
拿到 Key 后,在 Cursor 的模型提供商或自定义端点设置里,把 Base URL 填为https://taotoken.net/api,注意末尾不要加/v1,也不要加任何 UTM 参数。API Key 填YOUR_API_KEY,模型 ID 按模型广场的列表选。这一步只是切换通道,不会改动任何本地规则文件。
2.3 实验结论:弹窗和通道无关
切换完成后,让 Agent 再次用 ApplyPatch 修改一个文件。结果没有悬念,确认弹窗照常出现,频率、文案、触发条件都和切换之前一模一样。到这里可以下一个初步结论:PreToolUse Hook 的拦截发生在本地配置层,与 API 通道、Key 类型、Base URL 地址无关。也正因为这个实验,我回到了原文的排障路径去查本地配置文件。
3. 回到原文排障路径:项目级配置全部排空
排障时不能凭感觉乱改配置,要先做排除法。原文走的路径是从项目目录开始,一层一层往外查,最终才定位到用户主目录下的全局配置。这套方法值得完整走一遍。
3.1 项目目录里的规则文件是否存在
先看项目根目录,以E:\AI_TEMP\CursorTest\为例:
.cursorrules:不存在.cursor/目录:不存在.vscode/目录:不存在AGENTS.md、CLAUDE.md、CURSOR.md:均不存在
项目目录干净得没有任何规则文件,排除了项目级配置的影响。如果你排查时项目里有这些文件,可以优先逐个重命名或注释掉再测,因为它们的优先级通常高于用户全局配置。
3.2 Cursor CLI 配置和文件系统权限检查
接下来看用户目录C:\Users\100984\.cursor\:
cli-config.json:不存在permissions.json:最初不存在,后来在排障过程中被创建出来,但测试证明它和 ApplyPatch 的文件写入确认无关
文件系统权限方面,Claude Code 终端能正常写入同一个目录,说明目录没有只读属性,当前用户也没有权限不足的问题。Windows 下常见的 ACL 问题在这里不存在,排障时可以跳过 NTFS 权限这一步。
3.3 注释 CLAUDE.md 规则后仍然复现
再往前排查一层,发现全局C:\Users\100984\.claude\CLAUDE.md里有一条「修改文件前确认」的规则。把它注释掉之后测试,Cursor Agent 仍然要求确认。这说明 CLAUDE.md 不是唯一原因,甚至不是主要原因。接下来误判过一次safety-rules.md,当时认为旧版规则出现在.claude/skills/目录下且没有会话豁免机制,所以把C:\Users\100984\.claude\skills\safety-rules.md删掉测了一轮,结果确认框依旧存在。这就是典型的「查到了一个干扰项,但不是根因」。
4. 真正的拦截者:全局 settings.json 的 PreToolUse Hook
真正导致反复确认的,是全局C:\Users\100984\.claude\settings.json里的一段 PreToolUse Hook 配置。它在每次Edit或Write调用之前强制弹出一个确认提示,从机制上讲是完全独立于 Auto-Run 设置的。
4.1 Hook 的配置长什么样
下面是复现问题的最小结构,配置中把matcher设为了Edit|Write,类型为prompt:
{ "hooks": { "PreToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "prompt", "prompt": "用户要求:修改文件前必须先询问确认。请确认是否继续这个文件修改操作: $ARGUMENTS" } ] } ] } }只要这段配置存在于全局settings.json,Cursor Agent 调用 ApplyPatch 时会先触发 Hook 检查。matcher: Edit|Write意味着匹配所有文件编辑和写入操作,type: prompt意味着永远弹确认,没有豁免通道。这就是为什么你说了「本次会话不用再确认」也无效。
4.2 为什么 settings.local.json 放行无效
尝试过在项目目录创建.claude/settings.local.json,并在 permissions 里放行Edit和Write,类似这样:
{ "permissions": { "allow": ["Read", "Edit", "Write", "Glob", "Grep"], "ask": [] } }测试结果是无效的。原因在于 PreToolUse Hook 的执行顺序早于 permission 判定,或者更准确地说,Hook 的 matcher 在权限检查之外独立运行。只要 Hook 还在,它就会拦截所有Edit|Write调用,permissions 列表里怎么放行都没用。
4.3 关键发现:Claude Code 配置会同时影响 Cursor
这次排障最有价值的地方在于,确认了C:\Users\100984\.claude\settings.json里的配置不只会作用于 Claude Code 终端,也会被 Cursor 编辑器里的 AI Agent 读取并生效。Cursor Agent 执行 ApplyPatch 时,会检查同一套用户级配置,包括权限列表和 Hook。因此,在 Claude Code 终端配置的「修改文件前强制确认」Hook,会同步影响 Cursor IDE 的 Agent 模式。
这也解释了一个现象:两边行为差异的根源不在通道,而在于配置读取范围的交叉。Cursor 和 Claude Code 在用户主目录的规则上存在共享,至少.claude/settings.json是会被两边同时参考的。这是排查时必须记住的:不要以为给 Claude Code 用的配置只影响终端。
5. 修改全局 settings.json 并完全重启
唯一有效的方法,是直接修改全局C:\Users\100984\.claude\settings.json,把Edit和Write从ask移到allow,并删除 PreToolUse Hook 中matcher: Edit|Write的配置段。
5.1 修改后的最小可用配置
下面是一个经过测试的有效结构,仅用于说明关键变化:
{ "permissions": { "allow": [ "Read", "Edit", "Write", "Glob", "Grep", "Bash" ], "ask": [ "Bash(rm:*)", "Bash(del:*)" ] }, "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "prompt", "prompt": "执行删除或 Sed 修改前请确认: $ARGUMENTS" } ] } ] } }重点是两条:一是Edit、Write已进入allow列表,二是原先matcher: Edit|Write的 Hook 整段删除。改完之后保存文件,然后彻底退出 Cursor 进程,不是 Reload Window,是让进程完全结束,再重新打开。
5.2 保留的安全措施什么时候该留
严格规则删掉不代表不设防。以下保护建议保留在配置里,它们针对的是更危险的命令操作:
Bash(rm:*)和Bash(del:*)执行前仍需要确认。Bash(sed:*)执行前需要确认,防止一条命令写坏整个文件。- Git 提交、推送、合并等操作,仍然按原规则禁止或确认。
- 全局
CLAUDE.md中「删除文件前先备份」的规则继续生效。
文件写入确认和删除确认是两种东西。前者在 AI 高频改代码时非常打扰,删除类命令的确认则属于必要防护。区分禁区和容忍区,配置文件才不会变成「要么全放行,要么全拦截」。
5.3 验证:完全重启后新建 Agent 会话
验证方式不能省。修改完配置后,先完全退出 Cursor,再重新打开,新建一个 Agent 会话,让 Agent 通过 ApplyPatch 改一个测试文件。预期行为是:文件直接写入,不再弹出确认框。严格规则删除后的首次询问,仍然由CLAUDE.md中的默认安全机制兜底,用户可以说「本次会话不用再确认」来获得会话级豁免。
如果重启后弹窗还在,大概率是以下三种情况之一:
- Cursor 没有完全退出,后台进程仍在运行,配置未重新加载。
- 修改的是项目级
settings.json,而实际生效的是全局配置。 - settings.json 格式错误导致配置回退,可打开 Cursor 的日志或 JSON 校验工具检查。
6. 这次排障留下的检查清单
排完这个坑之后,建议把检查顺序固定下来,以后再遇到类似「AI 写文件反复要确认」的问题时,按顺序过一遍,效率会高很多。
6.1 先查本地规则,再怀疑 Key 和 Base URL
这次最大的教训是:很多情况下通道是无辜的。先花 10 分钟检查本地配置文件,可能比换 Key、换 Base URL 更快定位问题。具体检查顺序如下。
- 项目目录:
.cursorrules、.cursor/、.vscode/、AGENTS.md - 用户主目录:
~/.cursorrules、~/.claude/CLAUDE.md - 全局配置:
~/.claude/settings.json - 子目录:
~/.claude/skills/下的规则文件
其中settings.json里的 PreToolUse Hook 拥有最高的拦截优先级,matcher 若包含Edit或Write,无论 permissions 怎么设置都会弹确认。
6.2 配置文件修改后,必须完全重启
Reload Window只重载编辑器界面,不一定会重新加载 Agent 的 System Prompt。修改完settings.json或删除规则文件后,需要完全退出 Cursor 进程,再重新打开并新建会话。旧的 System Prompt 缓存可能把已删除的规则继续保留在上下文里,这也是很多配置改了不生效的根本原因。
6.3 回控制台核对这次调用是否正常记账
排除 Hook 之后,如果通道还挂着 TaoToken,可以回到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 控制台,查看刚才新会话里的调用记录是否正常出现。主要核对三件事:请求是否成功、模型 ID 是否与模型广场列表一致、Base URL 是否用的是 https://taotoken.net/api 且末尾没有加/v1。确认无异常后,再继续日常开发。
如果后续你还想进一步减少确认打断,可以在对话里明确告诉 Agent「允许本次会话直接修改文件」,让会话级豁免生效;如果希望全局彻底放开文件写入,则按第 5 节的方法调整settings.json。如果更在意删除和 Git 操作的安全,不要删除Bash(rm:*)和 Sed 相关的 Hook。最后提醒一句:换 Key 解决不了 Hook 拦截的问题,先把本地配置检查完,再决定要不要换通道。