你把 YOLO 模式关了(或者压根没开过),打开 Agent 模式让 Cursor 做点无害的小事,下一秒就看到集成终端里 rm -rf node_modules 在跑,没有任何确认弹窗。又或者一口气 pip install 一长串包。又或者直接 push 到分支。设置里明明写着「Require confirmation」,可命令还是一条条往下跑。根因几乎都是这三件之一:allowlist 比你以为的宽很多、设置文件还残留了旧 key、或者 workspace 级别的设置盖过了 user 级别。判断准了,改一分钟就好。
常见原因
按命中率从高到低。
1. 命令 allowlist 太宽
Cursor 允许你把某些命令或前缀加到 allowlist,跳过确认。如果 npm、git、甚至 * 在列表里,匹配到的命令就直接跑。很多人一次加了 npm install 后就忘了——它会把所有 npm 开头的全部带过。
怎么判断:设置 → Cursor Settings → Features → Agent → 「Allowed commands」。看到任何宽前缀或 *,就是它。
2. Workspace 级别设置覆盖 user 级别
仓库里的 .vscode/settings.json 或 .cursor/settings.json 可能写了 cursor.agent.yoloMode: true,把你的全局偏好盖掉。你改错了层。
怎么判断:在 workspace 里搜 yoloMode 或 agent.confirm。workspace JSON 一旦设了,user 那边就拗不过它。
3. 升级后旧设置没清
Cursor 版本一升,设置 schema 偶尔会变。UI 里新开关显示是关的,但 settings.json 里旧 key(名字不一样)还在授予 auto-run 权限。
怎么判断:打开 ~/.cursor/settings.json(Windows 上是 %APPDATA%\Cursor\User\settings.json)。搜任何包含 yolo、autoRun、confirmCommands 的 key。
4. Rules 文件里授权自动执行
.cursorrules 或 .cursor/rules/*.mdc 里写了「always run shell commands without asking」这种话,Agent 把它当成指令解析,那一轮就绕过 UI 的拦截。
怎么判断:在 rules 文件里 grep 「without asking」「no confirmation」「auto run」。命中任何一条都可能是它。
5. 命令排在多步计划里
Agent 模式经常先制定一个多步计划,整批一起跑。第一步可能弹确认,同一个计划里后面的步骤继承同意、不再单独弹。
怎么判断:看聊天记录。如果一开始有「Plan: 1, 2, 3」这种 block,你点了一次 Approve,后面的每一步都不再问。
6. 某个版本本身有 bug
Cursor 0.42 和 0.45 早期几个 build 确认有 bug:对包含 cd ... 或 && 链式的命令,确认开关失效。
怎么判断:Help → About。命中那几个版本,升级就完了。
开始前
- 想清楚要的是「零 auto-execute」还是「小白名单」,修法不一样。
- 改设置前先把正在跑的 Agent 任务停掉——设置下一轮才生效,跑到一半改没用。
- 改之前给
settings.json备一份。
需要收集的信息
- Cursor 版本(Help → About)。
- OS 和默认 shell(Cursor 集成终端用的是你的默认 shell)。
- 那条没弹就跑的命令原文。
~/.cursor/settings.json(或%APPDATA%\Cursor\User\settings.json)内容。- 项目里有没有
.cursorrules或.cursor/rules/*.mdc。 - workspace 里有没有
.vscode/settings.json。 ~/.cursor/logs/最近那条日志。
一步一步修复
Step 1:审一遍 allowlist
设置 → Cursor Settings → Features → Agent → 「Allowed commands」。一条不留全删掉。保存。后面真要加,加完整字符串(比如 npm test),不要加前缀。
Step 2:在 user 设置里硬写关闭
Command Palette → 「Preferences: Open User Settings (JSON)」加:
{
"cursor.agent.yoloMode": false,
"cursor.agent.allowedCommands": [],
"cursor.agent.requireConfirmation": true
}
保存、reload 窗口(Cmd+Shift+P → 「Developer: Reload Window」)。
Step 3:查 workspace 有没有覆盖
项目根目录看一下 .vscode/settings.json 和 .cursor/settings.json。把里面 cursor.agent.* 相关 key 全部删掉,或者把它挪到 user 级别。workspace JSON 永远赢 user JSON。
Step 4:清 rules 文件
grep 一下仓库里有没有 rule 在授权 auto-execute:
grep -ri "without asking\|no confirmation\|auto.run\|skip prompt" .cursor .cursorrules 2>/dev/null
命中的都删掉或重写。rules 是被当指令解析的,激进的 rule 会把 UI 拦截打掉。
Step 5:升级 Cursor
Help → Check for Updates。0.42 和 0.45 早期那个绕过 bug 在 0.46+ 修了。一时升不了的话,先别用 Agent 模式,用 Composer(每一步 shell 都会弹)顶着。
Step 6:拿一条已知危险命令验证
随便找个 scratch 仓库问 Agent:「Run echo TEST && false」。能弹确认就是回来了。还是静默跑,回到 Step 1 再审 allowlist。
Step 7:实在不放心,给 shell 套个 sandbox
确认门还是不可信的话,把 Cursor 集成终端指向一个 sandbox 包装脚本——所有不在安全列表里的命令都强制 stdin 输 yes/no。设置 → Terminal → Integrated → Default Profile。重了点但绝对兜底。
怎么验证修好了
- 重新让 Agent 跑一个需要 shell 的 prompt,确认弹窗必须出现。
- 让 Agent 跑一个多步计划,每一步 shell 都要弹,不是只弹第一步。
- reload 窗口再试一遍——设置要扛得住 reload。
- 打开
~/.cursor/settings.json确认你写进去的 key 还在。
长期预防
cursor.agent.allowedCommands默认就保持空,没强理由不要加。.cursorrules当代码看待——改了要走 PR review,别让 auto-run 那种 rule 偷偷溜进来。- 团队里把 Cursor 钉在一个公认稳定的 minor 版本上,一起升级。
- 新人 onboarding 时把 user 和 workspace 设置都查一遍,share 仓库的人会继承 workspace 设置。
- 涉及风险的分支(rebase、deploy)用 Composer,Agent 留给从零写代码的场景。
容易踩的坑
- 为了
npm test不弹,把npm加进 allowlist,忘了npm uninstall也算npm开头。 - user 设置改了半天,workspace 设置在默默盖掉。
- 只看 UI 开关,不看下层 JSON。
- 以为 Cursor 升级会重置设置——并不会。
- 老版本上以为确认弹窗能拦住
&&链式命令——不能。
常见问答
- YOLO 模式到底是什么? Cursor Agent 的一个设置,允许模型不逐条问就执行 shell 命令。脚本化任务方便,默认上有风险。
- 能只白名单安全命令吗? 能。用完整字符串如
npm test或pnpm build,别用前缀或通配符。 - 确认弹窗也拦文件编辑吗? 不拦。文件编辑走 diff review 流程。确认弹窗专门给 shell 命令用。
- 为什么 Agent 没问就 push 到 main 了? 要么
git在 allowlist 里,要么你批准了一个包含 push 的多步计划。 - 有没有紧急停止键? 点正在跑的任务上的 stop,或 Cmd+Shift+P → 「Cursor: Stop Agent」。失控进程直接 kill 集成终端。