Saltar al contenido
claudemods

Time Machine: una línea de tiempo de Claude Code de cada llamada a herramientas

Línea de tiempo de cada llamada a herramientas con instantáneas en git sombra: compara, restaura, ramifica y repite.

Permisos

  • Lee archivosPuede leer archivos y listar directorios en tu equipo ($.fs.read / list / stat / exists).
  • Escribe archivosPuede crear o sobrescribir archivos en tu equipo ($.fs.write).
  • Ejecuta comandosPuede ejecutar programas de shell en tu equipo ($.process.run / spawn). Revisa el código fuente para ver exactamente cuáles.
  • Intercepta llamadas a herramientasVe cada llamada a herramienta que hace Claude (tool.call / tool.check) y podría bloquearla o modificarla.
  • Lee tus promptsPuede ver lo que escribes y la transcripción de la conversación (prompt.* / session.append / session.messages).
  • Modifica la interfazDibuja en la interfaz de Claude Code: bandas, paneles, texto de estado, avisos (ui.render / $.ui.*).
  • Añade comandos/herramientasRegistra nuevos comandos de barra o herramientas invocables por ti o por Claude ($.command.register / $.tool.register).
  • Guarda datosConserva datos entre sesiones en el almacén privado del plugin ($.store.*).
probado con
v2.1.303
última prueba
requiere
Claude Code ≥ 2.1.287
superficies
estado, panel

Instalar dentro de Claude Code:

/plugin install time-machine --marketplace YeonwooSung/my-claude-code-mods
Todas las opciones de instalación ↓

¿Qué hace este mod?

Time Machine es un mod de la comunidad creado por YeonwooSung (my-claude-code-mods) que da a cada sesión una línea de tiempo de Claude Code. Cuando un agente edita varios archivos y terminas en un estado equivocado, un git diff solo dice qué cambió. Time Machine registra qué llamada a herramientas se ejecutó, en qué orden y cómo quedaron los archivos después, para que puedas volver a cualquier paso.

Todo pasa por un solo comando, /tm. /tm dibuja la línea de tiempo, /tm show <n> muestra un paso, /tm diff <a> [b] compara los archivos en dos pasos y /tm why enumera las ediciones que más probablemente rompieron una ejecución de pruebas fallida. /tm restore <n> y /tm branch <n> devuelven los archivos a un paso, /tm compare compara dos ramas o sesiones, /tm rerun <n> repite un paso y /tm sessions lista las sesiones registradas. /tm-pane abre un panel con la línea de tiempo en vivo, y la barra de estado muestra algo como tm ② · 1 snaps · 79ms.

Restaura archivos y repite herramientas; no reproduce las respuestas del modelo y la conversación no se rebobina.

Demo

La grabación inicia Claude Code con el mod cargado en el pequeño proyecto de demostración, con el almacenamiento apuntando a una carpeta temporal. Le pedimos a Claude que cree NOTES.md con una línea sobre el proyecto. Claude lee README.md y escribe el archivo. Mientras tanto, la barra de estado sube de tm ⓪ a tm ② y muestra 1 snaps. Luego escribimos /tm. La línea de tiempo lista la instantánea base (5 archivos), ① Read README.md y ② Write NOTES.md con su propia instantánea, donde A NOTES.md marca el archivo añadido.

Instalación

Usa cualquiera de los métodos del bloque de instalación; instalan directamente desde el marketplace propio del autor. El mod se activa en la siguiente sesión, y /tm se registra al iniciar la sesión.

$ install time-machine

Requiere Claude Code ≥ 2.1.287

Se instala desde el marketplace del autor: YeonwooSung/my-claude-code-mods

  1. 1.Una línea, dentro de Claude Code

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

    Pégala en una sesión abierta (v2.1.275+). Claude Code te pedirá primero añadir el marketplace.

  2. 2.Desde tu shell

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

    Después ejecuta /reload-plugins en cualquier sesión que ya esté abierta.

  3. 3.Pruébalo sin instalarlo

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

    Carga el mod solo para una sesión. No se añade nada a tu configuración.

Cómo funciona

En cada tool.call el mod registra un paso. Después de cada herramienta que modifica archivos (edición, escritura, cada llamada a Bash por defecto, herramientas desconocidas y de MCP) hace commit del árbol de trabajo en un repositorio bare «sombra» guardado en su propio almacenamiento, con su propio índice, de modo que tu .git nunca se lee ni se escribe. Si antes de ejecutar una herramienta el árbol cambió desde la última instantánea, por ejemplo porque editaste un archivo en tu IDE, se registra como un paso external en lugar de atribuirlo al agente. La protección de los comandos que cambian archivos, de 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 es una inferencia, no una prueba: toma la última ejecución correcta del mismo comando de pruebas antes de una fallida y puntúa cada archivo cambiado entre ambas, más alto si la salida del fallo menciona la ruta. La salida de pruebas se analiza para pytest, jest y vitest, go, cargo y node:test; cualquier otra salida usa solo el código de salida.

Personalízalo

La configuración del plugin tiene cuatro opciones:

  • storeDir: dónde viven las instantáneas y las líneas de tiempo, una carpeta por proyecto. Debe ser una ruta absoluta o empezar por ~/, y estar fuera del proyecto; si no, las instantáneas se desactivan. Por defecto es ~/.claude/time-machine.
  • retentionDays: las sesiones más antiguas se borran, comprobándolo como máximo una vez al día. Por defecto 14; 0 lo conserva todo.
  • recordModelOutput: desactivada por defecto. Activada, guarda el texto de la respuesta del modelo y los primeros 200 caracteres de cada prompt; desactivada, solo longitudes y hashes.
  • skipSearchBash: desactivada por defecto. Activada, no se hace instantánea tras los comandos de Bash clasificados como búsqueda (rg, grep, ls, cat).

Permisos y seguridad

Leímos todos los archivos que carga el plugin: plugin.json, hooks/hooks.json, hooks/register.tsx, hooks/git.ts y todo lo de hooks/core/, además del README y las pruebas. No hay package.json, script de instalación, binarios ni código empaquetado. Una búsqueda de fetch, http, child_process, eval, import() dinámico, WebSocket y caracteres Unicode de ancho cero o bidireccionales no encontró nada. Hallazgos destacables:

  • Ejecuta procesos mediante $.process.run: git (contra el repositorio sombra), además de mkdir, rm -rf, cp, find -delete y sh. rm -rf y find -delete se limitan a rutas dentro de la carpeta de almacenamiento (comprobaciones isInside en register.tsx y git.ts). /tm rerun --isolated --yes ejecuta el comando de Bash registrado con sh -lc en una copia de la instantánea. No es un sandbox y no pasa por el diálogo de permisos; solo se ejecuta cuando lo escribes y rechaza comandos que nombren la ruta absoluta del proyecto.
  • Escribe archivos en la carpeta de almacenamiento, ~/.claude/time-machine por defecto. No escribe en settings.json, archivos de shell, LaunchAgents ni hooks de git. /tm restore --yes reescribe los archivos rastreados de tu proyecto, pero solo cuando lo escribes, tras guardar una instantánea previa, y se niega si se sobrescribirían archivos ignorados.
  • Registra tu trabajo: las instantáneas contienen el contenido completo de los archivos no ignorados, incluidos los secretos que tengas en el proyecto. Las entradas y resultados de las herramientas se enmascaran en la medida de lo posible, pero el contenido de los archivos en las instantáneas no. Revisa la carpeta antes de compartirla.
  • Inyecta texto en la conversación una sola vez: tras una restauración añade una nota que dice que los archivos se restauraron y que los resultados anteriores de herramientas están desactualizados. Por lo demás, no reescribe prompts ni resultados.
  • Envuelve cada llamada a herramientas (hook de control tool.call con .catch). Pasa la respuesta sin cambios, incluidas las denegaciones, y los errores de registro nunca bloquean la herramienta. Las llamadas modificadoras en paralelo esperan a la comprobación de cambios externos.
  • Sin red, demonios ni telemetría. La limpieza se ejecuta separada tras el inicio, pero termina con la sesión. La única variable de entorno que lee es HOME.
  • Requisito externo: git debe estar instalado. Las instantáneas se desactivan si la raíz de la sesión es tu carpeta personal o /.
  • Licencia: Apache-2.0 (archivo LICENSE en la raíz del repositorio), que permite la redistribución.

claude plugin validate no informó de errores ni advertencias. Las pruebas del autor pasaron en Claude Code 2.1.303: 103 correctas, 0 fallidas.

Lee archivos
Puede leer archivos y listar directorios en tu equipo ($.fs.read / list / stat / exists).
Escribe archivos
Puede crear o sobrescribir archivos en tu equipo ($.fs.write).
Ejecuta comandos
Puede ejecutar programas de shell en tu equipo ($.process.run / spawn). Revisa el código fuente para ver exactamente cuáles.
Intercepta llamadas a herramientas
Ve cada llamada a herramienta que hace Claude (tool.call / tool.check) y podría bloquearla o modificarla.
Lee tus prompts
Puede ver lo que escribes y la transcripción de la conversación (prompt.* / session.append / session.messages).
Modifica la interfaz
Dibuja en la interfaz de Claude Code: bandas, paneles, texto de estado, avisos (ui.render / $.ui.*).
Añade comandos/herramientas
Registra nuevos comandos de barra o herramientas invocables por ti o por Claude ($.command.register / $.tool.register).
Guarda datos
Conserva datos entre sesiones en el almacén privado del plugin ($.store.*).

Compatibilidad y solución de problemas

Probado con Claude Code 2.1.303 en macOS (validate, las pruebas del autor y la grabación de la demo). El autor indica Claude Code 2.1.287 o posterior. Si algo falla:

  • La barra de estado muestra snapshots off: ejecuta /tm; el motivo aparece arriba. Las causas habituales son una raíz de sesión igual a tu carpeta personal, un storeDir relativo o dentro del proyecto, falta de git o una instantánea base que tardó más de 5 segundos.
  • En un repositorio grande, cada herramienta modificadora paga el tiempo de la instantánea; el promedio está en la barra de estado.
  • Un archivo de registro que cambia constantemente dentro del proyecto genera un paso external antes de cada herramienta modificadora.
  • Los archivos ignorados (resultados de compilación, node_modules, .env) nunca se guardan ni se restauran.
  • El panel y la barra de estado se muestran en el terminal; en el panel de chat de VS Code solo funcionan los comandos.

Preguntas frecuentes

¿Time Machine toca el .git de mi proyecto?
No. Las instantáneas van a un repositorio bare aparte dentro de la carpeta de almacenamiento, con su propio índice por sesión. Las variables de entorno de git se fijan a ese repositorio en cada llamada, así que tu propio .git no se modifica. Tu .git/info/exclude local se copia al repositorio sombra y se aplican tus reglas de .gitignore.
¿Dónde se guardan las instantáneas y cuánto tiempo se conservan?
Por defecto en ~/.claude/time-machine, una carpeta por proyecto. Puedes cambiar la carpeta con la opción storeDir. Las sesiones de más de 14 días se borran como máximo una vez al día; con retentionDays en 0 se conserva todo.
¿Puede Claude restaurar archivos o repetir comandos por su cuenta?
No. Un restore o branch con --yes, y cualquier rerun salvo el ensayo con --isolated, solo se ejecuta cuando tú escribes el comando. Si la petición viene de otro origen, el comando se niega y nombra ese origen. Nada de esto se expone como herramienta que el modelo pueda llamar.
¿Envía algo por la red?
No encontramos nada. El plugin no tiene código de red. Ejecuta git, mkdir, rm, cp, find y sh en local, y solo escribe en su propia carpeta de almacenamiento.
¿En qué se diferencia de /rewind de Claude Code?
El autor dice que no lo sustituye. Time Machine también hace instantáneas de los archivos que cambia Bash, mantiene una línea de tiempo entre herramientas, estima qué ediciones probablemente causaron un fallo de pruebas, compara dos ejecuciones y repite un paso. Solo restaura archivos; la conversación no se rebobina.
Blast Radius funcionando en Claude CodeDestacado

Blast Radius

Retiene rm -r, force push y migraciones de base de datos en Claude Code y muestra qué cambiarían antes de ejecutarse.

  • panel
  • sobre el prompt
  • Ejecuta comandos
  • Intercepta llamadas a herramientas
  • Modifica la interfaz

probado con v2.1.291

Contador de llamadas a herramientas funcionando en Claude CodeDestacado

Contador de llamadas a herramientas

Cuenta las llamadas a herramientas por turno y sesión, muestra el total junto al spinner y añade /tally con un desglose.

  • spinner
  • transcripción
  • estado
  • Intercepta llamadas a herramientas
  • Modifica la interfaz
  • Añade comandos/herramientas

probado con v2.1.310

Más en Temporizadores, tareas y standups, Comandos slash.