1. O que são Hooks no Claude Code e por que eles são necessários
Ao trabalhar com um assistente de IA no terminal, os desenvolvedores frequentemente se veem repetindo as mesmas rotinas: "agora execute o ESLint", "formate o código com Prettier", "verifique os tipos antes do commit". Mesmo que essas regras sejam definidas nas instruções do sistema CLAUDE.md, o modelo de linguagem pode ocasionalmente esquecer de executá-las ou ignorá-las para economizar tokens.
Hooks no Claude Code resolvem esse problema radicalmente: são gatilhos determinísticos que chamam automaticamente comandos do sistema ou scripts em momentos precisos do ciclo de vida da operação do assistente.
A lógica dos hooks é simples:
Se o Claude executou o evento X → o sistema operacional garante a execução da ação Y.
Comparação das abordagens de automação
| Característica | Prompts manuais | Instruções no CLAUDE.md | Hooks nativos |
|---|---|---|---|
| Confiabilidade de execução | Baixa (depende da memória humana) | Média (comportamento probabilístico do LLM) | 100% (interceptação determinística de eventos) |
| Consumo de tokens | Alto (tokens gastos a cada solicitação) | Médio (a regra é carregada em cada contexto) | Zero (executado localmente no shell) |
| Velocidade de resposta | Lenta (entrada manual de comandos) | Requer uma rodada adicional de geração | Instantânea (chamada nativa de processo) |
| Capacidade de bloqueio | Inexistente | Inexistente | Sim (exit code não-zero interrompe a ação) |
Os Hooks do Claude Code são configurados em formato JSON no arquivo .claude/settings.json no nível do repositório individual ou globalmente em ~/.claude/settings.json.
2. Ciclo de vida de eventos: PreToolUse, PostToolUse, Notification, Stop
O Claude Code oferece quatro pontos fundamentais de interceptação (eventos) aos quais você pode vincular comandos automatizados.
Principais pontos de disparo
PreToolUse(Antes do uso da ferramenta): dispara antes que o agente execute uma ação. Se o comando do hook retornar um erro (exit code diferente de 0), a execução da ação é bloqueada. Este é o lugar ideal para verificações de segurança antes de commits ou pushes.PostToolUse(Após o uso da ferramenta): dispara imediatamente após a execução bem-sucedida da ferramenta. É o gatilho mais popular para formatação automática de código (Prettier) ou linting do arquivo modificado (ESLint).Notification(Notificação): ativa-se quando o assistente precisa enviar uma mensagem importante do sistema ou solicitar autorização adicional.Stop(Fim da resposta): dispara no momento em que o Claude Code termina completamente a geração da resposta e aguarda a próxima mensagem do usuário. Usado para reproduzir sinais sonoros e notificações desktop.
Pontos de disparo dos Hooks no ciclo de vida3. Estrutura de configuração no settings.json e sintaxe do Matcher
A configuração dos hooks é armazenada no arquivo .claude/settings.json. Se este arquivo ainda não existir na raiz do seu projeto, crie-o.
Sintaxe básica de configuração
Como funciona o campo Matcher
O campo matcher define a qual ferramenta específica do agente o hook deve reagir:
"Edit"— intercepta a modificação de arquivos já existentes."Write"— dispara ao criar um novo arquivo ou sobrescrevê-lo totalmente."Bash"— reage à execução de qualquer comando de console."Bash(git commit*)"— template preciso que filtra chamadas Bash iniciadas pelo comandogit commit."*"— seletor universal (wildcard), que dispara para qualquer ferramenta do agente.
Os templates matcher são sensíveis a maiúsculas/minúsculas. Use os nomes padrão das ferramentas do Claude Code: Edit, Write, Bash, Glob, Grep.
4. Linting e formatação automáticos (ESLint + Prettier)
O cenário diário mais prático é delegar a formatação e a verificação primária de estilo às utilitários Prettier e ESLint. Isso garante que o código seja sempre salvo no repositório em estado perfeito.
Configuração do PostToolUse para ESLint e Prettier
Análise das flags de segurança no comando
"$CLAUDE_FILE_PATH"— variável de ambiente dinâmica onde o Claude insere automaticamente o caminho completo do arquivo recém-modificado pelo agente.2>/dev/null— suprime a saída excessiva de erros do fluxo stderr para não sobrecarregar o terminal.|| true— construção bash crucial. Garante que, mesmo se o linter encontrar erros irreparáveis e retornar código1, o hook termine com código0e não pare o trabalho subsequente do agente.
5. Barreiras de proteção antes do git commit (TypeCheck + Testes)
Se usamos hooks "suaves" com || true para formatação, para fixar mudanças no controle de versão é necessário um controle rigoroso de qualidade (Quality Gate).
Usando PreToolUse, você pode bloquear a criação de um commit se houver erros de compilação TypeScript ou falhas nos testes unitários no projeto.
Configuração do hook Pre-commit bloqueador
O que acontece quando erros são detectados
- O Claude formula o comando
git commit -m "...". - Antes de sua execução, o sistema ativa o
PreToolUse. - Os comandos de validação são executados:
npm run typecheckenpm run lint. - Se um erro for encontrado: o processo retorna um código de saída não-zero (exit code 1).
- O Claude Code intercepta a saída do erro do compilador diretamente em seu contexto.
- Em vez de um commit quebrado, o assistente analisa o texto do erro, corrige automaticamente os tipos no código e faz uma nova tentativa limpa de commit.
Atenção: nas verificações bloqueadoras de PreToolUse, nunca use || true, caso contrário, a verificação será sempre considerada bem-sucedida e a barreira de proteção deixará de funcionar.
6. Notificações de áudio e desktop ao concluir tarefas (Stop Hook)
Refatorações complexas ou a execução de suítes completas de testes podem levar de 2 a 10 minutos. Em vez de ficar olhando fixamente para o terminal, configure notificações através do evento Stop.
A notificação dispara apenas quando o agente conclui completamente a geração da resposta final, e não entre chamadas intermediárias de ferramentas.
7. Passagem de contexto através de variáveis de ambiente
Para que os scripts de automação sejam flexíveis e adaptativos, o Claude Code exporta automaticamente metadados da operação atual para variáveis de ambiente do sistema (Environment Variables).
Variáveis de ambiente do Claude Code para hooksReferência das variáveis de sistema do Claude Code
| Variável de ambiente | Tipo de valor | Descrição e exemplo de conteúdo |
|---|---|---|
$CLAUDE_FILE_PATH | Caminho absoluto | Caminho para o arquivo específico sendo criado ou editado (/Users/dev/project/src/index.ts) |
$CLAUDE_TOOL_NAME | Identificador textual | Nome da ferramenta que iniciou o evento (Edit, Write, Bash) |
$CLAUDE_PROJECT_DIR | Caminho absoluto | Diretório raiz do projeto onde a sessão atual do Claude Code está rodando |
Exemplo de script Bash contextual para um hook
Crie o script .claude/hooks/smart-validator.sh:
Agora, no .claude/settings.json, basta indicar a chamada deste script:
8. Padrão «CI-in-a-Loop»: feedback contínuo
No desenvolvimento tradicional sem hooks, surge um padrão de ruptura: o agente altera dezenas de arquivos, depois inicia-se uma build do projeto que gera uma avalanche de 40 erros de tipo. É difícil para o agente descobrir qual alteração específica causou a quebra.
CI-in-a-Loop (Curto ciclo de feedback) inverte esse processo:
Configuração da auditoria cíclica de TypeScript
Por que usar obrigatoriamente head -n 20
Se a saída do compilador retornar centenas de linhas de log, elas entram no contexto do modelo e podem estourar o limite de tokens. Limitar via head -n 20 mostra os primeiros erros mais críticos, dando ao modelo um guia preciso para correção imediata sem sobrecarregar a sessão.
9. Automação Headless: modo -p, Cron e Git Hooks
Os hooks podem ser combinados com o modo autônomo (headless) do Claude Code — a flag -p (print/prompt). Isso permite automatizar a execução de tarefas totalmente sem intervenção humana.
Script autônomo de auditoria noturna (nightly-audit.sh)
Configuração do agendamento via Cron
Abra o planejador de tarefas (crontab -e) e configure a execução toda noite às 03:00:
Execução da verificação em um Git Hook nativo (.git/hooks/post-merge)
Para que, após cada atualização via git pull, seja iniciado automaticamente uma análise de compatibilidade:
Não esqueça de dar permissão de execução ao script: chmod +x .git/hooks/post-merge.
10. Melhores práticas de engenharia e regras de segurança para Hooks
Hooks mal configurados podem causar loops infinitos ou travar o terminal. Siga estas quatro regras fundamentais de higiene de engenharia.
Quatro regras para design seguro de hooks
-
Desempenho extremo: Hooks com evento
PostToolUserodam após cada modificação de arquivo. Se o hook demorar mais de 1-2 segundos, o trabalho interativo com o Claude ficará lento e desconfortável. Execute testes E2E pesados apenas emPreToolUseantes do commit, mas não após cadaEdit. -
Logging obrigatório da saída: Sempre redirecione a saída de scripts de diagnóstico para um arquivo de log temporário:
bash"command": "bash .claude/hooks/check.sh >> /tmp/claude-hooks.log 2>&1 || true"Se o hook parar de disparar, você poderá abrir imediatamente
/tmp/claude-hooks.loge encontrar a causa. -
Teste isolado em terminal limpo: Antes de adicionar qualquer comando ao
settings.json, execute-o manualmente em um shell comum. Se o comando gerar erro no console, ele garantidamente quebrará a sessão do Claude Code. -
Prevenção de recursão infinita: Nunca configure um comando em
PostToolUseque modifique os arquivos do projeto por si só sem flags de ignorância (por exemplo, um script externo que chama outroEdit), caso contrário, o agente entrará em um loop infinito de chamadas.
Não execute comandos via hooks que esperem entrada interativa do usuário (como confirmações read -p ou sudo pedindo senha). Isso resultará no travamento do processo do terminal.
11. Workshop prático, cheat sheet e checklist final
Para começar rapidamente em seu próprio projeto, use esta referência consolidada pronta e uma configuração production testada.
Cheat sheet para escolher o tipo de Hook para automaçãoArquivo de configuração pronto .claude/settings.json
Copie esta configuração de referência para a pasta .claude do seu projeto:
Autoavaliação rápida
1. Qual a diferença fundamental entre PreToolUse e PostToolUse?
Resposta:
PreToolUseroda antes da execução da ação da ferramenta e pode bloqueá-la com exit code não-zero.PostToolUseroda após a conclusão bem-sucedida da operação e é usado para formatação ou linting.
2. Por que adicionar || true nos hooks de formatação?
Resposta: Para que erros do linter ou formatador não retornem status crítico e parem o processo de geração da resposta do agente.
3. Qual variável de ambiente contém o caminho do arquivo recém-editado?
Resposta: A variável
$CLAUDE_FILE_PATH.
Checklist final de implementação de Hooks
- Criado o diretório
.claude/e o arquivosettings.jsonna raiz do projeto. - Configurada a formatação automática de arquivos modificados via
PostToolUse+Prettier. - Implementada a verificação de tipos/testes em
PreToolUsepara bloquear commits ruins. - Adicionadas notificações de som/desktop no evento
Stop. - Testados todos os scripts de hook manualmente no terminal antes de integrar.