Cursor 聊天读错文件

你 @ 一个文件但 Cursor 答的是另一个同名文件的内容——文件名歧义、索引陈旧、symlink 迷惑。

你在 chat 里输 @utils.ts,让 Cursor 解释里面的 formatDate,结果它聊的内容你完全不认识——它读的是 packages/admin/utils.ts 而不是你期望的 packages/web/utils.ts。或者更怪:它讲了一个你三天前删掉的函数。这通常不是模型胡说,而是 @ 选择器在多个同名文件里挑错、索引滞后于真实磁盘、或 symlink 让它误以为另一份是同一份。

修法核心是消歧 + 强制 reindex。

常见原因

1. 同名文件多份,@ 选择器挑错

monorepo / 大型项目里 index.tstypes.tsutils.tsconfig.ts 等会有几十份。@ 自动补全按相似度排序,列表里你点了第二个、它其实存了第一个 path。

如何判断

fd "utils.ts" .             # 或 find . -name "utils.ts" -not -path "*/node_modules/*"

如果输出 > 1 行,就有歧义。

2. 索引陈旧——还在引用旧版本 / 已删除文件

你刚 git mv old.ts new.tsgit rm old.ts,索引还没更新;Cursor 仍按旧索引取出旧文件内容回答。

如何判断:Settings → Features → Codebase Indexing 看 “Last indexed” 时间;如果比你 rename 早,就是陈旧。

packages/shared symlink 到 ../shared,Cursor 索引可能两份都存、但读时按 symlink target,与你 @ 的路径不一致。

如何判断

find . -type l -not -path "*/node_modules/*"

4. 文件改名后 chat 引用了旧 attachment

旧对话里 @ 的文件路径已经过期。继续在同一对话发 prompt,Cursor 还试图读旧路径,要么读到旧缓存要么读到同名新文件。

如何判断:上下文面板里 @ 文件的路径加灰显示 / 标 “missing”。

5. 测试 fixture 和源码同名

src/parser.tssrc/__tests__/fixtures/parser.ts,retrieval 把 fixture 排到前面,模型解释 fixture 的逻辑。

如何判断:context 面板里出现 fixtures/ / __tests__/ 下的同名文件。

6. 大小写敏感差异(macOS / Linux 差)

macOS APFS 默认不区分大小写,User.tsuser.ts 在 macOS 上是同一文件,在 Linux CI 上是两个。Cursor 索引按 OS 行为存,跨机器协作时混淆。

如何判断fd -i "user.ts" . 看有几条命中(-i = 忽略大小写)。

动手前先确认

  • 确认是 chat / Composer / Cmd+K 哪个入口出问题;Cmd+K 直接基于光标位置不会读错。
  • 复现前先 commit 一次,避免 rename / 删 symlink 改动丢追踪。
  • 记下 Cursor 版本、当前模型、是否在 monorepo。

需要收集的信息

  • 你 @ 的文件名 + 模型回答里引用的内容。
  • fd <filename> . 输出(列出所有同名文件)。
  • Settings → Features → Codebase Indexing → “Last indexed” 时间。
  • Composer / chat 上下文面板截图,看实际加载了哪个路径。

最短修复路径

按”立刻消歧 → 系统改善”排序。

Step 1:删旧 @,用全路径重 attach

把当前 @ 删掉,重新输:

@packages/web/utils.ts

让 @ 走全路径而不是文件名。如果路径里还有歧义,补到目录级:

@packages/web/src/utils.ts (而不是 @utils.ts)

Step 2:在 prompt 里再次显式指认

I'm asking about the formatDate function in packages/web/utils.ts (NOT any other utils.ts in this repo).
Please confirm the file path you're reading before answering.

让模型先 echo 路径,错了你立刻发现。

Step 3:触发 reindex

Cmd+Shift+P → “Cursor: Resync Index”。等 5-30 分钟。如果只是一两个文件刚改名:

Cmd+Shift+P → "Cursor: Reindex Current File"

Step 4:rename 消歧(最稳)

如果两份同名文件长期共存,给一个起独特名字:

git mv packages/admin/utils.ts packages/admin/adminUtils.ts
# 更新所有 import
rg "from .*admin/utils" --files-with-matches | xargs sed -i '' 's|admin/utils|admin/adminUtils|g'

模型再也不会混。

Step 5:清理过期 @ + 重开 chat

旧 chat 里的 @ 可能挂着失效路径。新开 chat(Cmd+L 重置 chat),重新 @,模型不会带过去的上下文残留。

如果一份目录是 symlink 重复:

# 把 symlink 加入 .cursorignore
echo "packages/shared-link" >> .cursorignore
# 或彻底用 npm/pnpm workspaces 而不是 symlink

怎么确认已经修好

  • 重新 @ 后让模型 echo 文件路径,确认是你期望的那条。
  • 用同一 prompt 在另一台机器同步同仓库重做,确认是路径层修复。
  • Composer 答案里引用的代码片段,能在你期望的文件里 grep 到。

如果还是没修好

  • 把 prompt 缩到最小:只 @ 一个全路径文件 + 一句 “what’s in this file?”。
  • 回滚最近一次 rename / .cursorignore 改动。
  • 在 forum.cursor.com 搜 “wrong file context”;附 fd 输出 + 截图。
  • 抓 View → Output → Cursor 索引日志贴 Bug Reports。

预防建议

  • 重要文件起独特名字,少用 utils.ts / types.ts / index.ts
  • 大重构 / rename 完立即 Cmd+Shift+P → Resync Index,不要等。
  • @ 习惯用全路径,养成 muscle memory,避免 @ 列表里选错。
  • symlink 改 native workspace(npm / pnpm / yarn workspaces)。
  • 跨 macOS / Linux 的项目用大小写敏感文件系统(macOS 可建 case-sensitive APFS volume)。

相关阅读

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