跳到正文
claudemods

Time Machine:记录每次工具调用的 Claude Code 时间线

为每次工具调用建立可分支的时间线,附带影子 git 快照,可对比、还原、分支和重跑。

权限

  • 读取文件可以读取你电脑上的文件并列出目录($.fs.read / list / stat / exists)。
  • 写入文件可以在你的电脑上创建或覆盖文件($.fs.write)。
  • 执行命令可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
  • 拦截工具调用能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
  • 读取你的提示词可以看到你输入的内容和对话记录(prompt.* / session.append / session.messages)。
  • 修改界面在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
  • 添加命令/工具注册新的斜杠命令或工具,供你或 Claude 调用($.command.register / $.tool.register)。
  • 存储数据在插件的私有存储中跨会话保存数据($.store.*)。
实测版本
v2.1.303
最近实测
需要
Claude Code ≥ 2.1.287
显示位置
状态栏、面板

在 Claude Code 中安装:

/plugin install time-machine --marketplace YeonwooSung/my-claude-code-mods
全部安装方式 ↓

这个插件能做什么?

Time Machine 是 YeonwooSung(my-claude-code-mods)开发的社区插件,为每个 Claude Code 会话提供一条 Claude Code 时间线。当代理改了好几个文件、结果走偏时,git diff 只能告诉你改了什么。Time Machine 记录哪次工具调用、按什么顺序、之后文件是什么样子,让你可以回到任意一步。

所有功能都通过一个命令 /tm 完成。/tm 绘制时间线,/tm show <n> 查看单个步骤,/tm diff <a> [b] 对比两个步骤时的文件,/tm why 列出最可能导致测试失败的修改。/tm restore <n> 和 /tm branch <n> 把文件还原到某一步,/tm compare 对比两个分支或会话,/tm rerun <n> 重新运行某一步,/tm sessions 列出已记录的会话。/tm-pane 打开实时时间线面板,状态栏会显示类似 tm ② · 1 snaps · 79ms 的内容。

它还原文件并重新运行工具;不会重放模型的回答,也不会回退对话。

演示

录屏中,我们在小型演示项目里启动加载了该插件的 Claude Code,并把存储目录指向临时文件夹。我们让 Claude 创建只有一行项目说明的 NOTES.md。Claude 读取 README.md 并写入文件,期间状态栏从 tm ⓪ 增加到 tm ②,并显示 1 snaps。随后我们输入 /tm,时间线列出基线快照(5 个文件)、① Read README.md,以及带有自己快照的 ② Write NOTES.md,其中 A NOTES.md 表示新增的文件。

安装

使用安装区块中的任意一种方式;它们都直接从作者自己的插件市场安装。插件会在下一次会话开始时启动,/tm 在会话开始时注册。

$ install time-machine

需要 Claude Code ≥ 2.1.287

从作者自己的 marketplace 安装: YeonwooSung/my-claude-code-mods

  1. 1.在 Claude Code 中一行安装

    /plugin install time-machine --marketplace YeonwooSung/my-claude-code-mods

    粘贴到正在运行的会话中(v2.1.275+)。Claude Code 会先询问是否添加该插件市场。

  2. 2.从终端安装

    claude plugin marketplace add YeonwooSung/my-claude-code-mods
    claude plugin install time-machine@my-claude-code-mods

    然后在所有已打开的会话中运行 /reload-plugins。

  3. 3.免安装试用

    git clone https://github.com/YeonwooSung/my-claude-code-mods
    claude --plugin-dir ./my-claude-code-mods/time-machine

    仅在当前会话中加载该插件,不会写入你的设置。

工作原理

每次 tool.call 都会记录一个步骤。在每个会改动文件的工具之后(编辑、写入、默认情况下所有 Bash 调用、未知工具和 MCP 工具),插件会把工作区提交到保存在自己存储目录中的裸“影子”仓库,使用独立的索引,因此你的 .git 不会被读取或写入。如果在工具运行前发现工作区自上次快照以来发生了变化,例如你在 IDE 中编辑了文件,这会被记录为 external 步骤,而不是算到代理头上。下面是修改文件的命令的保护逻辑,来自 hooks/register.tsx:

// Origins a person typed: the only ones allowed to change files or run commands through /tm.
const TYPED = new Set(['composer', 'bridge', 'sdk'])

const sub = changesFiles(args)
const kind = e.origin?.kind ?? 'unknown'
if (sub !== undefined && !TYPED.has(kind)) return { text: `time-machine: ${sub} changes files or runs commands and only runs when you type it (this came from ${kind})` }

/tm why 是推断而不是证明:它取失败运行之前同一测试命令最近一次通过的运行,并给两者之间改动的每个文件打分,失败输出中提到该路径时分数更高。测试输出支持 pytest、jest 和 vitest、go、cargo 以及 node:test 的格式,其他输出只使用退出状态。

自定义

插件设置中有四个选项:

  • storeDir:快照和时间线的存放位置,每个项目一个文件夹。必须是绝对路径或以 ~/ 开头,并且位于项目之外,否则快照会被关闭。默认为 ~/.claude/time-machine。
  • retentionDays:超过该天数的会话会被删除,最多每天检查一次。默认 14;0 表示全部保留。
  • recordModelOutput:默认关闭。开启后会保存模型的回答文本和每条提示词的前 200 个字符;关闭时只保存长度和哈希。
  • skipSearchBash:默认关闭。开启后,被归类为搜索的 Bash 命令(rg、grep、ls、cat)之后不会再做快照。

权限与安全

我们读过了插件加载的每一个文件:plugin.json、hooks/hooks.json、hooks/register.tsx、hooks/git.ts 以及 hooks/core/ 中的全部文件,还有 README 和测试。没有 package.json、安装脚本、二进制文件或打包后的代码。我们搜索了 fetch、http、child_process、eval、动态 import()、WebSocket 以及零宽或双向 Unicode 字符,没有任何发现。值得注意的情况:

  • 运行进程:通过 $.process.run 运行 git(针对影子仓库),以及 mkdir、rm -rf、cp、find -delete 和 sh。rm -rf 和 find -delete 仅限于存储文件夹内部的路径(register.tsx 和 git.ts 中的 isInside 检查)。/tm rerun --isolated --yes 会在快照副本中用 sh -lc 运行已记录的 Bash 命令。这不是沙箱,也不经过权限对话框;它只在你亲自输入时运行,并且会拒绝包含项目绝对路径的命令。
  • 写入文件:位于存储文件夹,默认是 ~/.claude/time-machine。不会写入 settings.json、shell 文件、LaunchAgents 或 git hooks。/tm restore --yes 会改写项目中被跟踪的文件,但只在你亲自输入时执行,并且先保存还原前的快照;如果会覆盖被忽略的文件,它会拒绝执行。
  • 记录你的工作:快照保存所有未被忽略文件的完整内容,包括你放在项目里的任何密钥。工具输入和结果会尽力脱敏,但快照中的文件内容不会。分享存储文件夹之前请先检查。
  • 向对话注入文本只有一次:还原之后,它会追加一条说明,告知文件已被还原、之前的工具结果已过时。除此之外,它不会改写提示词或工具结果。
  • 包裹每一次工具调用(带 .catch 的 tool.call 门控钩子)。它原样传递回答,包括拒绝,记录出错也不会阻止工具。并行的修改类调用会等待外部变更检查完成。
  • 没有网络、守护进程或遥测。 清理任务在启动后分离运行,但会随会话结束。读取的唯一环境变量是 HOME。
  • 外部要求: 必须安装 git。当会话根目录是你的主目录或 / 时,快照会被关闭。
  • 许可证: Apache-2.0(仓库根目录有 LICENSE 文件),允许再分发。

claude plugin validate 没有报告任何错误或警告。作者的测试在 Claude Code 2.1.303 上通过:103 个通过,0 个失败。

读取文件
可以读取你电脑上的文件并列出目录($.fs.read / list / stat / exists)。
写入文件
可以在你的电脑上创建或覆盖文件($.fs.write)。
执行命令
可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
拦截工具调用
能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
读取你的提示词
可以看到你输入的内容和对话记录(prompt.* / session.append / session.messages)。
修改界面
在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
添加命令/工具
注册新的斜杠命令或工具,供你或 Claude 调用($.command.register / $.tool.register)。
存储数据
在插件的私有存储中跨会话保存数据($.store.*)。

兼容性与故障排除

已在 macOS 上使用 Claude Code 2.1.303 检查(validate、作者的测试和演示录屏)。作者标明需要 Claude Code 2.1.287 或更高版本。如果出现异常:

  • 状态栏显示 snapshots off:运行 /tm,原因就在顶部。常见原因包括会话根目录是你的主目录、storeDir 为相对路径或位于项目内、缺少 git,或基线快照耗时超过 5 秒。
  • 在大型仓库中,每个修改类工具都要承担快照时间;平均值显示在状态栏。
  • 项目内持续变化的日志文件会在每个修改类工具之前产生一个 external 步骤。
  • 被忽略的文件(构建产物、node_modules、.env)不会被快照或还原。
  • 面板和状态栏显示在终端中;在 VS Code 聊天面板中只有命令可用。

常见问题

Time Machine 会改动我项目里的 .git 吗?
不会。快照保存在存储目录下单独的裸仓库中,每个会话有自己的索引。每次调用 git 时都会固定它的环境变量,所以你自己的 .git 不会被写入。你本地的 .git/info/exclude 会被复制到影子仓库,.gitignore 规则同样适用。
快照存放在哪里,保留多久?
默认在 ~/.claude/time-machine,每个项目一个文件夹,可用 storeDir 选项更改。超过 14 天的会话最多每天清理一次;把 retentionDays 设为 0 则全部保留。
Claude 能自己还原文件或重跑命令吗?
不能。带 --yes 的 restore 和 branch,以及除 --isolated 试运行之外的所有 rerun,只有在你亲自输入命令时才会执行。请求来自其他来源时,命令会拒绝并指出来源。这些功能都没有作为模型可调用的工具暴露。
它会通过网络发送数据吗?
我们没有发现。插件没有任何网络代码,只在本地运行 git、mkdir、rm、cp、find 和 sh,并且只写入自己的存储文件夹。
它和 Claude Code 的 /rewind 有什么区别?
作者说明它不能取代 /rewind。Time Machine 还会为 Bash 改动的文件做快照,跨工具保留时间线,推断哪些修改最可能导致测试失败,对比两次运行并重跑某一步。它只还原文件,不会回退对话。
Blast Radius 在 Claude Code 中运行精选

Blast Radius

在 Claude Code 运行 rm -r、强制推送或数据库迁移之前先拦下,列出会受影响的文件或提交,等你确认。

  • 面板
  • 输入框上方
  • 执行命令
  • 拦截工具调用
  • 修改界面

已在 v2.1.291 实测

工具调用计数器 在 Claude Code 中运行精选

工具调用计数器

统计 Claude 每轮和每个会话的工具调用次数,在加载指示器旁显示计数,并新增 /tally 查看明细。

  • 加载动画
  • 对话记录
  • 状态栏
  • 拦截工具调用
  • 修改界面
  • 添加命令/工具

已在 v2.1.310 实测

更多 计时、待办与站会、斜杠命令。