PTENES
Pular para o conteúdo
MÓDULO 4.3

🧱 Guarda e painel

Com vários agentes trabalhando ao mesmo tempo, dois estragos ficam possíveis: um sobrescrever o que o outro fez e um comando apagar demais. A guarda do kit pergunta antes. O painel mostra o time sem sair do Claude Code.

6
Tópicos
~35
Minutos
R7
Receita
Prático
Tipo
0 de 60%
1

Entenda o que é um mod do Claude Code

Nos vídeos que circularam sobre mods do Claude Code apareceram duas proteções: uma guarda de colisão (dois agentes no mesmo arquivo) e uma de "raio de explosão" (o tamanho do estrago de um comando que apaga).

A ideia é ótima. O kit faz a versão própria, só com recursos oficiais: os hooks do Claude Code. A divisão é simples: a regra fica no script, a tela fica no mod.

🆕 Novo aqui? Quatro palavras deste módulo

  • Hook (gancho) — um comando que o Claude Code roda sozinho num momento fixo. PreToolUse roda antes de uma ferramenta (editar, rodar Bash); PostToolUse roda depois.
  • Plugin — um pacote oficial que acrescenta hooks, comandos ou telas ao Claude Code. Tem um .claude-plugin/plugin.json com nome e versão.
  • Mod — o apelido que os vídeos deram aos plugins. No kit, os mods ficam em runtime/mods/.
  • Worktree — uma segunda cópia de trabalho do mesmo repositório Git, numa pasta separada. Dois agentes, duas cópias, nenhum pisa no outro.
agente pede Edit · Bash PreToolUse colisao.mjs pre raio.mjs sem risco: segue risco: "ask" você decide PostToolUse anota quem editou registro: ~/.local/state/inema-runtime/toques.json (limpa após 24 h)

Como ler o desenho: a caixa âmbar é o ponto de controle. Toda edição e todo comando passam por ela antes de acontecer. Sem risco, segue pela seta azul. Com risco, a guarda não bloqueia nem libera: ela devolve a pergunta para você (N2).

📄 Trecho do .claude/settings.json do kit (a guarda já vem ligada)
"PreToolUse": [
  {
    "matcher": "Edit|Write|MultiEdit|NotebookEdit",
    "hooks": [ { "type": "command",
      "command": "node \"$CLAUDE_PROJECT_DIR/runtime/mods/runtime-guarda/hooks/colisao.mjs\" pre",
      "timeout": 10 } ]
  },
  {
    "matcher": "Bash",
    "hooks": [ { "type": "command",
      "command": "node \"$CLAUDE_PROJECT_DIR/runtime/mods/runtime-guarda/hooks/raio.mjs\"",
      "timeout": 15 } ]
  }
]
…
"PostToolUse": [ … colisao.mjs pos … ]
O que olhar: o matcher diz em que ferramenta o gancho dispara. Edição chama a colisão; Bash chama o raio.
🪝
Hook

roda antes ou depois

🧩
Plugin

o "mod" oficial

📜
Regra no script

colisao.mjs · raio.mjs

🖥️
Tela no mod

o painel

2

Veja a guarda de colisão em ação

A dor é real. Aconteceu num projeto nosso: uma sessão esvaziou um arquivo que outra estava editando. Nenhuma das duas errou sozinha. Cada uma achava que o arquivo era só dela.

A colisão resolve isso com memória. Depois de cada edição, ela anota "esta sessão mexeu neste arquivo agora". Antes da próxima edição, confere a anotação e a data do arquivo.

sessão A edita às 10:00 sessão B tenta às 10:10 agenda.csv da Clara Guarda de colisão outra sessão editou há 10 min seguir · worktree · cancelar?

Como ler o desenho: a seta azul é a edição normal da sessão A, que fica anotada. A seta vermelha é a sessão B chegando dentro da janela de 30 minutos. Quem responde à pergunta da caixa âmbar é você.

1

Depois de editar: anota

colisao.mjs pos grava o caminho do arquivo, o id da sessão e a hora em toques.json. A gravação é atômica: duas sessões não corrompem o registro.

2

Antes de editar: confere

colisao.mjs pre olha se outra sessão tocou no arquivo, ou se a data do arquivo mudou por fora, nos últimos 30 minutos.

3

Se houver risco: pergunta

O texto montado pelo script é: Guarda de colisão: Outra sessão (<id>) editou <arquivo> há <N> min. Seguir mesmo assim, usar outra cópia (worktree) ou cancelar?

✓ Pergunta quando

  • ✓ Outra sessão do Claude editou o arquivo há menos de 30 min
  • ✓ O arquivo mudou por fora: Codex, editor ou outra pessoa

✗ Fica quieta quando

  • ✗ O arquivo é novo (não há nada a proteger)
  • ✗ Foi a mesma sessão que editou por último
  • ✗ A última mudança tem mais de 30 min

Provado no CHANGELOG 0.3.0: com 5 casos (arquivo velho, alterado por fora, mesma sessão, outra sessão, inexistente), a colisão só pergunta nos casos de outra sessão e de alteração por fora. Dentro do Claude, um Edit em arquivo de outra sessão foi barrado e o arquivo ficou intacto.

⚠️ Limite do Codex

O Codex ainda não tem um gancho "antes de editar" equivalente. A guarda protege as sessões do Claude e detecta edições feitas pelo Codex pela data do arquivo. Ela não impede o Codex de editar. Se o Codex e o Claude vão mexer na mesma pasta, dê a cada um uma worktree.

💡 Ajuste a janela

Se o seu time trabalha devagar, aumente a janela: INEMA_COLISAO_MIN=60 faz a guarda considerar a última hora em vez de 30 minutos.

3

Prove o raio antes de apagar

O raio entra antes de um rm ou git clean. Ele conta quantos arquivos existentes seriam apagados, soma o tamanho e lista os primeiros caminhos. Depois pergunta: "Tem backup? Confirme para seguir."

O raio não apaga nada: só lê o disco. E se o comando não apagaria nenhum arquivo existente, ele fica quieto. Você pode testar o script sozinho, sem abrir o Claude, mandando para ele o mesmo pedido que o Claude mandaria.

🎯 Objetivo: ver o raio pedir confirmação antes de um rm -r

No terminal. Troque /caminho/do/kit pela pasta onde você clonou o kit:

mkdir -p /tmp/teste-raio/x && echo a > /tmp/teste-raio/x/a && cd /tmp/teste-raio
printf '{"cwd":"%s","tool_name":"Bash","tool_input":{"command":"rm -r x"}}' "$PWD" \
  | node /caminho/do/kit/runtime/mods/runtime-guarda/hooks/raio.mjs

Resultado provado no CHANGELOG 0.3.0 / esperado pela receita R7:

a saída traz "permissionDecision":"ask"
e o texto Raio: este comando apaga 1 arquivo(s)
Como verificar: procure as duas expressões na saída. Depois confira: a pasta x continua lá. O comando acima só perguntou ao raio; não apagou nada.

🆕 Novo aqui? O que o printf … | faz

O printf monta um texto no formato que o Claude Code entrega ao hook: a pasta (cwd), a ferramenta (Bash) e o comando (rm -r x). A barra | joga esse texto para dentro do raio.mjs. É um ensaio: o hook responde como responderia ao Claude.

Caso testado (CHANGELOG 0.3.0)O raio…
rm -r, rm -f *.txt, git clean -fdconta exatamente os arquivos que seriam apagados e pergunta
rm de arquivo inexistente, lsnada a apagar: não pergunta
Claude no modo que libera tudo, pedindo rm -r pastabarra pelo "Raio"; pasta intacta

💡 Duas camadas, não uma

O .claude/settings.json já nega rm -rf de vez (módulo 4.1). O raio cobre o resto: rm -r, rm com curinga, git clean. A negação é um muro; o raio é uma porta que só abre com o seu sim.

💥
Raio

tamanho do estrago

🔢
Conta

arquivos e tamanho

👀
Só lê

nunca apaga

💾
Backup?

a pergunta final

4

Leve a guarda para outro projeto

Na pasta do kit a guarda já está ligada. Mas a Sônia tem outra pasta, a dos fechamentos mensais, onde também roda agentes. Ela quer a mesma proteção lá.

A receita R7 dá dois jeitos. Escolha um, não os dois.

Jeito 1 · Só nesta sessão

Abre o Claude carregando a guarda como plugin. Fechou a sessão, acabou.

Bom para testar ou para um projeto passageiro.

Jeito 2 · Fixo no projeto

Copie o bloco hooks do .claude/settings.json do kit para o .claude/settings.json do outro projeto, trocando o caminho.

Bom para a pasta que você usa todo dia.

🎯 Objetivo: abrir o Claude em outro projeto com a guarda ligada

No terminal, dentro da pasta do outro projeto (troque /caminho/do/kit):

claude --plugin-dir /caminho/do/kit/runtime/mods/runtime-guarda

Resultado provado no CHANGELOG 0.3.0:

com --plugin-dir runtime-guarda e o modo que libera tudo,
rm -r pasta foi barrado pelo "Raio" e a pasta ficou intacta;
Edit em arquivo editado por outra sessão foi barrado pela "colisão".
Como verificar: na sessão, peça ao Claude para apagar uma pasta de teste com rm -r. Ele tem de parar e mostrar a pergunta do Raio. Responda "não".

💡 Por que o caminho muda

No kit, o settings usa $CLAUDE_PROJECT_DIR/runtime/mods/…, ou seja, "a pasta deste projeto". No outro projeto não existe runtime/. Por isso, no jeito 2, o caminho tem de apontar para onde o kit está de verdade.

🧳
--plugin-dir

só nesta sessão

📌
Bloco hooks

fixo no projeto

☝️
Um jeito

nunca os dois

🗂️
Caminho real

aponta para o kit

5

Abra o painel do time

No módulo 3.3 você soltou sessões com claude --bg e acompanhou pelo observar.mjs, em outro terminal. O painel traz essa lista para dentro do Claude Code. É opcional.

Ele mostra cada sessão em segundo plano com nome, estado e minutos, um botão Atualizar e um botão Parar nas que estão rodando. Só o seu clique para uma sessão.

🎯 Objetivo: abrir o painel do time em segundo plano

No terminal, dentro da pasta do kit. Depois, já na sessão, digite /painel:

claude --plugin-dir runtime/mods/runtime-painel

Para conferir o mod antes de usar:

claude plugin validate runtime/mods/runtime-painel
claude plugin test runtime/mods/runtime-painel

Resultado provado no CHANGELOG 0.3.0:

validate: passa
test: 1 pass
Como verificar: o /painel abre um painel com as sessões do claude --bg desta pasta e os botões Atualizar e Parar.
Time em segundo plano Atualizar lido às <hora> nomeestadomin r4-revisordone7 <outra sessão><rodando><N> Parar

Como ler o desenho: é uma ilustração, não um print. A linha r4-revisor · done · 7 é a mesma sessão que o observar.mjs mostrou no módulo 3.3. O botão vermelho só aparece em sessão que ainda está rodando.

observar.mjs/painel
Onde rodaoutro terminaldentro da sessão do Claude
Parar sessãovocê digita claude stop <id>botão Parar
Precisa instalarnão, já vem no kitcarregar o mod com --plugin-dir

O que olhar na tabela: os dois leem a mesma lista de sessões. Escolha pelo conforto, não pela função.

📊
/painel

o comando novo

🔄
Atualizar

lê de novo

⏹️
Parar

só com seu clique

🧪
1 pass

teste do mod

6

Leia o código antes de instalar um mod

Mods e plugins rodam com as mesmas permissões do Claude Code. Um hook pode ler seus arquivos, rodar comandos e acessar a rede, sem perguntar. É por isso que ele protege bem e é por isso que um mod mal-intencionado estraga bem.

A regra da receita R7: leia o código de qualquer mod de terceiro antes de instalar. Você não precisa programar para isso. Peça ao agente para ler e explicar, sem rodar nada.

🎯 Objetivo: entender o que um mod faz antes de ligar

Abra claude na pasta do kit e cole (para um mod de terceiro, troque os caminhos):

Leia runtime/mods/runtime-guarda/.claude-plugin/plugin.json, runtime/mods/runtime-guarda/hooks/hooks.json, colisao.mjs e raio.mjs. Me diga em linguagem simples: em que momento cada hook roda, o que ele lê, o que ele grava e se acessa a rede. Não instale nem rode nada.
Como verificar: a resposta tem de bater com este módulo: o raio só lê o disco; a colisão grava só em toques.json; nenhum dos dois chama a rede.

✓ Sinais de mod saudável

  • ✓ plugin.json com autor, licença e endereço do código
  • ✓ hooks.json curto: dá para ver cada gancho
  • ✓ Grava só num lugar conhecido
  • ✓ Pergunta em vez de decidir sozinho

✗ Sinais de alerta

  • ✗ Código embaralhado que ninguém consegue ler
  • ✗ Lê credenciais, tokens ou a pasta de configuração de outra ferramenta
  • ✗ Manda dados para um endereço da internet
  • ✗ Aprova permissões sozinho

Teste rápido (opcional): a guarda encontra risco numa edição. O que ela faz?

🔑
Permissões

as do Claude Code

📖
Ler antes

todo mod de terceiro

🤖
Agente explica

sem rodar nada

🌐
Rede?

a pergunta-chave

🎓 Resumo do módulo

✓
Mod é plugin oficial com hooks — a regra no script, a tela no mod.
✓
A colisão pergunta antes de pisar no outro — janela de 30 min; o Codex só é detectado.
✓
O raio mostra o estrago antes — conta arquivos e tamanho, nunca apaga.
✓
Outro projeto: um jeito só — --plugin-dir ou o bloco hooks.
✓
Painel opcional, código sempre lido — mod roda com as suas permissões.

Próximo módulo:

4.4 — Laboratório e projeto final