Disparando um Comando Shell no PostToolUse com Hooks
Um hook PostToolUse é um comando shell que roda automaticamente logo após uma chamada de ferramenta correspondente ser concluída.
Busque em todas as páginas da documentação
Um hook PostToolUse é um comando shell que roda automaticamente logo após uma chamada de ferramenta correspondente ser concluída.
O uso mais comum é a formatação automática: no momento em que o Claude edita um arquivo, um formatador é executado nele sem que ninguém peça.
Hooks são configurados em settings.json, sob um nome de evento como PostToolUse.
Cada entrada de hook tem um matcher, que o limita a ferramentas específicas como Edit ou Write, e um ou mais comandos hooks para executar quando esse matcher é acionado.
Diferente de um comando de barra, nada sobre um hook passa pelo modelo. O harness executa o comando shell diretamente e não pergunta ao Claude se deveria.
Um hook recebe detalhes sobre a chamada de ferramenta concluída como JSON, tipicamente via stdin, incluindo qual arquivo foi tocado.
Como o hook é determinístico, ele é o lugar certo para qualquer coisa que deva acontecer sempre, sem exceções e sem chamadas de julgamento.
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "npx prettier --write \"$CLAUDE_FILE_PATH\""
}
]
}
]
}
}Quando usar isso:
#!/usr/bin/env bash
# .claude/hooks/format-on-edit.sh
# Lê o payload do evento PostToolUse via stdin e formata o arquivo tocado.
set -euo pipefail
payload="$(cat)"
file_path="$(echo "$payload" | jq -r '.tool_input.file_path // empty')"
if [ -z "$file_path" ]; then
exit 0
fi
case "$file_path" in
*.ts|*.tsx|*.js|*.jsx|*.json|*.css|*.md)
npx prettier --write "$file_path"
echo "Formatted: $file_path"
;;
*)
exit 0
;;
esac{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "bash .claude/hooks/format-on-edit.sh"
}
]
}
]
}
}O que isso demonstra:
matcher limita o hook às ferramentas Edit e Write, para que ele nunca seja acionado em, por exemplo, um comando Bash.jq, em vez de adivinhar uma variável de ambiente.case restringe a formatação a tipos de arquivo que o Prettier realmente entende, para que o hook opere silenciosamente em arquivos que não deveria tocar.set -euo pipefail faz com que o script falhe ruidosamente em erros inesperados em vez de fazer nada silenciosamente.PostToolUse imediatamente após uma chamada de ferramenta ser concluída com sucesso.matcher de cada hook PostToolUse registrado contra a ferramenta que acabou de rodar; apenas hooks correspondentes são executados.command de cada hook correspondente roda como um comando shell simples, com o payload do evento (nome da ferramenta, entrada da ferramenta e resultado) disponível para ele, tipicamente via stdin como JSON.| Matcher | Corresponde |
|---|---|
Edit | Apenas a ferramenta Edit. |
Write | Apenas a ferramenta Write. |
Edit|Write | Edit ou Write (alternância de regex). |
* ou omitido | Toda chamada de ferramenta, independentemente de qual ferramenta rodou. |
# Prefira ler entrada estruturada em vez de depender de variáveis de ambiente
# que podem ou não ser definidas consistentemente entre implementações de hook.
payload="$(cat)"
file_path="$(echo "$payload" | jq -r '.tool_input.file_path // empty')"
# Proteja contra um caminho vazio antes de fazer qualquer trabalho.
[ -z "$file_path" ] && exit 0settings.json, pois é mais fácil de testar, comparar e raciocinar isoladamente.*) dispara mesmo em ferramentas não relacionadas como Bash ou Read, desperdiçando ciclos e poluindo a saída. Correção: defina um matcher que nomeie exatamente as ferramentas que o hook deseja, como Edit|Write.case acima) para que o hook saia silenciosamente em arquivos que não deveria tocar.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Pedir ao Claude para formatar o arquivo no prompt | Uma solicitação única, não algo que deva acontecer em cada edição daqui para frente. | O comportamento deve ser incondicional e automático para toda a equipe, não dependente de lembrar de pedir. |
| Um hook PreToolUse | O objetivo é validar ou bloquear a edição antes que ela aconteça, não reagir após sua conclusão. | A ação é um efeito colateral que deve rodar após uma edição bem-sucedida, como formatação ou logging. |
| Uma etapa de pipeline de CI | A verificação é cara (conjunto completo de testes, compilação completa) e não precisa rodar em cada edição local. | Feedback rápido em cada edição é mais importante do que centralizar a verificação em CI. |
Não. PostToolUse é acionado após a chamada da ferramenta já ter sido concluída, então a edição já aconteceu quando o hook roda. O bloqueio pertence a um hook PreToolUse em vez disso.
O payload do evento inclui a entrada da chamada da ferramenta, tipicamente entregue como JSON via stdin, que contém o caminho do arquivo para chamadas de ferramenta Edit e Write.
Edit ou Write.Edit|Write) permite que uma entrada de hook cubra múltiplas ferramentas.*, faz o hook disparar em toda chamada de ferramenta.Sim. Múltiplas entradas de hook podem ser registradas sob PostToolUse, e cada entrada cujo matcher corresponde à ferramenta concluída é executada.
A saída não zero é tipicamente apresentada de volta à sessão como um sinal de falha, o que é útil para hooks que realizam validação leve além de um efeito colateral como formatação.
Não. Ele deve verificar a extensão (ou caminho) do arquivo e apenas rodar o formatador contra tipos que ele realmente entende, saindo silenciosamente em qualquer outra coisa.
Geralmente não, já que o hook roda em cada edição correspondente e um hook lento adiciona essa latência a cada edição. Verificações lentas são geralmente melhores deixadas para CI ou um comando acionado manualmente.
Em settings.json, sob um array hooks.PostToolUse, onde cada entrada tem um matcher e um ou mais comandos hooks para executar.
Não. O command do hook roda como um comando shell independente, separado do processo de raciocínio do modelo, e apenas sua saída e código de saída são reportados de volta.
Sim. O payload do evento geralmente inclui tanto a entrada quanto o resultado da ferramenta, o que é útil para hooks que querem reagir de forma diferente dependendo do que a edição realmente produziu.
Sim, e é recomendado, já que um script de hook com escopo de projeto em controle de versão significa que cada colega de equipe obtém o mesmo comportamento automático de formatação ou logging sem configuração individual.
Um hook PostToolUse é acionado após cada chamada de ferramenta correspondente individual ser concluída, enquanto um hook Stop é acionado uma vez, quando a sessão ou turno termina, tornando-o mais adequado para resumos de fim de turno ou limpeza em vez de reações por edição.
Versões da Stack: Escrito contra a linha de modelos Claude atual em ~junho de 2026 - Claude Fable 5, Claude Opus 4.8, Claude Sonnet 5 (o padrão), e Claude Haiku 4.5. Nomes de modelos, preços e recursos de produtos mudam rapidamente - verifique os detalhes atuais em platform.claude.com/docs antes de confiar neles.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026