Kairia Logo

Hooks Claude Code : un tutoriel pour valider vos fichiers JSON

Claude Code
Développement
+2

Hooks Claude Code : un tutoriel pour valider vos fichiers JSON

Kairia
9 min

Configurez un hook Claude Code pour contrôler vos fichiers JSON après modification : script Python, tests reproductibles, limites et dépannage.

Partager :

Vous demandez à votre assistant de vérifier les fichiers qu'il modifie. Mais une consigne n'est pas un contrôle automatique. Un hook Claude Code permet de lancer une commande à un moment précis : avant un outil, après son exécution ou lorsqu'une notification est émise.

Ce tutoriel construit un cas volontairement limité : contrôler la syntaxe d'un fichier JSON après une modification par les outils Edit ou Write, puis signaler une erreur à Claude. Vous obtenez une configuration, un script sans dépendance Python externe et une procédure de test. Le script ne modifie aucun fichier.

Les exemples visent macOS ou Linux avec Python 3 et un shell Bash. Les comportements de Claude Code sont vérifiés dans sa documentation officielle au 22 septembre 2026. Les tests du script utilisent des événements simulés : ils ne constituent pas un test de bout en bout dans une session Claude Code.

Quand utiliser un hook plutôt qu'une instruction ?

Une instruction dans CLAUDE.md exprime une règle de travail. Un hook de type command exécute un programme quand l'événement configuré correspond. Il convient donc aux vérifications déterministes : parser un fichier, lancer un formateur déjà installé, vérifier une convention précise.

BesoinPoint de départ
Expliquer le style de code attenduConsignes dans CLAUDE.md
Vérifier un fichier après une édition réussieHook PostToolUse
Examiner un appel d'outil avant son exécutionHook PreToolUse
Recevoir un signal lorsque Claude attend une interventionHook Notification

Ne mettez pas toute votre chaîne de tests dans chaque hook. Pour commencer, choisissez une vérification courte, locale et facile à comprendre. Les tests complets et les contrôles avant livraison gardent leur rôle.

Comprendre événement, matcher et commande

La référence officielle des hooks décrit les trois éléments que nous allons utiliser :

  • PostToolUse se déclenche après la réussite d'un appel d'outil.
  • Le matcher filtre le nom de l'outil. Ici, Edit|Write cible les deux outils d'édition.
  • La commande reçoit un objet JSON sur son entrée standard. Pour ces outils, tool_input.file_path contient le chemin du fichier.

Après ne signifie pas avant. Si le contrôle découvre un JSON invalide, le fichier a déjà été écrit. Un hook PostToolUse ne constitue pas une annulation de cette écriture.

1. Préparer le script de validation

À la racine d'un projet de test, créez le dossier .claude/hooks, puis le fichier .claude/hooks/check-json.py ci-dessous. Vérifiez d'abord que python3 --version fonctionne dans votre terminal.

import json
import sys
from pathlib import Path


def report(message):
    print(message, file=sys.stderr)
    return 2


def main():
    try:
        event = json.load(sys.stdin)
        if not isinstance(event, dict):
            raise ValueError("objet attendu")
        tool_input = event.get("tool_input", {})
        if not isinstance(tool_input, dict):
            raise ValueError("tool_input doit etre un objet")
    except (ValueError, UnicodeError) as exc:
        return report(f"Evenement de hook invalide : {exc}")

    if event.get("tool_name") not in {"Edit", "Write"}:
        return 0

    raw_path = tool_input.get("file_path")
    if not isinstance(raw_path, str) or not raw_path:
        return report("Chemin du fichier absent de l'evenement.")

    path = Path(raw_path)
    if path.suffix.lower() != ".json":
        return 0
    if not path.is_absolute():
        return report("Un chemin absolu est attendu.")

    try:
        text = path.read_text(encoding="utf-8")
        json.loads(text)
    except json.JSONDecodeError as exc:
        return report(
            f"JSON invalide : ligne {exc.lineno}, "
            f"colonne {exc.colno}. Corrigez le fichier modifie."
        )
    except (OSError, UnicodeError):
        return report("Fichier JSON illisible ou encodage UTF-8 invalide.")
    return 0


if __name__ == "__main__":
    sys.exit(main())

Le contrôle ignore les fichiers qui ne se terminent pas par .json. Il ne lance aucune commande construite à partir du chemin reçu : les espaces dans les noms de fichiers restent de simples caractères. Il ne recopie pas le contenu du document dans le message d'erreur.

Ce script vérifie uniquement ce que le parseur json de Python accepte. Il ne valide ni schéma métier, ni champs obligatoires, ni unicité des clés. Il n'est pas adapté aux fichiers JSON avec commentaires. Pour ces besoins, choisissez un validateur spécifique et testez-le séparément.

2. Déclarer le hook dans settings.json

Pour un réglage partagé avec le projet, utilisez .claude/settings.json. Pour un essai personnel limité à ce projet, utilisez .claude/settings.local.json. Notre guide de configuration Claude Code détaille la portée de ces fichiers.

Voici la configuration complète pour un fichier de réglages vide :

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/hooks/check-json.py\"",
            "timeout": 10
          }
        ]
      }
    ]
  }
}

La variable CLAUDE_PROJECT_DIR permet de référencer le script depuis la racine du projet. Les guillemets protègent le chemin si le dossier du projet contient des espaces. Le script est passé à Python, il n'a donc pas besoin d'être rendu exécutable.

Si votre fichier contient déjà des réglages, fusionnez ce bloc sans les écraser. S'il existe déjà une clé hooks, ajoutez l'événement à cet objet. Si PostToolUse existe déjà, ajoutez votre configuration à son tableau. Ne créez pas plusieurs clés JSON identiques.

Vérifiez la syntaxe de votre fichier de réglages avec python3 -m json.tool .claude/settings.json. Cette commande affiche le document : ne partagez pas sa sortie si vos réglages contiennent des informations privées. Elle vérifie la syntaxe JSON, pas la validité du schéma de configuration Claude Code.

3. Tester le script sans appeler un modèle

Avant de relier un script à votre assistant, vérifiez son comportement indépendamment. Placez ce test dans test-hook.py à la racine du projet. Il crée ses fichiers dans un répertoire temporaire et envoie un événement simulé au script.

import json
import subprocess
import sys
import tempfile
from pathlib import Path

script = Path(".claude/hooks/check-json.py").resolve()
with tempfile.TemporaryDirectory(prefix="test hook ") as folder:
    root = Path(folder)
    for name, content, expected in [
        ("valide.json", '{"active": true}', 0),
        ("invalide.json", '{"active": }', 2),
        ("nom avec espaces.json", '{"count": 3}', 0),
        ("notes.txt", "pas du JSON", 0),
    ]:
        path = root / name
        path.write_text(content, encoding="utf-8")
        event = {"tool_name": "Write", "tool_input": {"file_path": str(path)}}
        result = subprocess.run(
            [sys.executable, str(script)],
            input=json.dumps(event), text=True, capture_output=True
        )
        assert result.returncode == expected, (name, result.stderr)
        print(name, result.returncode)

Lancez python3 test-hook.py. Vous devez obtenir, dans l'ordre, les codes 0, 2, 0, 0. Ces quatre cas ont été exécutés pour ce tutoriel. Ils vérifient notamment qu'un chemin avec espaces est accepté et qu'un fichier texte est ignoré.

Dans un hook PostToolUse, le code 2 transmet le message d'erreur standard à Claude. Il ne bloque pas rétroactivement l'outil qui vient de réussir. Le comportement d'un même code de sortie dépend de l'événement : consultez le tableau officiel des codes de sortie avant de réutiliser ce script ailleurs.

4. Vérifier le déclenchement dans Claude Code

Ouvrez une session dans le projet de test. Utilisez /hooks pour vérifier la présence de votre hook, son événement, sa commande et le fichier de réglages dont il provient. Le menu est un navigateur de configuration en lecture seule ; les modifications se font dans le fichier JSON.

Demandez ensuite une petite modification d'un fichier JSON de démonstration avec l'outil Write ou Edit. Observez l'outil réellement utilisé. Si Claude écrit le fichier avec une commande Bash, votre matcher ne correspond pas et ce contrôle ne s'exécute pas.

Pour un essai d'erreur, utilisez uniquement un fichier jetable, jamais la configuration de votre application. Vérifiez qu'une écriture invalide produit un retour, puis qu'une correction fait disparaître l'erreur. Cette vérification d'intégration reste à effectuer dans votre environnement : les tests autonomes précédents ne la remplacent pas.

Pourquoi mon hook ne fonctionne-t-il pas ?

SymptômeVérification utile
Le hook n'apparaît pas dans /hooksVérifiez le projet ouvert, le fichier de réglages et sa syntaxe
Le script fonctionne seul mais rien ne se passe après une modificationVérifiez si Claude utilise Edit, Write ou un autre outil
Python est introuvableVérifiez le PATH de l'environnement qui lance Claude Code ; adaptez le chemin de Python si nécessaire
Le script est introuvableVérifiez son emplacement sous .claude/hooks et les guillemets du chemin
Le fichier invalide reste sur disqueC'est attendu : PostToolUse intervient après l'écriture
Le JSON est accepté mais l'application échoueLa syntaxe ne vérifie pas les exigences métier ni le schéma
Aucun message en cas de succèsNotre script termine silencieusement avec le code 0

Pour inspecter l'exécution, la documentation prévoit claude --debug et les journaux sous ~/.claude/debug/. Ce mode écrit des logs ; il ne les affiche pas directement dans le terminal. Relisez et nettoyez les journaux avant de les partager.

Passer d'un essai individuel à une règle d'équipe

Avant de partager ce hook, fixez son périmètre : outils concernés, extensions, taille des fichiers et temps d'exécution acceptable. Notre exemple lit le document entier en mémoire ; réservez-le à de petits fichiers de configuration. Ne l'appliquez pas sans adaptation à des exports volumineux.

Versionnez le script et, si la règle est commune, sa configuration projet. Faites relire les commandes comme du code : un hook s'exécute sur le poste qui utilise le projet. Conservez une procédure simple de retour arrière, en retirant uniquement l'entrée ajoutée à PostToolUse.

Enfin, gardez un contrôle indépendant avant livraison. Une modification par Bash, un autre outil ou un éditeur externe n'est pas couverte par notre matcher. Pour surveiller les modifications d'un fichier quelle qu'en soit l'origine, la documentation actuelle décrit aussi l'événement FileChanged ; c'est un autre périmètre à étudier, pas une propriété de l'exemple présenté ici.

Le bon résultat n'est pas « nous avons installé des hooks ». C'est une erreur précise détectée au bon moment, avec un message exploitable, sans ralentir chaque action. Pour adapter cette méthode aux conventions de votre dépôt et former les personnes qui la maintiendront, découvrez notre formation Claude Code pour équipes.

Sources et périmètre de vérification

Solution recommandée

Automatisez votre SEO avec PilotRanker

La solution IA développée par Kairia pour produire du contenu SEO en continu, sans effort technique.

Découvrir PilotRanker

Articles liés

CLAUDE.md : le guide complet du fichier qui pilote Claude Code
Claude Code
CLAUDE.md

CLAUDE.md : le guide complet du fichier qui pilote Claude Code

Écrire un CLAUDE.md qui change vraiment le comportement de Claude Code : hiérarchie de chargement, imports, règles efficaces et gouvernance en équipe.

Lire l'article →
La configuration Claude Code parfaite en 2026 : le guide complet
Claude Code
IA

La configuration Claude Code parfaite en 2026 : le guide complet

Configurer Claude Code en 2026 : settings.json, permissions, hooks, status line et CLAUDE.md. La configuration complète, fichier par fichier.

Lire l'article →
Vibecode : créer une vraie application mobile depuis son iPhone, en quelques minutes
Vibecode
IA

Vibecode : créer une vraie application mobile depuis son iPhone, en quelques minutes

Vibecode permet de développer des applications mobiles complètes directement depuis un iPhone grâce à l’IA. Analyse experte, usages, limites et avis professionnel.

Lire l'article →
Réserver 30 minutes