Los hooks ejecutan comandos de shell en puntos fijos de una sesión: después de escribir un archivo, antes de ejecutar una herramienta, al terminar un turno. Son la única parte de la configuración que ejecuta código sin pedir permiso cada vez, lo que hace que valga la pena cazar sus fallos silenciosos. Un matcher que nombra una herramienta inexistente no se activa jamás y tampoco protesta. Un comando que busca un argumento recibe una cadena vacía, porque el evento llega por la entrada estándar como JSON y no como argumentos. Y solo algunos eventos pueden detener de verdad lo que iba a pasar. Este creador cubre los tres casos y dice qué eventos bloquean y cuáles solo observan.
Características
Cada evento listado con aquello que lo dispara
Matchers comprobados contra nombres reales, distinguiendo mayúsculas
Avisa cuando se pone un matcher en un evento sin herramienta
Avisa cuando un comando busca argumentos que nunca recibirá
Indica qué eventos pueden bloquear una acción, y cómo
Patrones de matcher habituales como atajos de un clic
Varios hooks agrupados correctamente por evento y matcher
Señala un comando destructivo antes de que corra sin supervisión
Cómo usar Constructor de hooks
Elige el evento en el que quieres actuar
Añade un matcher si el evento es específico de una herramienta
Escribe el comando leyendo la carga por la entrada estándar
Lee los avisos y fusiona la salida en settings.json
Ejemplo
Entrada
prettier --write "$1"
Salida
Warning: $1 will be empty — a hook is not given arguments
El evento llega como JSON por tubería; léelo con jq.
Errores comunes y solución de problemas
El hook nunca se ejecuta. — Casi siempre el matcher. Los nombres van capitalizados y distinguen mayúsculas —Write, no write— y un nombre inexistente no coincide con nada, en silencio.
El comando corre pero no recibe entrada. — La entrada del hook llega como JSON por la entrada estándar. Léela con algo como jq -r '.tool_input.file_path' en vez de esperar un argumento.
Mi hook no puede detener la llamada. — Solo algunos eventos pueden, y solo saliendo con estado 2. Cualquier otra cosa se interpreta como «continúa», y eventos como PostToolUse se disparan después de todos modos.
La sesión se queda colgada en mi hook. — Pon un tiempo límite. Un hook que espera por algo —una llamada de red, un bloqueo— retiene la sesión entera mientras lo hace.
Preguntas frecuentes
¿Qué evento uso para un formateador?
PostToolUse con un matcher para las herramientas de escritura, para que corra cuando el archivo ya existe. Formatear antes de escribir no tiene nada que formatear.
¿Cómo recibe el hook el evento?
Como JSON por la entrada estándar: el nombre de la herramienta, su entrada y el contexto alrededor. Nada llega como argumento de línea de órdenes, y por eso un comando escrito alrededor de $1 no recibe nada.
¿Un hook puede impedir que una herramienta se ejecute?
Antes de que se ejecute, sí: salir con estado 2 la bloquea. Qué eventos lo permiten se indica al elegirlos, porque intentar bloquear desde un evento que se dispara después es un error tan común como desconcertante.
¿Los hooks corren sin preguntar?
Sí, ese es su sentido y la razón de leer cualquier hook con cuidado antes de añadirlo. Aquí se señala uno que borre archivos, pero la regla general es que todo lo de este archivo corre sin supervisión.
¿Puedo tener varios hooks en un evento?
Sí. Los que comparten evento y matcher se agrupan en la salida, que es la forma que espera el archivo de configuración.