Cap 5: Hooks

Por: Artiko
claude-codehookseventosautomatización

Qué son los Hooks

Los hooks son comandos shell, endpoints HTTP o prompts LLM que se ejecutan automáticamente en puntos específicos del ciclo de vida de Claude Code. Permiten automatizar acciones como formateo después de ediciones, linting antes de commits, o bloqueo de comandos peligrosos.

Los 16 eventos

EventoCuándo se dispara
SessionStartAl iniciar o reanudar una sesión
SessionEndAl terminar una sesión
UserPromptSubmitAl enviar un prompt, antes de que Claude lo procese
PreToolUseAntes de ejecutar una herramienta. Puede bloquearla
PostToolUseDespués de que una herramienta se ejecuta exitosamente
PostToolUseFailureDespués de que una herramienta falla
PermissionRequestCuando aparece un diálogo de permisos
NotificationCuando Claude Code envía una notificación
SubagentStartCuando se lanza un sub-agente
SubagentStopCuando un sub-agente termina
StopCuando Claude termina de responder
TeammateIdleCuando un teammate del agent team va a quedar inactivo
TaskCompletedCuando una tarea se marca como completada
ConfigChangeCuando cambia un archivo de configuración
WorktreeCreateCuando se crea un worktree
WorktreeRemoveCuando se elimina un worktree
PreCompactAntes de la compactación de contexto

Configuración

Los hooks se definen en archivos de settings JSON:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": ".claude/hooks/block-rm.sh"
          }
        ]
      }
    ]
  }
}

Tres niveles de anidación

  1. Evento: qué punto del ciclo (PreToolUse, Stop, etc.)
  2. Matcher group: filtro de cuándo se dispara
  3. Hook handler: qué ejecutar cuando coincide

Ubicaciones

UbicaciónAlcance
~/.claude/settings.jsonGlobal
.claude/settings.jsonProyecto (commiteable)
.claude/settings.local.jsonProyecto (local)
Frontmatter de skill/agentDurante uso del componente

Matcher patterns

El campo matcher es un regex que filtra cuándo se dispara el hook:

EventoQué filtra el matcherEjemplos
PreToolUse, PostToolUseNombre de herramientaBash, Edit|Write, mcp__.*
SessionStartCómo inicióstartup, resume, clear
SessionEndPor qué terminóclear, logout, other
NotificationTipo de notificaciónpermission_prompt, idle_prompt
SubagentStart/StopTipo de agenteExplore, Plan, nombres custom
ConfigChangeFuente del cambiouser_settings, project_settings

Eventos sin soporte de matcher (siempre se disparan): UserPromptSubmit, Stop, TeammateIdle, TaskCompleted, WorktreeCreate, WorktreeRemove.

Tipos de hook handler

Command (shell)

{
  "type": "command",
  "command": ".claude/hooks/lint.sh"
}

Recibe JSON en stdin, puede retornar JSON en stdout.

HTTP

{
  "type": "http",
  "url": "https://mi-servidor.com/hooks/pre-tool"
}

Recibe JSON como body del POST.

Prompt (LLM)

{
  "type": "prompt",
  "prompt": "Verifica que el código editado siga las convenciones del proyecto"
}

Ejecuta un prompt LLM como parte del hook.

Exit codes

CódigoSignificado
0Éxito, continuar normalmente
2Error — se muestra al usuario y bloquea la acción
OtroError genérico

JSON de entrada (stdin)

Para PreToolUse:

{
  "session_id": "abc-123",
  "tool_name": "Bash",
  "tool_input": {
    "command": "rm -rf /tmp/build"
  }
}

JSON de salida (stdout)

Para bloquear una herramienta:

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "deny",
    "permissionDecisionReason": "Comando destructivo bloqueado"
  }
}

Ejemplo: Auto-format después de editar

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write \"$CLAUDE_TOOL_INPUT_FILE_PATH\""
          }
        ]
      }
    ]
  }
}

Variables de entorno en hooks

Claude Code expone variables de entorno al contexto del hook:


Siguiente: MCP Servers