"command" : " npx prettier --write \" $CLAUDE_FILE_PATH \" "
Evento Cuándo corre SessionStartAl arrancar una sesión UserPromptSubmitJusto antes de mandar tu prompt al modelo PreToolUseAntes de que una herramienta se ejecute (puede bloquearla) PostToolUseDespués de que una herramienta terminó StopCuando Claude termina de responder SubagentStart / SubagentStopAl arrancar/terminar un subagente
"hooks" : [{ "type" : " command " , "command" : " scripts/bloquear-rm-rf.sh " }]
command = $( echo " $input " | jq -r ' .tool_input.command ' )
if echo " $command " | grep -qE ' rm -rf / ' ; then
echo ' {"permissionDecision": "deny", "systemMessage": "rm -rf / bloqueado por hook"} '
El hook recibe JSON por stdin (tool_input, etc.) y puede devolver JSON por stdout con permissionDecision: allow/deny/ask para controlar si la herramienta sigue.
Tipo de handler Qué ejecuta commandUn shell script httpPOST a una URL mcp_toolInvoca una tool de un servidor MCP promptEvaluación de un turno con el modelo agentDispara un subagente (experimental)
Exit code 0 = éxito; 2 = bloqueante (en eventos que lo soportan); cualquier otro = error no bloqueante.
.claude/settings.json (se commitea) vs .claude/settings.local.json (gitignored) — hooks de equipo van en el primero, hooks personales en el segundo.
/hooks dentro de Claude Code muestra todos los hooks configurados actualmente.