Zum Inhalt springen
claudemods

Time Machine: Eine Claude Code Zeitleiste jedes Tool-Aufrufs

Zeitleiste jedes Tool-Aufrufs mit Shadow-Git-Snapshots: vergleichen, wiederherstellen, verzweigen, wiederholen.

Berechtigungen

  • Liest DateienKann Dateien lesen und Verzeichnisse auf deinem Rechner auflisten ($.fs.read / list / stat / exists).
  • Schreibt DateienKann Dateien auf deinem Rechner anlegen oder überschreiben ($.fs.write).
  • Führt Befehle ausKann Shell-Programme auf deinem Rechner ausführen ($.process.run / spawn). Im Quellcode siehst du, welche genau.
  • Fängt Tool-Aufrufe abSieht jeden Tool-Aufruf von Claude (tool.call / tool.check) und könnte ihn blockieren oder verändern.
  • Liest deine PromptsKann sehen, was du eingibst, und den Gesprächsverlauf lesen (prompt.* / session.append / session.messages).
  • Verändert die OberflächeZeichnet in die Oberfläche von Claude Code: Leisten, Bereiche, Statustext, Toasts (ui.render / $.ui.*).
  • Fügt Befehle/Tools hinzuRegistriert neue Slash-Befehle oder Tools, die du oder Claude aufrufen können ($.command.register / $.tool.register).
  • Speichert DatenBehält Daten zwischen Sitzungen im privaten Speicher des Plugins ($.store.*).
getestet mit
v2.1.303
zuletzt getestet
erfordert
Claude Code ≥ 2.1.287
Oberflächen
Statuszeile, Bereich

In Claude Code installieren:

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

Was macht diese Mod?

Time Machine ist eine Community-Mod von YeonwooSung (my-claude-code-mods), die jeder Claude-Code-Sitzung eine Claude Code Zeitleiste gibt. Wenn ein Agent mehrere Dateien ändert und du an einem falschen Ort landest, zeigt ein git diff nur, was sich geändert hat. Time Machine hält fest, welcher Tool-Aufruf in welcher Reihenfolge lief und wie die Dateien danach aussahen, sodass du zu jedem Schritt zurückgehen kannst.

Alles läuft über einen Befehl, /tm. /tm zeichnet die Zeitleiste, /tm show <n> zeigt einen Schritt, /tm diff <a> [b] vergleicht die Dateien zu zwei Schritten, und /tm why listet die Änderungen auf, die einen fehlgeschlagenen Testlauf am wahrscheinlichsten verursacht haben. /tm restore <n> und /tm branch <n> setzen die Dateien auf einen Schritt zurück, /tm compare vergleicht zwei Branches oder Sitzungen, /tm rerun <n> führt einen Schritt erneut aus, und /tm sessions listet aufgezeichnete Sitzungen. /tm-pane öffnet ein Live-Panel mit der Zeitleiste, und die Statuszeile zeigt etwa tm ② · 1 snaps · 79ms.

Die Mod stellt Dateien wieder her und führt Tools erneut aus; Antworten des Modells spielt sie nicht erneut ab, und die Unterhaltung wird nicht zurückgespult.

Demo

Die Aufnahme startet Claude Code mit geladener Mod im kleinen Demoprojekt, wobei der Speicher auf einen temporären Ordner zeigt. Wir bitten Claude, NOTES.md mit einer Zeile über das Projekt anzulegen. Claude liest README.md und schreibt die Datei. Dabei zählt die Statuszeile von tm ⓪ auf tm ② hoch und zeigt 1 snaps. Dann geben wir /tm ein. Die Zeitleiste listet den Baseline-Snapshot (5 Dateien), ① Read README.md und ② Write NOTES.md mit eigenem Snapshot, in dem A NOTES.md die hinzugefügte Datei markiert.

Installation

Nutze eine der Methoden im Installationsblock; sie installieren direkt aus dem eigenen Marketplace des Autors. Die Mod startet mit der nächsten Sitzung, und /tm wird beim Sitzungsstart registriert.

$ install time-machine

Erfordert Claude Code ≥ 2.1.287

Wird aus dem Marketplace des Autors installiert: YeonwooSung/my-claude-code-mods

  1. 1.Eine Zeile, direkt in Claude Code

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

    In eine laufende Sitzung einfügen (v2.1.275+). Claude Code fragt zuerst, ob der Marketplace hinzugefügt werden soll.

  2. 2.Aus deiner Shell

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

    Führe danach in jeder bereits geöffneten Sitzung /reload-plugins aus.

  3. 3.Ohne Installation ausprobieren

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

    Lädt die Mod nur für eine Sitzung. An deinen Einstellungen wird nichts geändert.

So funktioniert es

Bei jedem tool.call wird ein Schritt aufgezeichnet. Nach jedem Tool, das Dateien verändert (Edit, Write, standardmäßig jeder Bash-Aufruf, unbekannte Tools und MCP-Tools), committet die Mod den Arbeitsbaum in ein „Shadow“-Bare-Repository in ihrem eigenen Speicher, mit eigenem Index, sodass dein .git nie gelesen oder beschrieben wird. Hat sich der Baum seit dem letzten Snapshot vor dem Start eines Tools geändert, etwa weil du eine Datei in der IDE bearbeitet hast, wird das als external-Schritt festgehalten und nicht dem Agenten angelastet. Die Schutzabfrage für Befehle, die Dateien ändern, aus 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 ist eine Schlussfolgerung, kein Beweis: Es nimmt den letzten erfolgreichen Lauf desselben Testbefehls vor einem fehlgeschlagenen und bewertet jede dazwischen geänderte Datei, höher, wenn die Fehlerausgabe den Pfad nennt. Die Testausgabe wird für pytest, jest und vitest, go, cargo und node:test geparst; andere Ausgaben nutzen nur den Exit-Status.

Anpassen

In den Plugin-Einstellungen gibt es vier Optionen:

  • storeDir: Wo Snapshots und Zeitleisten liegen, ein Ordner pro Projekt. Der Pfad muss absolut sein oder mit ~/ beginnen und außerhalb des Projekts liegen, sonst werden Snapshots abgeschaltet. Standard ist ~/.claude/time-machine.
  • retentionDays: Sitzungen, die älter sind, werden gelöscht, geprüft höchstens einmal am Tag. Standard ist 14; 0 behält alles.
  • recordModelOutput: standardmäßig aus. Eingeschaltet speichert es den Antworttext des Modells und die ersten 200 Zeichen jedes Prompts; ausgeschaltet nur Längen und Hashes.
  • skipSearchBash: standardmäßig aus. Eingeschaltet wird nach Bash-Befehlen, die als Suche eingestuft sind (rg, grep, ls, cat), kein Snapshot gemacht.

Berechtigungen & Sicherheit

Wir haben jede Datei gelesen, die das Plugin lädt: plugin.json, hooks/hooks.json, hooks/register.tsx, hooks/git.ts und alles in hooks/core/, dazu die README und die Tests. Es gibt kein package.json, kein Installationsskript, keine Binärdatei und keinen gebündelten Code. Eine Suche nach fetch, http, child_process, eval, dynamischem import(), WebSocket sowie Zero-Width- und bidirektionalen Unicode-Zeichen ergab nichts. Bemerkenswerte Befunde:

  • Startet Prozesse über $.process.run: git (gegen das Shadow-Repository) sowie mkdir, rm -rf, cp, find -delete und sh. rm -rf und find -delete sind auf Pfade innerhalb des Speicherordners beschränkt (isInside-Prüfungen in register.tsx und git.ts). /tm rerun --isolated --yes führt den aufgezeichneten Bash-Befehl mit sh -lc in einer Snapshot-Kopie aus. Das ist keine Sandbox und läuft nicht über den Berechtigungsdialog; es läuft nur, wenn du es eingibst, und lehnt Befehle ab, die den absoluten Projektpfad nennen.
  • Schreibt Dateien im Speicherordner, standardmäßig ~/.claude/time-machine. Nichts wird in settings.json, Shell-Dateien, LaunchAgents oder Git-Hooks geschrieben. /tm restore --yes überschreibt die verfolgten Dateien deines Projekts, aber nur, wenn du es eingibst, nach einem Snapshot vor der Wiederherstellung, und es verweigert, wenn ignorierte Dateien überschrieben würden.
  • Zeichnet deine Arbeit auf: Snapshots enthalten den vollständigen Inhalt aller nicht ignorierten Dateien, auch Geheimnisse, die du im Projekt ablegst. Tool-Eingaben und -Ergebnisse werden nach bestem Bemühen maskiert, Dateiinhalte in Snapshots aber nicht. Prüfe den Speicherordner, bevor du ihn teilst.
  • Fügt einmal Text in die Unterhaltung ein: Nach einer Wiederherstellung hängt es eine Notiz an, dass die Dateien wiederhergestellt wurden und frühere Tool-Ergebnisse veraltet sind. Sonst schreibt es weder Prompts noch Tool-Ergebnisse um.
  • Umhüllt jeden Tool-Aufruf (tool.call-Gating-Hook mit .catch). Es reicht die Antwort unverändert durch, Ablehnungen eingeschlossen, und Aufzeichnungsfehler blockieren das Tool nie. Parallele ändernde Aufrufe warten auf die Prüfung auf externe Änderungen.
  • Kein Netzwerk, keine Daemons, keine Telemetrie. Das Aufräumen läuft nach dem Start abgekoppelt, endet aber mit der Sitzung. Die einzige gelesene Umgebungsvariable ist HOME.
  • Externe Voraussetzung: git muss installiert sein. Snapshots werden abgeschaltet, wenn die Sitzungswurzel dein Home-Ordner oder / ist.
  • Lizenz: Apache-2.0 (LICENSE-Datei im Repository-Stamm), die Weitergabe erlaubt.

claude plugin validate meldete keine Fehler oder Warnungen. Die Tests des Autors bestanden auf Claude Code 2.1.303: 103 bestanden, 0 fehlgeschlagen.

Liest Dateien
Kann Dateien lesen und Verzeichnisse auf deinem Rechner auflisten ($.fs.read / list / stat / exists).
Schreibt Dateien
Kann Dateien auf deinem Rechner anlegen oder überschreiben ($.fs.write).
Führt Befehle aus
Kann Shell-Programme auf deinem Rechner ausführen ($.process.run / spawn). Im Quellcode siehst du, welche genau.
Fängt Tool-Aufrufe ab
Sieht jeden Tool-Aufruf von Claude (tool.call / tool.check) und könnte ihn blockieren oder verändern.
Liest deine Prompts
Kann sehen, was du eingibst, und den Gesprächsverlauf lesen (prompt.* / session.append / session.messages).
Verändert die Oberfläche
Zeichnet in die Oberfläche von Claude Code: Leisten, Bereiche, Statustext, Toasts (ui.render / $.ui.*).
Fügt Befehle/Tools hinzu
Registriert neue Slash-Befehle oder Tools, die du oder Claude aufrufen können ($.command.register / $.tool.register).
Speichert Daten
Behält Daten zwischen Sitzungen im privaten Speicher des Plugins ($.store.*).

Kompatibilität & Fehlerbehebung

Getestet mit Claude Code 2.1.303 unter macOS (validate, die Tests des Autors und die Demo-Aufnahme). Der Autor nennt Claude Code 2.1.287 oder neuer. Wenn etwas nicht stimmt:

  • Die Statuszeile zeigt snapshots off: Führe /tm aus; der Grund steht ganz oben. Häufige Ursachen sind ein Home-Ordner als Sitzungswurzel, ein relatives oder im Projekt liegendes storeDir, fehlendes git oder ein Baseline-Snapshot, der länger als 5 Sekunden dauerte.
  • In einem großen Repository zahlt jedes ändernde Tool die Snapshot-Zeit; der Durchschnitt steht in der Statuszeile.
  • Eine Logdatei, die sich im Projekt ständig ändert, erzeugt vor jedem ändernden Tool einen external-Schritt.
  • Ignorierte Dateien (Build-Ausgaben, node_modules, .env) werden weder gesichert noch wiederhergestellt.
  • Panel und Statuszeile erscheinen im Terminal; im VS-Code-Chatpanel funktionieren nur die Befehle.

FAQ

Verändert Time Machine das .git meines Projekts?
Nein. Snapshots landen in einem separaten Bare-Repository im Speicherordner, mit einem eigenen Index pro Sitzung. Bei jedem Git-Aufruf werden die Umgebungsvariablen auf dieses Repository festgelegt, daher wird dein eigenes .git nicht beschrieben. Deine lokale .git/info/exclude wird in das Shadow-Repository kopiert, und deine .gitignore-Regeln gelten.
Wo werden die Snapshots gespeichert und wie lange bleiben sie erhalten?
Standardmäßig in ~/.claude/time-machine, ein Ordner pro Projekt. Den Ordner kannst du mit der Option storeDir ändern. Sitzungen, die älter als 14 Tage sind, werden höchstens einmal am Tag gelöscht; mit retentionDays auf 0 bleibt alles erhalten.
Kann Claude von selbst Dateien wiederherstellen oder Befehle wiederholen?
Nein. Ein restore oder branch mit --yes und jedes rerun außer dem --isolated-Probelauf läuft nur, wenn du den Befehl selbst eingegeben hast. Kommt die Anfrage aus einer anderen Quelle, lehnt der Befehl ab und nennt die Quelle. Nichts davon ist als Tool verfügbar, das das Modell aufrufen kann.
Sendet es etwas über das Netzwerk?
Wir haben nichts gefunden. Das Plugin enthält keinen Netzwerkcode. Es führt git, mkdir, rm, cp, find und sh lokal aus und schreibt nur in seinen eigenen Speicherordner.
Wie unterscheidet es sich von /rewind in Claude Code?
Der Autor sagt, es ersetze /rewind nicht. Time Machine macht auch Snapshots von Dateien, die Bash geändert hat, führt eine Zeitleiste über alle Tools hinweg, schätzt, welche Änderungen einen Testfehler wahrscheinlich verursacht haben, vergleicht zwei Läufe und wiederholt einen Schritt. Es stellt nur Dateien wieder her; die Unterhaltung wird nicht zurückgespult.
Blast Radius in Claude CodeEmpfohlen

Blast Radius

Hält rm -r, Force-Pushes und Migrationen in Claude Code an, zeigt betroffene Dateien oder Commits und wartet auf OK.

  • Bereich
  • über dem Prompt
  • Führt Befehle aus
  • Fängt Tool-Aufrufe ab
  • Verändert die Oberfläche

getestet mit v2.1.291

Tool-Call-Zähler in Claude CodeEmpfohlen

Tool-Call-Zähler

Zählt Claudes Tool-Aufrufe pro Turn und Sitzung, zeigt sie neben dem Spinner und ergänzt /tally als Übersicht.

  • Spinner
  • Verlauf
  • Statuszeile
  • Fängt Tool-Aufrufe ab
  • Verändert die Oberfläche
  • Fügt Befehle/Tools hinzu

getestet mit v2.1.310

Mehr in Timer, Todos, Standups, Slash-Commands.