Claude Code Hooks : contrôler l'IA avec du Python simple
Pourquoi ça compte pour toi
Si tu utilises Claude Code pour automatiser du développement, tu dois pouvoir ajouter tes propres garde-fous : vérifier que Claude ne modifie que certains fichiers, appliquer tes standards de code, journaliser ses décisions. Cette lib fait exactement ça sans t'obliger à gérer JSON, stdin/stdout ou les schémas de réponse.
Ce qu'il faut retenir
- 1.4 types de hooks : avant/après exécution d'outils, validation de prompts, initialisation de session
- 2.Tu hérites de HookHandler, tu surcharges la méthode du hook que tu veux, c'est tout
- 3.Dataclasses typées + builder pattern pour les réponses (allow/deny/ask)
- 4.Journaux JSONL automatiques avec session ID, namespace, timestamps — debug sans prise de tête
Tu galères avec le jargon ?
Lis la version réécrite en mode débutant — toutes les idées, sans le jargon.
Pourquoi les hooks ?
Quand Claude Code génère du code, tu veux souvent lui imposer des règles : "pas de modifications en dehors de /app/src", "tout fichier Vue doit avoir setup lang=ts", "bloque les FormRequest, pousse vers les Data Classes". Sans les hooks, tu dois vérifier manuellement ou refuser tout en bloc. Avec les hooks, tu automatises la validation.
Trois patterns concrets
Valider la structure Vue
class VueValidator(HookHandler):
def pre_tool_use(self, input: PreToolUseInput) -> PreToolUseResponse | None:
if not input.file_path_matches('**/*.vue'):
return None
content = input.content or ''
if '<script setup lang="ts">' not in content:
return PreToolUseResponse.deny(
"Vue doit utiliser <script setup lang=\"ts\">"
)
return PreToolUseResponse.allow()
Tu étends HookHandler, tu implémentes pre_tool_use(), tu retournes allow/deny/ask. Fini.
Confiner les contrôleurs Laravel
class ControllerValidator(HookHandler):
def pre_tool_use(self, input: PreToolUseInput) -> PreToolUseResponse | None:
if not input.file_path_matches('**/*Controller.php'):
return None
if not input.file_path_matches('**/app/Http/Controllers/**'):
return PreToolUseResponse.deny(
f"Les contrôleurs doivent être dans app/Http/Controllers/. "
f"Trouvé: {input.file_path}"
)
return PreToolUseResponse.allow()
Journaliser les décisions
Chaque handler reçoit un HookLogger. Les journaux vont dans .claude/logs/{namespace}/hooks.jsonl — un objet JSON par ligne, avec timestamp, niveau, session ID, raison. Parfait pour comprendre pourquoi Claude a fait un truc ou non.
Points clés
Minimaliste : tu n'as que ce qu'il te faut. Pas de dépendances lourdes. Si tu veux appeler une IA pour la validation, tu importes ton SDK toi-même.
Type-safe : les inputs et outputs sont des dataclasses. Ton IDE te complète, les erreurs remontent à la compilation.
Multi-hook : un même script Python peut gérer PreToolUse, PostToolUse, UserPromptSubmit, SessionStart. Tu surcharges juste ce que tu dois.
Réactions fines : allow/deny/ask, et tu peux même modifier l'input avant qu'il n'arrive à Claude (with_updated_input).
Configuration
Tu déclares tes hooks dans .claude/settings.json :
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [{
"type": "command",
"command": "python3 /path/to/validator.py"
}]
}
]
}
}
C'est ça. Claude passe par stdin, tu retournes la réponse sur stdout, la lib gère le reste.
Qui devrait l'utiliser ?
Si tu utilises Claude Code dans une équipe ou un projet avec des standards stricts (structure de dossiers, conventions de code, fichiers protégés), cette lib te sauve du temps de relecture manuelle. Tu écris une fois, ça roule à chaque suggestion de Claude.
Et concrètement pour toi ?
Choisis ton profil — la lecture de l'article change selon qui tu es.
Pour toi, cette lib montre concrètement pourquoi on peut pas juste lâcher l'IA seule : même le meilleur modèle a besoin de garde-fous humains intégrés, pas ajoutés après coup.
Essayer maintenant
Installer claude-hook-utils →Source
📊 Cours en bourse
Pour aller plus loin
Cet article t'a donné envie d'approfondir ? Deux formations Noésis t'attendent :
Explorer les thèmes de cet article :