¿Qué son OpenClaw Hooks? (Y por qué cambian la forma de trabajar con los agentes de IA)
Si alguna vez ha visto a un agente de IA sobrescribir un archivo que no debería tocar, o ha deseado que ejecute su conjunto de pruebas automáticamente después de cada cambio de código, los ganchos OpenClaw son la respuesta. Le permiten interceptar, reaccionar y controlar el comportamiento de los agentes precisamente en los momentos que importan.
Hooks son pequeños scripts controlados por eventos que se ejecutan dentro de OpenClaw Gateway en puntos específicos del ciclo de vida de un agente. Piense en ellos como middleware para su agente de IA: se ubican entre el agente y las herramientas que llama, brindándole una capa de intercepción programable.
Hay dos tipos distintos:
- Internal hooks - scripts que se ejecutan adentro el proceso de puerta de enlace en sí. Tienen acceso directo al estado de la sesión, los metadatos de llamadas a herramientas y el contexto de trabajo del agente. Cero sobrecarga de red.
- Webhooks — Devoluciones de llamada HTTP que se activan a un punto final externo cuando ocurre un evento del ciclo de vida. La puerta de enlace envía una solicitud POST; su servidor maneja la lógica.
La diferencia práctica: los ganchos internos sirven para barandillas y automatización local rápidas y sincrónicas. Webhooks son para cualquier cosa que deba llegar fuera de su máquina: notificaciones Slack, sistemas CI, plataformas de registro.
Internal Hooks frente a Webhooks: ¿cuál necesita?
| Factor | Gancho interno | gancho web |
|---|---|---|
| Execution location | Inside the Gateway process | External HTTP server |
| Latency | Near-zero (synchronous) | Network round-trip |
| Session state access | Direct | Serialized payload only |
| Lo mejor para | File guards, auto-formatting, local scripts | Slack alerts, audit logging, external APIs |
| Complejidad de configuración | Low: solo un directorio + archivo controlador | Medium: requiere un punto final HTTP en ejecución |
| Blocking agent execution | Yes (PreToolUse hooks can abort) | Typically async/non-blocking |
Decision rule: Si tu gancho necesita prevenir una acción o leer datos de sesión local, utilice un gancho interno. Si es necesario notificar a un sistema externo y no necesita bloquear al agente, use un webhook.
Cómo funciona el descubrimiento de ganchos OpenClaw
La puerta de enlace utiliza escaneo automático de directorios para descubrir ganchos. Al iniciarse, escanea los directorios de enlaces configurados y carga cualquier paquete de enlaces válido que encuentre.
Dos requisitos previos importantes antes de que se activen los ganchos:
- Hooks debe ser habilitado explícitamente — un directorio de enlace por sí solo no es suficiente
- Al menos se debe configurar una entrada de gancho en la configuración de tu puerta de enlace
Este es un punto de confusión común. Puede tener un enlace perfectamente escrito en el directorio correcto, pero si no se le ha dicho al Gateway que active los enlaces, los ignora silenciosamente.
Cada paquete de gancho requiere exactamente dos archivos:
HOOK.md— archivo de metadatos que declara el nombre, la versión, la descripción, las suscripciones a eventos del ciclo de vida y los permisos necesarios del ganchohandler.ts(ohandler.js): el archivo de implementación que contiene la lógica real que se ejecuta cuando se activa el evento.
El archivo HOOK.md es lo que la puerta de enlace lee primero durante el descubrimiento. Si tiene un formato incorrecto o faltan campos obligatorios, el enlace no se cargará; no hay error, solo silencio. Esta es la causa más común de los informes "mi gancho no funciona".
Los cuatro eventos del ciclo de vida que todo desarrollador debería conocer
| Evento | cuando dispara | uso común |
|---|---|---|
| PreToolUse | Antes el agente llama a cualquier herramienta | Block dangerous operations, validate inputs |
| PostToolUse | Después se completa una llamada de herramienta | Código de formato Run tests,, resultados de registro |
| Stop | Cuando finaliza la sesión del agente | Send notifications, flush logs, cleanup |
| SessionStart | Cuando comienza una nueva sesión de agente | Load context, set guardrails, warm up state |
PreToolUse es el más poderoso: es el único evento que puede abortar una llamada a la herramienta antes de que se ejecute. Si su gancho devuelve una señal de rechazo durante PreToolUse, el agente nunca llama a la herramienta.
PostToolUse es el caballo de batalla para la automatización. ¿Archivo escrito? Ejecute su linter. ¿Prueba modificada? Ejecute la suite. ¿Código comprometido? Activa una construcción.
Step-by-Step: escribiendo su primer gancho personalizado desde cero
La mayoría de la documentación muestra comandos. Esto le muestra el camino completo desde la nada hasta un gancho que funciona.
Goal: Ejecute automáticamente ESLint después de cada escritura de archivo.
Step 1: crea el directorio de enlace
mkdir -p .OpenClaw/hooks/auto-lint
Step 2: escribe los metadatos HOOK.md
# auto-lint
**Version:** 1.0.0
**Event:** PostToolUse
**Description:** Runs ESLint on any file written by the agent
**Tools:** write_file, edit_file
El campo Tools limita su enlace a llamadas de herramientas específicas. Sin él, el gancho sigue disparando. cada Evento PostToolUse: normalmente no es lo que desea.
Step 3: implementar handler.ts
import { PostToolUseEvent } from "@OpenClaw/sdk";
import { execSync } from "child_process";
export default function handler(event: PostToolUseEvent) {
const filePath = event.toolResult?.path;
if (!filePath) return;
try {
execSync(`npx eslint --fix "${filePath}"`, { stdio: "inherit" });
} catch (err) {
console.error(`[auto-lint] ESLint failed on ${filePath}`);
}
}
Step 4: habilitar mediante CLI
OpenClaw hooks enable auto-lint
Step 5: verifica que esté cargado
OpenClaw hooks list
Deberías ver auto-lint con estado enabled. Inicie una sesión, escriba un archivo y observe cómo se activa el linter.
JavaScript frente a TypeScript para manipuladores de ganchos: qué elegir en 2026
El SDK se envía con tipificaciones TypeScript completas y, a partir de las versiones del SDK de 2026, TypeScript es el valor predeterminado recomendado para ganchos nuevos.
| Factor | TypeScript | JavaScript |
|---|---|---|
| Type safety | Full: se escriben formas de eventos | None: sorpresas en tiempo de ejecución |
| Compilation step | Required (tsc or esbuild) | None |
| SDK compatibility | First-class support | Supported but no autocomplete |
| Lo mejor para | Any hook that will be maintained or shared | Guiones rápidos y únicos |
Si está escribiendo un enlace que se comprometerá con el control de versiones o lo compartirá con un equipo, use TypeScript. Para una barandilla local desechable, JavaScript simple está bien; simplemente asígnele el nombre handler.js y omita el paso de compilación.
OpenClaw Hooks CLI Reference
| Dominio | Flags | que hace |
|---|---|---|
| lista de anzuelos OpenClaw | --json |
Lists all discovered hooks and their status |
| ganchos de garra abierta inspeccionan |
— | Muestra metadatos completos de HOOK.md + configuración actual |
| Los ganchos OpenClaw habilitan |
— | Activates a hook para el proyecto actual |
| Los ganchos OpenClaw desactivan |
— | Deactivates without removing |
| instalación de ganchos OpenClaw |
--yes, --dry-run |
Installs a hook pack from registry |
| actualización de ganchos OpenClaw | --all, --dry-run |
Updates installed hook packs |
Managing Hook Packs: instalación, actualización y flujo de trabajo --dry-run
Los paquetes de ganchos agrupan varios ganchos relacionados como una única unidad instalable. El flujo de trabajo de instalación verifica una hash de integridad antes de escribir algo en el disco.
# Preview what would be installed without committing
OpenClaw hooks install productivity-pack --dry-run
# Install non-interactively (for CI environments)
OpenClaw hooks install productivity-pack --yes
# Update all installed packs
OpenClaw hooks update --all
La bandera --dry-run está infrautilizada. Ejecútelo antes de cualquier install o update para ver exactamente qué archivos cambiarían. En las canalizaciones de CI, empareje --yes con --dry-run en un paso de validación separado antes de la instalación real.
Bundled Hooks Reference: Qué se envía con OpenClaw
| Gancho | Estado predeterminado | que hace | Mejor usado cuando |
|---|---|---|---|
| memoria de sesión | Enabled | Persists key context across sessions | Long-running projects with recurring tasks |
| additional bundled hooks vary by Gateway version | — | Ejecute OpenClaw hooks list --builtin para ver el suyo |
— |
Ejecute OpenClaw hooks inspect session-memory para ver sus opciones de configuración completas. La mayoría de los ganchos incluidos se envían con valores predeterminados razonables, pero exponen los campos de configuración para su personalización.
Casos de uso de ganchos del mundo real (con ejemplos prácticos)
1. File Protection Guardrail (PreToolUse)
Evite que el agente toque su archivo .env:
import { PreToolUseEvent } from "@OpenClaw/sdk";
export default function handler(event: PreToolUseEvent) {
const target = event.toolInput?.path ?? "";
if (target.includes(".env")) {
return { abort: true, reason: "Modification of .env files is blocked by policy." };
}
}
Coloque esto en .OpenClaw/hooks/protect-env/ con el HOOK.md correspondiente suscribiéndose a PreToolUse con alcance a write_file y edit_file. El agente recibe el motivo del rechazo en su contexto y no volverá a intentarlo.
2. Slack Notification on Session Stop
import { StopEvent } from "@OpenClaw/sdk";
export default async function handler(event: StopEvent) {
await fetch(process.env.SLACK_WEBHOOK_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: `OpenClaw session ended. Files modified: ${event.session.filesModified ?? 0}`
})
});
}
Suscríbase a este enlace al evento Stop. Cada final de sesión activa un mensaje Slack con un resumen. No se necesita un servidor externo: el proceso de puerta de enlace realiza la solicitud de salida directamente.
3. Auto-Format + Test on PostToolUse
import { PostToolUseEvent } from "@OpenClaw/sdk";
import { execSync } from "child_process";
export default function handler(event: PostToolUseEvent) {
const file = event.toolResult?.path;
if (!file?.endsWith(".ts")) return;
execSync(`prettier --write "${file}"`);
execSync("npm test -- --passWithNoTests", { stdio: "inherit" });
}
Esto se activa después de cada escritura de archivo TypeScript, lo formatea y luego ejecuta su conjunto de pruebas. Lento en proyectos grandes: alcance un alcance estricto utilizando el campo Tools en HOOK.md.
Hooks para equipos: aplicación de barreras de seguridad en un proyecto compartido
Confirme su directorio .OpenClaw/hooks/ al control de versiones. Cada desarrollador que clona el repositorio automáticamente tiene la misma configuración de enlace.
- Bloquee los enlaces críticos a
enableden la configuración del proyecto — evita que los compañeros de equipo desactiven accidentalmente los protectores de archivos - Utilice descripciones
HOOK.mdpara documentar la intención — trátelos como comentarios de código, los compañeros de equipo los leerán - Scope hooks to tool-level granularity — Los ganchos amplios ralentizan todas las interacciones de los agentes, creando fricción que hace que los compañeros de equipo los desactiven.
- En monorepos, los enlaces en un directorio principal se aplican a todos los proyectos anidados a menos que se anulen en el nivel del subdirectorio.
CI/CD Integration: ejecución de OpenClaw Hooks de forma no interactiva
En acciones GitHub o en cualquier entorno sin cabeza, el mensaje de confirmación interactivo bloqueará su canalización. Utilice --yes para omitirlo:
- name: Install hooks non-interactively
run: OpenClaw hooks install qa-pack --yes
- name: Run OpenClaw session
env:
OpenClaw_HOOKS_ENABLED: "true"
SLACK_WEBHOOK_URL: secrets.SLACK_WEBHOOK_URL
run: OpenClaw run --task "audit dependencies" --yes
Establezca OpenClaw_HOOKS_ENABLED=true como variable de entorno para activar enlaces sin confirmación interactiva. Esto anula el requisito de "al menos una entrada configurada" en el modo CI.
Hook Security: Qué se ejecuta, a qué puede acceder y cómo mantenerse seguro
Esta es la parte que la mayoría de la documentación omite por completo, y es la sección más importante si estás instalando paquetes de enlaces comunitarios.
A qué ganchos puede acceder: Los scripts de gancho heredan el permisos completos del proceso Gateway. Si Gateway se ejecuta como su cuenta de usuario, sus enlaces pueden leer cualquier archivo que esa cuenta pueda leer, realizar solicitudes de red, ejecutar subprocesos y acceder a variables de entorno, incluidos los secretos.
El riesgo de paquetes de anzuelos no revisados: Un paquete de enlaces maliciosos podría filtrar su .env, sus claves SSH o sus tokens API, todo mientras parece hacer algo benigno como "formatear código".
Hook Pack Audit Checklist
Ejecute esto antes de instalar cualquier paquete de terceros:
- ☐Lea el
HOOK.mdcompleto: ¿los permisos declarados coinciden con el propósito declarado? - ☐Lea cada línea de
handler.ts/js; busque el accesofetch(),execSync,process.env - ☐Verifique la procedencia de npm si el paquete está distribuido por el registro (
npm info <pack> --json | grep provenance) - ☐Verifique la identidad del editor: ¿es un mantenedor conocido o una cuenta nueva?
- ☐Ejecute
--dry-runprimero y revise el manifiesto del archivo. - ☐Nunca instale paquetes de ganchos con
--yessin completar primero los pasos anteriores
El comando OpenClaw hooks inspect le muestra la ruta de origen completa de un enlace instalado; utilícelo para volver a revisar el código del controlador después de las actualizaciones.
Troubleshooting OpenClaw Hooks — Cuando no disparan
Hook not discovered at all
- Verifique que el directorio esté dentro de una ruta de enlace escaneada:
OpenClaw hooks list --verbose - Confirme que
HOOK.mdexiste y es válido: faltan campos obligatorios y omita el enlace silenciosamente - Verifique que los enlaces estén habilitados globalmente y que al menos una entrada esté configurada
Hook discovered but not firing
- Ejecute
OpenClaw hooks inspect <name>: verifique que el campoEventenHOOK.mdcoincida con el evento del ciclo de vida que espera - Verifique el alcance de
Tools: si su alcance eswrite_filepero el agente está llamando acreate_file, el enlace no se activará - Confirme que el estado del enlace muestra
enabled, noloaded(cargado significa descubierto pero no activo)
Hook fires but handler errors are silent
- Agregue bloques
try/catchexplícitos conconsole.erroriniciando sesión en su controlador - Los registros de la puerta de enlace se escriben en
~/.OpenClaw/logs/; verifique el registro de sesión más reciente para ver si hay líneas con prefijo[hook] - Utilice
OpenClaw hooks inspect <name> --logspara mostrar el último resultado de ejecución
Hook slowing down every agent action
- Perfil con
OpenClaw hooks list --timingpara ver el tiempo de ejecución por gancho - Mueva las llamadas
execSyncsincrónicas a asíncronas donde el resultado no necesita bloquear al agente - El alcance se vincula a herramientas específicas en lugar de suscribirse a todos los eventos
PostToolUse
Lleve el flujo de trabajo de su agente de IA más allá con EasyClaw
Los ganchos OpenClaw le brindan control a nivel de agente. EasyClaw le brinda ese control, además de un entorno nativo de escritorio completo creado para desarrolladores y equipos de contenido que necesitan confiabilidad, privacidad y velocidad sin depender de la nube.
- ✓ Ejecute enlaces, agentes y automatización completamente en su propia máquina: ningún dato sale de su entorno
- ✓ Integración nativa con su cadena de herramientas de desarrollo existente: linters, ejecutores de pruebas, formateadores, canales de CI
- ✓ Gestión visual de enlaces: habilite, deshabilite e inspeccione enlaces sin memorizar indicadores CLI
- ✓ Listo para Team: comparta configuraciones de enlaces, bloquee barandillas y audite registros de sesiones desde un solo panel
Frequently Asked Questions
P: ¿Puede un gancho impedir por completo que el agente ejecute una llamada a una herramienta?
R: Sí, solo los ganchos PreToolUse pueden cancelar una llamada a una herramienta. Devuelva { abort: true, reason: "..." } de su controlador y la puerta de enlace impide que la herramienta se ejecute. El agente recibe la cadena de motivo en su contexto. Los ganchos PostToolUse, Stop y SessionStart no pueden cancelar acciones de forma retroactiva.
P: ¿Qué sucede si mi controlador de gancho arroja un error no controlado?
R: De forma predeterminada, un error no controlado en un controlador de enlace se registra en el registro de sesión de la puerta de enlace, pero no bloquea la sesión del agente. El agente continúa como si el anzuelo no hubiera disparado. Esto es así por diseño: los ganchos nunca deben bloquear la funcionalidad principal del agente. Siempre ajuste la lógica de su controlador en try/catch y maneje los errores explícitamente para tener visibilidad de las fallas.
P: ¿Puedo usar async/await en manipuladores de ganchos?
R: Sí, tanto los controladores PreToolUse como PostToolUse admiten funciones asíncronas. Para PreToolUse, la puerta de enlace espera al controlador antes de decidir si continúa, por lo que la lógica de aborto asíncrono funciona correctamente. Tenga en cuenta que las operaciones asíncronas de larga duración en PreToolUse retrasarán cada llamada a la herramienta, así que manténgalas rápidas.
P: ¿Los ganchos se aplican a todos los proyectos o solo a aquel en el que se encuentran?
R: Los Hooks colocados en el directorio .OpenClaw/hooks/ de un proyecto tienen un alcance de proyecto y solo se activan para sesiones en ese proyecto. Los ganchos globales se pueden colocar en ~/.OpenClaw/hooks/ y aplicarse en todos los proyectos. En monorepos, los enlaces en un directorio principal se aplican a proyectos anidados a menos que se anulen en el nivel del subdirectorio.
P: ¿Existe un costo de rendimiento por ejecutar muchos ganchos?
R: Cada gancho agrega latencia al evento al que se suscribe. Un gancho rápido y con buen alcance (menos de 50 ms) es imperceptible. Los problemas surgen cuando los ganchos ejecutan operaciones sincrónicas intensas en cada evento PostToolUse sin alcance a nivel de herramienta. Utilice OpenClaw hooks list --timing para perfilar, alcance enlaces a herramientas específicas en HOOK.md y mueva el trabajo sin bloqueo a asíncrono cuando sea posible.
P: ¿Pueden los ganchos acceder a secretos de variables de entorno de forma segura?
R: Hooks hereda el entorno completo del proceso Gateway, por lo que process.env.MY_SECRET funciona dentro de cualquier controlador. Para entornos de CI, inyecte secretos a través del administrador de secretos de su canalización (por ejemplo, GitHub Actions Secrets) en lugar de codificarlos. Nunca confirme secretos en HOOK.md o archivos de controlador; trate los archivos fuente de enlace como código que será revisado y controlado por versiones.
Reflexiones finales: elegir la estrategia de gancho adecuada para su flujo de trabajo
| Guión | Enfoque recomendado |
|---|---|
| Solo dev: protege archivos confidenciales | Gancho interno, PreToolUse, destinado a herramientas de escritura |
| Solo dev: pruebas de ejecución automática | Gancho interno, PostToolUse, con alcance para tipos de archivos adyacentes a pruebas |
| Team: aplicar barreras de seguridad compartidas | Confirmar ganchos para el control de versiones, bloquear ganchos críticos habilitados en la configuración del proyecto |
| Team — pista de auditoría | Stop publicación de gancho de evento en un punto final de registro compartido |
| CI pipeline — sesiones automatizadas | --yes bandera + OpenClaw_HOOKS_ENABLED env var, --dry-run en el paso de validación |
| External notifications | Webhook o enlace de evento Stop con fetch() a Slack/PagerDuty |
Comience con un gancho que resuelva un problema real: un protector de archivos o un linter posterior a la escritura. Haz que funcione de un extremo a otro antes de aplicar más capas. El poder de los ganchos se complica: una sesión con tres ganchos con buen alcance funcionando sin problemas es significativamente más confiable que una con diez ganchos con mal alcance en los que no confías.
El primer gancho de mayor apalancamiento para la mayoría de los desarrolladores: un guardia PreToolUse en sus archivos .env y secretos. Se necesitan diez minutos para escribir, no requiere mantenimiento para ejecutarse y elimina permanentemente toda una clase de errores de agentes.