Hooks y automatización
Conecta hooks de SessionStart para cargar contexto automáticamente. Usa PreToolUse para bloquear comandos peligrosos. Ejecuta Claude en cron con puertas de aprobación.
Los hooks son comandos que Claude Code ejecuta en eventos de ciclo de vida específicos. Configúralos una vez en ~/.claude/settings.json; se activan automáticamente. Los hooks imponen una disciplina que de otro modo olvidarías: cargar STATE.md en cada sesión, verificar archivos .env en staging antes de confirmar. El costo de configuración es de 10 minutos. La recompensa es permanente.
SessionStart se dispara en el momento en que se abre una sesión; lo que imprima se convierte en contexto antes de tu primer mensaje:
{
"hooks": {
"SessionStart": [
{
"command": "cat ~/notes/STATE.md ~/notes/MEMORY.md 2>/dev/null || true"
}
]
}
}El || true importa: no rompas el inicio de la sesión si faltan archivos. Mantén los hooks por debajo de 50ms y no hagas llamadas de red al abrir la sesión. ¿Necesitas datos frescos de la API? Ejecuta un cron que escriba un archivo local; carga el archivo en el hook.
Cuatro eventos de hook más:
Stop: se dispara cuando termina una sesión. Úsalo para recordatorios: "Antes de cerrar: actualiza STATE.md."
PreToolUse: se dispara antes de que Claude llame a una herramienta. Tu capa de aplicación de seguridad: bloquea comandos peligrosos, registra llamadas para auditorías. Exit 0 permite la llamada; exit 2 la bloquea.
PostToolUse: se dispara después de que una herramienta regresa. Ejecuta un linter después de escribir un archivo, verifica las políticas RLS después de una migración SQL.
UserPromptSubmit: se dispara cuando presionas enter. Inyecta contexto o aplica defensas de inyección de prompts para contenido externo.
Un hook PreToolUse que bloquea cualquier llamada Bash que contenga rm -rf:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -q 'rm -rf'; then echo 'BLOCKED: rm -rf not allowed' >&2; exit 2; fi"
}
]
}
}El campo matcher apunta a una herramienta específica. Sin él, el hook se dispara en cada llamada a herramienta. Usa matchers para mantener los hooks rápidos y dirigidos.
Cuando un hook no se dispara, verifica en orden:
Sintaxis: ¿JSON válido? Ejecuta cat ~/.claude/settings.json | python3 -m json.tool.
Ruta del archivo: prueba el comando del hook manualmente en tu terminal.
Código de salida: ¿falta || true?
Velocidad: ¿más de 3 segundos? Mueve la parte lenta a un cron.
Dos problemas de producción. Establece un campo timeout explícito en cada hook para que el comportamiento sea predecible. Y los hooks se ejecutan en un entorno limitado, no en tu shell completo: si un hook necesita una variable de entorno (como un token de Slack), carga tu .env explícitamente en el comando del hook. Esta es la causa más común de hooks que funcionan en tu terminal pero fallan silenciosamente en Claude Code.
Claude Code impulsado por Cron. El mismo agente puede ejecutarse en un horario a través de claude --headless: un informe matutino a las 7 AM publicado en Slack, monitoreo de redes sociales cada 4 horas, una verificación de salud de despliegue cada 30 minutos.
El patrón crítico: puertas de aprobación. El cron redacta, tú revisas, el sistema envía. Un agente autónomo que envía mensajes salientes sin revisión eventualmente enviará algo incorrecto: plantilla incorrecta, audiencia incorrecta, momento incorrecto. La arquitectura: el agente descubre y redacta, el humano revisa y libera. Implementación: el agente escribe borradores en un canal de Slack; nada sale hasta que un humano lo aprueba. Esto escala a docenas de agentes sin que ninguno se descontrole.
Construye el sistema de hooks en fases:
Fase 1 (semanas 1-2), hooks de carga: SessionStart carga STATE.md y MEMORY.md; Stop te recuerda actualizar.
Fase 2 (semanas 3-4), hooks de guardia: PreToolUse bloquea comandos irreversibles (force-push a main, DROP TABLE, rm -rf).
Fase 3 (mes 2+), hooks de auditoría: PostToolUse verifica lo que realmente se escribió: migraciones SQL sin políticas RLS, nuevas rutas de API sin limitación de tasa, secretos en cualquier archivo escrito.
PostToolUse es más fuerte que PreToolUse para auditorías porque lee el contenido del archivo escrito, la verdad fundamental, no solo lo que Claude pretendía. Construye hooks alrededor de tus modos de falla reales: dos hooks que resuelven problemas reales son mejores que diez teóricos.
SessionStart carga el contexto, Stop recuerda, PreToolUse bloquea comandos peligrosos (exit 2), PostToolUse audita lo que se escribió, y cron más puertas de aprobación convierte a Claude en un sistema programado con un humano en el botón de enviar. Comienza con un hook: cat ~/notes/STATE.md 2>/dev/null || true en SessionStart. Agrega la siguiente fase cada mes.