Aula 15Hooks: ações automáticas
Prefere o terminal? Veja esta aula na versão do terminal🖥️ Versão Desktop. Nesta versão do curso, você usa o Claude Code no app Claude Desktop, na aba Code. Quase tudo é feito por janelas e botões. Quando uma aula pedir para digitar um comando, ela mostra exatamente o que digitar. Nesta aula, você não digita nenhum comando: o exercício é um pedido em português e um clique num arquivo. A parte opcional do fim usa o
/status, para conferir a versão, e o terminal integrado do app, para deixar um script pronto para rodar.
Objetivos
Ao final desta aula você vai saber:
- O que é uma ação automática (hook) e em que momentos ela roda
- As três camadas: o que o
CLAUDE.mdpede, o que as regras deny e ask travam e o que a ação automática faz sempre - Por que o modo Manual e as suas regras já protegem o essencial
- O cuidado antes de aceitar uma ação automática de outra pessoa
- Ver as ações automáticas da sua pasta sem mudar nada, e como desligar todas
Nas Aulas 11 a 14, você deu ao Claude as regras da casa, ajudantes, receitas e conectores. Tudo isso o Claude costuma seguir. Nesta aula, você conhece o que roda sempre: as ações automáticas, que o Claude Code chama de hooks (ganchos).
A aula é curta e só de olhar. Ela usa a pasta da sua página, com o CLAUDE.md da Aula 11 e as regras deny e ask das Aulas 05 e 10. Você não instala nada e não precisa do GitHub.
O que é uma ação automática
Uma ação automática é um comando que roda sozinho, num momento certo, toda vez. Quem a dispara é o programa, o Claude Code, e não o Claude: por isso ela não depende de ele lembrar. Ela fica guardada num arquivo de configurações, como o .claude/settings.json, o mesmo das suas regras deny e ask. O app lê os mesmos arquivos de configurações que o terminal.
Os momentos mais usados:
| O momento | Um exemplo do que ela pode fazer |
|---|---|
| Quando você manda um pedido | Anotar num arquivo a hora de cada pedido |
| Antes de um comando | Impedir um comando que apaga arquivos |
| Depois de uma mudança num arquivo | Deixar o código da página arrumado, sempre do mesmo jeito |
| Quando o Claude termina | Tocar um som |
Escrever uma ação automática é coisa de quem programa: ela roda um comando, muitas vezes um pequeno programa. Por isso, o passo a passo fica em Para ir além, no fim da aula.
As três camadas
Você já conhece duas maneiras de orientar o Claude. A ação automática é a terceira:
| A camada | O que ela faz | Na sua página |
|---|---|---|
As regras da casa, no CLAUDE.md (Aula 11) |
Pede. O Claude lê no começo da conversa e costuma seguir, mas pode esquecer | As regras da página, como perguntar antes de instalar |
| As regras deny e ask (Aulas 05 e 10) | Travam uma ação. A deny proíbe, e a ask faz o Claude pedir licença | A deny do .env e a ask do envio para o GitHub |
| A ação automática (esta aula) | Roda um comando seu, sempre, no momento certo | Nenhuma, de propósito |
💡 Para quem está começando, isso já basta. O modo Manual e as suas regras deny e ask protegem o essencial: o Claude pede licença antes de mudar um arquivo e antes dos comandos que mudam alguma coisa, e o
.envfica trancado. A ação automática serve para quem quer que algo aconteça sempre, sem pedir. O curso não precisa de nenhuma.
💡 Quer um aviso quando o Claude terminar? O app já avisa: quando uma sessão termina uma tarefa e você não está olhando para ela, ele mostra uma notificação do sistema. Isso não precisa de ação automática.
O cuidado antes de aceitar uma ação automática
Uma ação automática roda comandos no seu computador, com as suas permissões: ela pode mexer em tudo o que você mexe. E ela não precisa ser sua. Pode vir pronta dentro da pasta de outra pessoa, no .claude/settings.json dela, junto com uma página que alguém mandou, e rodar quando o Claude trabalha nessa pasta.
Então:
- Nunca cole uma ação automática enviada por quem você não conhece, nem uma que você não entende.
- Antes de abrir no app a pasta de outra pessoa, abra uma sessão na sua pasta de sempre e peça ao Claude para ler o
.claude/settings.jsonda outra pasta e explicar, em português simples, o que cada ação automática faz, sem rodar nada. - Para desligar todas, peça ao Claude: "desligue todas as ações automáticas nas minhas configurações pessoais". O nome dessa configuração fica em Para ir além.
🛡️ Antes de aprovar algo que roda código no seu computador (uma ação automática, um mod, um plugin, um conector que roda no computador): instale só o que vem de quem você confia, peça ao Claude para explicar em português simples o que aquilo faz e desligue o que não usa.
O exercício: só olhar
Na aba Code, abra uma sessão na pasta da sua página, no Manual, e peça:
"liste as ações automáticas e as regras deste projeto, em português simples, sem mudar nada"
O critério de pronto: a resposta diz que não há nenhuma ação automática e mostra as regras que você criou, a deny do .env (Aula 05) e a ask do envio para o GitHub (Aula 10). Se aparecer uma ação automática que você não conhece, pergunte ao Claude de onde ela veio antes de seguir.
Para conferir com os próprios olhos, clique no caminho .claude/settings.json quando ele aparecer na resposta: o app abre o arquivo no painel ao lado da conversa. Você não precisa entender cada linha, porque o Claude acabou de explicar. O /hooks, que mostra essa lista num menu, é da versão do terminal.
Opcional: uma regra ask para apagar arquivos, pedida como a do envio, na Aula 10:
"crie uma regra ask no .claude/settings.json para que você sempre me pergunte antes de apagar um arquivo"
No Manual, o Claude já pede licença antes de apagar. A regra garante a pergunta também nos outros modos, até no Auto. Antes de aprovar a mudança, peça ao Claude para explicar a regra em português simples. Depois, guarde uma versão: "guarde uma versão com uma mensagem em português explicando o que mudou".
Para ir além (opcional): escrever uma ação automática
🔧 Para ir além (para quem já programa; pode pular): esta parte mostra como uma ação automática é escrita por dentro: os eventos, o filtro de ferramentas, o script, os códigos de saída, o
jq, ochmod, o formatador e o bloqueio antes do comando. Daqui em diante, ela usa o nome técnico, hook. Se você nunca programou, pule direto para o Na prática.
Por que usar hooks
Hooks permitem rodar comandos em pontos específicos do ciclo de vida do Claude Code. A grande diferença entre hooks e tudo o mais que vimos neste curso é que hooks são determinísticos: eles sempre rodam.
Você pode escrever no seu CLAUDE.md para o Claude rodar o Prettier depois de cada edição. Na maioria das vezes, ele vai rodar. Mas às vezes, não. Um hook faz isso acontecer todas as vezes, sem exceção.
Usos comuns:
- Formatar automaticamente depois de editar arquivos
- Registrar todos os comandos executados, para auditoria e conformidade
- Bloquear operações perigosas, como modificar arquivos de produção
- Levar o aviso de tarefa terminada para outro lugar, como um canal do time. A notificação do app já existe sem hook (veja o 💡 do começo da aula)
Como funcionam
Hooks ficam configurados no settings.json. Você escolhe um evento, opcionalmente define um matcher (para quais ferramentas o hook vale) e informa um comando para rodar. O app lê os mesmos arquivos de settings que o terminal, e os hooks disparam nos mesmos eventos.
Os eventos mais comuns:
| Evento | Quando roda |
|---|---|
| PreToolUse | Antes de uma chamada de ferramenta. Pode bloquear a chamada |
| PostToolUse | Depois que uma chamada de ferramenta termina com sucesso (se ela falhar, dispara o PostToolUseFailure) |
| UserPromptSubmit | Quando você envia um prompt, antes de o Claude processá-lo |
| Stop | Quando o Claude termina de responder |
| Notification | Quando o Claude Code envia uma notificação |
Esses são só alguns: o Claude Code suporta muitos outros. Veja a lista completa na referência de hooks.
Para criar ou mudar um hook, edite o settings.json ou peça ao Claude: descreva o que você quer ("crie um hook que formate os arquivos TypeScript depois de cada edição") e ele escreve a configuração. Edições diretas nos arquivos de settings costumam valer sem reiniciar nada: o Claude Code percebe a mudança sozinho.
Para conferir o que está configurado, abra o arquivo: clique no caminho .claude/settings.json quando ele aparecer na conversa ou no diff, e o app o mostra no painel de arquivos. Ou peça ao Claude: "liste os hooks configurados e de onde vem cada um". O comando /hooks, que mostra essa lista com a origem de cada hook e o texto completo do que ele roda, é da versão do terminal.
Exemplo prático: formatação automática
O hook mais comum. Configure um PostToolUse com o matcher "Edit|Write", para que ele dispare sempre que o Claude modificar um arquivo com as ferramentas de edição. O comando verifica a extensão do arquivo e roda o formatador adequado: Prettier para TypeScript, gofmt para Go, o que o seu projeto usar.
.claude/settings.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/formatar.sh"
}
]
}
]
}
}.claude/hooks/formatar.sh:
#!/bin/bash
# O hook recebe um JSON no stdin com os dados da ferramenta
arquivo=$(jq -r '.tool_input.file_path')
case "$arquivo" in
*.ts|*.tsx|*.js|*.jsx) npx prettier --write "$arquivo" ;;
*.go) gofmt -w "$arquivo" ;;
esac
exit 0Dois cuidados antes de testar:
- Torne o script executável: rode
chmod +x .claude/hooks/formatar.shno terminal integrado do app (Ctrl+`, ou Terminal, na barra de título da sessão), ou peça ao Claude para fazer isso. Os exemplos também usam ojqpara ler o JSON; instale-o se ainda não tiver. Se o hook não achar ojqou onpx, confira se eles funcionam no terminal do seu sistema e reinicie o app: ele nem sempre herda todo o ambiente do seu shell. No Windows, um script de bash precisa do Git Bash (o Git para Windows): sem ele, o comando roda no PowerShell, e um script escrito para o bash pode não funcionar. - Comandos de shell escapam do matcher. O
Edit|Writesó pega as edições feitas pelas ferramentas de edição. Se o Claude mudar um arquivo com um comando (umsed, um gerador de código), o hook não dispara. Para cobrir tudo, use também um hookStop, que confere a pasta uma vez no fim de cada resposta. Para um arquivo específico, mudado por qualquer caminho, use um hookFileChanged: ele vigia o arquivo no disco, e o matcher dele é a lista dos nomes exatos, separados por|, como"index.html|estilo.css".
Bloqueando com PreToolUse
Hooks PreToolUse podem bloquear chamadas de ferramenta antes de elas acontecerem. Seu hook recebe o nome da ferramenta e a entrada dela como JSON no stdin. O código de saída define o comportamento:
| Código de saída | Comportamento |
|---|---|
| 0 | Segue normalmente |
| 2 | Bloqueia a ação. A mensagem do stderr volta para o Claude como feedback, para ele saber por que foi bloqueado e se ajustar |
| Qualquer outro | Erro não bloqueante: aparece um aviso, e a ação segue (a menos que o hook tenha "onFailure": "block") |
⚠️ Por padrão, hooks falham "abertos". Se o script não existir, não for executável (o shell devolve o código 127) ou terminar com
exit 1, o Claude Code mostra um aviso e segue com a ação. Só oexit 2bloqueia. Num hook de bloqueio, acrescente"onFailure": "block"ao lado do"command"(desde a versão 2.1.295): aí um script que falha, estoura o tempo ou some bloqueia a ação em vez de liberá-la. No app, confira a versão com/status(linha Claude Code); se for anterior, use Claude → Check for Updates (no Mac) ou Help → Check for Updates (no Windows) e abra uma sessão nova. Eexit 0não é uma aprovação: a ação continua passando pelas regras de permissão normais. Teste seu hook de bloqueio antes de confiar nele.
É assim que você garante regras rígidas. Bloquear escrita na pasta de configuração de produção. Bloquear comandos bash com rm -rf. Bloquear commits na main. O que o seu time precisa que seja garantido, e não apenas sugerido.
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/bloquear-rm.sh",
"onFailure": "block"
}
]
}
]
}
}.claude/hooks/bloquear-rm.sh:
#!/bin/bash
comando=$(jq -r '.tool_input.command')
if echo "$comando" | grep -q 'rm -rf'; then
echo "Bloqueado: 'rm -rf' não é permitido neste projeto. Apague arquivos específicos." >&2
exit 2
fi
exit 0Compartilhando hooks com o time
Hooks configurados em .claude/settings.json são de nível de projeto e podem ser commitados no repositório. Assim, o time inteiro recebe os mesmos hooks automaticamente.
Use a variável de ambiente CLAUDE_PROJECT_DIR nos comandos para referenciar scripts guardados no projeto. Assim eles funcionam independentemente da pasta em que o Claude estiver no momento.
ℹ️ Numa sessão que você abre no app com a opção worktree, o Claude Code lê os hooks da raiz do checkout principal, roda os comandos lá, e o
CLAUDE_PROJECT_DIRaponta para essa raiz, não para a cópia do worktree. Se um script precisar da pasta em que o Claude está trabalhando, leia o campocwddo JSON que o hook recebe.
Hooks pessoais, em ~/.claude/settings.json, valem só no seu computador, nas sessões Local do app: as sessões na nuvem (as sessões Cloud do app e a web) não leem o seu ~/.claude/settings.json. Numa sessão na nuvem com um repositório só, os hooks do .claude/settings.json do repositório valem, porque vêm junto na cópia. Já as conversas de um Projeto (Aula 17) que rodam na nuvem carregam do repositório só o CLAUDE.md e as regras de .claude/rules/, sem os hooks.
A confiança na pasta
No terminal, o Claude Code pergunta se você confia numa pasta antes de rodar os hooks dela. Já um claude -p ou uma sessão do Agent SDK nunca pergunta e conta a pasta como confiada, e aí os hooks commitados num repositório rodam mesmo numa pasta em que você nunca confiou. No app, conte com que os hooks de uma pasta possam rodar logo na primeira sessão nela: por isso, a explicação do Claude vem antes de abrir a pasta de outra pessoa.
Desligando hooks
Para tirar um hook, apague a entrada dele no arquivo de settings. Não há como desligar um hook só e manter a configuração dele.
Para desligar todos sem apagar, use "disableAllHooks": true (é o que o Claude grava em ~/.claude/settings.json quando você pede para desligar todas as ações automáticas nas suas configurações pessoais). Três detalhes:
- Ele desliga também a status line personalizada e os mods que você instalou (Aula 18). Os mods que vêm com o Claude Code e o que a sua empresa gerencia continuam.
- Vale o valor que sobra depois da precedência das configurações: um
"disableAllHooks": falseno.claude/settings.jsonde um projeto vence otruedas suas configurações pessoais. - Na versão do terminal, dá para desligar os hooks de uma execução só, seja o que for que o projeto diga, com
claude --settings '{"disableAllHooks": true}'.
Para testar
- Peça ao Claude um hook PostToolUse com matcher
Edit|Writeque rode o formatador do seu projeto. Se o app pedir aprovação para mexer na pasta.claude, aprove. Depois, clique no caminho.claude/settings.jsonna conversa e confira o hook no painel de arquivos. - Peça ao Claude uma pequena edição e confira, no diff, que o arquivo saiu formatado.
- Peça um hook PreToolUse que bloqueie
rm -rfcomexit 2. Abra o terminal integrado (Ctrl+`) e rodechmod +x .claude/hooks/bloquear-rm.sh(ou peça ao Claude). Depois, peça ao Claude para "limpar a pasta build com rm -rf" e veja como ele reage ao bloqueio. - Peça ao Claude para commitar
.claude/settings.jsone a pasta.claude/hooks/.
Se algo precisa acontecer toda vez, sem falhar, não coloque em um prompt. Coloque em um hook.
Documentação oficial: Hooks e o guia de hooks (em inglês).
Na prática
Use a pasta da sua página (a confeitaria, ou a da sua ideia).
- Na aba Code, clique em + New. Na linha abaixo da caixa de mensagem, escolha Local e a pasta da sua página. Antes da primeira mensagem, escolha Manual no seletor de modo, na mesma linha.
- Peça: "liste as ações automáticas e as regras deste projeto, em português simples, sem mudar nada". Confira: nenhuma ação automática, a deny do
.enve a ask do envio para o GitHub. - Na resposta, clique no caminho
.claude/settings.json: o arquivo abre no painel ao lado, com as duas regras e nenhuma ação automática. Se o caminho não aparecer, peça: "mostre o caminho do arquivo .claude/settings.json deste projeto". - Saiba onde fica o interruptor, sem mexer nele. Peça: "se um dia eu precisar, como desligo todas as ações automáticas nas minhas configurações pessoais? Só explique, sem mudar nada".
- (Opcional) Peça a regra ask para apagar arquivos, peça a explicação dela antes de aprovar e guarde uma versão.
Resumo
- Uma ação automática (hook) é um comando que roda sozinho num momento certo, sempre, sem depender de o Claude lembrar.
- São três camadas: o
CLAUDE.mdpede, as regras deny e ask travam uma ação, e a ação automática roda um comando seu. - Para quem está começando, o Manual e as regras já protegem o essencial, e o app já avisa quando uma sessão termina uma tarefa e você não está olhando.
- Ela roda com as suas permissões: só de quem você confia, e com a explicação do Claude antes de abrir a pasta de outra pessoa. Para desligar todas, peça ao Claude.
- Para ver o arquivo, clique no caminho do
.claude/settings.jsonna conversa: ele abre no painel ao lado.
No próximo módulo, o Claude trabalha no horário marcado, com as tarefas agendadas e os lembretes.
Perguntas de fixação
Três perguntas rápidas para conferir se a ideia principal da aula ficou. Escolha uma opção: a página mostra se você acertou e explica a resposta.
Você escreveu no CLAUDE.md: "deixe o código arrumado depois de cada mudança". Quase sempre funciona, mas às vezes um arquivo sai desarrumado. O que faz todo arquivo sair arrumado, sem exceção?
Ver a resposta
Resposta: c) O CLAUDE.md pede, e o Claude pode esquecer, até com letras maiúsculas. A regra deny trava uma ação, mas não roda nada, e o Manual só faz o Claude pedir licença. Quem dispara a ação automática é o Claude Code, e não o Claude: ela roda o comando de arrumar depois de toda mudança. Escrever uma fica para quem programa, em "Para ir além" (Aula 15, Desktop).
Uma pessoa mandou a pasta de uma página pronta, com um .claude/settings.json cheio de ações automáticas. O que fazer antes de abrir essa pasta no app?
Ver a resposta
Resposta: c) Uma ação automática roda comandos com as suas permissões, sem pedir licença, quando o Claude trabalha na pasta em que ela está. Por isso, a explicação vem antes, pedida numa sessão na sua pasta de sempre. Copiar o arquivo para a sua pasta traria as ações automáticas junto (Aula 15, Desktop).
Você quer desligar todas as ações automáticas, em todas as sessões. O que fazer?
Ver a resposta
Resposta: a) O Claude grava nas suas configurações pessoais o ajuste que desliga todas, e o nome dele fica em "Para ir além". O CLAUDE.md só pede, e quem dispara a ação automática é o Claude Code; uma sessão nova carrega as mesmas ações automáticas; e clicar no caminho só abre o arquivo para você ler (Aula 15, Desktop).