Time Machine: uma linha do tempo do Claude Code de cada chamada de ferramenta
Linha do tempo de cada chamada de ferramenta com snapshots em git sombra: compare, restaure, ramifique e repita.
Permissões
- Lê arquivosPode ler arquivos e listar diretórios na sua máquina ($.fs.read / list / stat / exists).
- Grava arquivosPode criar ou sobrescrever arquivos na sua máquina ($.fs.write).
- Executa comandosPode executar programas de shell na sua máquina ($.process.run / spawn). Confira no código-fonte exatamente quais.
- Intercepta chamadas de ferramentasVê cada chamada de ferramenta que o Claude faz (tool.call / tool.check) e pode bloqueá-la ou alterá-la.
- Lê seus promptsPode ver o que você digita e a transcrição da conversa (prompt.* / session.append / session.messages).
- Altera a interfaceDesenha na interface do Claude Code: faixas, painéis, texto de status, notificações (ui.render / $.ui.*).
- Adiciona comandos/ferramentasRegistra novos comandos de barra ou ferramentas que você ou o Claude podem acionar ($.command.register / $.tool.register).
- Armazena dadosGuarda dados entre sessões no armazenamento privado do plugin ($.store.*).
- testado com
- v2.1.303
- último teste
- requer
- Claude Code ≥ 2.1.287
- superfícies
- status, painel
- código-fonte
- YeonwooSung (Apache-2.0)
Instale dentro do Claude Code:
/plugin install time-machine --marketplace YeonwooSung/my-claude-code-modsO que este mod faz?
O Time Machine é um mod da comunidade feito por YeonwooSung (my-claude-code-mods) que dá a cada sessão uma linha do tempo do Claude Code. Quando um agente edita vários arquivos e você acaba num estado errado, um git diff só diz o que mudou. O Time Machine registra qual chamada de ferramenta rodou, em que ordem e como os arquivos ficaram depois, para que você possa voltar a qualquer passo.
Tudo passa por um único comando, /tm. /tm desenha a linha do tempo, /tm show <n> mostra um passo, /tm diff <a> [b] compara os arquivos em dois passos e /tm why lista as edições que mais provavelmente quebraram uma execução de testes com falha. /tm restore <n> e /tm branch <n> devolvem os arquivos a um passo, /tm compare compara dois branches ou sessões, /tm rerun <n> repete um passo e /tm sessions lista as sessões registradas. /tm-pane abre um painel com a linha do tempo ao vivo, e a barra de status mostra algo como tm ② · 1 snaps · 79ms.
Ele restaura arquivos e repete ferramentas; não reproduz as respostas do modelo e a conversa não é retrocedida.
Demonstração
A gravação inicia o Claude Code com o mod carregado no pequeno projeto de demonstração, com o armazenamento apontando para uma pasta temporária. Pedimos ao Claude que crie NOTES.md com uma linha sobre o projeto. O Claude lê o README.md e escreve o arquivo. Enquanto isso, a barra de status sobe de tm ⓪ para tm ② e mostra 1 snaps. Depois digitamos /tm. A linha do tempo lista o snapshot base (5 arquivos), ① Read README.md e ② Write NOTES.md com seu próprio snapshot, em que A NOTES.md marca o arquivo adicionado.
Instalação
Use qualquer um dos métodos do bloco de instalação; eles instalam direto do marketplace do próprio autor. O mod passa a funcionar na próxima sessão, e o /tm é registrado quando a sessão começa.
$ install time-machine
Requer Claude Code ≥ 2.1.287
Instala a partir do marketplace do autor: YeonwooSung/my-claude-code-mods
1.Uma linha, dentro do Claude Code
/plugin install time-machine --marketplace YeonwooSung/my-claude-code-modsCole em uma sessão em andamento (v2.1.275+). O Claude Code pede primeiro para adicionar o marketplace.
2.Pelo seu shell
claude plugin marketplace add YeonwooSung/my-claude-code-mods claude plugin install time-machine@my-claude-code-modsDepois execute /reload-plugins em qualquer sessão que já esteja aberta.
3.Experimente sem instalar
git clone https://github.com/YeonwooSung/my-claude-code-mods claude --plugin-dir ./my-claude-code-mods/time-machineCarrega o mod só para uma sessão. Nada é adicionado às suas configurações.
Como funciona
A cada tool.call o mod registra um passo. Depois de cada ferramenta que modifica arquivos (edição, escrita, toda chamada de Bash por padrão, ferramentas desconhecidas e de MCP), ele faz commit da árvore de trabalho em um repositório bare "sombra" guardado no próprio armazenamento, com índice próprio, de modo que seu .git nunca é lido nem escrito. Se, antes de uma ferramenta rodar, a árvore mudou desde o último snapshot, por exemplo porque você editou um arquivo no IDE, isso é registrado como um passo external em vez de ser atribuído ao agente. A proteção dos comandos que alteram arquivos, 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 é uma inferência, não uma prova: ele pega a última execução bem-sucedida do mesmo comando de teste antes de uma que falhou e pontua cada arquivo alterado entre as duas, mais alto se a saída da falha menciona o caminho. A saída dos testes é analisada para pytest, jest e vitest, go, cargo e node:test; qualquer outra saída usa só o código de saída.
Personalize
As configurações do plugin têm quatro opções:
storeDir: onde ficam os snapshots e as linhas do tempo, uma pasta por projeto. Precisa ser um caminho absoluto ou começar com~/e ficar fora do projeto; caso contrário, os snapshots são desativados. O padrão é~/.claude/time-machine.retentionDays: sessões mais antigas são apagadas, verificado no máximo uma vez por dia. O padrão é 14;0mantém tudo.recordModelOutput: desativada por padrão. Ativada, guarda o texto da resposta do modelo e os primeiros 200 caracteres de cada prompt; desativada, apenas tamanhos e hashes.skipSearchBash: desativada por padrão. Ativada, não é feito snapshot após comandos de Bash classificados como busca (rg,grep,ls,cat).
Permissões e segurança
Lemos todos os arquivos que o plugin carrega: plugin.json, hooks/hooks.json, hooks/register.tsx, hooks/git.ts e tudo em hooks/core/, além do README e dos testes. Não há package.json, script de instalação, binário nem código empacotado. Uma busca por fetch, http, child_process, eval, import() dinâmico, WebSocket e caracteres Unicode de largura zero ou bidirecionais não encontrou nada. Achados relevantes:
- Executa processos por meio de
$.process.run:git(contra o repositório sombra), além demkdir,rm -rf,cp,find -deleteesh.rm -rfefind -deleteficam limitados a caminhos dentro da pasta de armazenamento (verificaçõesisInsideemregister.tsxegit.ts)./tm rerun --isolated --yesexecuta o comando de Bash registrado comsh -lcnuma cópia do snapshot. Não é um sandbox e não passa pelo diálogo de permissão; só roda quando você digita e recusa comandos que citem o caminho absoluto do projeto. - Grava arquivos na pasta de armazenamento,
~/.claude/time-machinepor padrão. Nada é gravado emsettings.json, arquivos de shell, LaunchAgents nem hooks do git./tm restore --yesreescreve os arquivos rastreados do seu projeto, mas só quando você digita, depois de salvar um snapshot anterior, e recusa se arquivos ignorados fossem sobrescritos. - Registra o seu trabalho: os snapshots guardam o conteúdo completo dos arquivos não ignorados, inclusive segredos que você mantenha no projeto. Entradas e resultados de ferramentas são mascarados na medida do possível, mas o conteúdo dos arquivos nos snapshots não. Revise a pasta antes de compartilhá-la.
- Injeta texto na conversa uma única vez: depois de uma restauração, acrescenta uma nota dizendo que os arquivos foram restaurados e que resultados anteriores de ferramentas estão desatualizados. Fora isso, não reescreve prompts nem resultados.
- Envolve cada chamada de ferramenta (hook de controle
tool.callcom.catch). Repassa a resposta sem alterações, inclusive negações, e erros de registro nunca bloqueiam a ferramenta. Chamadas modificadoras em paralelo esperam a verificação de mudanças externas. - Sem rede, daemons ou telemetria. A limpeza roda separada após a inicialização, mas termina com a sessão. A única variável de ambiente lida é
HOME. - Requisito externo: o
gitprecisa estar instalado. Os snapshots são desativados se a raiz da sessão for sua pasta pessoal ou/. - Licença: Apache-2.0 (arquivo LICENSE na raiz do repositório), que permite redistribuição.
O claude plugin validate não relatou erros nem avisos. Os testes do autor passaram no Claude Code 2.1.303: 103 passaram, 0 falharam.
- Lê arquivos
- Pode ler arquivos e listar diretórios na sua máquina ($.fs.read / list / stat / exists).
- Grava arquivos
- Pode criar ou sobrescrever arquivos na sua máquina ($.fs.write).
- Executa comandos
- Pode executar programas de shell na sua máquina ($.process.run / spawn). Confira no código-fonte exatamente quais.
- Intercepta chamadas de ferramentas
- Vê cada chamada de ferramenta que o Claude faz (tool.call / tool.check) e pode bloqueá-la ou alterá-la.
- Lê seus prompts
- Pode ver o que você digita e a transcrição da conversa (prompt.* / session.append / session.messages).
- Altera a interface
- Desenha na interface do Claude Code: faixas, painéis, texto de status, notificações (ui.render / $.ui.*).
- Adiciona comandos/ferramentas
- Registra novos comandos de barra ou ferramentas que você ou o Claude podem acionar ($.command.register / $.tool.register).
- Armazena dados
- Guarda dados entre sessões no armazenamento privado do plugin ($.store.*).
Compatibilidade e solução de problemas
Testado com o Claude Code 2.1.303 no macOS (validate, os testes do autor e a gravação da demo). O autor indica o Claude Code 2.1.287 ou posterior. Se algo parecer errado:
- A barra de status mostra
snapshots off: execute/tm; o motivo aparece no topo. Causas comuns são a raiz da sessão ser sua pasta pessoal, umstoreDirrelativo ou dentro do projeto, falta degitou um snapshot base que levou mais de 5 segundos. - Em um repositório grande, cada ferramenta modificadora paga o tempo do snapshot; a média aparece na barra de status.
- Um arquivo de log que muda o tempo todo dentro do projeto gera um passo
externalantes de cada ferramenta modificadora. - Arquivos ignorados (saídas de build,
node_modules,.env) nunca são salvos nem restaurados. - O painel e a barra de status aparecem no terminal; no painel de chat do VS Code só os comandos funcionam.
Perguntas frequentes
- O Time Machine mexe no .git do meu projeto?
- Não. Os snapshots vão para um repositório bare separado dentro da pasta de armazenamento, com um índice próprio por sessão. As variáveis de ambiente do git são fixadas nesse repositório em cada chamada, então seu próprio .git não é alterado. Seu .git/info/exclude local é copiado para o repositório sombra e suas regras de .gitignore se aplicam.
- Onde os snapshots ficam guardados e por quanto tempo?
- Por padrão em ~/.claude/time-machine, uma pasta por projeto. Você pode mudar a pasta com a opção storeDir. Sessões com mais de 14 dias são apagadas no máximo uma vez por dia; com retentionDays em 0, tudo é mantido.
- O Claude pode restaurar arquivos ou repetir comandos por conta própria?
- Não. Um restore ou branch com --yes, e qualquer rerun exceto o ensaio com --isolated, só roda quando você mesmo digita o comando. Se o pedido vier de outra origem, o comando recusa e cita a origem. Nada disso é exposto como ferramenta que o modelo possa chamar.
- Ele envia algo pela rede?
- Não encontramos nada. O plugin não tem código de rede. Ele executa git, mkdir, rm, cp, find e sh localmente e grava apenas na própria pasta de armazenamento.
- Como ele difere do /rewind do Claude Code?
- O autor diz que ele não substitui o /rewind. O Time Machine também faz snapshots dos arquivos alterados pelo Bash, mantém uma linha do tempo entre ferramentas, estima quais edições provavelmente causaram uma falha de teste, compara duas execuções e repete um passo. Ele restaura apenas arquivos; a conversa não é retrocedida.
# Mods relacionados
DestaqueBlast Radius
Segura rm -r, force push e migrações de banco de dados no Claude Code e mostra o que mudariam antes de rodarem.
- painel
- acima do prompt
- Executa comandos
- Intercepta chamadas de ferramentas
- Altera a interface
testado com v2.1.291
DestaqueContador de chamadas de ferramentas
Conta as chamadas de ferramentas do Claude por turno e por sessão, mostra o total junto ao spinner e adiciona /tally.
- spinner
- transcrição
- status
- Intercepta chamadas de ferramentas
- Altera a interface
- Adiciona comandos/ferramentas
testado com v2.1.310
Mais em Timers, tarefas e standups, Comandos slash.