Que sont les crochets OpenClaw ? (Et pourquoi ils changent la façon dont vous travaillez avec les agents IA)
Si vous avez déjà vu un agent IA écraser un fichier auquel il ne devrait pas toucher, ou si vous souhaiteriez qu'il exécute automatiquement votre suite de tests après chaque modification de code, les hooks OpenClaw sont la réponse. Ils vous permettent d'intercepter, de réagir et de contrôler le comportement des agents précisément aux moments qui comptent.
Les crochets sont petits scripts basés sur des événements qui s'exécutent dans OpenClaw Gateway à des moments précis du cycle de vie d'un agent. Considérez-les comme un middleware pour votre agent IA : ils se situent entre l'agent et les outils qu'il appelle, vous offrant ainsi une couche d'interception programmable.
Il en existe deux types distincts :
- Crochets internes — des scripts qui s'exécutent à l'intérieur le processus Gateway lui-même. Ils ont un accès direct à l'état de la session, aux métadonnées des appels d'outils et au contexte de travail de l'agent. Zéro surcharge réseau.
- Webhooks — Rappels HTTP qui se déclenchent sur un point de terminaison externe lorsqu'un événement de cycle de vie se produit. La passerelle envoie une requête POST ; votre serveur gère la logique.
La différence pratique : les crochets internes sont destinés aux garde-corps rapides et synchrones et à l'automatisation locale. Les webhooks sont destinés à tout ce qui doit atteindre l'extérieur de votre machine : notifications Slack, systèmes CI, plates-formes de journalisation.
Hooks internes et webhooks : de lequel avez-vous besoin ?
| Facteur | Crochet interne | Webhook |
|---|---|---|
| Lieu d'exécution | À l’intérieur du processus Gateway | Serveur HTTP externe |
| Latence | Proche de zéro (synchrone) | Aller-retour réseau |
| Accès à l'état de session | Direct | Charge utile sérialisée uniquement |
| Idéal pour | Protections de fichiers, formatage automatique, scripts locaux | Alertes Slack, journalisation d'audit, API externes |
| Complexité de configuration | Faible : juste un répertoire + un fichier de gestionnaire | Moyen : nécessite un point de terminaison HTTP en cours d'exécution |
| Exécution de l'agent bloquant | Oui (les hooks PreToolUse peuvent abandonner) | Généralement asynchrone/non bloquant |
Règle de décision : Si votre crochet doit prévenir une action ou lire les données de session locale, utilisez un crochet interne. S'il le faut avertir un système externe et n'a pas besoin de bloquer l'agent, utilisez un webhook.
Comment fonctionne la découverte de crochets OpenClaw
La passerelle utilise analyse automatique des répertoires pour découvrir des hameçons. Au démarrage, il analyse les répertoires de hook configurés et charge tous les packages de hook valides qu'il trouve.
Deux conditions préalables importantes avant l’activation des hooks :
- Les crochets doivent être explicitement activé — un répertoire hook seul ne suffit pas
- Au moins une entrée de hook doit être configurée dans les paramètres de votre passerelle
Il s’agit d’un point de confusion courant. Vous pouvez avoir un hook parfaitement écrit dans le bon répertoire, mais si la passerelle n'a pas été invitée à activer les hooks, elle les ignore silencieusement.
Chaque package de hook nécessite exactement deux fichiers :
HOOK.md— fichier de métadonnées déclarant le nom, la version, la description, les abonnements aux événements du cycle de vie et toutes les autorisations requises du hookhandler.ts(ouhandler.js) — le fichier d'implémentation contenant la logique réelle qui s'exécute lorsque l'événement se déclenche
Le fichier HOOK.md est ce que la passerelle lit en premier lors de la découverte. S'il est mal formé ou s'il manque des champs obligatoires, le hook ne se chargera pas - pas d'erreur, juste le silence. Il s’agit de la cause la plus courante des rapports « mon hook ne fonctionne pas ».
Les quatre événements du cycle de vie que tout développeur devrait connaître
| Événement | Quand il tire | Utilisation courante |
|---|---|---|
| Utilisation du pré-outil | Avant l'agent appelle n'importe quel outil | Bloquer les opérations dangereuses, valider les entrées |
| Utilisation de l'outil de publication | Après un appel d'outil est terminé | Exécuter des tests, formater le code, enregistrer les résultats |
| Arrêt | Quand la session de l'agent se termine | Envoyer des notifications, vider les journaux, nettoyer |
| Début de session | Lorsqu'une nouvelle session d'agent commence | Charger le contexte, définir les garde-fous, l'état d'échauffement |
Utilisation du pré-outil est le plus puissant — c'est le seul événement qui peut avorter un appel d'outil avant son exécution. Si votre hook renvoie un signal de rejet pendant PreToolUse, l'agent n'appelle jamais l'outil.
Utilisation de l'outil de publication est le cheval de bataille de l’automatisation. Fichier écrit ? Exécutez votre linter. Test modifié ? Exécutez la suite. Code commis ? Déclenchez une build.
Étape par étape : écrire votre premier hook personnalisé à partir de zéro
La plupart de la documentation vous montre des commandes. Cela vous montre le chemin complet de rien à un hook fonctionnel.
But: Exécutez automatiquement ESLint après chaque écriture de fichier.
Étape 1 — Créez le répertoire hook
mkdir -p .OpenClaw/hooks/auto-lint
Étape 2 — Écrivez les métadonnées 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
Le champ Tools étend votre hook à des appels d'outils spécifiques. Sans cela, le crochet tire chaque Événement PostToolUse — généralement pas ce que vous voulez.
Étape 3 — Mettre en œuvre 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}`);
}
}
Étape 4 — Activer via CLI
OpenClaw hooks enable auto-lint
Étape 5 — Vérifiez qu'il est chargé
OpenClaw hooks list
Vous devriez voir auto-lint avec le statut enabled. Démarrez une session, écrivez un fichier et regardez le linter se déclencher.
JavaScript vs TypeScript pour les gestionnaires de hooks : que choisir en 2026
Le SDK est livré avec des saisies TypeScript complètes et, à partir des versions 2026 du SDK, TypeScript est la valeur par défaut recommandée pour les nouveaux crochets.
| Facteur | Manuscrit | Javascript |
|---|---|---|
| Type de sécurité | Complet : les formes d'événement sont saisies | Aucun — surprises d'exécution |
| Étape de compilation | Obligatoire (tsc ou esbuild) | Aucun |
| Compatibilité SDK | Assistance de première classe | Pris en charge mais pas de saisie semi-automatique |
| Idéal pour | Tout hook qui sera maintenu ou partagé | Scripts ponctuels rapides |
Si vous écrivez un hook que vous vous engagerez à contrôler la version ou à partager avec une équipe, utilisez TypeScript. Pour un garde-corps local jetable, du JavaScript simple convient : nommez-le simplement handler.js et ignorez l'étape de compilation.
Référence CLI d'OpenClaw Hooks
| Commande | Drapeaux | Ce que ça fait |
|---|---|---|
| liste des crochets OpenClaw | --json |
Répertorie tous les hooks découverts et leur statut |
| les crochets OpenClaw inspectent |
— | Affiche les métadonnées complètes de HOOK.md + la configuration actuelle |
| les crochets OpenClaw activent |
— | Active un hook pour le projet en cours |
| les hooks OpenClaw désactivent |
— | Désactive sans supprimer |
| les crochets OpenClaw installent |
--yes, --dry-run |
Installe un pack de hooks à partir du registre |
| mise à jour des crochets OpenClaw | --all, --dry-run |
Mises à jour des packs de hooks installés |
Gestion des packs de hooks : installation, mise à jour et flux de travail --dry-run
Les packs de crochets regroupent plusieurs crochets associés en une seule unité installable. Le workflow d'installation vérifie un hachage d'intégrité avant d'écrire quoi que ce soit sur le disque.
# 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
L'indicateur --dry-run est sous-utilisé. Exécutez-le avant tout install ou update pour voir exactement quels fichiers changeraient. Dans les pipelines CI, associez --yes à --dry-run dans une étape de validation distincte avant l'installation réelle.
Référence des hooks groupés : ce qui est livré avec OpenClaw
| Crochet | État par défaut | Ce que ça fait | Mieux utilisé quand |
|---|---|---|---|
| mémoire de session | Activé | Conserve le contexte clé au fil des sessions | Projets de longue durée avec tâches récurrentes |
| les hooks fournis supplémentaires varient selon la version de Gateway | — | Exécutez OpenClaw hooks list --builtin pour voir le vôtre |
— |
Exécutez OpenClaw hooks inspect session-memory pour voir ses options de configuration complètes. La plupart des hooks fournis sont livrés avec des valeurs par défaut raisonnables mais exposent des champs de configuration pour la personnalisation.
Cas d'utilisation de Hooks dans le monde réel (avec exemples pratiques)
1. Garde-corps de protection des fichiers (PreToolUse)
Empêchez l'agent de toucher à votre fichier .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." };
}
}
Déposez ceci dans .OpenClaw/hooks/protect-env/ avec le HOOK.md correspondant abonné à PreToolUse étendu à write_file et edit_file. L'agent reçoit le motif du rejet dans son contexte et ne réessaiera pas.
2. Notification Slack à l'arrêt de la session
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}`
})
});
}
Abonnez ce hook à l'événement Stop. Chaque fin de session déclenche un message Slack avec un résumé. Aucun serveur externe n'est nécessaire : le processus Gateway effectue directement la demande sortante.
3. Formatage automatique + Test sur 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" });
}
Cela se déclenche après chaque écriture de fichier TypeScript, le formate, puis exécute votre suite de tests. Lent sur les grands projets : définissez-le étroitement à l'aide du champ Tools dans HOOK.md.
Hooks for Teams – Application de garde-fous dans un projet partagé
Validez votre répertoire .OpenClaw/hooks/ dans le contrôle de version. Chaque développeur qui clone le dépôt a automatiquement la même configuration de hook.
- Verrouillez les hooks critiques sur
enableddans la configuration du projet - empêche les coéquipiers de désactiver accidentellement les protections de fichiers - Utilisez les descriptions
HOOK.mdpour documenter l'intention — traitez-les comme des commentaires de code, les coéquipiers les liront - La portée s'accroche à la granularité au niveau de l'outil — les crochets larges ralentissent toutes les interactions des agents, créant des frictions qui amènent les coéquipiers à les désactiver
- Dans monorepos, les hooks d'un répertoire parent s'appliquent à tous les projets imbriqués, sauf s'ils sont remplacés au niveau du sous-répertoire.
Intégration CI/CD – Exécution de Hooks OpenClaw de manière non interactive
Dans GitHub Actions ou dans tout environnement sans tête, l'invite de confirmation interactive bloquera votre pipeline. Utilisez --yes pour l'ignorer :
- 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
Définissez OpenClaw_HOOKS_ENABLED=true comme variable d'environnement pour activer les hooks sans confirmation interactive. Cela remplace l'exigence « au moins une entrée configurée » en mode CI.
Hook Security : ce qui fonctionne, à quoi il peut accéder et comment rester en sécurité
C'est la partie que la plupart de la documentation ignore entièrement - et c'est la section la plus importante si vous installez des packs de hooks communautaires.
À quels hooks peuvent accéder : Les scripts Hook héritent du autorisations complètes du processus Gateway. Si la passerelle s'exécute en tant que compte utilisateur, vos hooks peuvent lire n'importe quel fichier que le compte peut lire, effectuer des requêtes réseau, exécuter des sous-processus et accéder aux variables d'environnement, y compris les secrets.
Le risque des packs de crochets non examinés : Un pack de crochets malveillant pourrait exfiltrer votre .env, vos clés SSH ou vos jetons API, tout en semblant faire quelque chose de bénin comme « formater le code ».
Liste de contrôle d’audit du pack de crochets
Parcourez ceci avant d'installer un pack tiers :
- ☐Lisez le
HOOK.mdcomplet : les autorisations déclarées correspondent-elles à l'objectif déclaré ? - ☐Lisez chaque ligne de
handler.ts/js— recherchez l'accèsfetch(),execSync,process.env - ☐Vérifiez la provenance npm si le pack est distribué par le registre (
npm info <pack> --json | grep provenance) - ☐Vérifiez l'identité de l'éditeur : s'agit-il d'un responsable connu ou d'un nouveau compte ?
- ☐Exécutez d'abord
--dry-runet examinez le manifeste du fichier. - ☐N'installez jamais de packs de crochets avec
--yessans avoir d'abord effectué les étapes ci-dessus.
La commande OpenClaw hooks inspect vous montre le chemin source complet d'un hook installé - utilisez-la pour réexaminer le code du gestionnaire après les mises à jour.
Dépannage des hooks OpenClaw - Lorsqu'ils ne se déclenchent pas
Crochet pas découvert du tout
- Vérifiez que le répertoire se trouve dans un chemin de hooks analysé :
OpenClaw hooks list --verbose - Confirmez que
HOOK.mdexiste et est valide – les champs obligatoires manquants ignorent silencieusement le crochet - Vérifiez que les hooks sont activés globalement et qu'au moins une entrée est configurée
Crochet découvert mais ne tirant pas
- Exécutez
OpenClaw hooks inspect <name>— vérifiez que le champEventdansHOOK.mdcorrespond à l'événement de cycle de vie que vous attendez - Vérifiez la portée
Tools— si vous avez étendu la portée àwrite_filemais que l'agent appellecreate_file, le hook ne se déclenchera pas - Confirmez que l'état du hook indique
enabled, et nonloaded(chargé signifie découvert mais non actif)
Hook se déclenche mais les erreurs du gestionnaire sont silencieuses
- Ajoutez des blocs
try/catchexplicites avec la connexionconsole.errordans votre gestionnaire - Les journaux de passerelle sont écrits dans
~/.OpenClaw/logs/— vérifiez le journal de session le plus récent pour les lignes préfixées[hook] - Utilisez
OpenClaw hooks inspect <name> --logspour faire apparaître le dernier résultat d'exécution
Hook ralentit chaque action de l'agent
- Profil avec
OpenClaw hooks list --timingpour voir le temps d'exécution par hook - Déplacez les appels
execSyncsynchrones vers async où le résultat n'a pas besoin de bloquer l'agent - La portée s'accroche à des outils spécifiques plutôt que de s'abonner à tous les événements
PostToolUse
Améliorez le flux de travail de vos agents IA avec EasyClaw
Les hooks OpenClaw vous donnent le contrôle au niveau de l'agent. EasyClaw vous offre ce contrôle, ainsi qu'un environnement de bureau complet conçu pour les développeurs et les équipes de contenu qui ont besoin de fiabilité, de confidentialité et de vitesse sans dépendance au cloud.
- ✓ Exécutez des hooks, des agents et des automatisations entièrement sur votre propre machine : aucune donnée ne quitte votre environnement
- ✓ Intégration native avec votre chaîne d'outils de développement existante : linters, exécuteurs de tests, formateurs, pipelines CI
- ✓ Gestion visuelle des hooks : activez, désactivez et inspectez les hooks sans mémoriser les indicateurs CLI
- ✓ Prêt pour l'équipe : partagez les configurations de hook, les garde-corps de verrouillage et les journaux de session d'audit à partir d'un seul tableau de bord
Foire aux questions
Q : Un hook peut-il empêcher complètement l’agent d’exécuter un appel d’outil ?
R : Oui – seuls les hooks PreToolUse peuvent abandonner un appel d'outil. Renvoyez { abort: true, reason: "..." } de votre gestionnaire et la passerelle empêche l'exécution de l'outil. L'agent reçoit la chaîne de motif dans son contexte. Les hooks PostToolUse, Stop et SessionStart ne peuvent pas abandonner les actions de manière rétroactive.
Q : Que se passe-t-il si mon gestionnaire de hook renvoie une erreur non gérée ?
R : Par défaut, une erreur non gérée dans un gestionnaire de hook est consignée dans le journal de session Gateway mais ne fait pas planter la session de l'agent. L'agent continue comme si le crochet n'avait pas tiré. C'est inhérent à la conception : les hooks ne doivent jamais bloquer les fonctionnalités principales de l'agent. Enveloppez toujours la logique de votre gestionnaire dans try/catch et gérez les erreurs explicitement afin d'avoir une visibilité sur les échecs.
Q : Puis-je utiliser async/await dans les gestionnaires de crochets ?
R : Oui, les gestionnaires PreToolUse et PostToolUse prennent en charge les fonctions asynchrones. Pour PreToolUse, la passerelle attend le gestionnaire avant de décider de continuer — la logique d'abandon asynchrone fonctionne donc correctement. N'oubliez pas que les opérations asynchrones de longue durée dans PreToolUse retarderont chaque appel d'outil, alors gardez-les rapides.
Q : Les hooks s'appliquent-ils à tous les projets ou uniquement à celui dans lequel ils se trouvent ?
R : Les hooks placés dans le répertoire .OpenClaw/hooks/ d'un projet sont limités au projet et ne s'activent que pour les sessions de ce projet. Les hooks globaux peuvent être placés dans ~/.OpenClaw/hooks/ et s'appliquer à tous les projets. Dans monorepos, les hooks d'un répertoire parent s'appliquent aux projets imbriqués à moins qu'ils ne soient remplacés au niveau du sous-répertoire.
Q : L’exécution de nombreux hooks a-t-elle un coût en termes de performances ?
R : Chaque hook ajoute de la latence à l’événement auquel il est abonné. Un hook rapide et bien ciblé (moins de 50 ms) est imperceptible. Des problèmes surviennent lorsque les hooks exécutent des opérations synchrones lourdes sur chaque événement PostToolUse sans portée au niveau de l'outil. Utilisez OpenClaw hooks list --timing pour créer un profil, étendez la portée à des outils spécifiques dans HOOK.md et déplacez le travail non bloquant vers l'asynchrone lorsque cela est possible.
Q : Les hooks peuvent-ils accéder en toute sécurité aux secrets des variables d’environnement ?
R : Les hooks héritent de l'environnement complet du processus Gateway, donc process.env.MY_SECRET fonctionne dans n'importe quel gestionnaire. Pour les environnements CI, injectez des secrets via le gestionnaire de secrets de votre pipeline (par exemple, GitHub Actions Secrets) plutôt que de les coder en dur. Ne confiez jamais de secrets à HOOK.md ou aux fichiers de gestionnaire : traitez les fichiers source du hook comme du code qui sera examiné et contrôlé en version.
Réflexions finales – Choisir la bonne stratégie de hook pour votre flux de travail
| Scénario | Approche recommandée |
|---|---|
| Solo dev – protégez les fichiers sensibles | Hook interne, PreToolUse, limité aux outils d'écriture |
| Développement solo – tests exécutés automatiquement | Hook interne, PostToolUse, limité aux types de fichiers adjacents au test |
| Équipe : appliquer des garde-fous partagés | Valider les hooks dans le contrôle de version, verrouiller les hooks critiques activés dans la configuration du projet |
| Équipe — piste d'audit | Publication du hook d'événement Stop sur un point de terminaison de journalisation partagé |
| Pipeline CI – sessions automatisées | --yes flag + OpenClaw_HOOKS_ENABLED env var, --dry-run dans l'étape de validation |
| Notifications externes | Webhook ou hook d'événement Stop avec fetch() vers Slack/PagerDuty |
Commencez avec un hook qui résout un vrai problème : un garde de fichiers ou un linter post-écriture. Faites-le fonctionner de bout en bout avant d’en superposer davantage. La puissance des hooks composés : une session avec trois hooks de bonne portée qui se déroulent sans problème est nettement plus fiable qu'une session avec dix hooks de mauvaise portée auxquels vous ne faites pas confiance.
Le premier hook le plus efficace pour la plupart des développeurs : un PreToolUse garde sur vos .env et vos fichiers secrets. L'écriture prend dix minutes, l'exécution ne nécessite aucune maintenance et élimine définitivement toute une classe d'erreurs d'agent.