Hooks que economizam tempo (e os que aprendi a remover)
Três hooks que rodo em todos os projetos com Claude Code, mais dois que parecem boa ideia mas viram ruído. O que automatizar e o que deixar manual.
Hooks no Claude Code são gatilhos que rodam em eventos específicos (PostToolUse, Stop, etc.) e executam um comando shell. Em teoria, automatizam tudo. Na prática, é fácil cair no anti-padrão de “automatizar coisa que era melhor manual”.
Aqui está minha curadoria depois de seis meses ajustando.
Os 3 que eu mantenho
1. Auto-format depois de editar
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": "pnpm prettier --write $CLAUDE_FILE_PATHS 2>/dev/null || true" }
]
}
]
}
}
Por quê: o modelo erra indentação ocasionalmente. Format on edit elimina o ruído sem custo. O || true evita falha em arquivos não suportados (binários, markdown sem prettier-plugin, etc.).
2. Notificação quando termina
{
"hooks": {
"Stop": [
{ "hooks": [{ "type": "command", "command": "notify-send 'Claude' 'Pronto.' " }] }
]
}
}
Por quê: deixo tarefas longas rodando e volto. Sem notificação, ou eu fico vigiando (perda de foco) ou descubro tarde (perda de tempo).
3. Lint silencioso depois de edits
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": "pnpm tsc --noEmit 2>&1 | tail -5" }
]
}
Por quê: erros de tipo aparecem na hora pra mim e pro modelo. Em vez de descobrir no build final que algo quebrou três arquivos atrás, o feedback é imediato.
Os 2 que removi
Auto-commit a cada edit
Parece organizado. Na prática, polui o histórico com 50 commits “wip” por sessão. Commit ainda é decisão humana — não dá pra delegar sem perder a granularidade certa.
Push automático no Stop
Já fiz isso. Errei. Push para main sem revisão é o tipo de coisa que parece útil até o dia que não é. Hoje, push é sempre comando explícito.
A heurística
Antes de adicionar um hook, pergunto:
- Esse passo sempre acontece, sem exceção?
- Se errar, o custo de desfazer é baixo?
Se as duas respostas forem sim, automatize. Se qualquer uma for não, deixe manual — o atrito que parece desperdício é, na verdade, ponto de decisão.
Bônus: debug
Quando um hook não dispara, rodo claude --debug e procuro por hook:. Costuma ser:
- Matcher errado (
BashvsBash:.*) - Comando que retorna stderr e o Claude trata como erro silencioso
Mantenha simples e revise mensalmente.