Cursor Composer 大刀阔斧改错

Composer 一次改 10+ 文件、把能跑的代码改坏——这是 prompt 边界没设,加上 agent 默认权限太大。

你给 Composer 写了”清理一下这段”或”统一下风格”,回头一看 git status 显示 14 个文件变更、500+ 行改动、连命名约定都改了。能跑的测试现在挂三个。问题不在模型”贪心”,而在 Composer 默认把任何模糊指令当成”我可以做我认为对的事”,agent 模式更激进。

止血只要 git checkout,但要让 Composer 下次不再这么放肆,得改你交给它的边界。

常见原因

1. Prompt 用了动词模糊词

“clean up”、“refactor”、“improve”、“polish”、“modernize” 这类词没有上限。模型把它们当成”做你认为应该做的全部”,于是改命名、抽函数、重排参数、加注释一起来。

如何判断:把你的 prompt 第一句拎出来,看动词是否”unbounded”。“clean up” 是,“rename foo to bar” 不是。

2. Agent 模式默认有写多文件 / 跑命令权限

Composer 在 agent 模式下可以 read_file → grep → edit_file 跨整个仓库迭代。你只问了一件事,它”顺便”修了它认为相关的另外 8 件。

如何判断:Composer 输入框模式下拉是不是 “Agent” 而不是 “Edit” / “Ask”;Agent 模式下一次回复会列十几个 tool call。

3. 没列”不要碰”的清单

模型不知道哪些文件神圣。migrations/generated/vendor/schema.prisma、第三方 SDK 包装层这些都是高危区,但你不说它就改。

如何判断:看 git diff --stat,是否有改动落在”我从来没让你碰过这”的目录。

4. 没 commit 就连发多 prompt

你给一句 prompt → 它改了 → 不满意 → 再来一句 → 又改。3 轮后 diff 已经混在一起了,最后 revert 起来分不清哪改哪没改。

如何判断git log --oneline 看上一次 commit 是不是今早或几天前。

5. 模型选错(agent 用了重写型模型)

opus / gpt-5 在 agent mode 下倾向”大刀阔斧”重构;sonnet / haiku 倾向保守 patch。任务是 surgical edit 时用大模型反而误伤。

如何判断:看 Composer 右下角模型;如果是 opus 又是 surgical 任务,模型选错了。

6. .cursorrules 没说”小改动优先”

没 rules 时模型按训练时学到的”好工程师风格”行动——其中包括”看到坏代码就重构”。你不显式说”don’t refactor unless asked”它就会。

如何判断:仓库根 cat .cursorrules;如果没有 “minimal edits” / “don’t refactor” 类条款就要补。

动手前先确认

  • 确认问题是在 Composer / Cmd+K / chat 哪个入口;Cmd+K 局部、Composer 全局、行为差很大。
  • 出问题立刻别再发 prompt,先 git diff > /tmp/diff.patch 留证据再决定 revert。
  • 记下 Cursor 版本和当前模型;切换模型重跑同 prompt 行为可能完全不同。

需要收集的信息

  • 触发 misedit 的 prompt 全文。
  • git diff --stat 输出,列出哪些文件改了多少行。
  • 当前模型 + 模式(Ask / Edit / Agent)+ 是否开 Max mode。
  • 仓库 .cursorrules 内容、是否有 .cursorignore

最短修复路径

按”先止血再修方法论”顺序。

Step 1:止血 + 留证据

git diff > /tmp/composer-misedit.patch   # 留个 patch 备查
git stash                                # 临时收起,不丢
# 或直接 revert:
git checkout HEAD -- .                   # 丢掉所有未 commit 改动

Step 2:分类筛留——只保留你要的

如果只是 5/14 文件想留:

git stash pop                            # 取回 patch
# Cursor 内 source control 面板逐文件 discard
# 或命令行:
git checkout HEAD -- path/to/unwanted-file

也可以 git add -p 交互式只 stage 想要的 hunk。

Step 3:重写 prompt,加 explicit scope

把 unbounded 词换成 surgical 词:

原:refactor the auth module
改:In src/auth/login.ts only:
    1. Replace the magic string "DEFAULT_TIMEOUT" with the constant from config.
    2. Do NOT change function signatures.
    3. Do NOT touch any other file.
    4. Do NOT add or remove comments.
    Output a unified diff, ≤ 30 lines.

Step 4:切到 Edit 模式或 Cmd+K,限制行动空间

Composer 输入框模式下拉 → “Edit” 而不是 “Agent”。Edit 模式只改你 @ 的文件、不会跨文件迭代。

外科级修改用 Cmd+K(选中要改的代码块再触发),权限缩到选中范围内。

Step 5:在 .cursorrules 里写死”保守原则”

# .cursorrules
- Make the minimum change required to satisfy the prompt.
- Do NOT refactor, rename, or reformat code that is not explicitly mentioned.
- Do NOT touch files in: migrations/, generated/, vendor/, schema.prisma.
- If the task seems to require changes outside the listed files, STOP and ask first.
- Preserve existing comments and existing import order unless asked to change them.

Step 6:危险任务前 commit

养成 Composer 大任务前 git commit -m "wip: before composer" 的习惯。失败 revert 成本秒级。

怎么确认已经修好

  • 用同一 prompt 重跑一次,检查改动是否限定在你 @ 的文件里。
  • 让队友打开同一 workspace 用同样 prompt 重跑,确认是规则层的修复。
  • 跑测试 + lint,确认 diff 没引入风格 / 行为漂移。

如果还是没修好

  • 把 prompt 缩到极小:单一动词 + 单一文件 + 单一目标行。
  • 回滚最近一次 .cursorrules 改动,逐项确认是哪条没起作用。
  • 在 forum.cursor.com 搜 “composer over-edits”;附 Cursor 版本 + 模型 + prompt + diff。
  • 抓 View → Output → Cursor 日志贴 Bug Reports。

预防建议

  • 每次开 Composer 前 commit,给自己一个干净基线。
  • prompt 模板里加 “Constraints” 段:allowed files / forbidden files / max diff lines。
  • 默认用 Edit 模式或 Cmd+K,agent 模式只在你确定要 multi-step 时手动开。
  • .cursorrules 写死 “minimum diff” 原则 + 神圣目录清单。
  • 给重要文件加显眼注释:// DO NOT MODIFY without ticket #1234 —— 模型看了通常会跳过。

相关阅读

标签: #排查 #Cursor #排查 #误改