1. Qué son los Hooks en Claude Code y por qué los necesitas
Al trabajar con asistentes de IA en la terminal, los desarrolladores a menudo se encuentran repitiendo las mismas instrucciones: "ahora ejecuta ESLint", "formatea el código con Prettier", "comprueba los tipos de TypeScript antes de hacer commit". Aunque definas estas directrices en el archivo CLAUDE.md, los modelos de lenguaje pueden olvidarlas periódicamente o pasarlas por alto para ahorrar tokens.
Los Hooks (ganchos) en Claude Code resuelven este problema desde la raíz: son disparadores deterministas que ejecutan comandos del sistema operativo o scripts en momentos exactos del ciclo de vida del agente.
El principio es simple:
Siempre que Claude ejecuta el evento X → el sistema operativo lanza de forma garantizada la acción Y.
Comparativa de enfoques de automatización
| Característica | Prompts manuales | Reglas en CLAUDE.md | Hooks nativos de Claude Code |
|---|---|---|---|
| Fiabilidad de ejecución | Baja (depende de la memoria humana) | Media (comportamiento probabilístico) | 100% (intercepción determinista de eventos) |
| Consumo de tokens | Alto (consume tokens en cada petición) | Medio (se carga en cada contexto del sistema) | Cero (se ejecuta localmente en la shell) |
| Velocidad de respuesta | Lenta (requiere entrada manual) | Requiere un turno adicional del modelo | Instantánea (invocación directa de proceso) |
| Capacidad de bloqueo | Inexistente | Inexistente | Disponible (código de salida != 0 aborta la acción) |
Los hooks de Claude Code se configuran en formato JSON dentro de .claude/settings.json a nivel de repositorio o globalmente en ~/.claude/settings.json.
2. Ciclo de vida de eventos: PreToolUse, PostToolUse, Notification y Stop
Claude Code expone cuatro puntos de intercepción fundamentales (eventos) a los que vincular comandos automatizados.
Principales eventos interceptables
PreToolUse(Antes del uso de la herramienta): se activa antes de que el agente ejecute una acción. Si el comando del hook devuelve un error (código de salida distinto de 0), la acción se bloquea. Es el lugar idóneo para controles de calidad previos a commits o pushes.PostToolUse(Después del uso de la herramienta): se activa inmediatamente después de que una herramienta finalice con éxito. Es el disparador más habitual para formatear código (Prettier) o pasar linters (ESLint) sobre el archivo modificado.Notification(Notificación del sistema): se ejecuta cuando el asistente necesita avisar al usuario o solicitar autorizaciones de permisos.Stop(Finalización de respuesta): se dispara cuando Claude Code concluye por completo la generación de su respuesta y espera la siguiente intervención del usuario. Se utiliza para reproducir sonidos o enviar notificaciones de escritorio.
Puntos de activación de Hooks en el ciclo de vida3. Estructura de configuración en settings.json y sintaxis de Matcher
La configuración de hooks se almacena en .claude/settings.json. Si este archivo no existe aún en la raíz de tu proyecto, créalo.
Sintaxis básica de configuración
Cómo funciona el campo Matcher:
El campo matcher determina a qué herramienta del agente debe responder el hook correspondiente:
"Edit"— intercepta la modificación de archivos existentes."Write"— se activa al crear un nuevo archivo o sobrescribirlo por completo."Bash"— responde a la ejecución de cualquier comando de consola."Bash(git commit*)"— patrón selectivo que filtra comandos Bash que comiencen porgit commit."*"— comodín universal que responde a cualquier herramienta del asistente.
Los nombres de matcher distinguen entre mayúsculas y minúsculas. Emplea los nombres oficiales de herramientas de Claude Code: Edit, Write, Bash, Glob, Grep.
4. Linting y formateo automatizados (ESLint + Prettier)
El caso de uso más práctico en el día a día es delegar el formateo y la corrección de estilo en herramientas como Prettier y ESLint. De este modo, todo el código nuevo o modificado se guarda con una estructura impecable.
Configuración de PostToolUse para ESLint y Prettier
Explicación de los modificadores de seguridad
"$CLAUDE_FILE_PATH"— variable de entorno dinámica donde Claude inserta la ruta absoluta del archivo que acaba de modificar o crear.2>/dev/null— silencia la salida de errores auxiliares de stderr para mantener limpia la consola.|| true— construcción de shell indispensable. Garantiza que si el linter encuentra un error insalvable (con salida1), el hook devuelva código0y no interrumpa el flujo de trabajo de Claude.
5. Barreras de calidad previas al commit (TypeCheck + Tests)
Mientras que para el formateo usamos hooks permisivos (|| true), para registrar cambios en el control de versiones se requiere una barrera de calidad estricta (Quality Gate).
Mediante PreToolUse, puedes bloquear la ejecución de git commit si existen errores de tipos en TypeScript o fallos en las pruebas unitarias.
Configuración del hook bloqueante de Pre-commit
Secuencia de intercepción de errores
- Claude prepara el comando
git commit -m "...". - Antes de ejecutarlo, el sistema activa
PreToolUse. - Se lanzan las comprobaciones:
npm run typecheckynpm run lint. - Si se detecta un error: el proceso finaliza con código de salida 1.
- Claude Code captura el log de compilación directamente en su contexto.
- En lugar de generar un commit defectuoso, el asistente analiza la traza del error, corrige los tipos en el código y repite el commit limpiamente.
En comprobaciones bloqueantes con PreToolUse, jamás añadas || true. Si lo haces, la verificación siempre se considerará exitosa y anularás la protección.
6. Notificaciones sonoras y de escritorio al finalizar tareas (Stop Hook)
Las refactorizaciones complejas o la ejecución de suites de pruebas pueden demorarse entre 2 y 10 minutos. En lugar de vigilar constantemente la terminal, configura una alerta sobre el evento Stop.
El evento Stop solo se dispara cuando el agente termina por completo la generación de su respuesta final, no entre llamadas intermedias a herramientas.
7. Inyección de contexto mediante variables de entorno
Para que los scripts de automatización sean modulares y conscientes de su contexto, Claude Code exporta automáticamente metadatos en variables de entorno del sistema operativo.
Variables de entorno de Claude Code para hooksReferencia de variables del sistema en Claude Code
| Variable de entorno | Tipo de dato | Descripción y valor de ejemplo |
|---|---|---|
$CLAUDE_FILE_PATH | Ruta absoluta | Ruta al archivo concreto que se está creando o modificando (/Users/dev/project/src/index.ts) |
$CLAUDE_TOOL_NAME | Identificador de texto | Nombre de la herramienta que originó el evento (Edit, Write, Bash) |
$CLAUDE_PROJECT_DIR | Ruta absoluta | Directorio raíz del proyecto donde se inició la sesión de Claude Code |
Creación de un script validador sensible al contexto
Crea un script en .claude/hooks/smart-validator.sh:
Vincula el script dentro de .claude/settings.json:
8. El patrón «CI-in-a-Loop»: retroalimentación inmediata
En el flujo habitual sin hooks se produce una brecha: el asistente modifica diez archivos y al compilar se encuentra con una avalancha de 40 errores de tipos. Descubrir qué cambio exacto rompió la compilación resulta costoso en tiempo y tokens.
CI-in-a-Loop (Bucle estrecho de retroalimentación) transforma este proceso:
Configuración del ciclo continuo de TypeScript
Por qué es indispensable usar head -n 20
Si el compilador devuelve cientos de líneas de log, saturará la ventana de contexto de la IA. Limitar la salida mediante head -n 20 muestra los errores iniciales más críticos, facilitando que el modelo los resuelva al instante sin agotar sus límites.
9. Automatización Headless: modo -p, Cron y Git Hooks
Los hooks pueden combinarse con el modo desatendido (headless) de Claude Code mediante la bandera -p (print/prompt). Esto permite que tareas complejas de desarrollo se ejecuten sin intervención humana.
Script de auditoría nocturna desatendida (nightly-audit.sh)
Programación mediante Cron
Edita la tabla de tareas (crontab -e) para fijar la ejecución cada madrugada a las 03:00:
Verificación automática en Git Hook nativo (.git/hooks/post-merge)
Para analizar incompatibilidades cada vez que se descarguen cambios con git pull:
No olvides conceder permisos de ejecución: chmod +x .git/hooks/post-merge.
10. Buenas prácticas de ingeniería y reglas de seguridad para Hooks
Un hook mal planificado puede provocar bucles infinitos o bloquear la consola. Aplica estas cuatro reglas de higiene técnica.
Cuatro principios para diseñar hooks seguros
-
Rendimiento subsegundo: Los hooks vinculados a
PostToolUsese ejecutan tras cada cambio de archivo. Si tardan más de 1 o 2 segundos, la sesión con Claude resultará lenta e incómoda. Reserva suites pesadas de pruebas E2E paraPreToolUseantes del commit. -
Redirección sistemática a logs: Canaliza siempre la salida de diagnóstico a un archivo temporal:
bash"command": "bash .claude/hooks/check.sh >> /tmp/claude-hooks.log 2>&1 || true"Si una automatización falla silenciosamente,
/tmp/claude-hooks.logmostrará el origen exacto. -
Verificación aislada en la consola: Antes de añadir una instrucción a
settings.json, pruébala directamente en tu shell. Si falla en la terminal, romperá con certeza la sesión de Claude Code. -
Prevención de recursión infinita: Nunca configures en
PostToolUseun script que modifique archivos del proyecto sin exclusiones. Si el script desencadena un nuevoEdit, el agente entrará en un ciclo interminable.
No ejecutes mediante hooks órdenes que requieran interacción por teclado (como preguntas interactivas read -p o sudo solicitando contraseñas), ya que bloquearán el proceso en segundo plano.
11. Taller práctico, chuleta de referencia y lista de verificación final
Para implementar esta automatización en tus proyectos, consulta esta guía rápida de decisiones y la configuración de producción recomendada.
Chuleta de referencia para seleccionar tipos de HooksPlantilla lista para producción de .claude/settings.json
Copia esta plantilla directamente en la carpeta .claude de tu proyecto:
Autoevaluación rápida
1. ¿Cuál es la diferencia técnica clave entre PreToolUse y PostToolUse?
Respuesta:
PreToolUsese ejecuta antes de la herramienta y puede abortar la acción si sale con código no nulo.PostToolUsese ejecuta después del éxito de la operación y se emplea para limpieza o formateo no bloqueante.
2. ¿Por qué se añade || true en los comandos de formateo?
Respuesta: Para evitar que cualquier advertencia o fallo menor del formateador detenga la respuesta del modelo con un código de error.
3. ¿Qué variable de entorno contiene la ruta del archivo recién modificado?
Respuesta: La variable
$CLAUDE_FILE_PATH.
Lista de verificación para desplegar Hooks
- Creada la carpeta
.claude/y el archivosettings.jsonen la raíz del proyecto. - Configurado el formateo automático de archivos mediante
PostToolUse+Prettier. - Añadido el control de calidad
PreToolUsesobreBash(git commit*)contypecheck. - Conectada la notificación auditiva o de escritorio al evento
Stop. - Comprobados todos los comandos en una terminal limpia antes de guardarlos.
- Verificado que ningún comando solicita contraseñas o confirmaciones
[y/N]por consola.