1. 项目概述:一个为AI开发者打造的会话历史管理利器
如果你和我一样,日常重度依赖 Claude Code 和 Cursor 这两个AI编程助手,那你一定遇到过这个痛点:上周那个解决了某个诡异docker-compose网络问题的对话,或者昨天那个生成了完美React组件逻辑的会话,现在怎么也想不起来具体是哪个了。在项目文件夹里翻找那些散落的.jsonl或.txt文件,无异于大海捞针。chat-history这个用 Rust 编写的高性能命令行工具,就是来解决这个问题的。它不是一个简单的文件查看器,而是一个专为开发者设计的、具备智能搜索和上下文管理能力的“会话记忆中枢”。
简单来说,chat-history能让你像使用grep搜索代码一样,闪电般地搜索你与 Claude 或 Cursor 的所有对话历史。无论是通过会话摘要、第一条提示,还是深入对话内容本身,它都能在亚秒级内返回结果。更重要的是,它原生支持为 Claude Code 和 Cursor 的 AI Agent 安装“技能”(Skill),让 Agent 在与你对话时,能自动查询相关历史,形成真正的“记忆延续”。对于追求效率、厌恶信息碎片化的开发者而言,这无疑是一个能将 AI 助手价值最大化的基础工具。
2. 核心设计思路:为什么是 Rust + 双层搜索架构?
2.1 技术选型:Rust 带来的性能与可靠性优势
这个项目选择用 Rust 实现,绝非偶然。处理可能包含数万条消息、总大小数 GB 的会话历史文件,性能是首要考量。Rust 的零成本抽象和内存安全特性,在这里发挥了关键作用。
- 极致性能:会话索引的构建和搜索操作涉及大量的字符串处理、JSON 解析和并行计算。Rust 的编译时优化和高效的内存管理,确保了即使在首次扫描全量历史文件时也能保持流畅。在实际测试中,对包含上千个会话的索引进行关键词搜索,响应时间稳定在 100 毫秒以内,这种“无感”的搜索体验是脚本语言(如 Python)难以企及的。
- 并发安全:工具利用
rayon库进行数据并行处理,在深度搜索(--deep)时需要同时解析多个 transcript 文件。Rust 的所有权系统和rayon的安全抽象,使得编写高效且绝不会出现数据竞争的并行代码变得非常简单,这对于保证工具稳定性至关重要。 - 单文件部署:通过
cargo install编译出的二进制文件是静态链接的,可以轻松复制到任何同类系统上运行,无需担心运行时环境或依赖库版本问题,大大简化了分发和使用。
注意:虽然安装需要 Rust 工具链,但一旦通过
cargo install完成安装,用户使用的就是一个独立的、高性能的可执行文件,与复杂的 Rust 开发环境完全解耦。
2.2 架构解析:索引搜索与深度搜索的双层设计
chat-history最精妙的设计在于其双层搜索架构,这直接借鉴了现代搜索引擎的思想,在速度与完整性之间取得了完美平衡。
第一层:索引搜索(Index Search)这是默认的搜索模式,速度极快(亚秒级)。它并不直接打开庞大的 transcript 文件,而是读取一个由 Claude Code/Cursor 自动生成的轻量级sessions-index.json文件。这个索引文件通常只包含会话的元数据:
- 会话摘要(Summary)
- 第一条用户提示(First Prompt)
- 关联的 Git 分支(Branch)
- 项目路径(Project Path)
- 时间戳和基础统计信息
搜索时,工具会对这些字段进行加权匹配(例如,摘要匹配的权重是分支匹配的3倍),并结合时间衰减因子(今天的会话权重更高)进行综合评分。只有当索引搜索的结果评分低于阈值(例如< 5.0)时,系统才会自动“降级”到第二层搜索。这种设计意味着,对于大多数通过摘要或核心提示就能定位的会话,搜索是瞬间完成的。
第二层:深度搜索(Deep Search)当使用--deep参数或索引搜索未找到满意结果时,工具会启动深度搜索。这会动用rayon并行池,同时打开并解析指定的原始 transcript 文件(.jsonl或纯文本),深入每一条助理和用户的消息内容中进行查找。
深度搜索的评分算法复杂得多,它融合了多个开源项目的策略:
- 核心术语精确匹配:如果查询词是
“docker”、“react”这类明确的框架/工具名,匹配项会获得很高基础分(10分)。 - 词边界与子串匹配:在完整单词边界上匹配得2分,作为子串匹配则得1分。这保证了搜索
“auth”能有效命中“authentication”。 - 语义增强:这是智能化的关键。当查询包含
“error”时,对话中实际出现错误堆栈或日志的部分会被额外加权(3倍)。当查询包含“fix”、“solve”时,那些包含解决方案、修正代码的段落会获得更高权重(2.8倍)。这使搜索结果更贴合开发者的真实意图——找错误时优先看到报错上下文,找方案时优先看到解决代码。 - 去重与限流:为了避免同一个会话中大量相似内容淹没结果,算法会对内容进行归一化签名,并限制每个会话最多只贡献3个最佳匹配片段。
这种“索引先行,深度兜底”的策略,确保了 90% 的日常查询都能得到即时响应,同时在需要深挖时又能提供全面、相关的结果。
3. 从安装到上手:完整实操指南
3.1 安装与环境准备
安装过程非常 straightforward,前提是你的系统已经安装了 Rust 工具链。如果你还没有安装 Rust,强烈建议通过官方rustup脚本进行安装,它能帮你管理多个 Rust 版本。
# 1. 安装 Rust (如果尚未安装) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 安装完成后,按照提示执行 source 命令或重启终端,使 cargo 命令生效。 # 2. 通过 cargo 从 crates.io 安装 chat-history cargo install chat-history安装成功后,chat-history以及它的短别名ch会被放置在~/.cargo/bin/目录下。请确保该目录已加入你的系统PATH环境变量中(rustup通常会自动配置)。
从源码构建:如果你想体验最新开发版或进行二次开发,可以克隆仓库并本地安装。
git clone https://github.com/ay-bh/chat-history.git cd chat-history cargo install --path . # 这会在本地编译并安装3.2 核心命令详解与使用场景
安装完成后,你就可以开始探索你的对话历史了。下面我们拆解每个核心命令,并附上真实的使用场景。
3.2.1 列出会话 (list, 默认命令)这是最基础的命令,用于浏览所有会话。直接运行chat-history或ch会按时间倒序列出所有会话。
# 基础列表 ch # 实用过滤组合:查看昨天所有会话,并按日期分组显示 ch --from yesterday -s # 输出示例: # 2024-05-14 # [a1b2c3d4] 10:32 Fix Docker network conflict in compose file # [e5f6g7h8] 14:15 Implement user auth middleware with JWT # 2024-05-13 # [i9j0k1l2] 09:18 Debug React infinite re-render loop-s(--group-by-day) 参数让输出按日期分组,视觉上更清晰,特别适合回顾近期工作。--from和--to支持自然语言日期(如“3 days ago”,“last monday”)和标准日期格式,过滤非常灵活。-k(--keyword) 可以在列表时就进行关键词过滤,-v会同时显示会话的完整ID和文件路径,便于后续脚本处理。
3.2.2 智能搜索 (search)这是工具的精华所在。搜索时,务必理解索引搜索和深度搜索的区别。
# 场景1:快速回忆——“我之前处理过身份验证的问题” ch search “auth” # 这会快速扫描索引(摘要、首条提示),可能返回标题或首条提示包含“auth”、“authentication”的会话。 # 场景2:深度挖掘——“我记得在某个对话的中间部分讨论过‘递归组件的性能优化’” ch search “递归 组件 性能” --deep # 使用 `--deep` 强制搜索全部对话内容。对于中文或复杂技术短语,深度搜索更有效。 # 场景3:精准定位——“找上周在‘feature/user-profile’分支上关于‘头像上传’的对话” ch search “头像上传” --branch feature/user-profile --from “last week” # 结合分支和时间过滤器,能极大缩小范围。 # 场景4:排查问题——“最近遇到的构建错误是什么?” ch search “error: failed to compile” --scope errors --timeframe week # `--scope errors` 会启用错误模式增强,优先高亮对话中的错误堆栈和日志部分。 # `--timeframe week` 将搜索范围限制在过去一周。3.2.3 查看会话详情 (inspect与view)搜索到目标会话ID(如[a1b2c3d4])后,下一步就是深入查看。
inspect命令给你一个高度概括的“摘要页”,非常适合快速回顾。ch inspect a1b2c3d4 # 输出会包括: # - 关键决策 (Key Decisions) # - 使用的工具 (Tools Used) # - 涉及的文件 (Files Touched) # - 使用的模型和令牌统计 # 这让你在几秒钟内就能重拾会话的核心上下文。view命令则用于查看完整的对话原文。# 查看完整对话 ch view a1b2c3d4 # 以纯文本格式查看,便于用 grep, head 等工具进行二次处理 ch view a1b2c3d4 --plain | grep -A 5 -B 5 “docker run” # 查看并包含工具调用的具体名称(如 `bash_command`, `read_file`) ch view a1b2c3d4 --tools
3.2.4 导出与复用 (export与resume)
export能将对话导出为结构清晰的 Markdown 文件,方便分享、归档或放入笔记软件。ch export a1b2c3d4 -o ~/notes/claude_sessions/docker_fix.mdresume是 Claude Code 用户的专属利器。它可以直接在 Claude Code 中重新打开一个历史会话,让你在完全相同的上下文中继续对话。这个功能对于中断后继续工作、或者基于历史会话提出新问题来说,体验是无缝的。ch resume a1b2c3d4 # 执行后,你的 Claude Code 界面会跳转到这个历史会话。
3.3 为 AI Agent 安装技能(Skill)
这是将chat-history从个人工具升级为团队协作或智能工作流的关键一步。安装技能后,Claude Code 或 Cursor 中的 AI Agent 在与你对话时,能够主动调用这个工具去搜索你的历史会话,从而获得更连续的上下文。
chat-history install-skill这个命令会在~/.cursor/skills/和~/.claude/skills/目录下分别创建一个chat-history文件夹,并将内置的SKILL.md描述文件放入其中。AI Agent 在启动时会读取这些技能描述,从而知道如何调用chat-history命令来搜索历史。
实操心得:安装技能后,你可以尝试对 Agent 说:“看看我之前有没有遇到过类似的WebSocket连接超时的问题?” 有技能的 Agent 可能会在后台执行类似ch search “WebSocket timeout” --deep --timeframe month的命令,并将找到的相关历史会话摘要作为上下文提供给当前的对话。这相当于让你的 AI 助手拥有了“长期记忆”。
重要提示:每次通过
cargo install升级chat-history后,都应该重新运行一次install-skill命令,以确保 Agent 使用的技能描述文件是最新版本,包含所有最新的参数和能力说明。
4. 高级技巧与排查指南
4.1 搜索策略优化:如何精准找到你想要的内容
单纯输入关键词可能返回太多结果。掌握以下策略,能让你成为搜索高手:
善用
--scope参数:这是很多人忽略的利器。它内置了多种针对开发者场景的优化搜索模式。--scope errors:当你只记得错误信息片段时使用。它会提升错误信息、堆栈跟踪(at ...)、日志级别(ERROR)等内容的相关性权重。--scope files:当你想找涉及特定文件操作的对话时使用。它会优先匹配文件路径(/src/components/)、read_file/write_file工具调用等。--scope tools:用于查找使用了特定工具(如bash_command,search_files)的对话。--scope similar:当你有一个较长的查询(如一段错误信息),想找语义上相似的过去查询时使用。它基于词向量进行简单相似度计算。
组合过滤条件:时间(
--from/--to)、分支(--branch)、项目源(--source claude)等过滤器可以任意组合。最有效的组合通常是时间 + 分支 + 关键词。理解评分(★):搜索结果前的星级(如
★7.2)是相关度评分。通常,高于★5.0的结果来自索引搜索,是高度相关的;低于★5.0的结果可能来自深度搜索,或者是匹配度稍弱的索引结果。评分可以帮助你快速判断结果质量。
4.2 数据源与文件结构解析
理解工具从哪里读取数据,有助于排查“为什么找不到某个会话”的问题。
| 来源 | 默认路径 | 工具读取的内容 | 注意事项 |
|---|---|---|---|
| Claude Code | ~/.claude/projects/*/ | 1.sessions-index.json(索引)2. *.jsonl(完整会话) | 确保 Claude Code 的“保存会话历史”功能已开启。每个项目文件夹对应一个 IDE 窗口或工作区。 |
| Cursor | ~/.cursor/projects/*/agent-transcripts/ | *.jsonl或*.txt文件 | Cursor 的转录文件可能因版本或设置而异。chat-history能自动识别两种格式。 |
常见问题1:工具报告“No sessions found”
- 检查路径:首先确认工具是否在读取正确的目录。你可以通过
ch -v查看它扫描的会话路径。 - 检查数据:手动去
~/.claude/projects/或~/.cursor/projects/下看看是否有对应的项目文件夹和会话文件。如果文件夹为空,可能是 Claude Code/Cursor 没有保存历史记录,需要在它们的设置中启用。 - 权限问题:确保当前用户有读取这些目录和文件的权限。
常见问题2:搜索不到已知存在的会话内容
- 确认搜索模式:如果你搜索的是对话中间某句很具体的话,请务必加上
--deep参数。索引搜索只覆盖摘要、首条提示和分支。 - 检查过滤条件:是否无意中设置了
--from、--to或--branch过滤器,把目标会话排除在外了? - 内容被过滤:工具会自动过滤掉“热身”消息(如“I‘m Claude”)、
/clear指令等噪音。极少数情况下,如果你的目标内容恰好和这些噪音模式重合,可能会被过滤。但这在正常开发对话中很少见。
常见问题3:安装技能后,Agent 仍不调用历史搜索
- 确认安装路径:技能文件必须准确安装在
~/.cursor/skills/chat-history/SKILL.md和~/.claude/skills/chat-history/SKILL.md。运行install-skill命令通常能正确完成。 - 重启 Agent/IDE:安装新技能后,可能需要重启 Claude Code 或 Cursor 的 AI Agent 界面,它才会重新加载技能列表。
- Agent 的自主性:即使拥有技能,Agent 也不会在每次对话中都主动搜索历史。它通常只在判断历史信息可能对当前问题有帮助时才会调用。你可以通过更明确的指令引导它,例如:“请搜索我的历史对话,看看我之前是如何配置
Nginx反向代理的。”
4.3 性能调优与处理大量历史数据
当你积累了成千上万个会话后,首次运行或深度搜索可能会变慢。以下是一些建议:
- 利用索引搜索:日常搜索尽量依赖默认的索引搜索。确保你的
sessions-index.json文件能正常生成(这是 Claude Code 的责任)。索引搜索的性能几乎不受会话总数影响。 - 限制搜索范围:养成使用
--timeframe(如--timeframe month)或--from/--to的习惯,避免无必要地扫描全部历史。 - 并行度调整(高级):深度搜索默认使用
rayon的全局并行池。如果你的机器 CPU 核心数非常多,且 IO 不是瓶颈(例如使用 NVMe SSD),理论上你可以通过修改环境变量RAYON_NUM_THREADS来调整并行线程数,但通常默认设置已是最优。
这个工具从根本上改变了我与AI编程助手的协作方式。它把一次性的、孤立的对话,变成了一个可检索、可延续的知识库。最大的体会是,主动管理对话上下文与被动记录同样重要。我现在会习惯性地在对话结束时,让 Claude 生成一个更准确的会话摘要(例如:“优化了X功能的数据库查询,使用了Y索引,性能提升Z%”),这能极大提升未来索引搜索的命中率。chat-history提供的不仅是一个搜索框,更是一种让AI助手的工作成果得以沉淀和复用的方法论。