现象
把一个 Claude Code 会话的 JSONL 文件从项目 A 复制到项目 B 的 .claude/projects/ 目录后,在项目 B 中 /resume 搜索不到该会话。即使手动编辑 sessions-index.json 添加条目也无效。
排查过程
尝试 1:手动编辑 sessions-index.json
将 JSONL 文件复制到目标项目目录,并在 sessions-index.json 中添加完整条目(sessionId、fullPath、customTitle、summary 等)。
结果:/resume 搜索仍然为空。
尝试 2:修改 JSONL 内部的 cwd 字段
JSONL 文件的第一条 user 消息中有 cwd 字段,记录会话创建时的工作目录。推测 Claude Code 用 cwd 判断会话归属。
将 cwd 从原始项目路径改为目标项目路径。
结果:仍然搜不到。且发现同目录下另一个手动复制的会话(cwd 未修改)反而正常显示过,说明 cwd 不是决定因素。
尝试 3:从所有 JSONL 重建 sessions-index.json
用 Python 扫描目录下所有 JSONL 文件,提取元数据,重建完整的 sessions-index.json(29 个会话条目)。
结果:仍然搜不到目标会话。
结论
Claude Code 的 /resume 功能不仅仅依赖 sessions-index.json。可能存在的额外校验机制:
- 内部会话注册表:Claude Code 可能在内存或其他位置维护会话创建记录,只有通过正常流程创建的会话才被承认
- sessionId 绑定:会话 ID 可能与创建时的项目上下文绑定,复制到其他项目后 ID 校验失败
- sessions-index.json 是缓存不是源:Claude Code 可能在启动时重建这个文件,手动编辑会被覆盖
Workaround
直接用 session ID resume(绕过搜索):
claude --resume c4bed3ee-2468-489d-9bf3-f322fe474891手动迁移 JSONL 是逆向工程
sessions-index.json 和 JSONL 文件是 Claude Code 的内部实现,不是公开 API。手动操作随时可能因版本更新而失效。
正确做法(待验证)
- 在目标项目目录下直接启动新会话,而不是复制旧会话
- 如果需要跨项目共享上下文,用 MEMORY.md 或 CLAUDE.md 传递关键信息
/resume的Ctrl+A(显示所有项目)可以跨项目搜索,不需要迁移文件