Personalización de usuarios avanzados de Claude Code: cómo configurar hooks
Aprender a configurar hooks de Claude Code para automatizar tareas repetitivas, aplicar reglas de proyecto e inyectar contexto dinámico en tus sesiones de programación.
Aprender a configurar hooks de Claude Code para automatizar tareas repetitivas, aplicar reglas de proyecto e inyectar contexto dinámico en tus sesiones de programación.
Incluso un flujo de trabajo de Claude Code fluido acumula puntos de fricción con el tiempo. Cada vez que Claude escribe un archivo, Prettier tiene que ejecutarse manualmente. Cada vez que ejecuta npm test, aparece el mismo mensaje de permiso. Cada sesión comienza pegando el mismo contexto de proyecto predefinido en el primer mensaje.
¿Las buenas noticias? Los hooks eliminan estos puntos de fricción. Actúan como interruptores que puedes configurar para que se activen antes o después de ciertas acciones, lo que te permite inyectar lógica, scripts y comandos personalizados directamente en las operaciones de Claude.
Este artículo cubre la configuración avanzada para desarrolladores que ya estén familiarizados con los conceptos básicos de Claude Code. Al final de este artículo, entenderás los ocho tipos de hooks, cuándo usar cada uno, cómo configurarlos y cómo depurarlos cuando las cosas salen mal.
Entremos en harina.
Un hook es un comando de shell personalizado que creas para ejecutarse automáticamente cuando se produce un evento específico en tu sesión de Claude Code, como cuando Claude está a punto de escribir un archivo o cuando envías un prompt. Puedes designar hooks para una amplia gama de propósitos: interceptar acciones antes de que se ejecuten, inyectar contexto de agente, automatizar aprobaciones o bloquear operaciones antes de que se realicen.
Los hooks se configuran en tus archivos de configuración utilizando una estructura JSON con nombres de eventos, matchers (para filtrar qué herramientas activan el hook) y los comandos que se deben ejecutar. Se ejecutan en tu entorno local con tus permisos de usuario, recibiendo información sobre el evento activador a través de stdin y comunicándose a través de códigos de salida y stdout. Esto te ofrece un control preciso sobre el comportamiento de Claude Code sin modificar la herramienta en sí.
Los hooks resuelven tres categorías de problemas.
Primero, eliminan los pasos manuales repetitivos. En lugar de ejecutar tu formateador después de cada cambio de archivo, un hook PostToolUse lo gestiona automáticamente. En lugar de aprobar npm test por enésima vez, un hook PermissionRequest lo aprueba automáticamente.
En segundo lugar, los hooks aplican reglas específicas del proyecto automáticamente. Puedes bloquear comandos peligrosos antes de que se ejecuten, validar rutas de archivos antes de las escrituras o garantizar que se sigan las convenciones de nomenclatura. Estas barreras de protección se ejecutan cada vez, no solo cuando te acuerdas de revisar.
En tercer lugar, los hooks inyectan contexto dinámico sin esfuerzo manual. Un hook de SessionStart puede proporcionar a Claude tu Estado actual de git y tu lista de TODO. Un hook de UserPromptSubmit puede añadir tus prioridades de sprint a cada solicitud. Claude se mantiene al día sin que tengas que repetirte.
Claude Code proporciona ocho eventos de hook que cubren todo el ciclo de vida de una sesión, desde el inicio, pasando por la ejecución de la herramienta, hasta la finalización. Cada uno se activa en un momento específico, lo que te brinda un control preciso sobre cuándo se ejecuta la automatización. Elegir el hook adecuado depende de lo que quieras conseguir.
Hooks de un vistazo
| Hook | Cuando se activa | Usos comunes |
|---|---|---|
| PreToolUse | Antes de que una herramienta se ejecute | Bloquear comandos peligrosos, validar rutas de archivos, aprobar automáticamente operaciones seguras |
| PermissionRequest | Antes de que aparezca un cuadro de diálogo de permisos | Aprobar automáticamente comandos de prueba, bloquear el acceso a archivos sensibles |
| PostToolUse | Después de que se completa una herramienta | Ejecutar formateadores, activar linters, registrar cambios en archivos |
| PreCompact | Antes de la compactación del contexto | Hacer copias de seguridad de transcripciones, preservar decisiones importantes |
| SessionStart | Cuando una sesión comienza o se reanuda | Inyectar estado de git, cargar listas de TODO, establecer contexto del entorno |
| Detener | Cuando Claude termine de responder | Verificar la finalización de tareas, ejecutar pruebas, generar resúmenes |
| SubagentStop | Cuando un subagente completa | Validar los resultados del subagente, activar acciones de seguimiento |
| UserPromptSubmit | Cuando envías un prompt | Inyectar contexto de sprint, validar solicitudes, añadir contexto dinámico |
Este es el hook más utilizado, se dispara después de que Claude elija una herramienta para usar, pero antes de que la herramienta se ejecute realmente. Tu script puede inspeccionar la acción planificada y aprobarla, bloquearla, solicitar confirmación del usuario o modificar los parámetros, utilizando un matcher para filtrar qué herramientas activan ese hook.
Este ejemplo de hook PreToolUse evalúa las escrituras de archivos antes de ejecutarlas. Claude revisa la acción planificada según los criterios especificados y puede aprobar, bloquear o señalar preocupaciones según la lógica del prompt.
Cuándo usar PreToolUse:
Este hook se activa cuando Claude normalmente mostraría un cuadro de diálogo de permisos. Este gancho intercepta el momento antes de que veas un prompt de confirmación, dejando que tu script decida si permitir, denegar o seguir preguntando al usuario.
Este ejemplo aprueba automáticamente cualquier comando de Bash que empiece por npm test. El patrón de coincidencia puede incluir argumentos para un control más preciso.
Cuándo usar PermissionRequest:
Se activa inmediatamente después de que una herramienta se ejecute con éxito. Tu script recibe información sobre lo que sucedió, incluido el resultado de la herramienta, utilizando matchers para filtrar qué herramientas lo activan.
Este ejemplo de PostToolUse ejecuta Prettier en cualquier archivo que Claude escriba o edite. La sintaxis de canalización en el matcher significa que se activa tanto para las herramientas de escritura como para las de edición.
Cuándo usar PostToolUse:
Se activa antes de que Claude compacte el contexto de la conversación para liberar espacio. La compactación resume partes antiguas de la conversación, lo que significa que algunos detalles se pierden. Este hook te da la oportunidad de preservar información antes de que eso ocurra.
Este ejemplo de PreCompact realiza una copia de seguridad de la transcripción antes de la compactación automática. El matcher puede ser "auto" o "manual" para que puedas distinguir entre compactación automática y eventos de compactación activados por el usuario.
Cuándo usar PreCompact:
Se dispara cuando Claude Code comienza una nueva sesión o reanuda una existente. Todo lo que tu script produzca se añade al contexto de la conversación, por lo que Claude comienza con esa información ya cargada.
Cada sesión comienza con Claude conociendo tu estado actual de git y tu lista de TODO. Stdout se convierte automáticamente en contexto.
Cuándo usar SessionStart:
Se activa cuando Claude termina de responder y normalmente esperaría a tu siguiente entrada. Tu script puede inspeccionar lo que Claude produjo y decidir si la tarea está realmente completa.
El script puede devolver JSON con "continue": true para hacer que Claude siga trabajando, lo que es útil para flujos de trabajo de varios pasos:
Cuándo usar Stop:
Este hook se activa cada vez que un subagente creado a través de la herramienta Task finaliza. Funciona de la misma manera que Stop, pero se activa específicamente cuando un subagente completa su acción (en lugar de cuando lo hace el agente principal). La configuración de SubagentStop refleja la estructura del hook Stop:
Cuándo usar SubagentStop:
Se dispara cuando envías un prompt, antes de que Claude lo procese. Todo lo que tu script envíe a través de stdout se añade al contexto de Claude junto con tu prompt, lo que hace que UserPromptSubmit sea útil para inyectar dinámicamente información que Claude debería considerar.
En este ejemplo, cada vez que envías un prompt, Claude recibe el contenido de tu archivo de contexto de sprint. Esto permite que Claude tenga información actualizada sobre las prioridades actuales sin que tengas que volver a expresarlas.
Cuándo usar UserPromptSubmit:
Los hooks se encuentran en archivos de configuración JSON en tres niveles. Los hooks de nivel de proyecto van en .claude/settings.json dentro de tu repositorio, lo que hace que se puedan compartir con tu equipo. Los hooks de nivel de usuario van en ~/.claude/settings.json y se aplican a todos tus proyectos. Los hooks de proyectos locales van en .claude/settings.local.json para una configuración personal que no desees hacer commit.
La configuración de nivel de proyecto tiene prioridad sobre la configuración de nivel de usuario. También hay configuraciones de políticas gestionadas por la empresa disponibles para el control de la organización. Para obtener información completa, consulta la información de configuración de Claude Code.
Consejo útil: este es el mismo archivo donde puedes configurar permisos granulares para las acciones de Claude, a nivel de proyecto, usuario o local. Por ejemplo, puedes permitir explícitamente a Claude que lea todos los archivos de un directorio para que no tengas que aprobarlo cada vez, o bloquear cualquier modificación de archivos confidenciales.
Los matchers son la forma de filtrar qué herramientas pueden activar tu hook. Solo se aplican a los hooks de PreToolUse, PostToolUse y PermissionRequest.
La coincidencia simple de cadenas funciona exactamente como cabría esperar: "Write" solo coincide con la herramienta Write.
Por ejemplo:
La sintaxis de pipe te permite hacer coincidir múltiples herramientas: "Write|Edit" se activa para cualquiera de los casos, mientras que los comodines coinciden con todo: "*" o una cadena vacía coincide con todas las herramientas.
Nota: los matchers distinguen entre mayúsculas y minúsculas, por lo que "bash" no coincidirá con la herramienta Bash.
Para un control más preciso, los patrones de argumentos como "Bash(npm test*)" pueden coincidir con argumentos de comando específicos. Los patrones de herramientas MCP siguen el formato "mcp__memory__.*" para herramientas de Model Context Protocol.
Todos los hooks reciben JSON a través de stdin que contiene información de la sesión y datos específicos de eventos. Los campos comunes incluyen: session_id, transcript_path, cwd, permission_mode y hook_event_name.
Además, los hooks relacionados con herramientas también reciben tool_name y tool_input. Estos datos permiten que tus scripts tomen decisiones informadas sobre cómo responder.
Los códigos de salida determinan el resultado básico. El código de salida 0 significa éxito y stdout se procesa para JSON o se añade al contexto. El código de salida 2 significa un error de bloqueo: stderr se convierte en el mensaje de error y la acción se impide.
Otros códigos de salida indican errores sin bloqueo, con stderr mostrado en modo detallado.
Además de los códigos de salida, los hooks pueden devolver JSON estructurado para un mayor control. Los campos incluyen: decision (approve, block, allow o deny), reason (explicación mostrada a Claude), continue (para los hooks de Stop para forzar la continuación) y updatedInput (para modificar parámetros de la herramienta antes de la ejecución).
Los hooks tienen acceso a variables de entorno, incluyendo: CLAUDE_PROJECT_DIR para la ruta raíz del proyecto, CLAUDE_CODE_REMOTE, que es true para entornos web, y CLAUDE_ENV_FILE para los hooks de SessionStart para persistir variables. Las variables de entorno estándar de tu shell también son accesibles.
También hay que tener en cuenta: los hooks tienen un tiempo de espera por defecto de 60 segundos, configurable por hook. Cuando varios hooks coinciden con un evento, se ejecutan en paralelo. Los comandos idénticos se deduplican automáticamente.
Los hooks ejecutan comandos de shell arbitrarios con tus permisos de usuario. Claude Code incluye una salvaguarda: las modificaciones directas a archivos de configuración de hooks requieren revisión en el menú /hooks antes de que surtan efecto. Esto evita que código malicioso añada silenciosamente hooks a tu configuración.
Sin embargo, si configuras y apruebas los hooks, estos se ejecutarán con tus niveles de permiso.
Consejo profesional: antes de ejecutar cualquier comando en un entorno, ten en cuenta los riesgos. Si vas a ejecutar comandos con hooks, considera buenas prácticas como: validar y sanear entradas de stdin, entrecomillar variables de shell para evitar inyecciones, usar rutas absolutas para scripts y evitar procesar archivos sensibles como .env o credenciales.
Claude Code registra todo en archivos de transcripción, lo que proporciona visibilidad de las llamadas y respuestas de herramientas sin necesidad de ninguna configuración. Cada hook recibe un campo transcript_path que apunta a un archivo JSONL que contiene el historial completo de la sesión. Puedes usar un hook de SessionStart para registrar dónde se encuentra cada transcripción:
Luego usa tail en esa transcripción para ver a Claude trabajar en tiempo real: tail -f /path/to/transcript.jsonl | jq .
Para la depuración específica de hooks, añade registros a tus scripts de hook. Los archivos de transcripción mostrarán lo que hizo Claude, pero no por qué tu hook realizó la acción para aprobar o bloquear algo.
Con un poco de esfuerzo adicional, puedes añadir un pequeño script de bash que envolverá tus herramientas y registrará la información adicional. Por ejemplo, log-wrapper.sh:
Este pequeño script wrapper captura stdin en una variable, registra la marca de tiempo y el nombre de la herramienta y luego canaliza la entrada a tu herramienta real.
Una vez que tengas escrito log-wrapper.sh, lo antepondrías a la llamada a la herramienta en el hook:
Consejo profesional: para obtener más consejos de depuración, consulta la documentación de depuración de Claude Code.
Empieza con un simple hook que resuelva un punto de fricción real en tu flujo de trabajo. El hook de formato PostToolUse es una buena primera opción, ya que el feedback es inmediato y visible. Una vez que eso funcione, amplía según lo que aprendas.
Para obtener documentación de referencia completa, incluidos todos los campos disponibles y patrones avanzados, consulta la documentación oficial de hooks.
Los hooks te permiten dar forma a Claude Code para que se adapte a tu flujo de trabajo, en lugar de adaptar tu flujo de trabajo a la herramienta. Cuando inviertes en configurar los hooks, cada sesión da sus frutos.
Empieza a usar hooks para personalizar tus flujos de trabajo de Claude Code hoy mismo.
Recibir el boletín para desarrolladores
Actualizaciones de productos, guías prácticas, aspectos destacados de la comunidad y más. Enviado mensualmente a tu bandeja de entrada.