Eventos de hooks de Claude Code
La referencia enumera más de treinta eventos. Estos son los que usa la mayoría de los hooks; un matcher limita un hook a ciertas herramientas, archivos u orígenes.
| Evento | Cuándo se dispara | Uso habitual |
|---|---|---|
SessionStart | Una sesión empieza o se reanuda | Cargar contexto, comprobar el entorno |
UserPromptSubmit | Envías un prompt, antes de que Claude lo vea | Añadir contexto, bloquear prompts sensibles |
PreToolUse | Antes de que se ejecute una llamada a herramienta; puede bloquearla | Bloquear comandos peligrosos, proteger archivos |
PermissionRequest | Una llamada a herramienta necesita una decisión de permisos | Aprobar o denegar automáticamente ciertas solicitudes |
PostToolUse | Después de que una llamada a herramienta termina bien | Formatear, pasar el linter o probar los archivos editados |
Notification | Claude Code envía una notificación | Alertas de escritorio cuando Claude te necesita |
SubagentStart, SubagentStop | Un subagente empieza o termina | Registrar o revisar el trabajo delegado |
Stop | Claude termina de responder | Comprobar que la tarea está realmente terminada |
PreCompact, PostCompact | Alrededor de la compactación del contexto | Guardar o reinyectar el contexto clave |
FileChanged, CwdChanged | Cambia un archivo vigilado o el directorio de trabajo | Recargar el entorno, reformatear archivos |
SessionEnd | La sesión termina | Limpiar, escribir un registro |
Dónde poner los hooks
| Ubicación | Alcance | Compartido |
|---|---|---|
~/.claude/settings.json | Todos tus proyectos | No |
.claude/settings.json | Un proyecto | Sí, haz commit |
.claude/settings.local.json | Un proyecto | No, está en el gitignore |
| Configuración de políticas administradas | Toda la organización | Controlado por el administrador |
hooks/hooks.json de un plugin | Mientras el plugin está activado | Sí, con el plugin |
| Frontmatter de una skill o un subagente | Una vez invocada la skill, o mientras se ejecuta el subagente | Sí, en el archivo |
Ejemplos de hooks de Claude Code, paso a paso
Añade cada bloque bajo la clave hooks de un archivo de configuración; si el archivo ya tiene un objeto hooks, añade el evento como una clave hermana en lugar de reemplazarlo. Ejecuta /hooks para confirmar que Claude Code lo cargó. También puedes pedirle a Claude que escriba el hook por ti.
Recibe una notificación de escritorio cuando Claude te necesite
Un hook
Notificationen~/.claude/settings.json. Este usaosascripten macOS; usanotify-senden Linux o PowerShell en Windows.{ "hooks": { "Notification": [ { "matcher": "", "hooks": [ { "type": "command", "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'" } ] } ] } }Formatea automáticamente cada archivo que edite Claude
Un hook
PostToolUsecon el matcherEdit|Writelee la ruta editada del JSON recibido por stdin conjqy ejecuta Prettier sobre ella. Ponlo en.claude/settings.jsonpara que lo comparta todo el equipo.{ "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" } ] } ] } }Bloquea un comando peligroso
Un hook
PreToolUsesobreBashejecuta este script. El código de salida 2 bloquea la llamada, y lo que escribas en stderr se convierte en el feedback para Claude, que así puede cambiar de rumbo. Salir con 0 significa que no hay decisión, así que se siguen aplicando los permisos normales.#!/bin/bash # .claude/hooks/block-drop-table.sh, se ejecuta como hook PreToolUse sobre Bash INPUT=$(cat) COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command') if echo "$COMMAND" | grep -q "drop table"; then echo "Blocked: dropping tables is not allowed" >&2 # se convierte en el feedback para Claude exit 2 # 2 = bloquear la acción fi exit 0 # sin decisión: se aplica el flujo normal de permisosMantén a Claude trabajando hasta terminar la tarea
Un hook
Stopde tipopromptle pregunta a un modelo si todo está terminado. Si respondeok: false, Claude sigue trabajando con elreasoncomo su siguiente instrucción. Es el ejemplo clásico de hook Stop.{ "hooks": { "Stop": [ { "hooks": [ { "type": "prompt", "prompt": "Check if all tasks are complete. If not, respond with {\"ok\": false, \"reason\": \"what remains to be done\"}." } ] } ] } }
Fuente: documentación de Claude Code, Automate actions with hooks
Cómo deciden los hooks lo que pasa
- Entrada: cada hook recibe el evento como JSON por stdin, por ejemplo el nombre de la herramienta y
tool_input, el ID de sesión ycwd. - Salida 0: sin objeciones. En algunos eventos, como
SessionStartyUserPromptSubmit, el stdout en texto plano se añade al contexto de Claude. - Salida 2: bloquear, cuando el evento lo permite. El stderr vuelve a Claude o a ti, según el evento.
- JSON por stdout: control más fino, como
hookSpecificOutputcon una decisión de permisos,updatedInputpara reescribir la entrada de una herramienta, oadditionalContext. - Otros códigos de salida: normalmente un error que no bloquea, salvo que el hook defina
onFailure: "block". - Los hooks que coinciden con un mismo evento se ejecutan en paralelo.
Hooks de tipo command, prompt, agent y HTTP
| Tipo | Qué se ejecuta | Tiempo límite por defecto |
|---|---|---|
command | Un comando de shell | 10 minutos |
http | Un POST del JSON del evento a una URL; el cuerpo de la respuesta funciona como la salida de un comando | 10 minutos |
mcp_tool | Una herramienta de un servidor MCP configurado | 10 minutos |
prompt | Una única llamada al modelo que responde ok o no | 30 segundos |
agent | Un subagente que puede leer archivos y ejecutar herramientas antes de decidir (experimental) | 60 segundos |
Hooks vs. skills vs. CLAUDE.md, y otros detalles a tener en cuenta
- CLAUDE.md y las skills son instrucciones que Claude suele seguir; los hooks se ejecutan siempre. Pon en un hook todo lo que nunca deba saltarse.
PostToolUseno puede deshacer una acción que ya se ejecutó; usaPreToolUsepara impedirla.Stopse dispara cada vez que Claude termina una respuesta, no solo al final de una tarea, y no cuando el usuario la interrumpe.- Los hooks no pueden ejecutar slash commands ni llamar a herramientas por sí mismos; solo responden mediante códigos de salida, stdout, stderr o JSON.
"disableAllHooks": truedesactiva los hooks; los hooks administrados se siguen ejecutando salvo que la configuración administrada también los desactive.- Los hooks son locales a tu configuración de Claude Code. Las comprobaciones a nivel de organización en todos los productos de Claude son otra función: los inference hooks de Claude.
- Un hook PreToolUse que filtra la salida de los tests es también una de las mejores formas de reducir el uso de tokens.
Los hooks mantienen a Claude Code a raya. Crewmark lo mantiene trabajando.
Los hooks son lo que hace seguro a un agente sin supervisión: el formateo, los tests y las protecciones se ejecutan siempre. Crewmark convierte una sesión de Claude Code, Codex, DeepSeek Harness u OpenCode en un empleado de IA con un rol, un objetivo y un horario, y la despierta con un heartbeat para que tome la siguiente issue de un tablero, con los hooks de tu proyecto en su sitio.
Haz commit de tus hooks
Los hooks de
.claude/settings.jsonse cargan en la sesión del empleado igual que en la tuya, así que sus ediciones se formatean y sus comandos arriesgados se bloquean.Deja que el heartbeat inicie el trabajo
Durante su horario, el empleado se despierta cada 15, 30 o 60 minutos en la misma conversación; consulta cómo hacer que Claude Code sea proactivo.
Responde solo a lo que te necesita
Comenta en sus issues y te escribe cuando necesita una decisión. Lee qué es un empleado de IA.
Preguntas frecuentes sobre los hooks de Claude Code
¿Qué son los hooks de Claude Code?
Comandos, llamadas HTTP o comprobaciones con un modelo, definidos por el usuario, que Claude Code ejecuta automáticamente en eventos del ciclo de vida, como antes de que se ejecute una herramienta o cuando Claude termina. Dan un control determinista en lugar de depender de que Claude recuerde una instrucción.
¿Dónde se configuran los hooks de Claude Code?
Bajo hooks en ~/.claude/settings.json (todos los proyectos), .claude/settings.json (compartido con el equipo) o .claude/settings.local.json (solo para ti). Los plugins, las skills y los subagentes también pueden incluir hooks. Ejecuta /hooks para ver cuáles están cargados.
¿Cómo bloqueo un comando con un hook?
Usa un hook PreToolUse con el matcher Bash. Lee el comando del JSON recibido por stdin y sal con el código 2 y un motivo en stderr para bloquearlo; Claude ve el motivo y se ajusta.
¿Qué es un hook Stop?
Un hook en el evento Stop, que se dispara cuando Claude termina de responder. Un hook Stop de tipo prompt puede comprobar si la tarea está completa y, si no lo está, devolver a Claude al trabajo con un motivo.
Hooks vs. skills: ¿cuál es la diferencia?
Las skills son instrucciones y archivos que Claude carga cuando son relevantes y que suele seguir. Los hooks son código que Claude Code ejecuta cada vez que se dispara un evento, decida lo que decida Claude.
¿Por qué no se dispara mi hook?
Comprueba que aparece en /hooks, que el nombre del evento y el matcher están escritos exactamente igual, que el script es ejecutable y que la salida del perfil de tu shell no está corrompiendo su JSON. Inicia Claude Code con un registro de depuración para ver qué hizo cada hook.
¿Los hooks de Claude Code son lo mismo que los inference hooks?
No. Los hooks de Claude Code se ejecutan en tu máquina para tus sesiones. Los inference hooks son una función de Claude Enterprise que envía cada prompt de la organización a un servidor de seguridad antes de que Claude se ejecute.
Comprobado con la documentación de Claude Code (guía de hooks y referencia de hooks) el 6 de noviembre de 2026.