Time Machine:全ツール呼び出しの Claude Code タイムライン
すべてのツール呼び出しを分岐できるタイムラインに記録し、シャドウ git のスナップショットで差分・復元・分岐・再実行ができます。
権限
- ファイルを読み取るお使いのマシン上のファイルの読み取りやディレクトリの一覧取得ができます($.fs.read / list / stat / exists)。
- ファイルを書き込むお使いのマシン上でファイルを作成・上書きできます($.fs.write)。
- コマンドを実行お使いのマシン上でシェルのプログラムを実行できます($.process.run / spawn)。具体的に何を実行するかはソースで確認してください。
- ツール呼び出しを傍受Claude が行うすべてのツール呼び出しを参照でき(tool.call / tool.check)、ブロックや変更も可能です。
- プロンプトを読み取る入力内容と会話のトランスクリプトを参照できます(prompt.* / session.append / session.messages)。
- UI を変更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このModでできること
Time Machine は YeonwooSung(my-claude-code-mods)によるコミュニティ製の拡張で、各 Claude Code セッションに Claude Code タイムラインを提供します。エージェントが複数のファイルを編集して意図しない状態になったとき、git diff では何が変わったかしか分かりません。Time Machine は、どのツール呼び出しが、どの順番で実行され、その後ファイルがどうなっていたかを記録するので、任意のステップに戻れます。
操作はすべて /tm という 1 つのコマンドで行います。/tm でタイムラインを表示し、/tm show <n> で 1 つのステップを表示し、/tm diff <a> [b] で 2 つのステップ時点のファイルを比較し、/tm why で失敗したテストの原因になった可能性が高い編集を挙げます。/tm restore <n> と /tm branch <n> でファイルをそのステップの状態に戻し、/tm compare で 2 つのブランチやセッションを比較し、/tm rerun <n> でステップを再実行し、/tm sessions で記録済みセッションを一覧にします。/tm-pane はライブのタイムラインペインを開き、ステータスラインには tm ② · 1 snaps · 79ms のような表示が出ます。
復元するのはファイルとツールの再実行までで、モデルの回答を再生したり、会話を巻き戻したりはしません。
デモ
録画では、小さなデモプロジェクトでこの拡張を読み込んだ Claude Code を起動し、保存先を一時フォルダにしています。Claude にプロジェクトの説明を 1 行だけ書いた 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 以上が必要
作者のマーケットプレイスからインストール: YeonwooSung/my-claude-code-mods
1.Claude Code 内で1行
/plugin install time-machine --marketplace YeonwooSung/my-claude-code-mods実行中のセッション(v2.1.275 以降)に貼り付けます。最初に Claude Code がマーケットプレイスの追加を確認します。
2.シェルから
claude plugin marketplace add YeonwooSung/my-claude-code-mods claude plugin install time-machine@my-claude-code-modsその後、すでに開いているセッションでは /reload-plugins を実行してください。
3.インストールせずに試す
git clone https://github.com/YeonwooSung/my-claude-code-mods claude --plugin-dir ./my-claude-code-mods/time-machineその1セッションだけ Mod を読み込みます。設定には何も追加されません。
仕組み
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 の形式を解析し、それ以外は終了ステータスだけを使います。
カスタマイズ
プラグインの設定には 4 つのオプションがあります。
storeDir:スナップショットとタイムラインの保存先で、プロジェクトごとに 1 フォルダです。絶対パスまたは~/で始まるパスで、プロジェクトの外にある必要があり、そうでないとスナップショットは無効になります。既定は~/.claude/time-machineです。retentionDays:この日数より古いセッションを削除します。確認は最大で 1 日 1 回です。既定は 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は、記録された Bash コマンドをスナップショットのコピー内でsh -lcにより実行します。これはサンドボックスではなく、権限ダイアログも通りません。あなたが自分で入力したときだけ実行され、プロジェクトの絶対パスを含むコマンドは拒否されます。 - ファイルを書き込みます:保存先フォルダ(既定は
~/.claude/time-machine)の下です。settings.json、シェルのファイル、LaunchAgents、git フックには書き込みません。/tm restore --yesはプロジェクトの追跡ファイルを書き換えますが、あなたが入力したときだけ、復元前のスナップショットを保存した後に実行され、無視されたファイルを上書きしてしまう場合は拒否します。 - 作業内容を記録します:スナップショットには無視されていないファイルの全内容が入り、プロジェクト内に置いたシークレットも含まれます。ツールの入力と結果はベストエフォートでマスクされますが、スナップショット内のファイル内容はマスクされません。保存先フォルダを共有する前に確認してください。
- 会話へのテキスト挿入は 1 回だけです。復元の後に、ファイルが復元されたこと、以前のツール結果が古くなったことを伝えるメモを追加します。それ以外でプロンプトやツール結果を書き換えることはありません。
- すべてのツール呼び出しをラップします(
.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)。
- コマンドを実行
- お使いのマシン上でシェルのプログラムを実行できます($.process.run / spawn)。具体的に何を実行するかはソースで確認してください。
- ツール呼び出しを傍受
- Claude が行うすべてのツール呼び出しを参照でき(tool.call / tool.check)、ブロックや変更も可能です。
- プロンプトを読み取る
- 入力内容と会話のトランスクリプトを参照できます(prompt.* / session.append / session.messages)。
- UI を変更
- 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 日より古いセッションは最大で 1 日 1 回削除されます。retentionDays を 0 にすると全て保持します。
- Claude が自分でファイルを復元したりコマンドを再実行したりできますか?
- できません。--yes 付きの restore と branch、および --isolated のドライラン以外の rerun は、あなたが自分で入力したときだけ実行されます。別の経路からの要求は、その経路を示して拒否されます。モデルが呼べるツールとしては公開されていません。
- ネットワークに何か送信しますか?
- 確認できた範囲では送信しません。プラグインにネットワークのコードはなく、git、mkdir、rm、cp、find、sh をローカルで実行し、自身の保存先フォルダにだけ書き込みます。
- Claude Code の /rewind とはどう違いますか?
- 作者は /rewind の代わりではないと述べています。Time Machine は Bash が変更したファイルもスナップショットし、ツールをまたいだタイムラインを保持し、テスト失敗の原因になりやすい編集を推定し、2 つの実行を比較し、ステップを再実行できます。復元するのはファイルだけで、会話は巻き戻りません。
# 関連する Mod
おすすめBlast Radius
rm -r、強制プッシュ、データベースのマイグレーションを実行前に止め、影響を受けるファイルやコミットを一覧表示して、あなたの判断を待ちます。
- ペイン
- プロンプト上部
- コマンドを実行
- ツール呼び出しを傍受
- UI を変更
v2.1.291 で検証済み
おすすめツール呼び出しカウンター
Claude のツール呼び出しをターンごと・セッションごとに数え、スピナーの横に件数を表示。/tally で内訳も確認できます。
- スピナー
- トランスクリプト
- ステータス
- ツール呼び出しを傍受
- UI を変更
- コマンド・ツールを追加
v2.1.310 で検証済み
同じカテゴリの Mod: タイマー、ToDo、スタンドアップ、スラッシュコマンド。