开源一个 Codex 本地历史管理 CLI:从 list 到安全 purge

Codex 用久之后,本地对话历史会慢慢堆起来。这个问题本身不复杂,但清理起来并不适合靠手动改文件解决:本地数据可能分布在 SQLite、JSON、JSONL 和其他状态文件里,漏删会留下残留,误删又会破坏 Codex 的本地状态。

我最近开源了一个小工具 codex-history,它解决的是一个很具体的问题:先找到本地 Codex 对话,再用可确认、可验证的方式清理受支持的本地数据。

它不是服务端删除工具,也不是用来绕过 Codex 官方能力的工具。我的目标更保守:在本机数据结构受支持时,提供一个比手动编辑 ~/.codex 更清晰的本地清理流程。

为什么要做这个工具

我遇到的场景是:想清理某个项目相关的 Codex 会话,但不想打开本地数据库和状态文件一点点找。更麻烦的是,Codex 本地历史不是单个文件能概括的。对话列表、会话记录、全局状态、日志和一些派生文件之间可能存在引用关系。

所以我没有把这个工具设计成"传一个路径然后递归删除"的脚本,而是拆成几个明确步骤:

  1. 先检查当前数据结构是否支持。
  2. 再列出可读的本地会话。
  3. 用标题、首条用户消息、预览或 cwd 缩小范围。
  4. 删除前展示计划并要求确认。
  5. 删除后扫描受支持的本地存储,确认已知引用是否移除。

这就是 codex-history 的主线。

安装和第一步检查

安装方式:

bash 复制代码
npm install -g @liuyoumi/codex-history

也可以不安装直接运行:

bash 复制代码
npx @liuyoumi/codex-history doctor

我建议第一步永远先跑:

bash 复制代码
codex-history doctor

下面的示例截图来自临时 demo --codex-home,不包含真实用户数据:

doctor 的作用是确认当前 Codex 本地数据结构是否被这个版本支持。如果不支持,删除命令会拒绝执行,而不是猜测数据应该怎么删。

用 list 找到目标

最基础的命令是:

bash 复制代码
codex-history list

默认输出会尽量保持短,一行一条:

如果本地历史很多,可以先用关键词缩小范围:

bash 复制代码
codex-history list --grep "Purge"

这里有一个刻意的限制:--grep 只匹配显示标题、首条用户消息和预览,不匹配 thread id 或 cwd,也不会搜索完整对话正文。

原因很简单:这个工具首先是清理工具,不是全文检索工具。删除前的筛选应该足够可解释,不应该因为某个完整上下文里隐藏的词,把用户没有意识到的会话带进删除计划。

按项目路径筛选可以用 --cwd

bash 复制代码
codex-history list --cwd codex-history --pretty=medium

--cwd 支持路径片段,所以可以输入完整路径,也可以输入项目名的一部分。

purge 为什么要确认

删除单条会话:

bash 复制代码
codex-history purge 019e7047

交互式流程会先展示解析到的目标,并要求输入短 id:

这个确认不是形式主义。purge 是不可撤销的本地破坏性操作,所以工具会要求用户在最后一步重新确认"我要删的就是这一条"。

多条删除和过滤式删除也支持:

bash 复制代码
codex-history purge 019e6885 019e6874
codex-history purge --cwd /Users/me/Projects/example
codex-history purge --grep "Astro"
codex-history purge --archived

批量或过滤式删除要求输入 purge-selected。如果任意一个目标不存在、不唯一,或者命中当前 active thread,整个批量计划会在修改数据前拒绝执行,不会部分删除。

脚本里可以加 --force

bash 复制代码
codex-history purge 019e6885 --force

--force 只跳过交互确认,不会跳过数据结构校验、active thread 保护和删除后的验证。

purge-orphans 解决什么

除了正常会话,有时本地还可能留下孤儿数据。比如 threads 表还记录着某个会话,但 rollout 文件已经不存在;或者日志数据库里还有 thread id,但主线程记录已经没有了。

对应命令是:

bash 复制代码
codex-history purge-orphans

它会先展示计划、影响的 SQLite 行数、将删除的文件数量和估算的本地磁盘空间影响。确认时需要输入 purge-orphans

发布前可以补一张计划截图,但不要为了截图去真实用户目录里制造破坏性场景。建议使用 fixture、复制后的沙盒数据,或显式临时 --codex-home

设计取舍

第一,未知数据结构直接 fail closed。Codex 本地数据结构可能随版本变化,工具不能在未知结构上猜测删除。

第二,不做模糊删除。传入 id 或短 id 前缀时,必须解析到唯一目标。删除命令里"差不多匹配到了"是危险设计。

第三,--grep 不做全文检索。筛选删除目标时,我更看重结果可解释,而不是尽可能多地匹配。

第四,删除后做引用验证。删除执行完不代表清理成功,工具还会扫描受支持的本地存储,看目标 thread id 是否仍有已知引用。

适合群体

  • 经常使用 Codex Desktop 或 Codex CLI 的用户。
  • 想按项目或关键词清理本地 Codex 历史的人。
  • 不想手动编辑 ~/.codex 的人。
  • 希望删除前能看到明确目标和确认流程的人。

项目地址

GitHub: github.com/liuyoumi/co...

npm: www.npmjs.com/package/@li...

如果你也在用 Codex,并且遇到过本地历史不好清理的问题,可以试试看。更欢迎提 issue,尤其是不同平台或 Codex 版本下的反馈;觉得这个方向有用的话,也欢迎给个 Star 支持后续维护。

相关推荐
悟空码字13 小时前
别再手搓CRUD了,用飞算JavaAI的“工程流水线“,助力高效开发
aigc·openai·ai编程
阿新聊ai16 小时前
死磕claude code-Skill 不触发、乱触发、跑挂了:一份评测与调优指南
openai·ai编程
卡卡罗特AI19 小时前
ChatGPT取消5小时限额,Codex终于可以疯狂造起来了!Anthropic最严厉的父亲来了!
chatgpt·openai·ai编程
武子康19 小时前
OpenAI 把 Codex 接进 Claude Code:Coding Agent 从单兵工具进入协作系统
人工智能·openai·claude
武子康19 小时前
GPT-5.6 Sol、Terra、Luna 怎么选?我的素材库项目为什么最终使用 Sol + Medium
人工智能·chatgpt·openai
TrisighT20 小时前
Agent 聊了 20 轮 token 翻了 8 倍——三种截断方案实测,最蠢的那种反而最稳
aigc·openai·ai编程
云卷云舒___________20 小时前
Grok CLI 泄密用户文件、Codex推理优化、GPT-5.6 Sol 登顶 Arena 前端榜 | 7月13日 AI日报
openai·codex·xai·ai日报·grokcli·gpt56sol·designarena
怕浪猫20 小时前
第14章 性能优化与成本控制
openai·agent·ai编程
孟陬2 天前
高质量全方位的 AI 工具 sse-stuntman — Mock SSE 接口
前端·node.js·openai
武子康2 天前
🔥 多 GPU 推理决策顺序全解:单卡 → DP → TP → PP → EP 怎么选(vLLM/TensorRT-LLM/SGLang)
人工智能·llm·openai