
一、问题现象
当你重命名本地项目目录后(例如 project-old 改为 project-new),Codex 客户端可能出现以下情况:
- 数据库中能查到线程已在新路径
- 当前项目视图下却看不到部分旧线程
- 线程闪现后又消失
- 更新客户端后突然丢失历史线程
这类问题看似“迁移失败”,本质通常是多处索引状态不一致,而不是线程真正丢失。
下面是一次真实排查时的界面状态示例:

二、高频根因
Codex Desktop 的线程展示通常受以下三类数据影响:
~/.codex/state_5.sqlite中threads.cwd~/.codex/sessions/.../rollout-*.jsonl中session_meta.payload.cwd~/.codex/.codex-global-state.json中thread-titles.order与thread-titles.titles
只修改数据库并不一定足够,很多“迁移后看不到线程”的情况,实际上是后两项未同步导致。
三、标准排查流程
1)检查数据库线程归属
sqlite3 ~/.codex/state_5.sqlite "
SELECT COUNT(*) AS old_cnt FROM threads WHERE cwd='/path/to/project-old';
SELECT COUNT(*) AS new_cnt FROM threads WHERE cwd='/path/to/project-new';
"
2)核对 rollout 文件首行 session_meta.cwd
sed -n '1p' rollout-xxxx.jsonl | jq '.payload.cwd'
3)检查侧栏索引
jq -r '."thread-titles".order[]' ~/.codex/.codex-global-state.json
四、最小修复方案
修复 A:修改 rollout 首行 cwd
OLD='/path/to/project-old'
NEW='/path/to/project-new'
F='rollout-xxxx.jsonl'
first_line=$(sed -n '1p' "$F")
new_first=$(printf '%s' "$first_line" | jq -c --arg new "$NEW" '.payload.cwd=$new')
{ printf '%s\n' "$new_first"; tail -n +2 "$F"; } > "$F.rewrite"
mv "$F.rewrite" "$F"
修复 B:补齐 thread-titles 索引
STATE="$HOME/.codex/.codex-global-state.json"
ID='thread-id-example'
TITLE='迁移后线程'
jq --arg id "$ID" --arg title "$TITLE" '
."thread-titles".titles[$id] = (."thread-titles".titles[$id] // $title)
| ."thread-titles".order = ([ $id ] + (."thread-titles".order // []) | unique)
' "$STATE"
五、安全迁移清单
- 确认 realpath old == realpath new
- threads.cwd 已指向新路径
- rollout 首条 session_meta.payload.cwd 正确
- thread-titles.order 包含目标线程 ID
- 重启客户端验证
六、进阶建议:借助 Codex 自己帮你修复
如果你对命令行排查不熟悉,或者希望更快解决问题,可以在新项目目录中直接创建一个新的线程,然后把本文链接或者将本文完整内容复制粘贴给 Codex。
你可以这样提问:
我把项目目录改名后,旧线程不见了。
请根据这篇文章的排查步骤,帮我逐步检查并修复:
https://www.wuaishare.cn/7001.html
由于 Codex 可以直接读取本地文件、执行命令、分析 JSON/SQLite,它通常可以在几分钟内完成排查,比手动逐条检查更高效。
很多时候,与其焦虑“线程是不是丢了”,不如让工具帮你验证数据一致性问题。正确的提问方式,本身就是效率的一部分。
七、总结
项目改名后线程“消失”,大概率不是线程丢了,而是数据库归属、会话元信息、侧栏索引三者未完全一致。逐项校对,通常可以在几分钟内恢复可见。


评论