MODULO 5.8

🪝 Hooks System

Injete side effects em pontos precisos do lifecycle do Claude Code -- 27 eventos, 5 tipos de comando, 6 fontes de configuracao e um modelo de seguranca em 3 camadas.

7
Topicos
~90
Minutos
Deep
Nivel
Source
Tipo
1

📋 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

2

🚦 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.

EventoExit 0Exit 2Outro
PreToolUseSilencioso, tool prossegueTool BLOQUEADAstderr ao user
PostToolUsestdout em transcriptstderr ao modelostderr ao user
StopSessao concluiConversa CONTINUASessao conclui
UserPromptSubmitstdout ao ClaudeBLOQUEIA, apaga promptstderr ao user
SessionStartstdout ao ClaudeIgnoradostderr ao user
3

🔧 5 Hook Command Types

command -- Shell subprocess. Recebe hook input como JSON no stdin. Opcoes: if, timeout, once, async, asyncRewake, shell.
prompt -- Chamada LLM unica. Modelo responde com {"ok": true/false, "reason": "..."}. Schema JSON forcado.
agent -- Sub-agente multi-turn (ate 50 turns) com acesso a todas as tools. Retorna via StructuredOutput tool.
http -- POST JSON para URL. Headers com interpolacao de env vars. SSRF guard bloqueia IPs privados.
function -- TypeScript callback in-process. Session-only, nao persistivel. Usado internamente.
4

📚 Config Sources & Priority

#FonteEscopo
1userSettingsTodos os projetos
2projectSettingsTodos neste repo
3localSettingsMinha maquina + este projeto
4policySettingsEnterprise admin (MDM, read-only)
5pluginHookPlugin-installed
6sessionHookSessao atual (in-memory)

allowManagedHooksOnly -- quando true em managed settings, APENAS managed hooks rodam. disableAllHooks em policy desabilita TUDO, incluindo managed hooks.

5

⏱️ 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.

6

🛡️ HTTP Hooks Security

Modelo de seguranca em tres camadas:

  1. URL allowlist -- allowedHttpHookUrls em settings, glob patterns
  2. Env var allowlist -- apenas variaveis listadas em allowedEnvVars sao interpoladas em headers
  3. SSRF guard -- bloqueia IPs privados (10.x, 172.16-31.x, 192.168.x, 169.254.x). Loopback (127.x) permitido
7

🎯 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.

📋 Resumo do Modulo

27 hook events definidos em HOOK_EVENTS. Exit code 2 e o universal "block and tell the model"
5 tipos formam hierarquia de poder vs simplicidade: command -> prompt -> agent -> http -> function
6 fontes de config, um merge. Policy tem poderes especiais: allowManagedHooksOnly e disableAllHooks
HTTP hooks tem seguranca em 3 camadas: URL allowlist, env var allowlist e SSRF guard
asyncRewake permite que hooks background interrompam a proxima resposta do modelo via exit code 2
Modulo Anterior Proximo Modulo