Skip to content

feat(history): 用 transcripts.mjs 按 cwd 与时间列出历史会话 - #15

Merged
mtmtian merged 2 commits into
mainfrom
claude-mt/brave-wilson-6f176c
Oct 17, 2026
Merged

mtmtian merged 2 commits into
mainfrom
claude-mt/brave-wilson-6f176c

Conversation

@mtmtian

@mtmtian mtmtian commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

问题

recall、correct、automate-me 需要回看本项目的历史会话,但 fork 只在文字里要求"按仓库/cwd、会话和时间收窄",没有给出路径,也没有可执行的检查。上游 cursor/plugins#637 写的 Claude 目录规则只替换 / 和 .,本机实测不完整:空格、下划线、非 ASCII 都会变成 -,超过 200 字符的路径还会被截断并追加哈希。

改动

  • 新增 bin/transcripts.mjs(Node,零依赖):--host claude|codex、可重复的 --cwd(默认当前目录)、--since/--until(默认最近 7 天;纯日期按本地自然日)、--json。按真实 mtime 倒序输出候选文件,不输出任何消息内容。
    • Claude:只进入由 cwd 推导出的 ~/.claude/projects/<slug>/(尊重 CLAUDE_CONFIG_DIR),且会话中须有顶层 cwd 等于目标,才列出该会话及其 <session>/subagents/*.jsonl。
    • Codex:遍历 ~/.codex/sessions/YYYY/MM/DD/*.jsonl(尊重 CODEX_HOME),先按 mtime 过滤,只对窗口内的文件读取第一行 session_meta,按 payload.cwd 匹配;payload.source.subagent 标为子代理并带上 parent_thread_id。
  • 新增 scripts/transcripts.test.mjs(check.sh 自动执行),用临时 HOME 造夹具。
  • 更新 references/runtime.md(保留第 68 行的范围约束,补上脚本用法和 worktree 说明)、claude-runtime.md、codex-runtime.md,以及 recall、correct、automate-me 中读历史的步骤;ADAPTATION.md 记录这项本地新增及依据。

slug 规则的依据

  • 从本机 Claude Code 2.1.302 二进制中读到的实现:replace(/[^a-zA-Z0-9]/g, "-");长度超过 200 时取前 200 位,加 - 和 Math.abs(hash).toString(36),hash 为 (h << 5) - h + charCode | 0。正则按 UTF-16 码元替换,所以 CJK 字符变成一个 -,emoji 变成两个。
  • 本机 ~/.claude/projects 下 130 个目录名只含 [A-Za-z0-9-];15 个 207 字符的目录全部能由其会话记录的 cwd 按上述规则精确还原(15/15)。
  • 209 个会话文件中,204 个首条 cwd 与所在目录一致;另外 5 个是从临时目录"切换目录"后搬过来的,首条 cwd 是旧目录,之后的记录才含本目录的 cwd。因此脚本不只看首条,任一顶层 cwd 匹配即可;这一核对同时排除 /a/b-c 与 /a/b.c 这类共用目录名的情况。
  • Codex:23 个 rollout 的首行都是 session_meta,工作目录字段为 payload.cwd,子代理来源为 payload.source.subagent(含 thread_spawn.parent_thread_id)。

验证

验收项 结果 证据
bash scripts/check.sh runtime PASS fork guards 通过;node --test scripts/*.test.mjs 73/73;离线 Python 测试 18、8、9、22、26 项全部 OK;结尾 runtime checks passed.
新测试覆盖 PASS 7 个测试:slug(空格、点、下划线、非 ASCII、超 200 字符)、目录名冲突与搬迁会话、子代理、时间窗(默认与显式)、Codex cwd 过滤与续写的旧日期会话、CLAUDE_CONFIG_DIR/CODEX_HOME、参数错误
反向验证 PASS 在副本中分别植入 5 种缺陷,各自被对应测试抓到:改回上游 /、. 规则;去掉截断哈希;不核对 cwd;只看首条 cwd;Codex 先读文件再按 mtime 过滤(用 chmod 000 的范围外文件检测)
真实 HOME,本仓库主 checkout,最近 7 天 PASS Claude 5 条会话;Codex 4 条(2 会话 + 2 子代理)
真实 HOME,git worktree list 的 12 个 checkout 一并传入 PASS Claude 12 条(8 个不同 cwd);Codex 8 条(6 会话 + 2 子代理,5 个不同 cwd)

以上计数只统计条数与类型,没有读取或粘贴会话内容。

收尾代码审查针对 6b05c98:没有阻断项;按审查意见在 e8255a4 合并了三处重复的 .jsonl 枚举,并去掉无调用方的导出接口及 env/homeDir 注入参数,行为不变。之后重跑了 fork guards、node --test scripts/*.test.mjs(73/73)和上述 5 项反向验证,结论对应 e8255a4。

限制与取舍

  • Codex 没有按项目分目录,只能读取窗口内每个 rollout 的第一行来判断 cwd;脚本不读后续内容,也不输出元数据以外的字段。
  • ~/.codex/archived_sessions/ 不列出(本机多数为 .jsonl.zst 压缩文件)。
  • 超长路径的哈希按当前 Claude Code 实现精确计算;若旧版本用过别的哈希,这类会话会漏列,而不会去扫描前缀相同的其他目录。
  • recall 第 2 步的默认范围从"当前 workspace"明确为"当前仓库的所有 checkout"(逐个传 --cwd),因为在 Claude 桌面端每个会话都在独立 worktree 里,只看当前 cwd 基本只会找到自己。
  • reflect、show-me-your-work 里还有同样的旧段落,本 PR 没有改。

未合并,也未刷新本机安装。

🤖 Generated with Claude Code

recall、correct、automate-me 改为调用 bin/transcripts.mjs 定位本项目的
Claude 与 Codex 会话,不再只靠文字描述路径。

- Claude:按 Claude Code 2.1.302 的规则把 cwd 转成项目目录名(非字母数字
  的 UTF-16 码元换成 -,超过 200 字符截断并加哈希),并要求会话记录过该
  cwd;同时列出 subagents/。
- Codex:先按 mtime 过滤 sessions/YYYY/MM/DD,只读窗口内文件首行
  session_meta 的 payload.cwd。
- scripts/transcripts.test.mjs 用临时 HOME 覆盖 slug、目录冲突与搬迁会话、
  时间窗、cwd 过滤和两种宿主。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-17T19:40:20.452310Z 6b05c98 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

收尾审查发现两处结构问题,行为不变:
- .jsonl 枚举与去扩展名在三处重复,抽成 jsonlFiles(dir)。
- listTranscripts 的导出和 env/homeDir 注入参数没有调用方,测试走 CLI;
  去掉这层接口,宿主目录在各自的列举函数里解析。

Co-Authored-By: Claude Opus 5.5 <[email protected]>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6b05c98caf

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread bin/transcripts.mjs
Comment thread references/runtime.md
@mtmtian
mtmtian merged commit 86bbc62 into main Oct 17, 2026
3 checks passed
@mtmtian
mtmtian deleted the claude-mt/brave-wilson-6f176c branch October 17, 2026 19:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant