Retour aux articles
16 min de lecture

Automatisation des workflows avec Claude Code : Hooks

Par Dorian Laurenceau

Mis à jour le

📅 Dernière révision : 24 avril 2026. Mise à jour avec les retours et observations d'avril 2026.

Automatisation des workflows avec Claude Code

Claude Code n'est pas qu'un assistant de codage, c'est une plateforme d'automatisation. Avec les hooks, les commandes personnalisées et les intégrations de scripts shell, vous pouvez construire des workflows puissants qui s'exécutent automatiquement, appliquent des standards et vous font gagner des heures chaque semaine.

Ce guide vous apprend à automatiser comme un utilisateur avancé.


1. Le système d'événements : Comment fonctionnent les hooks

Les hooks sont des scripts qui s'exécutent automatiquement lorsque des événements spécifiques se produisent dans Claude Code. Pensez-les comme des hooks git, mais pour votre assistant IA.

Événements disponibles

Types d'événements Claude Code

ÉvénementQuand il se déclencheCas d'usage courant
PreToolUseAvant l'exécution de tout outilValidation de sécurité, blocage de commandes dangereuses
PostToolUseAprès la fin de tout outilFormatage automatique, linting, journalisation
UserPromptSubmitQuand vous envoyez un messageEnrichissement du contexte, injection du statut git
SessionStartLa session commenceInitialisation de l'environnement
SessionEndLa session se termineNettoyage, création de points de sauvegarde
NotificationClaude envoie une notificationAlertes sonores, messages Slack
StopL'utilisateur interrompt (Ctrl+C)Arrêt gracieux, sauvegarde d'état

← Scroll horizontally →

Le flux d'événements

Voici comment les événements circulent lors d'une interaction typique :

Flux d'événements : L'utilisateur tape un message

1. UserPromptSubmit se déclenche

Votre hook peut enrichir le prompt avec du contexte (statut git, branche courante, etc.)

💡 Cela s'exécute AVANT que Claude voie votre message.

1/5

Visualiseur interactif du flux de hooks

Explorez le fonctionnement des hooks avec ce diagramme de flux interactif. Cliquez sur chaque type de hook pour voir des exemples de code en Bash et PowerShell :


Les hooks, c'est le moment où Claude Code cesse d'être un outil de chat pour devenir de l'infrastructure réelle, et le retour de la communauté reflète ce basculement. Sur r/devops et r/ClaudeAI, les prises de position enthousiastes du début (« j'ai automatisé tout mon workflow ! ») sont maintenant tempérées par les prises plus sobres qui suivent (« j'ai passé un week-end à déboguer pourquoi mon pre-commit se déclenche deux fois »). Les deux sont vraies. Les hooks déverrouillent des garde-fous déterministes autour d'un agent non déterministe — exactement la combinaison nécessaire pour la confiance — mais chaque hook ajouté est un nouveau mode d'échec à porter.

Ce qui vaut la peine d'être automatisé, d'après ce que les praticiens gardent réellement : les garde-fous de sécurité (bloquer les écritures sur main, imposer les conventional commits, empêcher la lecture de .env), le formatage et le linting en PreToolUse, et une notification sur les sessions longues. Ce qui ne vaut pas encore la peine : tout ce qui modifie un état de façon irréversible sur la base d'une décision du modèle. La référence hooks d'Anthropic est claire : les hooks tournent avec vos permissions locales — donc un hook qui déraille peut causer de vrais dégâts à vraie vitesse.

Règle opérationnelle honnête : chaque hook commence sa vie comme un script que vous pouvez lancer en standalone. S'il ne marche pas indépendamment, il ne marchera pas sous Claude Code — vous aurez juste plus de mal à le déboguer parce que l'échec sera emmêlé avec la sortie de l'agent. Testez en isolation, intégrez prudemment, et versionnez vos scripts de hooks à côté du code qu'ils protègent.


2. Créer votre premier hook

Les hooks sont enregistrés dans votre fichier de paramètres et pointent vers des scripts shell.

Enregistrement des hooks

Ajoutez les hooks dans .claude/settings.json :

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash|Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": ".claude/hooks/security-check.sh",
            "timeout": 5000
          }
        ]
      }
    ]
  }
}

Champs de configuration

Configuration des hooks

ChampFonctionExemple
matcherRegex pour les outils qui déclenchent ce hook"Bash|Edit|Write"
typeToujours "command""command"
commandChemin vers votre script de hook".claude/hooks/security.sh"
timeoutTemps d'exécution maximum (millisecondes)5000
asyncExécuter en arrière-plan (non bloquant)true ou false (par défaut)

← Scroll horizontally →

Entrée et sortie des hooks

Votre hook reçoit du JSON sur stdin :

{
  "tool_name": "Bash",
  "tool_input": {
    "command": "rm -rf node_modules"
  },
  "session_id": "abc123",
  "cwd": "/my-project"
}

Votre hook peut produire du JSON en retour :

{
  "systemMessage": "Auto-formatted 3 files",
  "hookSpecificOutput": {
    "additionalContext": "Current branch: feature/auth"
  }
}

Codes de sortie

Codes de sortie des hooks

Code de sortieSignificationRésultat
0SuccèsAutoriser la poursuite de l'opération
2BlocageARRÊTER l'opération (PreToolUse uniquement)
AutreErreurJournaliser l'erreur et continuer

← Scroll horizontally →

Vérification rapide

Vous voulez empêcher Claude d'exécuter des commandes 'rm -rf'. Quel événement de hook devez-vous utiliser ?


3. Hooks synchrones vs asynchrones

Claude Code prend en charge deux modèles d'exécution pour les hooks :

Synchrone (par défaut)

  • →Claude attend la fin du hook
  • →Le hook peut fournir un retour via stdout
  • →Le code de sortie 2 peut bloquer les opérations
  • →À utiliser pour : Validation de sécurité, vérification de types

Asynchrone

  • →Claude continue immédiatement
  • →Le hook s'exécute en arrière-plan
  • →Ne peut pas bloquer les opérations ni fournir de retour
  • →À utiliser pour : Journalisation, notifications, formatage
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": ".claude/hooks/auto-format.sh",
            "async": true
          }
        ]
      }
    ]
  }
}

Guide de décision sync vs async

Usage du hookModeRaison
Validation de sécuritéSyncDoit bloquer les opérations dangereuses
Vérification de types (tsc, mypy)SyncLes erreurs doivent bloquer et déclencher des corrections
Formatage de code (Prettier)AsyncCosmétique, pas de retour nécessaire
Journalisation/métriquesAsyncPur effet de bord
Notifications SlackAsyncAlerte utilisateur, non bloquant
Exécution de testsSyncLes résultats influencent l'action suivante

← Scroll horizontally →


4. Exemples de hooks essentiels

Bloqueur de sécurité (PreToolUse)

Bloquez les commandes dangereuses avant leur exécution :

#!/bin/bash
# .claude/hooks/security-blocker.sh

INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // ""')

# Dangerous patterns to block
DANGEROUS=(
    "rm -rf /"
    "rm -rf ~"
    "rm -rf *"
    "sudo rm"
    "git push --force origin main"
    "git push -f origin main"
    "> /dev/sda"
)

for pattern in "${DANGEROUS[@]}"; do
    if [[ "$COMMAND" == *"$pattern"* ]]; then
        echo "BLOCKED: Dangerous command: $pattern" >&2
        exit 2  # Exit code 2 = BLOCK
    fi
done

exit 0  # Allow the command

Formateur automatique (PostToolUse)

Formater automatiquement le code après chaque édition :

#!/bin/bash
# .claude/hooks/auto-format.sh

INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""')

# Only run for Edit/Write
if [[ "$TOOL_NAME" != "Edit" && "$TOOL_NAME" != "Write" ]]; then
    exit 0
fi

# Format based on file type
if [[ "$FILE_PATH" =~ \.(ts|tsx|js|jsx|json|css)$ ]]; then
    npx prettier --write "$FILE_PATH" 2>/dev/null
elif [[ "$FILE_PATH" =~ \.py$ ]]; then
    black "$FILE_PATH" 2>/dev/null
fi

exit 0

Injecteur de contexte Git (UserPromptSubmit)

Ajouter automatiquement le contexte git à chaque prompt :

#!/bin/bash
# .claude/hooks/git-context.sh

BRANCH=$(git branch --show-current 2>/dev/null || echo "not a git repo")
STAGED=$(git diff --cached --stat 2>/dev/null | tail -1 || echo "none")
UNSTAGED=$(git diff --stat 2>/dev/null | tail -1 || echo "none")

cat << EOF
{
  "hookSpecificOutput": {
    "additionalContext": "[Git] Branch: $BRANCH | Staged: $STAGED | Unstaged: $UNSTAGED"
  }
}
EOF

exit 0

5. Commandes slash personnalisées

Les commandes sont des fichiers Markdown qui définissent des workflows réutilisables. Ce sont des macros pour Claude Code.

Structure des commandes

Les commandes vivent dans .claude/commands/ :

.claude/commands/
├── tech/
│   ├── commit.md      → /tech:commit
│   └── pr.md          → /tech:pr
├── product/
│   └── scope.md       → /product:scope
└── debug/
    └── trace.md       → /debug:trace

Modèle de commande

# Command Name

## Purpose
[Ce que fait cette commande]

## Process

1. **Étape 1**
   [Instructions]

2. **Étape 2**
   [Instructions]

## Arguments
If $ARGUMENTS[0] provided: [utiliser comme X]
If no arguments: [comportement par défaut]

## Output Format
[Structure attendue]

Exemple : Commande de commit

# Smart Commit

## Purpose
Create a well-formatted git commit following Conventional Commits.

## Process

1. **Check Status**
   Run `git status` and `git diff` to understand changes.

2. **Determine Type**
   - `feat`: New feature
   - `fix`: Bug fix
   - `refactor`: Code restructuring
   - `docs`: Documentation
   - `test`: Test changes

3. **Draft Message**
   Format: `type(scope): description`
   
4. **Stage and Commit**
   ```bash
   git add [relevant files]
   git commit -m "[message]"

Arguments

If $ARGUMENTS[0] provided: Use as commit message hint Example: /tech:commit add user auth

Output

Commit: [hash] [message] Files: [number] changed


### Exemple : Commande de cadrage de problème

```markdown
# Problem Framer

## Purpose
Challenge and refine problem definitions before solution design.

## Process

1. **Capture Initial Problem**
   Record the problem as stated.

2. **5 Whys Analysis**
   Ask "Why?" 5 times to find root cause:
   - Why 1: [First answer]
   - Why 2: [Deeper]
   - Why 3: [Deeper still]
   - Why 4: [Getting to root]
   - Why 5: [Root cause]

3. **Stakeholder Analysis**
   - Who is affected?
   - Who decides?
   - Who benefits?

4. **Reframe**
   Write: "How might we [action] for [user] so that [outcome]?"

## Output
**Original**: [as stated]
**Root Cause**: [from 5 Whys]
**Refined**: "How might we [X] for [Y] so that [Z]?"
Vérification rapide

Quel est l'avantage des commandes personnalisées par rapport à taper les instructions à chaque fois ?


6. Scripts shell vs agents IA

Tout n'a pas besoin d'IA. Choisissez le bon outil pour la tâche :

Script shell vs Agent IA

Type de tâcheMeilleur outilPourquoi
Déterministe (créer une branche, formater un fichier)Script shellRapide, prévisible, pas de coût API
Basé sur des patterns (chercher des secrets)Script shell + regexFiable pour les patterns connus
Interprétation nécessaire (revue de code)Agent IANécessite du jugement
Dépendant du contexte (correspond-il au cahier des charges ?)Agent IANécessite de la compréhension

← Scroll horizontally →

La règle d'or

Si vous pouvez écrire une regex ou une condition simple pour le faire, utilisez un script shell. Si cela nécessite de la « compréhension » ou du « jugement », utilisez l'IA.

Exemple : Workflow de PR

# DÉTERMINISTE (script shell) : créer la branche, pusher, ouvrir la PR
git checkout -b feature/user-auth
git push -u origin feature/user-auth
gh pr create --title "Add user auth" --body "..."

# INTERPRÉTATION (agent IA) : vérifier la qualité du code
# → Utilisez les capacités de revue de code de Claude

7. Construire un workflow complet

Construisons un workflow prêt pour la production qui combine hooks, commandes et scripts.

Le workflow de développement

Pipeline de développement automatisé

Démarrage de session : Initialiser le contexte

Hook : Charger l'état du projet, la branche git, le handoff de la dernière session. Fichier : .claude/hooks/session-init.sh

💡 Cela prépare Claude avec le contexte avant que vous ne tapiez quoi que ce soit.

1/6

Configuration complète

{
  "hooks": {
    "SessionStart": [
      {
        "matcher": ".*",
        "hooks": [{
          "type": "command",
          "command": ".claude/hooks/session-init.sh"
        }]
      }
    ],
    "UserPromptSubmit": [
      {
        "matcher": ".*",
        "hooks": [{
          "type": "command",
          "command": ".claude/hooks/git-context.sh"
        }]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{
          "type": "command",
          "command": ".claude/hooks/security-blocker.sh",
          "timeout": 5000
        }]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [{
          "type": "command",
          "command": ".claude/hooks/auto-format.sh",
          "async": true
        }]
      }
    ],
    "SessionEnd": [
      {
        "matcher": ".*",
        "hooks": [{
          "type": "command",
          "command": ".claude/hooks/session-handoff.sh"
        }]
      }
    ]
  }
}

8. Bonnes pratiques

Conseils de développement de hooks

  1. →Commencez simple : Débutez avec un seul hook (comme le bloqueur de sécurité) avant de construire un pipeline complet
  2. →Testez hors-ligne : Exécutez vos scripts manuellement avant de les enregistrer comme hooks
  3. →Utilisez jq : Parsez l'entrée JSON de manière fiable avec jq
  4. →Journalisez tout : Ajoutez de la journalisation pour déboguer le comportement des hooks
  5. →Définissez des timeouts : Empêchez les hooks bloqués de bloquer Claude

Pièges courants

Pièges des hooks et solutions

ProblèmeCauseSolution
Le hook ne s'exécute jamaisLe matcher ne correspond pas au nom de l'outilTestez le pattern regex contre les noms d'outils exacts
Claude bloqué de manière inattendueCode de sortie 2 retourné accidentellementNe retournez 2 que pour des blocages intentionnels
Réponses lentesHook sync trop longUtilisez async: true pour les hooks non bloquants
Aucun retour visibleUtilisation d'async pour un hook de validationUtilisez sync pour les hooks qui doivent rapporter un statut
Le hook échoue silencieusementstderr non capturéSortez avec un code non-zéro + message sur stderr

← Scroll horizontally →

Vérification rapide

Vous avez un hook PostToolUse qui lance Prettier. Les réponses de Claude semblent lentes. Que faire ?


9. Avancé : Hook de handoff de session

Voici un hook de handoff de session complet qui capture votre travail :

#!/bin/bash
# .claude/hooks/session-handoff.sh

# Create handoff directory
mkdir -p claudedocs/handoffs

# Get session info
DATE=$(date +%Y-%m-%d)
TIME=$(date +%H:%M)
BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown")

# Get recent commits
COMMITS=$(git log --oneline -5 2>/dev/null || echo "No commits")

# Get changed files
CHANGED=$(git diff --name-only HEAD~5..HEAD 2>/dev/null || echo "No changes tracked")

# Create handoff file
cat > "claudedocs/handoffs/handoff-$DATE.md" << EOF
# Session Handoff - $DATE $TIME

## Branch
$BRANCH

## Recent Commits
$COMMITS

## Files Changed
$CHANGED

## Next Steps
[To be filled by Claude or user]

## Notes
[Session-specific notes]
EOF

echo "Created handoff: claudedocs/handoffs/handoff-$DATE.md"
exit 0
Click to expand

Résumé

Vous disposez maintenant des outils pour automatiser Claude Code comme un utilisateur avancé :

OutilFonctionEmplacement
HooksScripts automatiques déclenchés par événement.claude/settings.json
CommandesModèles de workflows réutilisables.claude/commands/
Scripts shellAutomatisation déterministe.claude/hooks/*.sh

Checklist de démarrage rapide

  • → Créer le répertoire .claude/hooks/
  • → Ajouter un hook bloqueur de sécurité (PreToolUse)
  • → Ajouter un hook formateur automatique (PostToolUse, async)
  • → Créer votre première commande personnalisée
  • → Tester avec une vraie tâche de développement

Continuez vers le Module 2 pour des exercices pratiques de construction de workflows d'automatisation en production.


Pour approfondir — guide gratuit

Approfondir cette méthode

Retrouvez les notions, les exemples et les activités du parcours associé.

D

Dorian Laurenceau

Développeur web et concepteur pédagogique

Dorian Laurenceau conçoit des parcours de formation en développement web et en intelligence artificielle. LearnIA propose ses méthodes, des exemples et des exercices pour apprendre à utiliser et vérifier les outils IA.

Prompt EngineeringLLMsFull-Stack DevelopmentLearning DesignReact
Publié le 17 janvier 2025Mis à jour le 24 avril 2026

Un cas pratique IA dans votre boîte mail

Méthodes, ressources et nouveaux exercices. Gratuit, avec désinscription à tout moment.

FAQ

Que sont les hooks Claude Code ?+

Les hooks sont des fonctions JavaScript qui s'exécutent avant ou après que Claude utilise un outil. Utilisez-les pour le formatage automatique, le linting, les vérifications de sécurité, les notifications ou toute logique personnalisée.

Où configurer les hooks ?+

Créez un répertoire .claude/hooks/ dans votre projet. Ajoutez des fichiers JavaScript comme pre-commit.js, post-edit.js, etc. Claude les exécutera automatiquement au moment approprié.

Les hooks peuvent-ils empêcher Claude de faire des modifications ?+

Oui, les pre-hooks peuvent annuler des opérations en levant des erreurs. Utilisez-les pour les portes de sécurité, la protection de fichiers sensibles ou l'application des standards de code.

Quelle est la différence entre les hooks et les skills ?+

Les skills sont des instructions qui guident le comportement de Claude. Les hooks sont du code qui s'exécute automatiquement quand Claude effectue des actions. Skills = quoi faire ; hooks = effets de bord pendant l'exécution.