Configuração
Os hooks do Claude Code são configurados em seus arquivos de configurações:~/.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
Os administradores corporativos podem usar
allowManagedHooksOnly para bloquear hooks de usuário, projeto e plugin. Consulte Configuração de Hook.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
PreToolUse,PermissionRequestePostToolUse)- Strings simples correspondem exatamente:
Writecorresponde apenas à ferramenta Write - Suporta regex:
Edit|WriteouNotebook.* - Use
*para corresponder a 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 corresponde
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, 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 os hooks de plugin funcionam:- 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 os 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 de projeto)- Todas as variáveis de ambiente padrão estão disponíveis
Hooks em Skills, Agents e Slash Commands
Além dos arquivos de configurações e plugins, os hooks podem ser definidos diretamente em Skills, subagents e slash commands usando frontmatter. Esses hooks são limitados ao ciclo de vida do componente e só são executados quando esse componente está ativo. Eventos suportados:PreToolUse, PostToolUse e Stop
Exemplo em uma Skill:
once: Defina comotruepara executar o hook apenas uma vez por sessão. Após a primeira execução bem-sucedida, o hook é removido. Nota: Esta opção atualmente é suportada apenas para skills e slash commands, não para agents.
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 atualmente são suportados apenas para hooks Stop e SubagentStop, onde permitem decisões inteligentes e conscientes do contexto.
Como os hooks baseados em prompt funcionam
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 a entrada do hook JSON - Se
$ARGUMENTSnão estiver presente, o JSON de entrada é anexado ao prompt
- Use
timeout: (Opcional) Timeout em segundos (padrão: 30 segundos)
Schema de resposta
O LLM deve responder com JSON contendo:ok:truepermite a ação,falsea previnereason: Obrigatório quandookéfalse. Explicação mostrada para Claude
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 subagent completou sua tarefa
- UserPromptSubmit: Validar prompts de usuário com assistência de LLM
- PreToolUse: Tomar decisões de permissão conscientes do contexto
- PermissionRequest: Permitir ou negar inteligentemente diálogos de permissão
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 | Configurar 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 conforme 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 subagent (consulte documentação de subagents)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
PermissionRequest
Executa quando o usuário é mostrado um diálogo de permissão. Use controle de decisão PermissionRequest para permitir ou negar em nome do usuário. Reconhece os mesmos valores de matcher que PreToolUse.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. Suporta matchers para filtrar por tipo de notificação. Matchers comuns:permission_prompt- Solicitações de permissão do Claude Codeidle_prompt- Quando Claude está aguardando entrada do usuário (após 60+ segundos de tempo ocioso)auth_success- Notificações de sucesso de autenticaçãoelicitation_dialog- Quando Claude Code precisa de entrada para elicitação de ferramenta MCP
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 agent 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 subagent 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 internamente). Ú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 de startupresume- Invocado de--resume,--continueou/resumeclear- Invocado de/clearcompact- Invocado de auto ou manual compact.
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 schema exato paratool_input depende da ferramenta.
Entrada PostToolUse
O schema 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 stop. 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 mutuamente exclusivas para hooks retornarem saída de volta para Claude Code. A saída comunica se deve bloquear e qualquer feedback que deve ser mostrado para Claude e o 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 em modo verbose (ctrl+o), exceto paraUserPromptSubmiteSessionStart, onde stdout é adicionado ao contexto. Saída JSON emstdouté analisada para controle estruturado (consulte Avançado: Saída JSON). - Código de saída 2: Erro de bloqueio. Apenas
stderré usado como mensagem de erro e alimentado de volta para Claude. O formato é[command]: {stderr}. JSON emstdouté não processado para código de saída 2. Consulte comportamento por evento de hook abaixo. - Outros códigos de saída: Erro não bloqueante.
stderré mostrado ao usuário em modo verbose (ctrl+o) com formatoFailed with non-blocking status code: {stderr}. Sestderrestiver vazio, mostraNo stderr output. A execução continua.
Comportamento do Código de Saída 2
| Evento de Hook | Comportamento |
|---|---|
PreToolUse | Bloqueia a chamada de ferramenta, mostra stderr para Claude |
PermissionRequest | Nega a permissão, mostra stderr para Claude |
PostToolUse | Mostra stderr para Claude (ferramenta já foi executada) |
Notification | N/A, mostra stderr apenas para o usuário |
UserPromptSubmit | Bloqueia processamento de prompt, apaga prompt, mostra stderr apenas para o usuário |
Stop | Bloqueia parada, mostra stderr para Claude |
SubagentStop | Bloqueia parada, mostra stderr para subagent Claude |
PreCompact | N/A, mostra stderr apenas para o usuário |
SessionStart | N/A, mostra stderr apenas para o usuário |
SessionEnd | N/A, mostra stderr apenas para o 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 a execução dos hooks.
- Para
PreToolUse, isso é diferente de"permissionDecision": "deny", que apenas bloqueia uma chamada de ferramenta específica e fornece feedback automático para Claude. - Para
PostToolUse, isso é diferente de"decision": "block", que fornece feedback automatizado para 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
para 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 para Claude."deny"impede que a chamada de ferramenta seja executada.permissionDecisionReasoné mostrado para Claude."ask"pede ao usuário para confirmar a chamada de ferramenta na UI.permissionDecisionReasoné mostrado ao usuário mas não para Claude.
updatedInput:
updatedInputmodifica os parâmetros de entrada da ferramenta antes da ferramenta ser executada- Combine com
"permissionDecision": "allow"para modificar a entrada e auto-aprovar a chamada de ferramenta - Combine com
"permissionDecision": "ask"para modificar a entrada e mostrá-la ao usuário para confirmação
Os campos
decision e reason estão deprecados para hooks PreToolUse.
Use hookSpecificOutput.permissionDecision e
hookSpecificOutput.permissionDecisionReason em vez disso. Os campos deprecados
"approve" e "block" mapeiam para "allow" e "deny" respectivamente.Controle de Decisão PermissionRequest
Os hooks PermissionRequest podem permitir ou negar solicitações de permissão mostradas ao usuário.
- Para
"behavior": "allow"você também pode opcionalmente passar um"updatedInput"que modifica os parâmetros de entrada da ferramenta antes da ferramenta ser executada. - Para
"behavior": "deny"você também pode opcionalmente passar uma string"message"que diz ao modelo por que a permissão foi negada, e um booleano"interrupt"que interromperá Claude.
Controle de Decisão PostToolUse
Os hooks PostToolUse podem fornecer feedback para Claude após a execução da ferramenta.
"block"automaticamente solicita 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 de usuário é processado e adicionar contexto.
Adicionando contexto (código de saída 0):
Existem duas maneiras de adicionar contexto à conversa:
- Stdout de texto simples (mais simples): Qualquer texto não-JSON escrito em stdout é adicionado como contexto. Esta é a maneira mais fácil de injetar informações.
-
JSON com
additionalContext(estruturado): Use o formato JSON abaixo para mais controle. O campoadditionalContexté adicionado como contexto.
additionalContext é adicionado mais discretamente.
Bloqueando prompts:
"decision": "block"impede que o prompt seja processado. O prompt enviado é apagado do contexto."reason"é mostrado ao usuário mas não adicionado ao contexto."decision": undefined(ou omitido) permite que o prompt prossiga normalmente.
O formato JSON não é obrigatório para casos de uso simples. Para adicionar contexto, você pode imprimir texto simples em stdout com código de saída 0. Use JSON quando precisar
bloquear prompts ou quiser controle mais estruturado.
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 Claude saber 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:- Stdout de texto simples com código de saída 0: Abordagem mais simples, imprime texto
- Saída JSON com código de saída 0: Use
"decision": "block"para rejeitar prompts, ouadditionalContextpara injeção de contexto estruturada
stderr para a mensagem de erro. Para bloquear usando
JSON (com um motivo personalizado), use "decision": "block" com código de saída 0.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 Ferramenta MCP
As ferramentas MCP seguem o padrãomcp__<server>__<tool>, por exemplo:
mcp__memory__create_entities- Ferramenta create entities do servidor Memorymcp__filesystem__read_file- Ferramenta read file do servidor Filesystemmcp__github__search_repositories- Ferramenta search 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 de Isenção
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 quaisquer 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 em dados de entrada cegamente
- Sempre cite variáveis de shell - Use
"$VAR"não$VAR - Bloqueie traversal de caminho - Verifique se há
..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ções não entram em efeito imediatamente. 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 as mudanças entrem em efeito
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/PermissionRequest/PostToolUse/Stop/SubagentStop: Progresso mostrado em modo verbose (ctrl+o)
- 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 de hook complexos:- Inspecione execução de hook - Use
claude --debugpara ver detalhes de execução de hook - Valide schemas 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 se há 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