- La fonctionnalité de hooks personnalisés a été ajoutée à Claude Code. Elle permet de contrôler le comportement de l’application de façon plus précise et répétable, sans dépendre des choix du LLM
- Elle permet divers types d’automatisation comme la personnalisation des notifications, le formatage automatique du code et le suivi des journaux de commandes
- Les hooks peuvent s’exécuter avant/après l’exécution d’une commande, lors de l’envoi d’une notification, ou à la fin d’une réponse, et être gérés au niveau projet, utilisateur ou entreprise via des fichiers de configuration
- Grâce à la structure du fichier de configuration et au mécanisme de matcher, il est possible de n’exécuter que certains hooks au moment d’appels d’outils spécifiques
- L’entrée est transmise au format JSON, et la sortie contrôle le résultat et le feedback via un code de sortie ou du JSON
- Les hooks exécutent automatiquement des commandes shell avec l’ensemble des privilèges de l’utilisateur, ce qui impose une vigilance particulière en matière de sécurité et de sûreté
Introduction
- Les hooks de Claude Code sont des commandes shell personnalisées exécutées automatiquement à chaque étape du cycle de vie de l’exécution du code
- Ils permettent une automatisation cohérente à chaque exécution, plutôt que de s’en remettre à des décisions optionnelles du LLM
-
Exemples d’usage principaux
- Notifications : fournir à l’utilisateur des notifications personnalisées lorsqu’une saisie est attendue
- Formatage automatique : exécuter automatiquement
prettier ou gofmt après modification de fichiers
- Journalisation : enregistrer et agréger les commandes exécutées pour le suivi ou le débogage
- Feedback : fournir automatiquement un retour lorsque du code généré ne respecte pas les règles du codebase
- Autorisations personnalisées : bloquer les modifications sur des répertoires sensibles ou des fichiers de production
- Comme ils s’exécutent dans du code système et non via un prompt, ils sont déclenchés de manière déterministe à chaque fois → fiabilité accrue de l’automatisation
- Les hooks exécutent directement des commandes shell avec l’ensemble des privilèges de l’utilisateur ; une validation de sécurité est donc nécessaire.
Exemple de configuration
- Exemple : enregistrer un hook pour que Claude écrive un log avant chaque exécution d’une commande Bash
1. Accéder au menu de configuration des hooks avec la commande /hooks, puis sélectionner l’événement PreToolUse
2. Ajouter le matcher Bash (appliqué uniquement aux commandes Bash)
3. Enregistrer la commande du hook puis sauvegarder (si l’emplacement User settings est choisi, cela s’applique à tous les projets)
4. Vérifier la configuration avec /hooks ou inspecter directement le fichier ~/.claude/settings.json
Structure de configuration
- Les hooks sont regroupés selon des matchers, et chaque matcher peut contenir plusieurs hooks sous forme de tableau
- Exemples : chaîne unique (correspondance exacte), expression régulière, ou vide pour s’appliquer à tous les événements
- Types de fichiers de configuration
~/.claude/settings.json : configuration utilisateur globale
.claude/settings.json : configuration du projet
.claude/settings.local.json : configuration locale (non partagée)
- configuration de politique d’entreprise
Principaux événements de hook
- PreToolUse : exécuté avant l’appel d’un outil, avec possibilité de bloquer l’exécution si nécessaire (matchers principaux : Bash, Write, Edit, Grep, etc.)
- PostToolUse : exécuté juste après l’exécution d’un outil, avec prise en charge des mêmes matchers
- Notification : exécuté lors de l’envoi d’une notification
- Stop : exécuté après la fin de la réponse
Exemples de matchers
Task : tâche d’agent
Bash : commande shell
Glob : correspondance de motifs de fichiers
Grep : recherche dans le contenu
Read : lecture de fichier
Edit, MultiEdit : modification de fichier
Write : écriture de fichier
WebFetch, WebSearch : opérations web
Formats d’entrée et de sortie
- Entrée : JSON transmis via stdin (incluant les informations de session et les données propres à chaque événement)
- Exemple : PreToolUse inclut
tool_input, PostToolUse ajoute tool_response
- Sortie :
- code de sortie 0 : exécution normale, stdout est affiché à l’utilisateur
- code de sortie 2 : blocage, stderr est transmis à Claude comme feedback (dans PreToolUse, cela bloque l’exécution de l’outil)
- autres codes : erreur, seul stderr est affiché à l’utilisateur
- contrôle avancé : si stdout renvoie du JSON, il est possible de contrôler finement le flux avec
"continue" à false ou "decision": "block", par exemple
Intégration avec les outils MCP
- Les outils basés sur le Model Context Protocol (MCP) sont également pris en charge, et peuvent être ciblés sélectivement via un motif de nommage spécial (
mcp____)
Recommandations de sécurité
- Les hooks présentent un risque d’exécution de commandes système arbitraires ; des règles de sécurité comme la validation des entrées, la vérification des chemins, l’exclusion des fichiers sensibles et l’usage de chemins absolus sont donc indispensables
- Les changements de configuration ne sont pas appliqués immédiatement : un instantané est utilisé au démarrage de la session, et un avertissement s’affiche en cas de modification externe
Environnement d’exécution et débogage
- Chaque hook a une limite maximale de 60 secondes, s’exécute en parallèle et fonctionne dans le répertoire de travail et l’environnement courants
- Il est possible de déboguer via
/hooks en vérifiant la configuration, en testant directement les commandes et en contrôlant les codes de sortie et la sortie
- Le déroulement de l’exécution et les résultats sont consultables dans le mode transcript (
Ctrl-R)
4 commentaires
Veuillez aussi sortir une version Windows, s’il vous plaît T_T
Utilisez WSL.
C’est peut-être à cause des performances modestes de mon PC, mais sous Windows WSL, certaines tâches avec Claude Code (par exemple le build d’un projet ou l’exécution d’un serveur web local) sont vraiment trop lentes.
Il est possible d’exécuter manuellement uniquement ces tâches en dehors de WSL, mais c’est pénible et contraignant, donc depuis la sortie de Gemini CLI, sous Windows j’utilise surtout Gemini CLI à la place de Claude Code.
Avis Hacker News
Claude Code Opus 4 a la fâcheuse habitude de ne pas ajouter de retour à la ligne en fin de fichier, ce qui est frustrant
Comme il faut redémarrer claude pour tester un nouveau hook, il est bien plus efficace d’utiliser un script qui permet de continuer à éditer pendant la session
Ce script applique un formateur aux fichiers C et aux scripts shell, et pour les autres fichiers il se contente de corriger les retours à la ligne manquants
Les IA comme Claude sont faibles pour bien découper un problème et essaient parfois de faire les choses de manière étrange, donc j’ai dû corriger plusieurs fois en procédant comme dans l’exemple de hook ci-dessus : enregistrer le fichier JSON sur le disque, n’en extraire que le chemin, le sauvegarder de nouveau, puis passer ce chemin à save-hook.sh
J’ai obtenu ce que je voulais en 10 minutes, mais j’ai perdu encore plus de temps à lui faire faire de gros changements d’un coup
On entend dire que l’IA va remplacer les développeurs, mais configurer ce genre de hooks et proposer de nouvelles fonctionnalités restera malgré tout le rôle des humains
Ce type de travail lié au tooling continuera d’exister tant que l’IA n’aura pas évolué au point d’imaginer elle-même ce genre d’idée et de l’appliquer à d’autres IA
Pour reprendre une analogie avec le travail du bois, on est selon moi à un point de bascule entre les outils manuels et les outils électriques
Quelqu’un qui maîtrise les bases saura bien manier les outils, mais au lieu de fabriquer finement à la main, on est désormais à l’étape où l’on travaille vite à la scie sur table : c’est plus efficace, mais aussi potentiellement plus dangereux
C’est similaire à l’idée selon laquelle l’arrivée de machines agricoles comme les moissonneuses-batteuses allait remplacer les emplois dans l’agriculture
Est-il vraiment plausible que toute la main-d’œuvre se contente de devenir opératrice de machines ?
Le point de vue ici est que, qu’il s’agisse d’outils d’automatisation, d’agriculture ou d’IA, la valeur ne se réduit pas à une simple conversion
Comme dans la fameuse histoire de « la Terre posée sur le dos d’une tortue », on peut répéter à l’infini, après l’apparition de l’IA, la question « et qui va gérer cette IA ? »
Il existe déjà des cas où l’on confie à Claude Code la mise à jour de
CLAUDE.md, donc lui faire modifier ses propres hooks n’est pas totalement impossibleMais il est intéressant de voir qu’on oublie facilement la question, à la Jurassic Park, de « devrait-on vraiment le faire ? »
L’idée que l’IA va réduire les emplois de développeur et la question de savoir qui configurera les hooks sont toutes deux valables
Cela souligne que le progrès technique ne se résume pas simplement à une hausse ou une baisse du nombre d’emplois : il en supprime tout en en créant de nouveaux
En réalité, pour la plupart des gens, ce type de travail relève moins du développement que de la maintenance, du DevOps et d’activités similaires
Même dans les produits SaaS, une grande partie du travail concerne davantage l’exploitation que le code, ce qui diffère du développement au sens fort auquel pensent les utilisateurs de HN
L’arrivée de cette fonctionnalité est vraiment enthousiasmante
Les hooks devraient jouer un rôle important dans l’engineering du contexte des agents et la validation des performances à l’exécution
Cela pourrait s’étendre à de nombreux cas d’usage, comme la conformité en entreprise ou la surveillance des comportements
Il est aussi impressionnant qu’Anthropic l’ait pris en charge directement à partir d’une suggestion dans une issue GitHub
Lien vers l’issue concernée
Je pense que ce genre de fonctionnalité va devenir une arme décisive généralisée à tous les agents de codage
Si cette fonctionnalité me plaît, c’est parce qu’elle permet d’écrire directement des règles de contrôle d’exécution de commandes complexes sans passer par un contournement via
CLAUDE.mdPar exemple,
docker compose exec django python manage.py testpeut être autorisé, tandis que
docker compose exec django python manage.py makemigrationspeut être bloqué
.Claude/settings.jsonJ’aurais trouvé encore mieux que cette fonctionnalité fonctionne comme un serveur MCP en soi
On pourrait définir à l’avance les hooks comme des outils MCP aux noms convenus, laisser l’agent découvrir automatiquement les hooks sans connaître leur implémentation interne, puis réutiliser le serveur MCP ou les recycler dans d’autres agents
Claude Code oublie souvent les instructions du fichier
CLAUDE.mdainsi que les éléments importants de la base de code, donc il faut le lui rappeler régulièrementJ’espère que cette mise à jour pourra corriger ce problème
void!CLAUDE.mddit bien que ce motif est interdit ! »Claude lit
CLAUDE.mdet répond : « 22 secondes, 2.6k tokens… »puis : « Vous avez raison ! »
Je partage quelques hooks d’exemple
Article d’exemple sur l’écriture de hooks et l’automatisation des workflows
C’est une bonne nouvelle de voir que Claude Code atteint le niveau de Cursor avec la prise en charge du linting et du contrôle de types après modification du code
J’aimerais que cette fonctionnalité arrive aussi dans Cursor
Pour l’instant, je m’en sors à peu près en combinant plusieurs règles comme solution provisoire
Je pense que cette fonctionnalité comble un écart fonctionnel important qui existait jusqu’ici
Comme la manière dont Claude Code génère les commits empêche la plupart des hooks Git classiques de fonctionner, j’utilisais une astuce consistant à lui demander via
CLAUDE.mdd’automatiser le formatage du code avec Qlty CLI, mais Claude ne le faisait pas de manière fiable, ce qui était décevantCe changement devrait permettre d’obtenir des résultats plus déterminants
Les événements hookables sont encore limités pour l’instant, mais j’espère qu’il sera bientôt facile d’ajouter aussi des hooks sur les événements Git commit et push
Lien GitHub de Qlty CLI
À noter que Claude est excellent en Java
Il comprend parfaitement mon guide de style et même mes préférences d’indentation, au point que le reformatage du code Java devient inutile
Il aligne même très bien la JavaDoc, ce qui m’a surpris
Il a probablement été entraîné sur une quantité énorme de gros codes Java d’entreprise
Je me demande pourquoi les hooks Git classiques ne fonctionnent pas correctement dans claude code
Husky et lint-staged fonctionnaient normalement, mais les pre-commit hooks, eux, ne marchaient pas
Si je comprends bien, cette fonctionnalité ne consomme pas de contexte et, contrairement à MCP où c’est Claude qui décide quand exécuter quelque chose, il s’agit ici d’un mécanisme d’actions automatiques défini directement par l’utilisateur pour chaque usage d’outil