por fin configuré los hooks de Claude Code justo a tiempo para Opus 5, desperdicié meses sin usarlos
Llevo tiempo queriendo escribir esto. Si estás usando Claude Code y alguna vez ha hecho exactamente lo que le dijiste que no hiciera, los hooks lo solucionan, y yo pospuse configurarlos durante meses porque asumí que era un infierno de configuración. No lo es, es un script de shell.
Versión corta de lo que son: Claude Code dispara eventos en puntos fijos de su bucle y puedes adjuntar un script a cualquiera de ellos. El que más importa es PreToolUse, que se ejecuta antes de que ocurra una llamada a herramienta y puede bloquearla. No desalentarla, bloquearla. Tu script recibe el nombre de la herramienta y el comando real por stdin como JSON, y tú decides.
Lo que me hizo entenderlo es que el bloqueo no es silencioso. Cualquier razón que devuelvas entra en el contexto de Claude, para que pueda actuar en consecuencia. El mío devuelve esto cuando detecta npm en un repositorio pnpm:
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "este repositorio se gestiona con pnpm (se encontró pnpm-lock.yaml), vuelve a ejecutar con pnpm"
}
}
y se vuelve a ejecutar con pnpm por sí solo, sin que yo tenga que escribir nada. Si no quieres lidiar con el JSON, simplemente puedes hacer exit 2 e imprimir la razón en stderr, el mismo efecto.
Los que realmente ejecuto:
- secretos: bloquea cualquier comando o escritura de archivo que contenga un patrón de clave API o token
- destructivo:
rm -rf /, force push a main,DROP DATABASE, lo de siempre - gestor de paquetes: lee el archivo de bloqueo, rechaza el incorrecto
- puerta de verificación de tipos: este es un hook
Stopen lugar dePreToolUse. ejecuta tsc cuando el agente piensa que ha terminado y bloquea la entrega si hay errores
El hook Stop es el que más recomendaría ahora mismo, especialmente con la llegada de Opus 5. Como el nuevo modelo va mucho más lejos antes de volver a pedir aprobación, hay un montón de trabajo sin revisar acumulado cuando finalmente se detiene. Hacer que se verifique los tipos primero atrapa una buena cantidad. Una advertencia si construyes uno: un hook Stop que siempre bloquea entrará en bucle para siempre, necesitas que se rinda después de la primera ronda.
Yo subí los míos con la configuración en settings.json, que sinceramente es más enredada que los propios scripts: https://techpotions.com/products/claude-code-hooks MIT, sin registro.
¿Alguien está haciendo algo más inteligente con los hooks Stop? Siento que están infrautilizados en comparación con PreToolUse y apenas los he explorado.
Visto en r/vibecoding