Aula 15Hooks: ações automáticas
Prefere o app? Volte para esta aula na versão do app Claude Desktop
O vídeo desta aula está na versão do app.
Ver o vídeo na versão do appObjetivos
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.
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? Isso não precisa de ação automática. Quando o Claude termina uma tarefa ou para num pedido de licença e você parece longe, o Claude Code avisa sozinho. Por padrão, a notificação na tela aparece só nos programas de terminal iTerm2, Ghostty e Kitty. Nos outros, peça ao Claude: "troque o aviso de tarefa terminada pelo bipe do terminal". Ou mude você mesmo: digite
/confige procure Local notifications (avisos locais).
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.
As ações automáticas de uma pasta só rodam depois que você confia nela, naquela pergunta que o Claude Code faz na primeira vez em que você o abre numa pasta (Aula 03). E a confiança numa pasta costuma valer também para as pastas que estão dentro dela. Por isso, confie só na pasta de cada projeto, nunca numa pasta grande, como a Documentos.
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 confiar na pasta de outra pessoa, abra o Claude Code na sua pasta de sempre e peça para ele 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
Abra o Claude Code 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, digite /hooks. Ele abre uma lista só para leitura, com cada ação automática configurada e de onde ela vem (as suas configurações pessoais, as do projeto, um plugin). Na sua pasta, não deve aparecer nenhuma. O /hooks não cria nem muda nada, e Esc fecha a lista.
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 som seu ou um canal do time. O aviso comum já existe sem hook (veja o 💡 do começo da aula), e um hook de
Notificationroda junto com ele
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.
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. O comando /update-config faz o mesmo, especializado em mudar configurações. Edições diretas nos arquivos de settings costumam valer sem reiniciar nada: o Claude Code percebe a mudança sozinho.
O comando /hooks serve para conferir: ele abre uma lista só para leitura dos hooks configurados, com a origem de cada um (as configurações do usuário, as do projeto, as locais, um plugin ou a sessão atual). Escolha um hook para ver o texto completo do que ele roda e onde ele está definido. Para ver todos os eventos, até os que não têm hook, escolha All events, no fim da lista. Ele não cria nem edita hooks.
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:
chmod +x .claude/hooks/formatar.sh. Os exemplos também usam ojqpara ler o JSON; instale-o se ainda não tiver. 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. 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.
Hooks pessoais, em ~/.claude/settings.json, valem só no seu computador: as sessões na nuvem 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 e o claude -p
Numa sessão interativa, o Claude Code segura os hooks de todos os arquivos de settings, inclusive o seu ~/.claude/settings.json, até você aceitar a pergunta de confiança da pasta (ou de uma pasta de cima cuja confiança vale para ela). Fora de um repositório Git, a confiança vale para as subpastas, menos as que são repositórios; num repositório, vale para o repositório inteiro.
Num claude -p ou numa sessão do Agent SDK, a pergunta nunca aparece e a pasta conta como confiada: os hooks commitados no .claude/settings.json de um repositório rodam mesmo numa pasta em que você nunca confiou. Antes de rodar um claude -p num repositório que não é seu, leia os arquivos de .claude/, comece com --bare ou desligue os hooks daquela execução com --settings '{"disableAllHooks": true}'.
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. Com ele ligado, o
/hooksmostra um aviso no lugar dos hooks, e o/goalnão roda. - 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. - Para desligar os hooks de uma execução só, seja o que for que o projeto diga, abra com
claude --settings '{"disableAllHooks": true}'.
Para testar
- Peça ao Claude (ou escreva você mesmo no
.claude/settings.json) um hook PostToolUse com matcherEdit|Writeque rode o formatador do seu projeto. Rode/hookse confira que ele aparece na lista. - Peça ao Claude uma pequena edição e confira que o arquivo saiu formatado.
- Crie um hook PreToolUse que bloqueie
rm -rfcomexit 2(lembre dochmod +x). Peça ao Claude para "limpar a pasta build com rm -rf" e veja como ele reage ao bloqueio. - Commite
.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).
- Abra o terminal, entre na pasta e abra o Claude Code:
cd Documents/confeitaria, com o nome da sua pasta, e depoisclaude. AperteShift + Tabuma vez e confira se aparecemanual mode on. - 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. - Digite
/hookse veja a lista, só para leitura. Na sua pasta, não deve aparecer nenhuma ação automática. AperteEscpara fechar. - 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 aviso de tarefa terminada não precisa de ação automática.
- Ela roda com as suas permissões: só de quem você confia, e com a explicação do Claude antes de confiar na pasta de outra pessoa. Para desligar todas, peça ao Claude.
- O
/hooksmostra o que está configurado, só para leitura.
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).
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 confiar nessa pasta?
Ver a resposta
Resposta: c) Uma ação automática roda comandos com as suas permissões, sem pedir licença, e as de uma pasta rodam depois que você confia nela. Por isso, a explicação vem antes, pedida na sua pasta de sempre. E a confiança numa pasta grande, como a Documentos, costuma valer também para as pastas que estão dentro dela (Aula 15).
Você quer desligar todas as ações automáticas, em todas as conversas. 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 /hooks só mostra a lista, sem criar nem mudar nada; o CLAUDE.md só pede, e quem dispara a ação automática é o Claude Code; e uma conversa nova carrega as mesmas ações automáticas (Aula 15).