调研探索
用关键词在本地 Claude Code…
当用户想凭模糊记忆找回之前某次 Claude Code 会话(讨论过什么、决定过什么、是否完成)时,在 ~/.claude/projects/ 下的会话记录里做定向搜索并汇报结果。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用关键词在本地 Claude Code 通用
解决思路
- 先确定搜索范围:若用户当前所在仓库就是那次会话发生的仓库,就从当前目录推导项目文件夹:ENCODED=$(pwd | sed 's|/|-|g'),再 ls ~/.claude/projects/$ENCODED/*.jsonl 2>/dev/null | wc -l;若用户是跨全部工作搜索,则 ls -d ~/.claude/projects/*/;不确定时直接问用户『那次对话是在这个仓库里,还是在你所有工作里?』
- 理解记录的组织方式:项目文件夹名 = 工作目录把 / 替换成 -(如 /Users/alice/source/acme/api 对应 ~/.claude/projects/-Users-alice-source-acme-api/);会话 ID 就是去掉 .jsonl 的文件名;每行是一个 JSON 消息,含 type(user/assistant/system 等)、timestamp 和内容;子代理记录在 <session-id>/subagents/agent-*.jsonl,默认跳过。
- 用定向 ripgrep 搜索,先只列文件名:rg -l -i "<独特短语>" ~/.claude/projects/<project>/*.jsonl;绝不要 cat 整个 .jsonl 文件(常有数 MB,含大量 thinking 签名块,会撑爆上下文)。
- 注意搜索词质量:auto-approve、commit、error 等常见词会命中大量噪声;若用户只给了一个泛词,先向他要一个独特短语(错误字符串、函数名、flag、文件路径、UI 文案、人名),一个具体短语胜过五个泛词。
- 顶层 shell 通配符 ~/.claude/projects/<project>/*.jsonl 天然跳过子代理记录;若改为递归搜索整个目录,需显式排除:rg -l -i "your phrase" ~/.claude/projects --glob '*.jsonl' --glob '!**/subagents/**'。
- 对候选结果分诊:0 命中就告知用户并索要更独特的短语,不要一直猜同义词;1-3 命中就逐个查看;4+ 命中就再要一个收窄词,或按时间排序先看最近的(ls -lt)。
- 对每个候选文件做 JSON 感知的上下文提取,两种模式:模式 A 快速粗略:rg -i -B 2 -A 5 "your phrase" ~/.claude/projects/<project>/<session>.jsonl | head -100;模式 B 更干净:rg -i "your phrase" <session>.jsonl | jq -r 'select(.type=="user" or .type=="assistant") | "\(.timestamp) [\(.type)] \(.message.content // .content | tostring | .[0:300])"';除非直接相关,跳过 tool_use 和 tool_result 条目。
- 汇报发现:对每个强候选给出会话 ID(去掉 .jsonl 的文件名)、项目文件夹(~/.claude/projects/<encoded>)、日期/时间(用匹配消息的 timestamp,退而用文件 mtime)、2-4 句关于讨论了什么和决定了什么的摘要;多个候选就各列一条让用户挑,不要把 20 KB 原始 JSON 倒进对话。
- 可选追问产出:定位到会话后扫描实际做了什么:rg -o '"command":"git (commit|push|checkout -b)[^"]*' <session>.jsonl;rg -o 'gh pr create[^"]*' <session>.jsonl;rg -o 'https://github.com/[^"]*pull/[0-9]+' <session>.jsonl | sort -u;若找到 PR URL,用 gh pr view <N> --repo <owner>/<repo> --json number,title,state,mergedAt,reviewDecision,url 查状态,并汇报 open/merged/closed、当前 review 决定、CI 是否最后为绿。
- 避免反模式:不要 cat 整个 .jsonl;不要不带限定词地 grep 常见词;不要相信第一个匹配(会话可能持续数小时,关键决定常在靠后的轮次,优先看会话末尾附近的匹配);不要自动包含子代理记录;不要凭记忆转述,每条结论都要有从文件中提取的实际行作依据;用户已明确点名仓库时不要跨 ~/.claude/projects/* 全量搜索。
- 失败恢复:搜索无结果时向用户索要更具体的短语(错误信息、函数名、文件路径、人名),若只记得主题可试 2-3 个同义变体,之后停下询问,不要无限模式匹配;匹配文件出现在没见过的项目里也没关系,编码目录名就告诉你原始 cwd,可 cd 过去查看仓库;找到会话但判断不出决定了什么时,读最后几轮用户发言和工具调用链结束前的最后一条助手发言,决定通常在那里而不是长调试的中段。
适用边界 · 注意事项
- 不适用于搜索当前代码库、当前 PR 评论或 Slack/Jira 等外部系统(那些有各自的技能与工具)。
- 用户已明确点名某个仓库时,不要跨 ~/.claude/projects/* 全量搜索,应先收窄。
- 不要用常见泛词(approve、error、fix、commit、pr)直接搜索,也不要 cat 整个 .jsonl 文件。