说在前头:我同时用了四个 AI 编程 CLI 工具,对话记录散落在系统各处,格式还全不一样。这篇文章记录的是我花了一天把它们全部收进一个 Obsidian vault 的过程。没有现成的导出指南,最后全靠”挖本地文件 + 读 CHANGELOG”硬刚出来的。
为什么要折腾这个
我是个管不住手的折腾爱好者(这博客哪篇文章不是折腾出来的),同时用着四个 AI 编程 CLI 工具:Antigravity CLI、Claude Code、OpenCode、grok-cli。每个工具都跟我聊了几十上百个会话,帮我做过博客、整蛊平台、刷课脚本、翻页时钟……
问题是:这些对话记录全散着。
这四个工具各自把对话存在系统不同角落,格式还都不一样。我在 Antigravity 里跟 AI 讨论过的 boom 架构设计,和在 OpenCode 里做的 boom 代码审查,完全是两条线,谁也接不上。更别提有时候我换了个工具继续同一个项目,前因后果全断了。
所以我想:能不能把这些对话全收进一个地方,整理成能检索的知识库?
(这不是什么新鲜想法,Karpathy 之前就提过用 LLM 帮你维护个人 wiki 的思路,刚好有个现成的 skill 可以用。)
第一步:建 vault
先用 Obsidian 建了个空 vault,分了三个目录:
raw/- 放原始对话日志和代码库综述(原料区)wiki/- 放结构化知识页面(成品区)journal/- 日记(后来没用上)
然后 git init,写好 .gitignore(排除了依赖、密钥、临时文件),首次提交 init: empty vault。干净的空仓库,准备开干。
第二步:Antigravity CLI(踩坑最重的部分)
官方文档啥也没写
Antigravity CLI 号称有”持久化历史”功能,但你翻遍官方文档和 GitHub README,关于历史存哪、什么格式、怎么导出—一个字都没写。文档站还是个 JS 渲染的单页应用,抓都抓不到正文(这文档站做得跟没上线似的)。
到这一步我已经开始怀疑了:一个有”持久化历史”功能的工具,官方居然没有任何导出说明?
仓库里根本没有源码
不死心,我去翻 Antigravity CLI 的 GitHub 仓库目录结构,想直接看源码里历史是怎么存的。结果发现—
这个仓库根本没有源码目录。
根目录就三个文件:CHANGELOG.md、README.md、一个 25MB 的 demo gif,外加一个 examples/ 目录(里面只有 statusline 和 title 两个示例)。CLI 本体是闭源的。
(也好理解,Google 的东西嘛,开源个壳子意思一下。)
读 CHANGELOG 逆天改命
正准备放弃这条路的时候,我顺手抓了 CHANGELOG.md 的原始内容。这一抓,金矿出来了。
CHANGELOG 里大量版本更新都提到了会话历史相关的改动,拼凑出了完整的信息:
- 会话格式:SQLite 数据库(
.db文件),从 v1.0.4 起是正式会话格式 - 存储目录:在 Gemini 的配置目录下(因为 Antigravity 基于 Gemini 生态),有个专门的
antigravity-cli子目录 - 查看/恢复历史:
/resume斜杠命令,交互式选择器,支持搜索、重命名、删除 - 命令行恢复:
agy -c <会话ID> -p <路径>可以 headless 恢复指定会话 - workspace 映射:有个
projects.json存着”工作目录 -> 项目”的映射关系
人话解释:Antigravity CLI 把你每次跟它的对话存在一个数据库文件里,不是明文文本。数据库文件藏得很深,在 Gemini 的配置目录底下。你想看历史对话得用
/resume命令在 CLI 里交互式浏览,没有现成的”导出”按钮。
与其继续猜数据库文件的确切位置和结构,不如直接看本机实际的目录—既然有历史对话,本地就一定有这个目录。
果然,一查本地,17 个会话文件整整齐齐躺在那。导入 vault,commit 完成。
第三步:Claude Code 和 OpenCode(直接挖本地)
有了 Antigravity 的经验,这回我直接跳过查文档,挖本地数据目录—反正对话存在本机,找到文件就完事。
Claude Code
Claude Code 的对话存储相对”正规”:每个项目一个目录,目录名是工作目录路径编码后的字符串(把 / 替换成 -),里面每个会话一个 .jsonl 文件,文件名是 session UUID。
人话解释:JSONL 就是”一行一个 JSON 对象”的文本格式,每行存一条消息。比 SQLite 数据库友好多了,至少能用文本编辑器直接打开看。
本机查下来,Claude Code 下有几个项目的对话记录,每个项目里若干个会话文件,清清楚楚。
OpenCode
OpenCode 的存储方式和 Antigravity 类似—SQLite 数据库。一个 opencode.db 文件装下所有会话。
这里有个差点踩的坑:OpenCode 的数据目录里除了数据库,还有凭证相关的文件(认证信息、账号配置)。这些绝对不能导入 vault,不然就等于把钥匙塞进保险箱还贴了张条子写”钥匙在里面”。
人话解释:四个工具两种存储方式。SQLite 数据库(Antigravity、OpenCode)和 JSONL 文本文件(Claude Code、grok-cli)。数据库需要写脚本查询导出,JSONL 直接复制就行。这就是为什么后面的整理工作量不一样。
第四步:grok-cli 和代码库
grok-cli 的对话也在本地,JSONL 格式,6 个会话,直接导入。
除了对话记录,我还把本地几个项目的代码库也做了综述导入—boom(整蛊平台)、博客、翻页时钟、open-design 等。每个代码库写一份”它到底在干什么、用了什么技术栈”的综述放进 raw/,这样 wiki 页面引用时有据可查。
第五步:用 skill 编译成 wiki
原料全进 raw/ 之后,用 karpathy-llm-wiki skill 把它们编译成结构化的 wiki 页面。
编译出来的 wiki 分几种类型:
- 实体页(entity):每个工具、每个项目一个页面,记”它是什么、什么技术栈、关键属性”
- 概念页(concept):跨项目提取的技术概念,比如”AI CLI 对话存储机制”把四个工具的存储方式放一张表对比
- 综述页(summary):每个工具的对话记录综述,提炼出”聊了什么、做了什么”
比如 boom 这个项目,在 Antigravity 里讨论过架构设计,在 Claude Code 里做过代码审查,在 OpenCode 里重设计过 UI—这些原本散在三个工具里的对话,现在通过 wiki 页面上的交叉引用串起来了。
第六步:分类重构(两次)
第一版 wiki 是按工具分类的:Antigravity 一堆、Claude Code 一堆、OpenCode 一堆。但很快发现问题—同一个项目的信息被打散到不同工具目录下了。boom 的架构设计在 Antigravity 目录,代码审查在 Claude Code 目录,UI 重设计在 OpenCode 目录,找起来要跨三个地方。
于是第一次重构:改成 tools/(工具)+ summaries/(对话综述)+ 项目目录(按项目聚合)。
用了之后又觉得不对:projects 里面混着”实用工具”(boom 整蛊平台、刷课脚本)和”展示作品”(博客、翻页时钟),这俩性质完全不同。
于是第二次重构:拆成三大类—
- projects:实用工具,解决实际问题的(boom、刷课、文件互传、办公自动化 agent)
- creations:展示作品,美学与表达的(博客、翻页时钟)
- explorations:学习笔记,研究别人开源项目的(open-design)
人话解释:就像整理书架,第一版按”在哪买的”分(京东一堆、淘宝一堆),发现不好用;第二版按”是什么”分(工具书一堆、小说一堆),发现还是混;第三版按”用来干嘛”分(干活用的、看着爽的、学东西的),终于顺了。
两次重构一共移动了 19 个文件,所有跨目录链接全部更新。链接用 Obsidian 的 [[双链]] 语法,改一次目录就要批量修一堆引用,痛不欲生。
成果
一天下来,知识库的格局是:
- 4 个工具的对话记录全部导入(Antigravity 17 会话、Claude Code 11 会话、OpenCode 69 会话、grok-cli 6 会话)
- 7 个代码库的综述
- 30+ 个 wiki 页面(实体页 + 概念页 + 综述页)
- 三级分类(tools / projects+creations+explorations / summaries),交叉引用串成网
最爽的是:现在开一个新会话,让 AI 先去读 wiki 的 index,它就能快速恢复”我之前用这些工具做过这些项目、踩过这些坑”的上下文。相当于给没有跨会话记忆的 AI 装了个外挂记忆。
踩坑总结
| 坑 | 解法 |
|---|---|
| 官方文档没写导出方法 | 放弃文档,直接挖本地数据目录 |
| Antigravity 仓库没源码 | 读 CHANGELOG 反而挖到最关键的信息(存储格式、路径、命令) |
| 四种存储格式全不同 | SQLite 的写脚本查表导出,JSONL 的直接复制 |
| OpenCode 数据目录混着凭证文件 | 导入前仔细甄别,凭证文件绝对不能进 vault |
| wiki 分类两次都不对 | 第一次按工具分(信息打散),第二次按项目分(性质混淆),第三次按用途分才顺 |
| 改目录要批量修链接 | Obsidian 双链的代价,改一次痛一次 |
后记
这次折腾最大的感悟是:有时候官方文档帮不了你,但 CHANGELOG 可以。 Antigravity CLI 的 CHANGELOG 里密密麻麻记着每次版本更新对会话历史的改动,拼起来就是一份完整的”数据存储演进史”。官方文档啥都没写,CHANGELOG 全写了。
(所以养成写 CHANGELOG 的好习惯啊各位开发者,你永远不知道谁会在哪天靠这玩意儿救命。)
知识库现在还在用,每次新会话产出有价值的内容就往里沉淀。虽然 AI 没有跨会话记忆,但有了这个 vault,至少不用每次从零开始解释”我是谁、我做过什么、别再问我为什么用 vibe coding 了”。

评论