mcpField
R
read-claude-code-history

read-claude-code-history

github.com/daymadeAgent 工作流1.5k162 次安装今天更新
代码仓库

关于 read-claude-code-history

用于读取和分析 Claude Code 历史记录的 Agent Skill,面向需要查证旧会话、工具调用或用户原话的人。它强调按证据范围检索,并避免把读取请求变成继续执行旧任务。

主要功能

  1. 01按会话重建时间线证据
  2. 02筛选工具调用及其结果
  3. 03提取 Agent 提示词
  4. 04跨会话分析工具与钩子事件
  5. 05检索用户消息与历史主题

适用场景

  1. 01核查特定会话中的命令及结果
  2. 02查找某时段启动程序的会话
  3. 03回顾用户曾提供的原话
  4. 04恢复 Claude 文件历史中的内容

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/daymade/claude-code-skills --skill read-claude-code-history

安装后在 Claude Code 中输入/read-claude-code-history确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.INTEGRATION_SUMMARY.md
evals/
evals.json
references/
cc-behavior-claims.json
claude_session_format.md
hybrid_history_recall.md
legacy_cross_provider_workflow.md
session_file_format.md
workflow_examples.md
scripts/
analyze_sessions.py
extract_user_messages.py
history_index.py
list_local_history.py
read_claude_session.py
recover_content.py
skill_usage_ledger.py
surface_version.py
verify_cc_claims.py
scripts/_core/
__init__.py
claude.py
codex.py
homes.py
kimi.py
model.py
native_output.py
parse.py
sources.py
text.py
tests/fixtures/real-derived/
askuserquestion-answer.jsonl
plan-binding-attachment.jsonl
read-numbered-result.jsonl

详细介绍

读取 Claude Code 历史记录

仅读取 Claude Code 证据。不要恢复旧进程、编辑其项目,或将读取请求转变为继续任务。之后用户要求采取行动时,将已核实的证据交给 daymade-claude-code:continue-claude-code-work。

按所需结果选择路径

用户想要使用
最近的 Claude Code 会话、标题、日期或 ID仅使用索引元数据;当前随附的 list_local_history.py 会在按日期/数量筛选前读取所有候选内容,因此不要用它进行广泛盘点
将一个已知会话重构为按时间顺序排列的证据简报scripts/read_claude_session.py --session <ID>
从一个特定会话中,按工具名称、字面文本、序号或时间选取一项工具的原始输入及其配对结果scripts/read_claude_session.py --session <ID> --tool-evidence --contains '<literal>';参见下文的原始工具调用/结果证据
获取某条钩子审计记录中对应的确切命令;该记录包含会话 ID 和命令 SHA-256,而非命令文本scripts/read_claude_session.py --session <ID> --find-command-sha256 <HEX>;参见下文的钩子审计记录背后的命令
逐字引用一个会话中的所有 Agent/Task tool_use(例如交给独立审核 Agent 的确切提示词)scripts/read_claude_session.py --session <ID> --agent-prompts(可选 --agent-description-prefix TEXT);重复派发的提示词会列出多次
在多个会话中查找哪个会话在已知时间范围内启动了某个程序scripts/analyze_sessions.py tool-calls --from <ISO> --to <ISO> --pattern <REGEX> [--tool NAME];先根据文件系统元数据筛选候选项,再读取内容,然后按会话分组;不包括 Codex 执行记录,输出中会说明这一缺失
查看多个会话中的钩子运行情况——每次运行的结果、持续时间、退出代码(例如“为什么会话启动很慢”“今天这个防护机制是否触发”)scripts/analyze_sessions.py hook-events --from <ISO> --to <ISO> [--pattern <REGEX>] [--event NAME];与工具调用查询一样,先筛选候选项;分叉会话中的同一次运行副本会合并为一条;不包括 Codex 执行记录,输出中会说明这一缺失
用户最近说过的话,包括用户排队等待发送的提示词scripts/extract_user_messages.py
按关键字查找对话或引文scripts/history_index.py recall --mode bm25,然后使用精确会话读取器
可能改过措辞的以往工作检查索引状态后,运行 scripts/history_index.py recall
不知道会话 ID 的主题运行 scripts/history_index.py status,然后运行 recall;说明索引覆盖范围和新鲜度
已识别会话或物理范围明确的项目如何结束按照 references/workflow_examples.md 中的检查会话结尾操作
Claude 文件历史记录中保留的已删除/覆盖文件scripts/recover_content.py
每个 Skill 运行的次数及其启动者(用户命令、用户提及后由模型启动、模型主动启动),例如用于决定该 Skill 应由模型可见还是仅供用户调用运行 scripts/skill_usage_ledger.py index,然后运行 report(同时包含 Claude 和 Codex);参见下文的Skill 使用记录
Kimi CLI 会话history_index.py recall --provider kimi,然后读取指定会话的 wire.jsonl;参见下文的Kimi CLI
继续已核实的 Claude 会话停止读取,并调用 daymade-claude-code:continue-claude-code-work

查找“我们之前做的那个 X”(产物类目标)的判据

按词搜索无果时,改用以下判据,不要硬扩关键词:

  1. 时间约束是第一道筛选。用户给出时间范围(“前两天”“本周”)→ 先按 mtime 筛选文件系统(find <root> -newermt '<日期>' -name '*.html'),把候选范围缩小到几十个,再按形态筛选。全库关键词搜索应在时间筛选之后,而不是之前。
  2. 搜索范围必须包含 session scratchpad(/private/tmp/claude-$(id -u)/**/scratchpad/,macOS 单用户环境通常是 claude-501)。Claude session 的默认产物位置就在那里,而不在 workspace——“我们之前写的 X”很可能就在 scratchpad。查找产物类目标时,务必将其明确纳入搜索范围。
  3. 恢复出的版本 ≠ 最终版。从 session jsonl 恢复文件(提取 Write 的 content)只能得到某次完整写入的内容,后续增量 Edit 不会自动合并进去——恢复出的产物可能只是真实文件的一小部分(实测:恢复片段为 28KB,完整版为 2.45MB)。打开或渲染后觉得“不像目标”时,先怀疑“拿到的不是完整版”(原路径文件是否还在、session 里是否还有后续 Edit),不要直接排除该目标。

战例(2026-09-18):查找“之前做的聚类网页”,经过十几轮全库关键词搜索仍无果;目标一直在 9-13 的 session scratchpad 中(favorites-ledger.html,2.45MB),恢复出的 28KB 片段渲染后只呈现裸样式,被误判为不相关;直到用户给出精确路径后才找到。

用户要求的输出优先于背景故事。如果用户要求的是其原始输入的时间顺序表格,就返回该表格;不要因为用户提到某起事件作为动机,就改为提供主题分析。

证据范围与完整性

默认情况下,发现每个处于活动状态的 Claude 配置主目录,以及 ~/.claude/history-sources.json 中登记的每个归档。按 Session ID 和内容标识去重物理副本,并使用记录时间戳,而不是文件 mtime。限定为单个显式 --home 的结果是诊断切片,不代表完整性。

应将 Claude 的记录标签视为存储元数据,而非作者身份的证明。顶层 type: user 记录可能包含命令封装、钩子样板文本、整份粘贴的文档、以 Agent 口吻撰写的文本或系统占位符。助手忙碌时输入的人类文本可能位于 attachment.queued_command.prompt 中,且带有 origin.kind: human;不要只读取 user 记录,以免遗漏这些更正。

解读架构、作者身份、sidechain、附件记录、压缩或文件历史快照时,请阅读 references/session_file_format.md。构建或修复可选的 BM25/向量索引前,请阅读 references/hybrid_history_recall.md。有关索引发现、分类和恢复示例,请阅读 references/workflow_examples.md。需要了解目录布局而非消息架构时,请阅读 [references/claude_session_format.md]:包括 session 在磁盘上的存放位置、项目路径如何规范化为目录名、sessions-index.json 的字段,以及用于标记对话记录已被摘要而非截断的 compact_boundary 标记。

命令

所有脚本都应相对于此 SKILL.md 定位;不要在机器上搜索同名辅助脚本,也不要内联重建 JSONL 解析器。

索引发现
<skill-dir>/scripts/history_index.py status
<skill-dir>/scripts/history_index.py recall '<topic>' --provider claude --mode bm25

预期输出:候选 Session ID 和索引覆盖范围。这用于主题发现,而非完整的近期 session 清单。若需要完整列表,请说明当前打包的清单将扫描原始正文。

精确的会话证据
<skill-dir>/scripts/read_claude_session.py --session <SESSION_ID>

# Add this only when the caller intentionally wants to restrict lookup to one workspace.
<skill-dir>/scripts/read_claude_session.py --session <SESSION_ID> --project <workspace>

预期输出:# Claude Code Session Evidence Briefing、会话身份、压缩边界、按时间顺序排列的用户/助手交接、排队等待的人工提示词、结束原因、未解决的调用、子 Agent 状态、已触及的文件、记忆以及当前工作区状态。精确读取器始终会解析每条物理会话记录,包括压缩前的记录。默认显示会截断较长的轮次,并仅折叠同时满足以下条件的单文本运行时 Skill 正文:isMeta: true,且具有唯一的较早 sourceToolUseID,该 ID 与同一记录谱系中的 Skill 调用相匹配。它会标注 Skill 和记录坐标;--full 会展开这些正文并取消字符截断。人工粘贴内容、排队的提示词、混合记录以及来源不确定的内容,仍会在正常截断限制内显示。原始记录、提取的时间线文本和工具证据导出均保持不变。它会检查活动副本和已注册的归档副本,仅接受内容完全相同或严格仅追加的副本;若副本存在差异、存在多个会话身份、缺少记录级会话身份、JSONL 格式错误或字节不可读,则会明确报错。提供精确的会话 ID 且未指定 --project 时,它会搜索已发现的活动主目录和已注册归档中的所有项目;显式指定 --project 仍会严格限定范围。文件名本身永远不能证明会话身份。解读任务结束、局部命令输出或工作目录回执前,请先阅读本地运行时和工作目录证据。

原始工具调用/结果证据

此模式适用于特定的备份、传输、续接命令或工具收据。先解析出一个确切的 Session;不要通过打印整份简报或重建原始历史记录解析器来获取工具证据。

<skill-dir>/scripts/read_claude_session.py --session <SESSION_ID> \
  --tool-evidence --tool Bash --contains 'scp' --contains 'backup'
<skill-dir>/scripts/read_claude_session.py --session <SESSION_ID> \
  --tool-evidence --ordinal 4:6 --from <ISO_WITH_TIMEZONE> --to <ISO_WITH_TIMEZONE>
<skill-dir>/scripts/read_claude_session.py --session <SESSION_ID> \
  --tool-evidence --subagent-path workflows/<run>/agent-<id>.jsonl --tool Bash

# Save the complete selected payload when it exceeds the bounded response.
<skill-dir>/scripts/read_claude_session.py --session <SESSION_ID> \
  --tool-evidence --tool Bash --contains 'scp' --full > /absolute/path/tool-evidence.json

预期会得到一个 JSON 信封,其中包含原始的 tool_use 和 tool_result 块、所选来源的 SHA-256、从 1 开始计数的物理行号和内容块坐标、记录 UUID/父 UUID、时间戳、cwd,以及记录的 Agent/sidechain 身份。默认情况下,此模式只读取所选的主 transcript,包括其中存储的 sidechain。若要读取一个已知的子 Agent 叶节点,请添加 --subagent-path agent-<id>.jsonl 或 --subagent-path workflows/<run>/agent-<id>.jsonl;路径相对于该 Session 的 subagents/ 目录。请使用完整的、相对于运行目录的路径:仅用基本文件名无法在多个 Workflow 运行中选择重复的 Agent ID。路径缺失、为空、越界或未知时,操作会失败,且不会导出证据。所选叶节点工具块必须带有匹配的 Agent 身份和父 Session 身份。JSON 中的来源范围和 subagent_files_read 会标明实际读取的内容;其他叶节点仍会排除在外。两种模式都不会读取当前 Git 状态或记忆。

此模式会验证该 transcript 中的每条物理记录;其证据输出会省略无关的对话文本。全局查找只会检查活动目录和已注册存档中名称与 <SESSION_ID>.jsonl 完全一致的文件;已重命名的存档不会纳入此查找。若现有发现机制能够定位该重命名文件,请传入范围明确的 --project。记录级身份、格式错误/不可读输入以及副本不一致的检查仍然适用。读取期间来源若发生变化,操作会明确失败;请仅重试此读取。

至少指定一个筛选条件。重复使用 --tool NAME 可指定多个区分大小写的精确工具名称。重复使用 --contains TEXT 可要求该组原始字符串值中包含每个区分大小写的字面文本,包括嵌套调用输入和结果内容;孤立结果无法匹配工具名称筛选条件。--tools 是 --tool-evidence 的别名。--ordinal N 或 N:M 会在应用其他筛选条件之前,按首次物理出现顺序选择从 1 开始计数的组序号。

时间范围包含边界,并采用首次调用时间戳;对于孤立结果,则采用其首次结果时间戳。日期时间必须包含时区;仅含日期的范围使用机器的本地日期。时间筛选会统计被排除的缺失/无效时间戳。

在记录的 Agent/sidechain 上下文中按工具使用 ID 配对,不受两者先后顺序影响。重复 ID 的所有块都会保留,并标记为 ambiguous;缺少对应项时标记为 missing_call 或 missing_result;缺少 ID 时标记为 missing_id。这些状态描述的是证据是否可用,而不是执行是否成功。在声称操作成功之前,请先查看原始结果中的错误/内容字段。

将返回的匹配视为完整结果前,请检查 coverage.output_complete。--max-output-bytes 限制整个 UTF-8 JSON 信封的大小,包括末尾换行符;当前默认值请参阅 CLI 帮助。较大的匹配可能会返回明确标记为不完整的 block_json_prefix,并附上其原始字符数,而非完整 block;后续组可能会被省略,并附上数量和 first_omitted_ordinal。请提高上限,或使用 --full 并重定向到绝对本地输出路径,以获取所选负载的完整内容;--full 会移除此模式的字节上限。若连元数据都无法容纳,读取会失败,且不会输出证据。退出码 0 表示至少选择到一个组,1 表示无匹配或来源/读取失败,2 表示参数无效。请检查 stderr 和覆盖信息,以区分这些情况;因时间范围缺口或来源被排除而得到零匹配,并不能证明该操作从未发生。

Hook 审计记录中的命令

Hook 审计日志通常存储 sid=<SESSION_ID> cmd_sha256=<HEX>,而不是命令文本。将记录解析为生成它的工具调用:

<skill-dir>/scripts/read_claude_session.py --session <SESSION_ID> --find-command-sha256 <HEX>

预期输出:一个标题为 # Tool calls whose command has SHA-256 … 的标题、已检查的转录文件和工具调用数量、匹配数量,以及每个匹配项的文件和行号、时间戳、记录 uuid、工具名称和 ID、cwd,以及用代码围栏括起的完整命令。退出码 0 表示至少有一个匹配项,1 表示没有匹配项,2 表示摘要格式错误或缺少 --session。摘要是对 tool_input.command 的 UTF-8 编码内容计算的 SHA-256。子 Agent 中触发的 Hook 事件带有父 Session ID,因此查询也会搜索 <SESSION_ID>/subagents/*.jsonl 和 <SESSION_ID>/subagents/workflows/*/agent-*.jsonl;仅搜索主转录会漏掉这些调用。Agent/Task 提示词查询和简报中的子 Agent 清单也使用相同的 Session 限定布局,不会递归发现历史记录。匹配项和清单会在相对路径中保留 Workflow 运行信息。格式错误或不属于当前 Session 的清单叶节点会报告为覆盖范围未知,绝不会视为已完成的 Agent。只有原始 assistant/user 事件记录才算作工具证据;诊断用的请求形状副本不包括在内。与简报不同,查询会跳过并统计无法解析的行,因此在正在写入的 Session 中仍可正常工作;若有跳过的行,结果为 0 并不能证明该调用不存在。

索引内容搜索
<skill-dir>/scripts/history_index.py status
<skill-dir>/scripts/history_index.py recall '<keyword>' \
  --mode bm25 --provider claude --exclude-session <CURRENT_ID>

检查索引的提供方覆盖范围和最近索引时间。仅使用精确 Session 读取器打开匹配的 Session ID,以核实原始记录。索引召回返回按排名排列的文本候选项,而不是思考内容、工具结果、附件或未编入索引记录的完整清单。对于实时存储,原始 analyze_sessions.py search 条目已禁用:其日期标记是在读取文件后才进行筛选。

使用 --role user 或 --role assistant 缩小存储角色范围,并重复使用 --phrase '<literal text>' 来要求匹配精确子字符串。这些筛选条件会限制 BM25 和向量候选项;--terms 只限制 FTS 部分。返回的 record_key、source_kind 和 human_authorship 描述的是来源信息,并不能证明发言者确实是人类。在说“你说过”之前,先检查原始记录。Codex 工具结果不在此文本索引中;将选定的 Codex 候选项交给 read-codex-history 的原始工具/记录证据路径。导出原始值时不会自动进行内容脱敏。与所请求命题相邻的事实,并不能回答该命题。

人类输入导出
<skill-dir>/scripts/extract_user_messages.py \
  <persistent-output-base> --days 7 --group-by session

这会生成 Markdown 和 HTML。它会将存储污染内容与人类撰写的文本区分开,并恢复排队的提示词。保留时间戳、重复项和 Session 边界;除非用户要求,否则不要再添加第二层主题分类。

已删除内容恢复

恢复操作会写入文件,因此请与常规读取分开处理。先针对确切的 Session 文件运行恢复报告,检查每个建议的目标位置,然后仅在用户要求恢复内容后才写入。绝不要直接恢复到当前项目树中覆盖现有内容。

Skill 使用情况台账

回答“我们实际使用了哪些 Skill,以及由谁启动”。这是一个增量索引(~/.claude-history-index/skill-usage-v1.db):首次运行 index 时,会解析每个 Claude 和 Codex 会话一次;之后只会重新解析大小或修改时间发生变化的文件。报告读取台账,绝不读取原始历史记录。

python3 scripts/skill_usage_ledger.py index            # --no-codex to skip Codex
python3 scripts/skill_usage_ledger.py report --override user-invocable-only
python3 scripts/skill_usage_ledger.py report <skill> [<skill> ...] --since 2026-06-01 --until 2026-09-24
python3 scripts/skill_usage_ledger.py status           # freshness + what is not covered

列:user_command(用户输入了 /X,或 Codex $X)、model_named(模型调用了 X,且最新的人类提示词包含 X 的名称)、model_auto(模型在未收到提示的情况下调用了 X)、last_model_use、blocked(Claude 因 X 不可由模型调用而拒绝了模型调用——模型尝试使用它但未能成功;不计为使用),以及该 Skill 当前的 skillOverrides 值。--override STATE 还会列出处于该状态但记录使用次数为零的 Skill。各行按不带限定名的名称分组,这是 skillOverrides 使用的键;identities 列出合并到该行的限定名称。同一行中有多个命名空间(review、suite:review)表示同名 Skill 被合并统计——使用 --exact 重新运行可将它们拆分。

每次得出结论时,都要考虑以下限制:

  • 仅限用户调用的 Skill 无法由模型调用,因此它的 model_auto 计数会在该 Skill 被隐藏的当天停止增长。应比较该日期前后的使用情况,而不是生命周期总计。
  • Codex 的模型使用情况,是根据模型读取某个 .../X/SKILL.md 推断的;使用普通 shell 读取命令编辑或审查 X 的 SKILL.md 的会话看起来也一样。单个命令读取多个 SKILL.md 文件时,会记录为 bulk_read 并排除。
  • 未涵盖:在 Claude 子 Agent 中调用的 Skill、Kimi CLI,以及 Codex 凭记忆使用但未读取的 Skill。记录的使用次数为零,表示“在涵盖的数据存储中未见”,而非“从未使用”。

读取结果约定

每个回答都必须说明:

  1. 读取的来源——活跃主目录、已注册的归档、确切的会话文件。
  2. 覆盖范围——会话 ID 和内部时间范围。
  3. 结果——按请求格式提供原始时间顺序或匹配证据。
  4. 缺漏——无法读取的文件、缺失的父记录或附件字节、排除的侧链,或任何未搜索的范围。

“未找到”表示“在所述覆盖范围内未找到”,绝不表示“从未发生”。索引化回忆会遗漏某些记录类型。应说明这一限制和索引边界;不要把零条排名命中当作完整的标签普查。

不要将精简摘要称为逐字历史记录;它只是用于延续工作的辅助材料,涉及关键主张时必须对照原始记录和当前工作区核实。

在写出任何否定或绝对主张(“从未说过”“从未出现”“不可能发生”“无法满足”)之前,必须完成以下检查清单:

  1. 检查所有记录类型,而不只是用户/助手文本。 搜索字面字符串时,还必须检查 attachment(queued_command.prompt)、tool_result 和 thinking——记录顶层的 type/isMeta 本身不能证明或否定内容是否出自人类。按 type:user 与 assistant 对命中项分类、却跳过 attachment,正是导致真实的回合中人类命令被报告为从未说过的原因。
  2. 断定“无法恢复”之前,先采取成本最低的下一步。 如果索引化回忆或重新读取已确认的会话能够弥补缺口,就应先这样做。尚未测试的边界不能作为边界证据。
  3. 出现与证据相矛盾的第一手陈述时,应重新调查,而不是以你的解读为准。 如果用户表示自己做过某事,而你的证据显示相反,应将此冲突视为重新执行(1)和(2)的信号,而不是要辩护的结论。

如果工具结果注明内容已截断或分页(“显示第 X–Y 行,共 Z 行……不要仅根据本页作答”),该警告必须遵守:在得出依赖这些内容的结论之前,应先读取其余部分。

防护措施

  • 普通读取模式应保持只读。
  • 不要运行 claude --resume 或 claude --continue。
  • 不要用文件 mtime 判断对话时间顺序。
  • 不要扫描未经筛选的完整历史记录。使用索引,或先选定一个确切的会话。在读取每个文件后才应用日期筛选,并不能限制工作量。 如果索引覆盖不完整,应报告缺口,而不是扫描历史记录。
  • 未经用户明确批准,不要将原始历史记录分享至本地机器之外;其中可能包含凭据和私人业务背景信息。
  • 搜索超时或源数据格式错误后,不要声称搜索已完成。
  • 未完成 Read-result contract 中的检查清单之前,不要断言否定结论(“从未说过”“从未出现过”“不可能满足”)。

界面约定

在一个会话中首次使用时,运行一次 python3 scripts/surface_version.py 并记录 12 位指纹——即此技能 scripts/**/*.py 代码表面的 sha256。如果该指纹与上次看到的此技能指纹不同,说明代码已发生变化:在依据上下文中对这些内容的回忆采取行动之前,先从磁盘重新读取此 SKILL.md 及其参考文件。指纹仅涵盖代码;文档编辑不会改变它。

CC 行为声明

references/cc-behavior-claims.json 是逐版本记录表,列出此技能所依赖的所有“Claude Code 的行为如 X”声明(Read 行编号、tool_use/tool_result 顺序、AUQ 答案格式、中断标记、计划绑定、旁路语义)。python3 scripts/verify_cc_claims.py --fixtures 是 CI 门禁——退出码为 1 表示实现、fixture 或记录表破坏了某项声明的格式。--corpus <dir> 会根据实时转录重新验证记录表:退出码为 2 表示架构发生偏移,这属于正确性任务,而不是测试失败——请更新 observed/last_verified/evidence 或修复实现,并在 CHANGELOG 中指出发生偏移的声明。

路由器与旧版兼容性

daymade-claude-code:local-conversation-history 是跨提供商路由器。它会将 Claude 读取请求和所有 Kimi CLI 请求发送到此处,且不会取代此 Skill 的身份或证据约定。新的 Codex 请求会路由至 daymade-claude-code:read-codex-history。

Kimi CLI 是此 Skill 的实时使用界面,而非旧版界面。 它没有自己的读取器。使用索引召回进行发现,然后检查指定会话的线缆记录。仅根据 Claude 数据回答 Kimi 相关问题,会导致错误地声称“从未发生”。

Home 解析顺序为 --kimi-home > KIMI_HOME > ~/.kimi-code。

默认 Home 不存在时,并不表示存储缺失——它只是在别处,工具会说明这一点。 Kimi 桌面客户端将 CLI 集成在自己的 Electron 运行时中,并将会话保存在该运行时内,而不是 Home 目录中,因此,拥有数百个真实对话的机器在查询默认路径时可能什么也找不到。清单会将尝试过的 Home 打印为诊断行;在报告 Kimi 结果为空之前,请先读取该行,因为“未找到 Home”和“没有对话”是不同的发现。

请按以下顺序定位实际的 Home,而不是猜测:

  1. 如果曾使用 Kimi 构建过召回索引,请先查询该索引。 scripts/history_index.py status 会输出 scope.sources,其中的 provider: kimi 条目包含建立索引时使用的绝对 home 路径。只有在 Kimi 至少建立过一次索引后,它才会返回结果,因此在已配置的机器上这是最快的方法,在全新机器上则不会有任何输出。
  2. 从正在运行的进程中读取桌面客户端的用户数据目录。 Electron 应用会在命令行中携带 --user-data-dir(ps ax | grep -i <client>)。随附的 CLI 不会直接位于该目录下:其 home 路径是 <user-data-dir>/daimon-share/daimon/runtime/kimi-code/home。注意末尾的 home 部分——.../runtime/kimi-code 是 CLI 安装目录,不通过第 4 步的测试;其下级 home/ 才是存储目录。
  3. 根据转录记录的 meta.sourcePath 追踪。 客户端会将对话镜像到 <user-data-dir>/daimon-share/daimon/agents/<agent>/memory/transcripts/days/<YYYY-MM-DD>/conv-*.jsonl,而每条记录的 meta.sourcePath 是其来源的绝对 wire 路径,其中包含 home。不要查看 kimi-agent/conversation-archive.json——该文件只包含标题和时间戳,不含任何路径。
  4. 使用前先确认。 真实的 Kimi home 包含 session_index.jsonl 和 sessions/wd_<workspace>_<hash>/ 目录树;两者都存在时,再将其作为 --kimi-home 传入。此测试可以区分存储目录与上一级的 CLI 安装目录。

Schema 事实决定了定位到的存储能否正确读取。较新的构建版本会从每个会话的 state.json 中移除 id 和 cwd,并仅在 session_index.jsonl 中保留工作目录,因此会话所属的项目必须从该映射中获取,而不能从其自身的状态文件中获取。同一个 sessions/ 目录树还包含内部 Agent 运行记录和真实对话,它们仅通过目录前缀区分——标题生成、保管库维护和技能摘要都属于机器生成的内容,并非历史记录;在真实存储中,这些内容的数量曾超过真实对话。

Kimi 覆盖情况检查。 确认 history_index.py status 包含 Kimi,并读取其新鲜度边界。 未建立索引的 Kimi 会话或比索引更新的 Kimi 会话,召回功能都无法识别。

读取已定位的 Kimi 会话没有随附命令。 read_claude_session.py 只解析 Claude 会话文件,遇到 Kimi 会话 ID 时会以非零状态码退出。Kimi 提供的是清单和索引召回;若要查看对话内容,请直接读取会话的 agents/<agent>/wire.jsonl,并根据上述记录类型进行解读。请说明这是直接读取文件,不要将其描述成与 Claude 读取器生成的、经过验证的重建结果相同。

以前的 claude-code-history-files-finder 也提供可选的 Codex 和 Kimi 分支。其原始说明保留在 references/legacy_cross_provider_workflow.md 中,仅作为迁移和回归证据的冻结快照——阅读它是为了了解旧版约定的内容,切勿将其视为当前发行版本的说明。

评论

支持 Markdown