AI Data Extractor Skill:一键导出多平台 AI 编程助手聊天记录为统一 JSONL 格式
AI Data Extractor Skill:一键导出 AI 编程助手聊天记录为统一 JSONL 格式
如果你用过 Claude Code、Cursor、Windsurf 这些 AI 编程工具,你可能有过这个困扰:每个工具存储聊天记录的方式完全不一样——有的用 SQLite,有的用 JSONL,有的干脆就是一个 Markdown 文件散落在项目目录里。想把它们统一备份、做分析、或者喂给模型微调,光是整理数据格式就要花大半天。
ai-data-extractor 解决的就是这个痛点:一个 Python 工具,自动扫描你的电脑,找出所有主流 AI 编程助手的聊天历史,统一转换为标准 JSONL 格式输出。2026 年 9 月 11 日上线,9 天内斩获 840 star,热度仍在上升。
功能与设计原则
核心能力:自动发现 + 统一导出。将不同 AI 编程助手的私有存储格式(SQLite、JSONL、JSON、Markdown)统一转换为标准化 JSONL,每条记录包含 messages、session_id、source、code_context、tool_use 等字段。
设计原则:
– 零依赖:纯 Python 标准库,无第三方包
– 只读优先:所有数据库连接均为只读模式,工具运行中不会阻塞编辑器
– 防御性解析:即便某个文件损坏,工具也会跳过并继续处理,不会整体崩溃
– 格式自适配:Cursor/Windsurf/Trae 等使用不透明 SQLite schema 的工具,采用启发式 key 扫描而非硬编码字段名
认可度
- GitHub Star:840(截至 2026-09-20),9 天新 repo,爆发力强
- Forks:135
- Issue 数:0(社区无 open issue,维护状态活跃)
- 增长轨迹:2026-09-12 约 61 star → 09-13 约 163 star → 09-14 约 377 star → 09-15 约 794 star(4 天翻 13 倍)
- GitHub trending:2026-09-19 GitHub 热门榜单新晋项目,AI 开发者工具类目持续吸睛
链接
GitHub:https://github.com/kruzovic7/ai-data-extractor
原作者
GitHub 用户名:kruzovic7(独立开发者)
暂无详细个人主页,但项目 README 描述清晰,更新频率高(最近一次更新 2026-09-19),可以看出是活跃维护状态。
详细介绍
ai-data-extractor 是一个开源 Python 工具包,解决 AI 编程助手数据碎片化问题。目前支持 10 个主流工具:
| 工具 | 存储格式 | 扫描路径 |
|---|---|---|
| Claude Code | JSONL(每会话一个文件) | ~/.claude/projects/*/.jsonl |
| Codex CLI | JSONL(rollout 文件) | ~/.codex/sessions/*/rollout-.jsonl |
| Cursor | SQLite(state.vscdb) | ~/…/Cursor/User/{global,workspace}Storage |
| Windsurf | SQLite(未公开 schema) | ~/…/Windsurf/User/{global,workspace}Storage |
| Trae | SQLite + JSONL | ~/…/Trae |
| Continue | JSON(每会话一个文件) | ~/.continue/sessions/*.json |
| Gemini CLI | JSON | ~/.gemini/tmp//chats/*.json |
| OpenCode | JSON(session/message/part 树) | ~/.local/share/opencode/storage/ |
| Cline / Roo Code | JSON(每任务一个文件夹) | /User/globalStorage//tasks/ |
| Aider | Markdown(每个项目目录一个) | /.aider.chat.history.md |
工具自动检测操作系统(macOS / Linux / Windows),覆盖各系统标准数据路径,无需手动指定。
Cursor、Windsurf、Trae 使用未公开的 SQLite schema,且这些 schema 在产品迭代中多次变更(如 Cursor 就经历至少三种 schema 形态)。工具对 Cursor 的三种已知形态均做了显式适配;对 Windsurf/Trae 则采用启发式 key 扫描(heuristic_extract_chat_from_kv),扫描键值对中匹配 role+text 结构的记录。
Aider 的存储最为特殊:每个项目目录下都有一个 .aider.chat.history.md,没有任何中心化数据库。工具默认扫描 home 目录加若干常见项目目录名(projects、code、dev、repos、workspace 等),最深 5 层,可通过 --search-path 参数指定项目路径。
特点
- 零依赖:仅用 Python 标准库(json、sqlite3、pathlib 等),pip install 免了
- 跨平台自动发现:macOS / Linux / Windows 三系统路径自动适配,无需手动指定
- 只读安全:数据库连接全部为只读模式,运行中的编辑器不会被打断
- 容错解析:启发式 schema 适配,未知版本也有概率成功提取
- 统一输出格式:JSONL 每行一个会话,包含 messages、source、session_id、project_path、created_at 等标准化字段
- 支持合并导出:
--merge参数可将所有来源合并为单一all_conversations.jsonl文件 - 支持扩展:提取器模块接口统一(
find_installations+extract),可自行添加新工具支持
使用方法
基本安装
git clone https://github.com/kruzovic7/ai-data-extractor
cd ai-data-extractor
python3 extract.py --help
查看已安装工具(不提取)
python3 extract.py --list
交互式提取(菜单选择来源)
python3 extract.py
指定来源提取
# 只提取 Cursor 和 Claude Code
python3 extract.py --sources cursor,claude_code
# 提取全部来源
python3 extract.py --all
合并输出
python3 extract.py --all --merge
# 生成 extracted_data/all_conversations.jsonl
指定额外搜索路径
python3 extract.py --sources aider --search-path ~/client-work --search-path /mnt/data/repos
输出文件在 extracted_data/ 目录,每源一个时间戳文件:
extracted_data/
├── claude_code_conversations_20260920_143022.jsonl
├── cursor_conversations_20260920_143022.jsonl
└── ...
使用场景与人群
适用场景:
– 数据备份:在工具数据库被清除前统一导出历史会话
– 微调训练:将个人编程对话整理为训练数据集,用于微调代码模型
– 成本审计:分析 token 使用量和对话频率,评估 AI 编程投入产出
– 合规留存:企业场景下留存 AI 辅助编程的完整对话记录
– 工作流复盘:回溯特定 bug 或功能的历史 AI 辅助决策过程
目标用户:
– 深度使用 Claude Code、Cursor、Windsurf 等工具的开发者
– 需要汇总团队成员 AI 编程数据的 Tech Lead
– 计划用个人编程数据微调模型的研究者和独立开发者
– 关注 AI 辅助编程效率与合规管理的企业团队
输入与输出案例
输入(Claude Code 原始 JSONL 片段):
{
"messages": [
{"role": "user", "content": "How do I fix this TypeScript error?", "code_context": [{"file": "/src/index.ts", "code": "const x: string = 123;"}]},
{"role": "assistant", "content": "The error occurs because you're assigning a number to a string type...", "tool_use": [{"name": "edit_file", "input": {"path": "src/index.ts"}}]}
],
"source": "claude-code",
"session_id": "c1a2b3...",
"project_path": "/Users/you/project",
"name": "TypeScript Type Error Fix",
"created_at": 1705414222000
}
输出(统一 JSONL,单行一条会话,可直接用于 datasets.load_dataset("json", data_files=...)):
{"messages": [...], "source": "claude-code", "session_id": "c1a2b3...", "project_path": "/Users/you/project", "name": "TypeScript Type Error Fix", "created_at": 1705414222000}
使用注意:提取后正式分享或训练前,强烈建议运行 detect-secrets 扫描敏感信息,并人工审查 code_context 和 tool_use 字段中是否包含私有代码路径、API Key 或客户代码片段。
评论区
登录后可评论。