Configuração
Os hooks do Claude Code são configurados em seus arquivos de configuração:~/.claude/settings.json- Configurações do usuário.claude/settings.json- Configurações do projeto.claude/settings.local.json- Configurações locais do projeto (não confirmadas)- Configurações de política gerenciada pela empresa
Estrutura
Os hooks são organizados por matchers, onde cada matcher pode ter vários hooks:- matcher: Padrão para corresponder nomes de ferramentas, sensível a maiúsculas e minúsculas (aplicável apenas para
PreToolUseePostToolUse)- Strings simples correspondem exatamente:
Writecorresponde apenas à ferramenta Write - Suporta regex:
Edit|WriteouNotebook.* - Use
*para corresponder todas as ferramentas. Você também pode usar uma string vazia ("") ou deixarmatcherem branco.
- Strings simples correspondem exatamente:
- hooks: Array de hooks a executar quando o padrão corresponder
type: Tipo de execução do hook -"command"para comandos bash ou"prompt"para avaliação baseada em LLMcommand: (Paratype: "command") O comando bash a executar (pode usar a variável de ambiente$CLAUDE_PROJECT_DIR)prompt: (Paratype: "prompt") O prompt a enviar para o LLM para avaliaçãotimeout: (Opcional) Quanto tempo um hook deve executar, em segundos, antes de cancelar esse hook específico
UserPromptSubmit, Notification, Stop e SubagentStop
que não usam matchers, você pode omitir o campo matcher:
Scripts de Hook Específicos do Projeto
Você pode usar a variável de ambienteCLAUDE_PROJECT_DIR (disponível apenas quando
Claude Code executa o comando hook) para referenciar scripts armazenados em seu projeto,
garantindo que funcionem independentemente do diretório atual do Claude:
Hooks de plugin
Plugins podem fornecer hooks que se integram perfeitamente com seus hooks de usuário e projeto. Os hooks de plugin são automaticamente mesclados com sua configuração quando os plugins estão habilitados. Como funcionam os hooks de plugin:- Os hooks de plugin são definidos no arquivo
hooks/hooks.jsondo plugin ou em um arquivo fornecido por um caminho personalizado para o campohooks. - Quando um plugin é habilitado, seus hooks são mesclados com hooks de usuário e projeto
- Vários hooks de diferentes fontes podem responder ao mesmo evento
- Os hooks de plugin usam a variável de ambiente
${CLAUDE_PLUGIN_ROOT}para referenciar arquivos de plugin
Os hooks de plugin usam o mesmo formato que hooks regulares com um campo
description opcional para explicar o propósito do hook.Os hooks de plugin são executados junto com seus hooks personalizados. Se vários hooks corresponderem a um evento, todos serão executados em paralelo.
${CLAUDE_PLUGIN_ROOT}: Caminho absoluto para o diretório do plugin${CLAUDE_PROJECT_DIR}: Diretório raiz do projeto (igual ao dos hooks do projeto)- Todas as variáveis de ambiente padrão estão disponíveis
Hooks Baseados em Prompt
Além dos hooks de comando bash (type: "command"), Claude Code suporta hooks baseados em prompt (type: "prompt") que usam um LLM para avaliar se deve permitir ou bloquear uma ação. Os hooks baseados em prompt são atualmente suportados apenas para hooks Stop e SubagentStop, onde permitem decisões inteligentes e conscientes do contexto.
Como funcionam os hooks baseados em prompt
Em vez de executar um comando bash, os hooks baseados em prompt:- Enviam a entrada do hook e seu prompt para um LLM rápido (Haiku)
- O LLM responde com JSON estruturado contendo uma decisão
- Claude Code processa a decisão automaticamente
Configuração
type: Deve ser"prompt"prompt: O texto do prompt a enviar para o LLM- Use
$ARGUMENTScomo um placeholder para o JSON de entrada do hook - Se
$ARGUMENTSnão estiver presente, o JSON de entrada é anexado ao prompt
- Use
timeout: (Opcional) Timeout em segundos (padrão: 30 segundos)
Esquema de resposta
O LLM deve responder com JSON contendo:decision:"approve"permite a ação,"block"a previnereason: Explicação mostrada a Claude quando a decisão é"block"continue: (Opcional) Sefalse, para a execução do Claude inteiramentestopReason: (Opcional) Mensagem mostrada quandocontinueé falsesystemMessage: (Opcional) Mensagem adicional mostrada ao usuário
Eventos de hook suportados
Os hooks baseados em prompt funcionam com qualquer evento de hook, mas são mais úteis para:- Stop: Decidir inteligentemente se Claude deve continuar trabalhando
- SubagentStop: Avaliar se um subagente completou sua tarefa
- UserPromptSubmit: Validar prompts do usuário com assistência de LLM
- PreToolUse: Tomar decisões de permissão conscientes do contexto
Exemplo: Hook Stop inteligente
Exemplo: SubagentStop com lógica personalizada
Comparação com hooks de comando bash
| Recurso | Hooks de Comando Bash | Hooks Baseados em Prompt |
|---|---|---|
| Execução | Executa script bash | Consulta LLM |
| Lógica de decisão | Você implementa em código | LLM avalia contexto |
| Complexidade de configuração | Requer arquivo de script | Apenas configure prompt |
| Consciência de contexto | Limitada à lógica do script | Compreensão de linguagem natural |
| Desempenho | Rápido (execução local) | Mais lento (chamada de API) |
| Caso de uso | Regras determinísticas | Decisões conscientes do contexto |
Melhores práticas
- Seja específico em prompts: Declare claramente o que você quer que o LLM avalie
- Inclua critérios de decisão: Liste os fatores que o LLM deve considerar
- Teste seus prompts: Verifique se o LLM toma decisões corretas para seus casos de uso
- Defina timeouts apropriados: O padrão é 30 segundos, ajuste se necessário
- Use para decisões complexas: Hooks bash são melhores para regras simples e determinísticas
Eventos de Hook
PreToolUse
Executa após Claude criar parâmetros de ferramenta e antes de processar a chamada de ferramenta. Matchers comuns:Task- Tarefas de subagente (consulte documentação de subagentes)Bash- Comandos de shellGlob- Correspondência de padrão de arquivoGrep- Busca de conteúdoRead- Leitura de arquivoEdit- Edição de arquivoWrite- Escrita de arquivoWebFetch,WebSearch- Operações web
PostToolUse
Executa imediatamente após uma ferramenta ser concluída com sucesso. Reconhece os mesmos valores de matcher que PreToolUse.Notification
Executa quando Claude Code envia notificações. As notificações são enviadas quando:- Claude precisa de sua permissão para usar uma ferramenta. Exemplo: “Claude precisa de sua permissão para usar Bash”
- A entrada do prompt ficou ociosa por pelo menos 60 segundos. “Claude está aguardando sua entrada”
UserPromptSubmit
Executa quando o usuário envia um prompt, antes de Claude processá-lo. Isso permite que você adicione contexto adicional com base no prompt/conversa, valide prompts ou bloqueie certos tipos de prompts.Stop
Executa quando o agente principal do Claude Code terminou de responder. Não executa se a parada ocorreu devido a uma interrupção do usuário.SubagentStop
Executa quando um subagente do Claude Code (chamada de ferramenta Task) terminou de responder.PreCompact
Executa antes de Claude Code estar prestes a executar uma operação de compactação. Matchers:manual- Invocado de/compactauto- Invocado de auto-compact (devido à janela de contexto cheia)
SessionStart
Executa quando Claude Code inicia uma nova sessão ou retoma uma sessão existente (que atualmente inicia uma nova sessão sob o capô). Útil para carregar contexto de desenvolvimento como problemas existentes ou mudanças recentes em sua base de código, instalar dependências ou configurar variáveis de ambiente. Matchers:startup- Invocado na inicializaçãoresume- Invocado de--resume,--continueou/resumeclear- Invocado de/clearcompact- Invocado de compactação automática ou manual.
Persistindo variáveis de ambiente
Os hooks SessionStart têm acesso à variável de ambienteCLAUDE_ENV_FILE, que fornece um caminho de arquivo onde você pode persistir variáveis de ambiente para comandos bash subsequentes.
Exemplo: Definindo variáveis de ambiente individuais
nvm use), capture e persista todas as mudanças comparando o ambiente:
CLAUDE_ENV_FILE está disponível apenas para hooks SessionStart. Outros tipos de hook não têm acesso a esta variável.SessionEnd
Executa quando uma sessão do Claude Code termina. Útil para tarefas de limpeza, registro de estatísticas de sessão ou salvamento de estado de sessão. O camporeason na entrada do hook será um de:
clear- Sessão limpa com comando /clearlogout- Usuário fez logoutprompt_input_exit- Usuário saiu enquanto a entrada de prompt estava visívelother- Outros motivos de saída
Entrada de Hook
Os hooks recebem dados JSON via stdin contendo informações de sessão e dados específicos do evento:Entrada PreToolUse
O esquema exato paratool_input depende da ferramenta.
Entrada PostToolUse
O esquema exato paratool_input e tool_response depende da ferramenta.
Entrada Notification
Entrada UserPromptSubmit
Entrada Stop e SubagentStop
stop_hook_active é true quando Claude Code já está continuando como resultado de
um hook de parada. Verifique este valor ou processe a transcrição para evitar que Claude Code
execute indefinidamente.
Entrada PreCompact
Paramanual, custom_instructions vem do que o usuário passa para
/compact. Para auto, custom_instructions está vazio.
Entrada SessionStart
Entrada SessionEnd
Saída de Hook
Existem duas maneiras para hooks retornarem saída de volta para Claude Code. A saída comunica se deve bloquear e qualquer feedback que deve ser mostrado a Claude e ao usuário.Simples: Código de Saída
Os hooks comunicam status através de códigos de saída, stdout e stderr:- Código de saída 0: Sucesso.
stdouté mostrado ao usuário no modo de transcrição (CTRL-R), exceto paraUserPromptSubmiteSessionStart, onde stdout é adicionado ao contexto. - Código de saída 2: Erro de bloqueio.
stderré alimentado de volta a Claude para processar automaticamente. Consulte o comportamento específico do evento de hook abaixo. - Outros códigos de saída: Erro não bloqueador.
stderré mostrado ao usuário e a execução continua.
Comportamento do Código de Saída 2
| Evento de Hook | Comportamento |
|---|---|
PreToolUse | Bloqueia a chamada de ferramenta, mostra stderr a Claude |
PostToolUse | Mostra stderr a Claude (ferramenta já foi executada) |
Notification | N/A, mostra stderr apenas ao usuário |
UserPromptSubmit | Bloqueia processamento de prompt, apaga prompt, mostra stderr apenas ao usuário |
Stop | Bloqueia parada, mostra stderr a Claude |
SubagentStop | Bloqueia parada, mostra stderr ao subagente Claude |
PreCompact | N/A, mostra stderr apenas ao usuário |
SessionStart | N/A, mostra stderr apenas ao usuário |
SessionEnd | N/A, mostra stderr apenas ao usuário |
Avançado: Saída JSON
Os hooks podem retornar JSON estruturado emstdout para controle mais sofisticado:
Campos JSON Comuns
Todos os tipos de hook podem incluir estes campos opcionais:continue for false, Claude para o processamento após os hooks serem executados.
- Para
PreToolUse, isso é diferente de"permissionDecision": "deny", que apenas bloqueia uma chamada de ferramenta específica e fornece feedback automático a Claude. - Para
PostToolUse, isso é diferente de"decision": "block", que fornece feedback automatizado a Claude. - Para
UserPromptSubmit, isso impede que o prompt seja processado. - Para
StopeSubagentStop, isso tem precedência sobre qualquer saída"decision": "block". - Em todos os casos,
"continue" = falsetem precedência sobre qualquer saída"decision": "block".
stopReason acompanha continue com um motivo mostrado ao usuário, não mostrado
a Claude.
Controle de Decisão PreToolUse
Os hooks PreToolUse podem controlar se uma chamada de ferramenta prossegue.
"allow"ignora o sistema de permissão.permissionDecisionReasoné mostrado ao usuário mas não a Claude."deny"impede que a chamada de ferramenta seja executada.permissionDecisionReasoné mostrado a Claude."ask"pede ao usuário para confirmar a chamada de ferramenta na UI.permissionDecisionReasoné mostrado ao usuário mas não a Claude.
updatedInput:
updatedInputpermite que você modifique os parâmetros de entrada da ferramenta antes que a ferramenta seja executada. Este é um objetoRecord<string, unknown>contendo os campos que você deseja alterar ou adicionar.- Isso é mais útil com
"permissionDecision": "allow"para modificar e aprovar chamadas de ferramenta.
Os campos
decision e reason estão descontinuados para hooks PreToolUse.
Use hookSpecificOutput.permissionDecision e
hookSpecificOutput.permissionDecisionReason em vez disso. Os campos descontinuados
"approve" e "block" mapeiam para "allow" e "deny" respectivamente.Controle de Decisão PostToolUse
Os hooks PostToolUse podem fornecer feedback a Claude após a execução da ferramenta.
"block"solicita automaticamente a Claude comreason.undefinednão faz nada.reasoné ignorado."hookSpecificOutput.additionalContext"adiciona contexto para Claude considerar.
Controle de Decisão UserPromptSubmit
Os hooks UserPromptSubmit podem controlar se um prompt do usuário é processado.
"block"impede que o prompt seja processado. O prompt enviado é apagado do contexto."reason"é mostrado ao usuário mas não adicionado ao contexto.undefinedpermite que o prompt prossiga normalmente."reason"é ignorado."hookSpecificOutput.additionalContext"adiciona a string ao contexto se não bloqueado.
Controle de Decisão Stop/SubagentStop
Os hooks Stop e SubagentStop podem controlar se Claude deve continuar.
"block"impede que Claude pare. Você deve preencherreasonpara que Claude saiba como proceder.undefinedpermite que Claude pare.reasoné ignorado.
Controle de Decisão SessionStart
Os hooks SessionStart permitem que você carregue contexto no início de uma sessão.
"hookSpecificOutput.additionalContext"adiciona a string ao contexto.- Os valores
additionalContextde vários hooks são concatenados.
Controle de Decisão SessionEnd
Os hooks SessionEnd são executados quando uma sessão termina. Eles não podem bloquear o término da sessão
mas podem executar tarefas de limpeza.
Exemplo de Código de Saída: Validação de Comando Bash
Exemplo de Saída JSON: UserPromptSubmit para Adicionar Contexto e Validação
Para hooks
UserPromptSubmit, você pode injetar contexto usando qualquer método:- Código de saída 0 com stdout: Claude vê o contexto (caso especial para
UserPromptSubmit) - Saída JSON: Fornece mais controle sobre o comportamento
Exemplo de Saída JSON: PreToolUse com Aprovação
Trabalhando com Ferramentas MCP
Os hooks do Claude Code funcionam perfeitamente com ferramentas do Model Context Protocol (MCP). Quando servidores MCP fornecem ferramentas, elas aparecem com um padrão de nomenclatura especial que você pode corresponder em seus hooks.Nomenclatura de Ferramentas MCP
As ferramentas MCP seguem o padrãomcp__<server>__<tool>, por exemplo:
mcp__memory__create_entities- Ferramenta criar entidades do servidor Memorymcp__filesystem__read_file- Ferramenta ler arquivo do servidor Filesystemmcp__github__search_repositories- Ferramenta buscar repositórios do servidor GitHub
Configurando Hooks para Ferramentas MCP
Você pode direcionar ferramentas MCP específicas ou servidores MCP inteiros:Exemplos
Considerações de Segurança
Aviso Legal
USE POR SUA CONTA E RISCO: Os hooks do Claude Code executam comandos shell arbitrários em seu sistema automaticamente. Ao usar hooks, você reconhece que:- Você é o único responsável pelos comandos que configura
- Os hooks podem modificar, deletar ou acessar qualquer arquivo que sua conta de usuário possa acessar
- Hooks maliciosos ou mal escritos podem causar perda de dados ou danos ao sistema
- Anthropic não fornece garantia e não assume responsabilidade por danos resultantes do uso de hooks
- Você deve testar completamente os hooks em um ambiente seguro antes do uso em produção
Melhores Práticas de Segurança
Aqui estão algumas práticas-chave para escrever hooks mais seguros:- Valide e sanitize entradas - Nunca confie cegamente em dados de entrada
- Sempre cite variáveis de shell - Use
"$VAR"não$VAR - Bloqueie travessia de caminho - Verifique
..em caminhos de arquivo - Use caminhos absolutos - Especifique caminhos completos para scripts (use “$CLAUDE_PROJECT_DIR” para o caminho do projeto)
- Pule arquivos sensíveis - Evite
.env,.git/, chaves, etc.
Segurança de Configuração
Edições diretas de hooks em arquivos de configuração não têm efeito imediato. Claude Code:- Captura um snapshot de hooks na inicialização
- Usa este snapshot durante toda a sessão
- Avisa se hooks forem modificados externamente
- Requer revisão no menu
/hookspara que mudanças sejam aplicadas
Detalhes de Execução de Hook
- Timeout: Limite de execução de 60 segundos por padrão, configurável por comando.
- Um timeout para um comando individual não afeta os outros comandos.
- Paralelização: Todos os hooks correspondentes são executados em paralelo
- Deduplicação: Múltiplos comandos de hook idênticos são automaticamente deduplicated
- Ambiente: Executa no diretório atual com o ambiente do Claude Code
- A variável de ambiente
CLAUDE_PROJECT_DIRestá disponível e contém o caminho absoluto para o diretório raiz do projeto (onde Claude Code foi iniciado) - A variável de ambiente
CLAUDE_CODE_REMOTEindica se o hook está sendo executado em um ambiente remoto (web) ("true") ou ambiente CLI local (não definido ou vazio). Use isso para executar lógica diferente com base no contexto de execução.
- A variável de ambiente
- Entrada: JSON via stdin
- Saída:
- PreToolUse/PostToolUse/Stop/SubagentStop: Progresso mostrado em transcrição (Ctrl-R)
- Notification/SessionEnd: Registrado apenas em debug (
--debug) - UserPromptSubmit/SessionStart: stdout adicionado como contexto para Claude
Depuração
Solução de Problemas Básica
Se seus hooks não estão funcionando:- Verifique configuração - Execute
/hookspara ver se seu hook está registrado - Verifique sintaxe - Certifique-se de que suas configurações JSON são válidas
- Teste comandos - Execute comandos de hook manualmente primeiro
- Verifique permissões - Certifique-se de que scripts são executáveis
- Revise logs - Use
claude --debugpara ver detalhes de execução de hook
- Aspas não escapadas - Use
\"dentro de strings JSON - Matcher errado - Verifique se nomes de ferramentas correspondem exatamente (sensível a maiúsculas e minúsculas)
- Comando não encontrado - Use caminhos completos para scripts
Depuração Avançada
Para problemas complexos de hook:- Inspecione execução de hook - Use
claude --debugpara ver execução detalhada de hook - Valide esquemas JSON - Teste entrada/saída de hook com ferramentas externas
- Verifique variáveis de ambiente - Verifique se o ambiente do Claude Code está correto
- Teste casos extremos - Tente hooks com caminhos de arquivo ou entradas incomuns
- Monitore recursos do sistema - Verifique esgotamento de recursos durante execução de hook
- Use logging estruturado - Implemente logging em seus scripts de hook
Exemplo de Saída de Debug
Useclaude --debug para ver detalhes de execução de hook:
- Qual hook está sendo executado
- Comando sendo executado
- Status de sucesso/falha
- Mensagens de saída ou erro