1. Qu'est-ce que les Hooks dans Claude Code et pourquoi sont-ils essentiels
En travaillant avec un assistant IA dans le terminal, les développeurs sont souvent contraints de répéter les mêmes commandes routinières : "lancez maintenant ESLint", "formatez le code via Prettier", "vérifiez les types avant le commit". Même si ces règles sont inscrites dans les instructions système CLAUDE.md, le modèle de langage peut parfois oublier de les appliquer ou les sauter pour économiser des tokens.
Les Hooks dans Claude Code résolvent ce problème radicalement : il s'agit de déclencheurs déterministes qui exécutent automatiquement des commandes système ou des scripts à des moments précis du cycle de vie de l'assistant.
La logique des hooks est simple :
Si Claude a effectué l'événement X → le système d'exploitation garantit le lancement de l'action Y.
Comparaison des approches d'automatisation
| Caractéristique | Prompts manuels | Instructions dans CLAUDE.md | Hooks natifs |
|---|---|---|---|
| Fiabilité d'exécution | Faible (dépend de la mémoire humaine) | Moyenne (comportement probabiliste du LLM) | 100% (interception déterministe des événements) |
| Consommation de tokens | Élevée (les tokens de requête sont consommés à chaque fois) | Moyenne (la règle est chargée dans chaque contexte) | Nulle (exécution locale dans le shell) |
| Vitesse de réaction | Lente (saisie manuelle des commandes) | Nécessite un tour de génération supplémentaire | Instantanée (appel natif du processus) |
| Possibilité de blocage | Absente | Absente | Oui (un exit code non nul stoppe l'action) |
Les hooks Claude Code se configurent au format JSON dans le fichier .claude/settings.json au niveau d'un dépôt spécifique ou globalement dans ~/.claude/settings.json.
2. Cycle de vie des événements : PreToolUse, PostToolUse, Notification, Stop
Claude Code prévoit quatre points d'interception fondamentaux (événements) auxquels vous pouvez associer des commandes automatisées.
Points de déclenchement principaux
PreToolUse(Avant l'utilisation de l'outil) : se déclenche avant que l'agent n'exécute une action. Si la commande du hook retourne une erreur (exit code différent de 0), l'exécution de l'action est bloquée. C'est l'endroit idéal pour les vérifications de sécurité avant les commits ou les pushes.PostToolUse(Après l'utilisation de l'outil) : se déclenche immédiatement après l'exécution réussie d'un outil. C'est le déclencheur le plus populaire pour le formatage automatique du code (Prettier) ou le linting du fichier modifié (ESLint).Notification(Notification) : s'active lorsque l'assistant doit envoyer un message système important ou demander une autorisation supplémentaire.Stop(Fin de réponse) : se déclenche au moment où Claude Code a complètement terminé la génération de la réponse et attend le prochain message utilisateur. Utilisé pour la lecture de signaux sonores et les notifications desktop.
Points de déclenchement des Hooks dans le cycle de vie3. Structure de configuration dans settings.json et syntaxe Matcher
La configuration des hooks est stockée dans le fichier .claude/settings.json. Si ce fichier n'existe pas encore à la racine de votre projet, créez-le.
Syntaxe de configuration de base
Fonctionnement du champ Matcher
Le champ matcher détermine sur quel outil spécifique de l'agent le hook doit réagir :
"Edit"— intercepte la modification de fichiers existants."Write"— se déclenche lors de la création d'un nouveau fichier ou d'une réécriture complète."Bash"— réagit au lancement de n'importe quelle commande console."Bash(git commit*)"— modèle précis qui filtre les appels Bash commençant par la commandegit commit."*"— sélecteur universel (wildcard), qui se déclenche sur n'importe quel outil de l'agent.
Les modèles matcher sont sensibles à la casse. Utilisez les noms standard des outils Claude Code : Edit, Write, Bash, Glob, Grep.
4. Linting et formatage automatiques (ESLint + Prettier)
Le scénario quotidien le plus pratique consiste à déléguer le formatage et la vérification initiale du style aux utilitaires Prettier et ESLint. Grâce à cela, le code est toujours sauvegardé dans le dépôt dans un état impeccable.
Configuration PostToolUse pour ESLint et Prettier
Analyse des drapeaux de sécurité dans la commande
"$CLAUDE_FILE_PATH"— variable d'environnement dynamique dans laquelle Claude insère automatiquement le chemin complet vers le fichier dès qu'il est modifié par l'agent.2>/dev/null— supprime les sorties d'erreur inutiles du flux stderr pour ne pas surcharger le terminal.|| true— construction bash cruciale. Elle garantit que même si le linter trouve des erreurs irrécupérables et retourne le code1, le hook lui-même se terminera avec le code0et n'arrêtera pas le fonctionnement ultérieur de l'agent.
5. Barrières de sécurité avant git commit (TypeCheck + Tests)
Si nous avons utilisé des hooks doux avec || true pour le formatage, la fixation des modifications dans le système de contrôle de version nécessite un contrôle qualité strict (Quality Gate).
À l'aide de PreToolUse, vous pouvez bloquer la création d'un commit si le projet contient des erreurs de compilation TypeScript ou si les tests unitaires échouent.
Configuration d'un hook Pre-commit bloquant
Ce qui se passe en cas de détection d'erreurs
- Claude formule la commande
git commit -m "...". - Avant son exécution, le système active
PreToolUse. - Les commandes de validation sont lancées :
npm run typechecketnpm run lint. - Si une erreur est détectée : le processus retourne un code de sortie non nul (exit code 1).
- Claude Code capture la sortie de l'erreur du compilateur directement dans son contexte.
- Au lieu d'un commit cassé, l'assistant analyse le texte de l'erreur, corrige automatiquement les types dans le code et effectue une nouvelle tentative propre de commit.
Notez bien : dans les vérifications bloquantes PreToolUse, n'utilisez jamais || true, sinon la vérification sera toujours considérée comme réussie et la barrière de sécurité cessera de fonctionner.
6. Notifications audio et desktop à la fin des tâches (Stop Hook)
Les refactoring complexes ou l'exécution de suites de tests complètes peuvent durer de 2 à 10 minutes. Plutôt que de fixer sans relâche le terminal, configurez des notifications via l'événement Stop.
La notification se déclenche uniquement lorsque l'agent termine complètement la génération de la réponse finale, et non entre les appels intermédiaires aux outils.
7. Transmission du contexte via les variables d'environnement
Pour que les scripts d'automatisation soient flexibles et adaptatifs, Claude Code exporte automatiquement les métadonnées de l'opération courante dans les variables d'environnement système (Environment Variables).
Variables d'environnement Claude Code pour les hooksRéférentiel des variables système Claude Code
| Variable d'environnement | Type de valeur | Description et exemple de contenu |
|---|---|---|
$CLAUDE_FILE_PATH | Chemin absolu | Chemin vers le fichier spécifique actuellement créé ou édité (/Users/dev/project/src/index.ts) |
$CLAUDE_TOOL_NAME | Identifiant textuel | Nom de l'outil qui a initié l'événement (Edit, Write, Bash) |
$CLAUDE_PROJECT_DIR | Chemin absolu | Répertoire racine du projet où la session actuelle de Claude Code est lancée |
Exemple de script Bash contextuel pour un hook
Créons le script .claude/hooks/smart-validator.sh :
Désormais, dans .claude/settings.json, il suffit d'indiquer l'appel de ce script :
8. Pattern « CI-in-a-Loop » : feedback continu
Dans le développement traditionnel sans hooks, un pattern de rupture apparaît : l'agent apporte des modifications à une dizaine de fichiers, puis le build du projet se lance et génère une avalanche de 40 erreurs de types. Il est difficile pour l'agent de déterminer quelle modification précise a causé la panne.
CI-in-a-Loop (Court cycle de feedback) inverse ce processus :
Configuration de l'audit cyclique TypeScript
Pourquoi utiliser impérativement head -n 20
Si la sortie du compilateur retourne des centaines de lignes de logs, elles entrent dans le contexte du modèle et peuvent saturer la limite de tokens. La limitation via head -n 20 affiche les premières erreurs les plus critiques, offrant au modèle un repère précis pour une correction immédiate sans surcharger la session.
9. Automatisation Headless : mode -p, Cron et Git Hooks
Les hooks peuvent être combinés avec le mode autonome (headless) de Claude Code — le drapeau -p (print/prompt). Cela permet d'automatiser l'exécution des tâches entièrement sans intervention humaine.
Script autonome d'audit nocturne (nightly-audit.sh)
Configuration de l'horaire d'exécution via Cron
Ouvrez le planificateur de tâches (crontab -e) et configurez l'exécution chaque nuit à 03:00 :
Lancement de la vérification dans un Git Hook natif (.git/hooks/post-merge)
Pour qu'une analyse de compatibilité se lance automatiquement après chaque récupération de mises à jour via git pull :
N'oubliez pas d'accorder les droits d'exécution au script : chmod +x .git/hooks/post-merge.
10. Meilleures pratiques d'ingénierie et règles de sécurité des Hooks
Des hooks mal configurés peuvent boucler l'exécution ou bloquer le fonctionnement du terminal. Respectez quatre règles fondamentales d'hygiène d'ingénierie.
Quatre règles de conception sécurisée des hooks
-
Rapidité extrême : Les hooks avec l'événement
PostToolUses'exécutent après chaque modification de fichier. Si un hook prend plus de 1-2 secondes, le travail interactif avec Claude deviendra lent et inconfortable. Lancez les tests E2E lourds uniquement dansPreToolUseavant le commit, mais pas après chaqueEdit. -
Journalisation obligatoire de la sortie : Redirigez toujours la sortie des scripts de diagnostic vers un fichier log temporaire :
bash"command": "bash .claude/hooks/check.sh >> /tmp/claude-hooks.log 2>&1 || true"Si un hook cesse de se déclencher, vous pourrez ouvrir immédiatement
/tmp/claude-hooks.loget trouver la cause. -
Test isolé dans un terminal propre : Avant d'ajouter une commande à
settings.json, exécutez-la vous-même dans un shell standard. Si la commande produit une erreur dans la console, elle cassera garantitivement la session Claude Code. -
Prévention de la récursion infinie : Ne configurez jamais une commande dans
PostToolUsequi modifie elle-même les fichiers du projet sans drapeaux d'ignorance (par exemple, un script tiers qui appelle unEditrépétitif), sinon l'agent entrera dans une boucle d'appels éternelle.
Ne lancez pas via les hooks des commandes qui attendent une saisie interactive de l'utilisateur (par exemple, confirmation read -p ou sudo avec demande de mot de passe). Cela entraînera le gel du processus terminal.
11. Atelier pratique, mémo et checklist de synthèse
Pour démarrer rapidement dans votre propre projet, utilisez un mémo synthétique prêt à l'emploi et une configuration production éprouvée.
Mémo pour choisir le type de Hook pour l'automatisationFichier de configuration prêt à l'emploi .claude/settings.json
Copiez cette configuration étalon dans le dossier .claude de votre projet :
Auto-vérification rapide
1. En quoi PreToolUse diffère-t-il fondamentalement de PostToolUse ?
Réponse :
PreToolUsese lance avant l'exécution de l'action de l'outil et peut la bloquer en cas d'exit code non nul.PostToolUsese lance après la fin réussie de l'opération et est utilisé pour le formatage ou le linting.
2. Pourquoi ajoute-t-on || true dans les hooks de formatage ?
Réponse : Pour éviter que les erreurs du linter ou du formateur ne retournent un statut critique et n'arrêtent le processus de génération de la réponse de l'agent.
3. Quelle variable d'environnement contient le chemin vers le fichier venant d'être édité ?
Réponse : La variable
$CLAUDE_FILE_PATH.
Checklist de synthèse pour l'implémentation des Hooks
- Le répertoire
.claude/et le fichiersettings.jsonont été créés à la racine du projet. - Le formatage automatique des fichiers modifiés est configuré via
PostToolUse+Prettier. - Les barrières de sécurité avant commit (
PreToolUse) sont en place avec TypeCheck et Tests. - Les notifications
Stopsont configurées pour les longues sessions. - Les scripts utilisent correctement les variables d'environnement (
$CLAUDE_FILE_PATH). - Les logs sont activés pour le débogage des hooks.