Pular para o conteúdo
claudemods

Blast Radius: prévia de rm -rf no Claude Code antes de rodar

Segura rm -r, force push e migrações de banco de dados no Claude Code e mostra o que mudariam antes de rodarem.

Permissões

  • 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.
  • Altera a interfaceDesenha na interface do Claude Code: faixas, painéis, texto de status, notificações (ui.render / $.ui.*).
testado com
v2.1.291
último teste
requer
Claude Code ≥ 2.1.287
superfícies
painel, acima do prompt

Instale dentro do Claude Code:

/plugin install blast-radius --marketplace hamzafer/claude-code-mods
Todas as opções de instalação ↓

O que este mod faz?

O Blast Radius oferece uma prévia de rm -rf no Claude Code. É um mod da comunidade criado por Hamza Zafar (hamzafer), da coleção claude-code-mods dele. Quando o Claude está prestes a rodar um comando de shell arriscado pela ferramenta Bash, o mod segura o comando, mostra o que ele mudaria e espera você apertar Cancel ou Proceed.

Três tipos de comando são retidos. Um rm recursivo ganha a lista dos arquivos que apagaria e o tamanho total, como delete 42 files (1.3 MB). ~ e $HOME são expandidos; um caminho com qualquer outra variável de shell, substituição de comando ou ~user mostra "can't preview" em vez de um palpite. Um git push --force lista os commits remotos que seriam perdidos e os locais que seriam enviados, com base no último fetch. Uma migração de banco de dados (prisma, supabase, drizzle-kit, knex, sequelize, rails, alembic, typeorm) não tem como ser prevista, então o mod lista os arquivos sem commit cujos nomes parecem migrações ou schemas.

O relatório abre em um painel lateral, ou na faixa acima do prompt quando o terminal é estreito demais para um painel. O Cancel vem com foco por padrão (atalho c); o Proceed é y. Uma contagem regressiva mostra auto-cancels in 42 s, e sem resposta em 60 segundos o comando é cancelado. De qualquer forma o Claude recebe um motivo, então uma sessão sem ninguém olhando continua em vez de travar. Só um comando é retido por vez; um segundo espera a vez dele e depois ganha a sua própria contagem regressiva completa.

Em comparação com o nosso Block Dangerous Commands, que recusa de cara um conjunto fixo de padrões destrutivos, o Blast Radius é uma proteção do tipo "me pergunte com fatos": ele nunca bloqueia um comando que você aprova e cobre o rm -r comum, não só alvos catastróficos. Os dois podem ser usados juntos. O README do autor exige o Claude Code 2.1.287 ou mais recente.

Demonstração

A gravação cria uma pasta descartável dist com três arquivos pequenos no projeto de demonstração e pede ao Claude que execute rm -r dist. O Blast Radius segura o comando antes que ele rode e mostra o que seria apagado (3 arquivos, 12 KB, com cada caminho listado), com os botões Cancel e Proceed e uma contagem regressiva de cancelamento automático. O Cancel é pressionado, então nada é apagado.

Instalação

Use qualquer um dos métodos do bloco de instalação; eles instalam direto do marketplace do próprio autor. A proteção fica ativa assim que o plugin carrega.

$ install blast-radius

Requer Claude Code ≥ 2.1.287

Instala a partir do marketplace do autor: hamzafer/claude-code-mods

  1. 1.Uma linha, dentro do Claude Code

    /plugin install blast-radius --marketplace hamzafer/claude-code-mods

    Cole em uma sessão em andamento (v2.1.275+). O Claude Code pede primeiro para adicionar o marketplace.

  2. 2.Pelo seu shell

    claude plugin marketplace add hamzafer/claude-code-mods
    claude plugin install blast-radius@claude-code-mods

    Depois execute /reload-plugins em qualquer sessão que já esteja aberta.

  3. 3.Experimente sem instalar

    git clone https://github.com/hamzafer/claude-code-mods
    claude --plugin-dir ./claude-code-mods/mods/blast-radius

    Carrega o mod só para uma sessão. Nada é adicionado às suas configurações.

Como funciona

O mod usa o hook tool.call para Bash. Uma função pura, classify, divide o comando em &&, ||, ; e quebras de linha e procura os três tipos arriscados. Se nenhum bater, a chamada passa direto com next(e). Esta é a prévia de uma exclusão recursiva, de hooks/register.tsx:

// Unquoted $t expands globs, and nothing else, without running the command.
const script =
  'shopt -s nullglob; for t in "$@"; do for p in $t; do [ -e "$p" ] || continue; ' +
  'echo "S $(du -sk "$p" | cut -f1)"; find "$p" -type f | head -n 5000 | sed "s/^/F /"; done; done'
const r = await $.process.run(['bash', '-c', script, 'blast-radius', ...targets], init)

Os alvos são passados como argumentos em vez de colados no script, e a listagem é limitada a 5000 arquivos. Depois de medir, o mod guarda o comando retido em um átomo $.state, abre o painel blast-radius com $.ui.open e verifica a cada quarto de segundo se um botão foi apertado, se o prazo venceu ou se a chamada foi abortada. Proceed retorna next(e), então o comando roda exatamente como foi escrito. Cancel ou um timeout retornam { deny: ... } com uma mensagem que inclui o resumo da prévia. Antes de tudo isso, $.session.surfaces() é verificado: sem tela, a chamada é negada na hora.

Personalize

Uma opção, timeoutSeconds (padrão 60, mínimo 0), define quanto tempo um comando retido espera antes de ser cancelado; 0 espera sem limite e esconde a contagem regressiva. Altere em /config sob o nome do mod, ou no settings.json em pluginConfigs. A lista de ferramentas de migração é a expressão regular MIGRATION no início do register.tsx, e MAX_LISTED (200) limita quantas linhas o relatório mostra.

Permissões e segurança

Lemos todos os arquivos que o plugin pode executar antes de rodá-lo: hooks/hooks.json, hooks/register.tsx, as declarações de tipos e os testes. Não há package.json, script de instalação nem código empacotado.

Intercepta chamadas de ferramentas aparece porque o mod controla as chamadas a Bash: ele pode segurá-las e negá-las, mas nunca reescreve um comando. Executa comandos aparece por causa de $.process.run. Os programas que ele roda são somente leitura: bash -c com o script de du/find acima, git log --oneline duas vezes para force pushes, git status --porcelain para migrações e sleep 0.25 para o loop de verificação. Cada chamada de prévia tem timeout de 10 segundos; note que du e find em um alvo muito grande podem levar até esse limite. Ele lê a variável de ambiente HOME para expandir ~. Altera a interface cobre o painel e a faixa.

Ele não grava arquivos, não usa a rede e não chama o modelo. O claude plugin validate não relatou erros nem avisos, e os 17 testes do autor passaram no Claude Code 2.1.291. Trate-o como um segundo olhar, não como uma sandbox: um comando que esconda o rm atrás de uma variável ou de outro programa não será classificado.

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.
Altera a interface
Desenha na interface do Claude Code: faixas, painéis, texto de status, notificações (ui.render / $.ui.*).

Compatibilidade e solução de problemas

Verificado com o Claude Code 2.1.291 no macOS (validate e testes). Se um comando arriscado não for retido:

  • claude --version é 2.1.287 ou mais recente, e o mod está ativado em /plugin.
  • O comando é de um dos três tipos. Um simples rm file.txt sem -r não é retido.
  • A prévia do force push conta os commits contra o upstream como estava no último fetch; rode git fetch para ter uma lista atualizada.
  • No claude -p e em outras sessões sem tela, os comandos retidos são recusados na hora em vez de exibidos.

Perguntas frequentes

Quais comandos o Blast Radius segura?
Um rm recursivo (rm -r, rm -rf, rm --recursive, inclusive depois de sudo), git push com -f, --force, --force-with-lease ou um +refspec, e comandos de migração de prisma, supabase, drizzle-kit, knex, sequelize, rails, alembic e typeorm. Cada parte de um comando composto é verificada.
A prévia executa o comando arriscado?
Não. Para o rm, ela roda du e find nos alvos em um script bash que só expande globs. Para um force push, roda dois comandos git log contra o upstream como estava no último fetch. Para uma migração, roda git status. Cada um tem timeout de 10 segundos.
O que acontece se ninguém responder?
Depois de 60 segundos o comando é cancelado, e o Claude fica sabendo o que teria feito e que não deve tentar de novo por conta própria. Ajuste timeoutSeconds para mudar a espera, ou use 0 para esperar sem limite.
E no claude -p ou em execuções headless?
Sem uma tela conectada ninguém pode apertar um botão, então um comando retido é recusado na hora com um motivo que inclui a prévia.
Qual a diferença para o Block Dangerous Commands (cm-block-dangerous-commands)?
O Block Dangerous Commands recusa direto os comandos que batem com o padrão e mostra um toast. O Blast Radius pergunta a você, mostra o que seria apagado ou sobrescrito e roda o comando sem alterações se você apertar Proceed.
Bloquear comandos perigosos em execução no Claude CodeDestaque

Bloquear comandos perigosos

Recusa rm -rf /, force-push na main, DROP TABLE, curl | sh e outros comandos Bash destrutivos antes de rodarem.

  • notificação
  • Intercepta chamadas de ferramentas
  • Altera a interface

testado com v2.1.310

Branch do Git acima do prompt em execução no Claude CodeDestaque

Branch do Git acima do prompt

Mostra a branch do Git, a contagem de alterações e o status ahead/behind em uma faixa acima do prompt do Claude Code.

  • acima do prompt
  • Executa comandos
  • Intercepta chamadas de ferramentas
  • Altera a interface

testado com v2.1.310

Mais em Proteções de segurança, Git e GitHub.