📋 All 27 Hook Events
Lifecycle
SessionStart, SessionEnd, Setup, Stop, StopFailure
Tool Execution
PreToolUse, PostToolUse, PostToolUseFailure
Agent/Subagent
SubagentStart, SubagentStop
Compaction
PreCompact, PostCompact
Permission/Policy
PermissionRequest, PermissionDenied, UserPromptSubmit, ConfigChange, InstructionsLoaded
Filesystem/Multi-Agent
CwdChanged, FileChanged, WorktreeCreate/Remove, Notification, TeammateIdle, TaskCreated/Completed, Elicitation/Result
🚦 Exit Code Semantics
Exit code 2 e o codigo universal "bloqueia e informa o modelo". Todos os outros non-zero sao ruido visivel apenas para o usuario. StopFailure e a unica excecao -- ignora todos os exit codes.
| Evento | Exit 0 | Exit 2 | Outro |
|---|---|---|---|
| PreToolUse | Silencioso, tool prossegue | Tool BLOQUEADA | stderr ao user |
| PostToolUse | stdout em transcript | stderr ao modelo | stderr ao user |
| Stop | Sessao conclui | Conversa CONTINUA | Sessao conclui |
| UserPromptSubmit | stdout ao Claude | BLOQUEIA, apaga prompt | stderr ao user |
| SessionStart | stdout ao Claude | Ignorado | stderr ao user |
🔧 5 Hook Command Types
{"ok": true/false, "reason": "..."}. Schema JSON forcado.📚 Config Sources & Priority
| # | Fonte | Escopo |
|---|---|---|
| 1 | userSettings | Todos os projetos |
| 2 | projectSettings | Todos neste repo |
| 3 | localSettings | Minha maquina + este projeto |
| 4 | policySettings | Enterprise admin (MDM, read-only) |
| 5 | pluginHook | Plugin-installed |
| 6 | sessionHook | Sessao atual (in-memory) |
allowManagedHooksOnly -- quando true em managed settings, APENAS managed hooks rodam. disableAllHooks em policy desabilita TUDO, incluindo managed hooks.
⏱️ Async & asyncRewake
Quando async: true, o hook e lancado mas Claude nao espera. Com asyncRewake: true, o hook roda em background mas o main loop acorda o modelo se o processo sai com code 2.
O registry rastreia hooks pendentes por processId. Quando o main loop faz poll via checkForAsyncHookResponses(), hooks completados sao finalizados.
🛡️ HTTP Hooks Security
Modelo de seguranca em tres camadas:
- URL allowlist --
allowedHttpHookUrlsem settings, glob patterns - Env var allowlist -- apenas variaveis listadas em
allowedEnvVarssao interpoladas em headers - SSRF guard -- bloqueia IPs privados (10.x, 172.16-31.x, 192.168.x, 169.254.x). Loopback (127.x) permitido
🎯 Real-world Patterns
Lint-on-write (PreToolUse)
Exit 2 bloqueia a escrita e informa Claude para reconsiderar.
Session context injection (SessionStart)
stdout no exit 0 e mostrado ao Claude como contexto antes do primeiro prompt.
Stop verification (agent hook)
Sub-agente verifica implementacao inclui testes. Se {"ok": false}, sessao continua.
.envrc auto-load (CwdChanged)
Escreve exports em CLAUDE_ENV_FILE para injetar env vars em BashTool.