Accueil / Étendre : compétences, MCP, sous-agents, hooks, plugins
Hooks : automatiser le cycle de vie
Un hook est une action que le harnais exécute lui même sur un événement précis du cycle de vie, jamais une préférence confiée au modèle en espérant qu'il s'en souvienne.
Un hook est une action que le harnais exécute lui même quand un événement précis du cycle de vie survient, jamais une demande que le modèle interprète au moment d'agir. Écrire dans un fichier de mémoire chaque fois que vous committez, lancez les tests reste une préférence : le modèle peut l'oublier après une longue conversation ou une compaction. Un hook déclaré sur l'événement correspondant s'exécute à chaque occurrence, indépendamment de ce que le modèle retient à cet instant.
Le mécanisme : un événement, une commande, une décision
Un hook se déclare dans settings.json, ou dans le fichier hooks.json d'un plugin, associé à un événement du cycle de vie et à un type d'action : une commande shell, un appel HTTP, un outil MCP, une invite ou un agent. Quand l'événement survient, le harnais exécute cette action et attend en retour une décision, avant que la question n'atteigne le modèle.
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "./verifier-avant-commande.sh" }
]
}
]
}
}
Cette déclaration associe l'événement PreToolUse, restreint aux appels de l'outil Bash, à un script qui s'exécute avant chaque commande proposée. Chaque type de hook porte son propre délai d'expiration par défaut, différent selon l'événement qui le déclenche : la leçon suivante détaille ces délais événement par événement, ainsi que les champs JSON précis qu'un hook renvoie pour bloquer, autoriser ou enrichir ce que le modèle voit.
Hook contre règle de mémoire : ce que chacun garantit réellement
Une règle de mémoire dépend d'un modèle qui la relit et décide de l'appliquer, dans une fenêtre de contexte qui grossit au fil de la session. Un hook dépend du harnais, qui vérifie l'événement indépendamment de ce que la conversation contient à cet instant. La différence se voit surtout sur une session longue : une instruction répétée vingt fois dans un fichier de mémoire peut se diluer dans un contexte chargé, alors qu'un hook déclaré une seule fois continue de s'exécuter identiquement au millième appel comme au premier.
Traduire un automatisme voulu en hook plutôt qu'en note de mémoire est donc moins une question de style qu'une question de fiabilité mécanique : l'un dépend d'une lecture attentive du modèle, l'autre d'un événement que le harnais constate lui même.
Du déclenchement à la décision
Règle de mémoire contre hook déclaré
| Fiabiliser un automatisme répété | Ce qui déclenche l'action | Comportement sur une session longue | Où l'automatisme se déclare |
|---|---|---|---|
| Règle écrite en mémoire | Une lecture du modèle, qui doit s'en souvenir au bon moment | Peut se diluer après une compaction ou un contexte chargé | Un fichier CLAUDE.md, interprété par le modèle |
| Hook déclaré | Un événement du cycle de vie, constaté par le harnais lui même | S'exécute identiquement à chaque occurrence de l'événement | settings.json ou le hooks.json d'un plugin, exécuté par le harnais |
Un développeur déclare un hook PreToolUse dans settings.json qui bloque tout appel de l'outil Bash contenant le motif rm suivi de -rf. Il demande ensuite à Claude Code d'exécuter une commande contenant ce motif, et voit le hook s'activer.
Écrivez en une phrase ce que cette situation établit, et en une phrase ce qu'elle n'établit pas.
Ce que cela établit : Cette situation établit que le hook intercepte effectivement une commande Bash correspondant au motif déclaré, au moment où l'outil est sur le point de s'exécuter.
Ce que cela n’établit pas : Elle n'établit pas que le même hook interceptera une commande destructive formulée autrement, par exemple avec des options séparées ou un chemin construit dynamiquement, puisque seul le motif testé a été observé.
Les trois calibrages faux les plus courants
- Trop large Cette situation prouve que le hook bloque désormais toute commande destructive, quelle que soit sa formulation.
- Trop étroit Cette situation ne prouve rien, puisqu'un hook ne peut jamais remplacer la vigilance d'un développeur qui relit chaque commande.
- À côté Cette situation montre que le hook s'est exécuté plus vite que ne l'aurait fait une relecture manuelle de la commande.
- Un hook se déclenche parce qu'un événement du cycle de vie survient, jamais parce que le modèle décide de l'appliquer au moment d'agir.
- Une règle répétée dans un fichier de mémoire peut se diluer dans un contexte chargé, un hook déclaré une seule fois s'exécute identiquement à chaque occurrence de l'événement.
- Un hook se déclare dans settings.json ou dans le fichier hooks.json d'un plugin, associé à un type d'action parmi commande shell, appel HTTP, outil MCP, invite ou agent.
- Chaque type de hook porte son propre délai d'expiration par défaut, détaillé événement par événement dans la leçon suivante.
Créez un fichier .claude/settings.json minimal dans un dépôt de test, déclarez-y un hook PreToolUse qui affiche un message avant chaque commande Bash pour observer le mécanisme se déclencher, puis retirez ce hook une fois la démonstration faite.
Chaque affirmation datable de cette leçon renvoie ici au texte public qui la porte. Une source qui ne s’ouvre pas ne prouve rien.