Ir al contenido
angel.library

Hooks — automatizar en eventos del ciclo de vida

.claude/settings.json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "npx prettier --write \"$CLAUDE_FILE_PATH\""
}
]
}
]
}
}
EventoCuá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": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [{ "type": "command", "command": "scripts/bloquear-rm-rf.sh" }]
}
]
}
}
scripts/bloquear-rm-rf.sh
#!/bin/bash
input=$(cat)
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"}'
exit 0
fi
exit 0

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 handlerQué 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.