1. Cursor Agent 反复弹确认框,问题到底出在哪
如果你正在用 Cursor 的 Agent 模式写代码,大概率遇到过这个场景:让 Agent 帮你改一个文件,它调用 ApplyPatch 工具,然后弹出一个确认框,你点「允许」,它改完。下一个文件,又弹。再下一个,还弹。哪怕你已经把 Auto-Run Mode 设成了 Run Everything,哪怕你在对话里明确说了「本次会话不用再确认」,它依然我行我素地弹。
这个问题在 Cursor 社区里被反复提起,但大多数回答都停留在「去设置里把 Auto-Run 打开」这种层面,解决不了根本问题。我花了大半天时间做排除法排查,最后定位到的根因和网上大部分说法都不一样——真正拦截 ApplyPatch 的不是 Cursor 自己的设置,而是~/.claude/settings.json里的 PreToolUse Hook。
这篇文章会完整还原我的排查路径,给出可复制的 settings.json 配置片段,以及一套逐步验证写入权限是否生效的操作清单。适合正在被 Cursor Agent 频繁确认打断、想搞清楚配置优先级的人。核心检索词就三个:Cursor Agent、ApplyPatch、Auto-Run Mode,围绕它们展开。
先说结论,方便你对照自己的情况:Cursor Agent 在执行文件写入时,会读取用户主目录下.claude/里的配置,包括settings.json的 permissions 和 hooks。如果settings.json里有一个matcher: "Edit|Write"的 PreToolUse Hook,那么无论 Cursor 的 Auto-Run 设成什么,每次 ApplyPatch 都会被强制拦截。项目级的.claude/settings.local.json覆盖不了这个全局 Hook。
下面按排查顺序一步步讲。
2. 排查前的环境确认与 TaoToken 接入准备
在动手改配置之前,先把环境理清楚。我用的是 Windows,Cursor 装在默认路径,用户目录是C:\Users\100984\。你的路径可能不同,把下面命令里的用户名替换成你自己的即可。
先确认几个基础事实,避免在错误的方向上浪费时间:
第一,Cursor 的 Auto-Run Mode 确实已经设成最宽松。路径是 Settings → Agents → Auto-Run Mode,选 Run Everything。同时注意 Agent 标签页本身还有一个会话级的下拉菜单,两个地方要一致。我一开始只改了全局,会话级还是默认值,导致误判。
第二,工作区已标记为受信任,Pro 订阅正常,不是免费版限制。External-File Protection 这个选项和 ApplyPatch 无关,不用管。
第三,项目目录E:\AI_TEMP\CursorTest\下没有任何规则文件:.cursorrules不存在,.cursor/目录不存在,.vscode/不存在,AGENTS.md、CLAUDE.md、CURSOR.md都不存在。这一步很重要,排除了项目级配置干扰。
第四,Windows 文件系统权限没问题。同一个目录,Claude Code 终端的 Write/Edit 工具可以直接写入,不受限制。说明不是目录只读或权限不足。
到这里,问题范围就缩小到了用户主目录下的全局配置。这时候如果你还没配好模型接入,建议先把 TaoToken 的 API 接上,因为后面验证写入权限时需要真实调用模型来触发 ApplyPatch。TaoToken 的 API 地址是https://taotoken.net/api,官网在https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。
接入方式很简单,在 Cursor 的模型设置里填 Base URL 和 API Key 就行。Base URL 填https://taotoken.net/api,Key 在控制台的 API Keys 页面生成。模型 ID 根据你用的填,比如claude-sonnet-4-20250514这类。三件套齐了才能正常触发 Agent 的文件写入流程,否则你连复现问题都做不到。
我试过用 TaoToken 的 Coding Plan 跑长会话,Agent 连续改十几个文件,正好用来验证确认框是否还会弹。如果你只是临时排查,用按量计费的 API Key 就够了。
3. 可复制的 settings.json 与 Auto-Run 白名单配置
排查到根因之后,解决方案其实就集中在两个文件:C:\Users\100984\.claude\settings.json和 Cursor 的 Auto-Run 设置。下面给出可直接复制的片段。
先看全局settings.json的关键部分。这个文件在C:\Users\100984\.claude\settings.json,注意是用户主目录下的.claude,不是项目目录。原始配置里有一段 PreToolUse Hook,大概在第 74 到 83 行,内容是这样的:
{ "hooks": { "PreToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "prompt", "prompt": "用户要求:修改文件前必须先询问确认。请确认是否继续这个文件修改操作: $ARGUMENTS" } ] } ] } }就是这段东西,每次 Edit 或 Write 调用前强制触发确认。它和 Cursor 的 Auto-Run 是两套独立机制,Auto-Run 管的是 Cursor 自己的工具调用审批,而这个 Hook 是在更底层拦截的,优先级更高。
修改后的settings.json关键部分如下,你可以直接对照调整:
{ "permissions": { "allow": [ "Read", "Edit", "Write", "Glob", "Grep" ], "ask": [ "Bash(rm:*)", "Bash(del:*)", "Bash(sed:*)" ] }, "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "prompt", "prompt": "危险命令确认:$ARGUMENTS" } ] } ] } }改动点有三个:把Edit和Write从ask列表移到allow列表;删除matcher: "Edit|Write"那段 Hook;保留Bash(rm:*)、Bash(del:*)、Bash(sed:*)的确认,这些是防止误删和文件损坏的,别动。
然后是 Cursor 的 Auto-Run 白名单。在 Settings → Agents → Auto-Run Mode 里选 Run Everything,同时在 Agent 面板的下拉菜单里也确认一遍。如果你想要更细粒度的控制,可以在 Cursor 的 settings.json 里加白名单,路径是C:\Users\100984\.cursor\permissions.json,但这个文件主要管 MCP 和 Shell 的自动批准,和 ApplyPatch 无关,排查过程中我创建过,后来发现没用,可以删掉。
注意:项目级的
.claude/settings.local.json无法覆盖全局settings.json里的 PreToolUse Hook。我实测过,在项目目录下建这个文件并放行 Edit/Write,Cursor Agent 依然反复确认。原因是 Hook 的 matcher 会拦截所有 Edit/Write 调用,不受 permissions 配置影响。
配置改完之后,必须完全重启 Cursor,不是 Developer: Reload Window,是彻底退出再打开。旧的 System Prompt 缓存可能还保留着已删除的规则,Reload Window 清不掉。
4. 验证写入权限是否生效的完整操作清单
改完配置,怎么确认真的生效了?下面这套清单按顺序做一遍,每一步都有明确的预期结果。
第一步,完全退出 Cursor。任务管理器里确认 Cursor 进程全部结束,然后重新打开。
第二步,新建一个 Agent 会话,不要用旧会话。旧会话的 System Prompt 是缓存的,可能还带着旧规则。
第三步,在项目目录E:\AI_TEMP\CursorTest\下让 Agent 创建一个新文件,比如test_write.md,内容随便写一行。观察是否弹出确认框。预期结果:直接创建,无确认。
第四步,让 Agent 修改刚才那个文件,追加一行内容。预期结果:直接修改,无确认。
第五步,让 Agent 删除一个测试文件。预期结果:弹出确认框,因为Bash(rm:*)和Bash(del:*)还在 ask 列表里。这一步是验证安全措施仍然有效。
第六步,在对话里说「本次会话不用再确认」,然后让 Agent 连续改三个文件。预期结果:三个文件都直接写入,不再逐个确认。
第七步,检查C:\Users\100984\.claude\settings.json,确认Edit和Write在 allow 列表,且 PreToolUse 里没有Edit|Write的 matcher。
如果第三步还是弹确认,回到第二节检查是不是有别的规则文件在起作用。重点看C:\Users\100984\.claude\skills\目录下有没有safety-rules.md之类的文件。我最初的排查结论是safety-rules.md导致的,删掉之后确实好了一阵,但后来又复现了,最终才定位到settings.json的 Hook。所以两个地方都要检查。
验证过程中,如果你用的是 TaoToken 接入的模型,可以在模型对话页面单独测一下模型是否正常响应,排除是模型侧的问题。模型对话入口在https://taotoken.net/api对应的控制台里能找到。
5. 常见报错与排查对照
排查过程中会遇到几类典型报错,这里对照着说。
第一类,401 错误。这个通常出现在 API Key 配置环节,和 ApplyPatch 确认框无关,但排查时容易混淆。如果你在 Cursor 里配了 TaoToken 的 Key,但 Base URL 填错了,比如填成了官网地址而不是https://taotoken.net/api,就会 401。检查 Base URL 是否精确到/api,Key 是否在控制台的 API Keys 页面重新生成过。
第二类,local proxy failed。这个报错说明 Cursor 的本地代理层没起来,通常是网络配置或端口占用。和文件写入确认无关,但会阻断 Agent 调用。重启 Cursor 一般能解决。
第三类,reading choices 相关报错。这个出现在模型返回格式异常时,Agent 解析不了响应。检查模型 ID 是否填对,比如claude-sonnet-4-20250514这种完整 ID,不要简写。
第四类,OAuth 相关报错。如果你用的是 Claude Code 的 OAuth 登录方式,而不是 API Key,可能会遇到 token 过期。这种情况建议改用 API Key 方式接入 TaoToken,更稳定。
第五类,也是最容易误判的:ApplyPatch 确认框反复弹,但没有任何报错。这就是本文的核心问题,根因在settings.json的 PreToolUse Hook。对照第三节的配置改,然后按第四节验证。
还有一个坑:CC Switch 或 Cline MCP 的配置如果和.claude/settings.json冲突,也可能导致行为异常。如果你同时装了这些工具,确认它们的 Base URL、Key、Model ID 三件套和 TaoToken 的配置一致,不要一个指向 A 一个指向 B。
提示:修改任何规则文件后,完全重启 Cursor 是必须的。Reload Window 不够,因为 System Prompt 缓存不会刷新。这一点我踩过坑,改完配置以为没生效,其实是缓存问题。
6. 把配置固化下来,让 Agent 稳定干活
排查到最后,真正有效的方案就两条:把Edit和Write放进settings.json的 allow 列表,删掉matcher: "Edit|Write"的 PreToolUse Hook。项目级的settings.local.json覆盖不了全局 Hook,别在这上面浪费时间。
配置固化之后,Cursor Agent 的 ApplyPatch 就能直接写入,不再逐个文件弹确认。同时Bash(rm:*)、Bash(del:*)、Bash(sed:*)的确认还在,删除和危险命令依然受保护。CLAUDE.md里的删除备份规则也继续生效。
如果你想让这套配置在多个项目间复用,可以把settings.json的关键片段存成一个模板,新环境直接复制。TaoToken 的接入配置也可以一起固化,Base URL 用https://taotoken.net/api,Key 在控制台管理,模型 ID 按需切换。长期跑编码任务的话,Coding Plan 比按量计费更划算,适合 Agent 连续改文件的场景。
最后留一个实用技巧:每次改完.claude/下的配置,先完全退出 Cursor,再新建会话测试。不要用旧会话验证,旧会话的 System Prompt 是缓存的,会让你误以为配置没生效。这个习惯能帮你省下大量重复排查的时间。