Files
claude-code-best-practice/fr/.claude/hooks/HOOKS-README.md
T
2026-06-02 23:24:21 +02:00

16 KiB
Raw Blame History

HOOKS-README

Contient tous les détails, scripts et instructions pour les hooks.

Vue densemble des événements de hook - 27 hooks officiels

Claude Code fournit plusieurs événements de hook qui sexécutent à différents moments du workflow :

# Hook Description Options
1 PreToolUse Sexécute avant les appels doutils (peut les bloquer) async, timeout: 5000, tool_use_id
2 PermissionRequest Sexécute lorsque Claude Code demande une permission à lutilisateur async, timeout: 5000, permission_suggestions
3 PostToolUse Sexécute après la réussite des appels doutils async, timeout: 5000, tool_response, tool_use_id
4 PostToolUseFailure Sexécute après l’échec dappels doutils async, timeout: 5000, error, is_interrupt, tool_use_id
5 UserPromptSubmit Sexécute lorsque lutilisateur soumet un prompt, avant que Claude le traite async, timeout: 5000, prompt
6 Notification Sexécute lorsque Claude Code envoie des notifications async, timeout: 5000, notification_type, message, title
7 Stop Sexécute lorsque Claude Code termine sa réponse async, timeout: 5000, stop_reason, last_assistant_message, stop_hook_active
8 SubagentStart Sexécute lorsque les tâches de sous-agent démarrent async, timeout: 5000, agent_id, agent_type
9 SubagentStop Sexécute lorsque les tâches de sous-agent se terminent async, timeout: 5000, agent_id, agent_type, last_assistant_message, agent_transcript_path, stop_hook_active
10 PreCompact Sexécute avant que Claude Code lance une opération de compactage async, timeout: 5000, once, compact_trigger
11 PostCompact Sexécute après la fin dune opération de compactage Claude Code async, timeout: 5000, compact_trigger
12 SessionStart Sexécute lorsque Claude Code démarre une nouvelle session ou reprend une session existante async, timeout: 5000, once, agent_type, model, source
13 SessionEnd Sexécute lorsquune session Claude Code se termine async, timeout: 5000, once, reason
14 Setup Sexécute lorsque Claude Code lance la commande /setup pour initialiser un projet async, timeout: 30000
15 TeammateIdle Sexécute lorsquun agent teammate devient inactif (agent teams expérimentaux) async, timeout: 5000, teammate_name, team_name
16 TaskCreated Sexécute lorsquune tâche est créée via loutil TaskCreate (agent teams expérimentaux) async, timeout: 5000, task_id, task_subject, task_description, teammate_name, team_name
17 TaskCompleted Sexécute lorsquune tâche en arrière-plan se termine (agent teams expérimentaux) async, timeout: 5000, task_id, task_subject, task_description, teammate_name, team_name
18 ConfigChange Sexécute lorsquun fichier de configuration change pendant une session async, timeout: 5000, file_path, config_source
19 WorktreeCreate Sexécute lorsque lisolation par worktree dagent crée des worktrees pour une configuration VCS personnalisée async, timeout: 5000, worktree_path, isolation_reason
20 WorktreeRemove Sexécute lorsque lisolation par worktree dagent supprime des worktrees pour le démontage VCS personnalisé async, timeout: 5000, worktree_path, removal_reason
21 InstructionsLoaded Sexécute lorsque CLAUDE.md ou des fichiers .claude/rules/*.md sont chargés dans le contexte async, timeout: 5000, file_path, memory_type, load_reason, globs, trigger_file_path, parent_file_path
22 Elicitation Sexécute lorsquun serveur MCP demande une saisie utilisateur pendant un appel doutil async, timeout: 5000, server_name, tool_name, elicitation_schema
23 ElicitationResult Sexécute après la réponse de lutilisateur à une elicitation MCP, avant lenvoi de la réponse au serveur async, timeout: 5000, server_name, tool_name, user_response
24 StopFailure Sexécute lorsque le tour se termine à cause dune erreur API (rate limit, échec dauth, etc.) async, timeout: 5000, error_type, error_message, last_assistant_message
25 CwdChanged Sexécute lorsque le répertoire de travail change pendant une session (gestion denvironnement réactive, par exemple direnv) async, timeout: 5000, old_cwd, new_cwd
26 FileChanged Sexécute lorsque des fichiers surveillés changent pendant une session (gestion denvironnement réactive, par exemple direnv). Nécessite matcher avec des basenames séparés par des pipes (par exemple .envrc|.env) pour préciser quels fichiers surveiller async, timeout: 5000, file_path, changed_reason
27 PermissionDenied Sexécute après quun classificateur en mode auto refuse un appel doutil. Retourne {retry: true} pour indiquer au modèle quil peut réessayer async, timeout: 5000, tool_name, tool_input, tool_use_id, reason

Note : les hooks 15-17 (TeammateIdle, TaskCreated et TaskCompleted) nécessitent la fonctionnalité expérimentale agent teams. Définis CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 au lancement de Claude Code pour les activer.

Non présents dans la documentation officielle

Les éléments suivants existent dans le Claude Code Changelog, mais ne sont pas listés dans la référence officielle des hooks :

Élément Ajouté dans Référence changelog Notes
Hook Setup v2.1.10 "Added new Setup hook event that can be triggered via --init, --init-only, or --maintenance CLI flags for repository setup and maintenance operations" Non listé dans la page de référence officielle des hooks (26 hooks listés, Setup exclu)
Hooks dans le frontmatter dagent v2.1.0 "Added hooks support to agent frontmatter, allowing agents to define PreToolUse, PostToolUse, and Stop hooks scoped to the agent's lifecycle" Le changelog ne mentionne que 3 hooks, mais les tests confirment que 6 hooks se déclenchent réellement dans les sessions dagent : PreToolUse, PostToolUse, PermissionRequest, PostToolUseFailure, Stop, SubagentStop. Les 27 hooks ne sont pas tous pris en charge.

Prérequis

Avant dutiliser les hooks, assure-toi davoir Python 3 installé sur ton système.

Logiciels requis

Toutes plateformes (Windows, macOS, Linux)

  • Python 3 : requis pour exécuter les scripts de hook
  • Vérifier linstallation : python3 --version

Instructions dinstallation :

  • Windows : télécharger depuis python.org ou installer via winget install Python.Python.3
  • macOS : installer via brew install python3 (nécessite Homebrew)
  • Linux : installer via sudo apt install python3 (Ubuntu/Debian) ou sudo yum install python3 (RHEL/CentOS)

Lecteurs audio (facultatif - détectés automatiquement)

Les scripts de hook détectent et utilisent automatiquement le lecteur audio approprié à ta plateforme :

  • macOS : utilise afplay (intégré, aucune installation requise)
  • Linux : utilise paplay depuis pulseaudio-utils — installer via sudo apt install pulseaudio-utils
  • Windows : utilise le module intégré winsound (inclus avec Python)

Comment les hooks sont exécutés

Les hooks sont configurés dans .claude/settings.json pour sexécuter directement avec Python 3 :

{
  "type": "command",
  "command": "python3 .claude/hooks/scripts/hooks.py"
}

Configurer les hooks (activer/désactiver)

Les hooks peuvent être facilement activés ou désactivés aux niveaux global et individuel.

Désactiver tous les hooks dun coup

Modifie .claude/settings.local.json et définis :

{
  "disableAllHooks": true
}

Note : le fichier .claude/settings.local.json est ignoré par git, donc chaque utilisateur peut configurer ses préférences de hooks sans affecter les paramètres partagés de l’équipe dans .claude/settings.json.

Managed Settings : si un administrateur a configuré des hooks via des paramètres de politique gérée, disableAllHooks défini dans les paramètres utilisateur, projet ou locaux ne peut pas désactiver ces hooks gérés (corrigé en v2.1.49).

Désactiver des hooks individuels

Pour un contrôle plus granulaire, tu peux désactiver des hooks spécifiques en modifiant les fichiers de configuration des hooks.

Fichiers de configuration

Il existe deux fichiers de configuration pour gérer les hooks individuels :

  1. .claude/hooks/config/hooks-config.json - Configuration partagée/par défaut, committée dans git
  2. .claude/hooks/config/hooks-config.local.json - Tes surcharges personnelles (ignorées par git)

Le fichier de configuration local (.local.json) est prioritaire sur la configuration partagée, ce qui permet à chaque développeur de personnaliser le comportement des hooks sans affecter l’équipe.

Configuration partagée

Modifie .claude/hooks/config/hooks-config.json pour les valeurs par défaut de l’équipe :

{
  "disableLogging": false,
  "disablePreToolUseHook": false,
  "disablePermissionRequestHook": false,
  "disablePostToolUseHook": false,
  "disablePostToolUseFailureHook": false,
  "disableUserPromptSubmitHook": false,
  "disableNotificationHook": false,
  "disableStopHook": false,
  "disableSubagentStartHook": false,
  "disableSubagentStopHook": false,
  "disablePreCompactHook": false,
  "disablePostCompactHook": false,
  "disableElicitationHook": false,
  "disableElicitationResultHook": false,
  "disableStopFailureHook": false,
  "disableSessionStartHook": false,
  "disableSessionEndHook": false,
  "disableSetupHook": false,
  "disableTeammateIdleHook": false,
  "disableTaskCompletedHook": false,
  "disableConfigChangeHook": false,
  "disableWorktreeCreateHook": false,
  "disableWorktreeRemoveHook": false,
  "disableInstructionsLoadedHook": false,
  "disableCwdChangedHook": false,
  "disableFileChangedHook": false,
  "disablePermissionDeniedHook": false
}

Options de configuration :

  • disableLogging : définir à true pour désactiver la journalisation des événements de hook dans .claude/hooks/logs/hooks-log.jsonl (utile pour éviter la croissance du fichier de log)

Configuration locale (surcharges personnelles)

Crée ou modifie .claude/hooks/config/hooks-config.local.json pour tes préférences personnelles :

{
  "disableLogging": true,
  "disablePostToolUseHook": true,
  "disableSessionStartHook": true
}

Dans cet exemple, la journalisation est désactivée, et les hooks PostToolUse et SessionStart sont surchargés localement. Tous les autres hooks utiliseront les valeurs de configuration partagée.

Note : les toggles de hooks individuels sont vérifiés par le script de hook (.claude/hooks/scripts/hooks.py). Les paramètres locaux surchargent les paramètres partagés ; si un hook est désactivé, le script se termine silencieusement sans jouer de son ni exécuter de logique de hook.

Text to Speech (TTS)

Site web utilisé pour générer les sons : https://elevenlabs.io/ Voix utilisée : Samara X

Hooks dans le frontmatter dagent

Claude Code 2.1.0 a introduit la prise en charge de hooks spécifiques aux agents, définis dans les fichiers de frontmatter dagent. Ces hooks ne sexécutent que dans le cycle de vie de lagent et prennent en charge un sous-ensemble d’événements.

Hooks dagent pris en charge

Les hooks de frontmatter dagent prennent en charge 6 hooks (pas les 27). Le changelog ne mentionnait initialement que 3 hooks, mais les tests confirment que 6 hooks se déclenchent réellement dans les sessions dagent :

  • PreToolUse : sexécute avant que lagent utilise un outil
  • PostToolUse : sexécute après quun agent termine une utilisation doutil
  • PermissionRequest : sexécute lorsquun outil nécessite une permission utilisateur
  • PostToolUseFailure : sexécute après l’échec dun appel doutil
  • Stop : sexécute lorsque lagent termine
  • SubagentStop : sexécute lorsquun sous-agent termine

Note : le changelog v2.1.0 ne mentionne que 3 hooks : "Added hooks support to agent frontmatter, allowing agents to define PreToolUse, PostToolUse, and Stop hooks scoped to the agent's lifecycle". Cependant, les tests avec claude-code-hook-agent confirment que 6 hooks se déclenchent réellement dans les sessions dagent. Les 21 hooks restants (par exemple Notification, SessionStart, SessionEnd, etc.) ne se déclenchent pas dans les contextes dagent.

Mise à jour (février 2026) : la référence officielle des hooks indique désormais "All hook events are supported" pour les hooks de frontmatter de skill/agent. Cela peut signifier que la prise en charge sest étendue au-delà des 6 hooks testés initialement. Il est recommandé de retester pour vérifier si des hooks supplémentaires se déclenchent maintenant dans les sessions dagent.

Dossiers de sons dagent

Les sons spécifiques aux agents sont stockés dans des dossiers séparés :

  • .claude/hooks/sounds/agent_pretooluse/
  • .claude/hooks/sounds/agent_posttooluse/
  • .claude/hooks/sounds/agent_permissionrequest/
  • .claude/hooks/sounds/agent_posttoolusefailure/
  • .claude/hooks/sounds/agent_stop/
  • .claude/hooks/sounds/agent_subagentstop/

Créer un agent avec hooks

  1. Crée un fichier de définition dagent dans .claude/agents/ :
---
name: my-agent
description: Description of what this agent does
hooks:
  PreToolUse:
    - type: command
      command: python3 ${CLAUDE_PROJECT_DIR}/.claude/hooks/scripts/hooks.py --agent=my-agent
      timeout: 5000
      async: true
      statusMessage: PreToolUse
  PostToolUse:
    - type: command
      command: python3 ${CLAUDE_PROJECT_DIR}/.claude/hooks/scripts/hooks.py --agent=my-agent
      timeout: 5000
      async: true
      statusMessage: PostToolUse
  PermissionRequest:
    - type: command
      command: python3 ${CLAUDE_PROJECT_DIR}/.claude/hooks/scripts/hooks.py --agent=my-agent
      timeout: 5000
      async: true
      statusMessage: PermissionRequest
  PostToolUseFailure:
    - type: command
      command: python3 ${CLAUDE_PROJECT_DIR}/.claude/hooks/scripts/hooks.py --agent=my-agent
      timeout: 5000
      async: true
      statusMessage: PostToolUseFailure
  Stop:
    - type: command
      command: python3 ${CLAUDE_PROJECT_DIR}/.claude/hooks/scripts/hooks.py --agent=my-agent
      timeout: 5000
      async: true
      statusMessage: Stop
  SubagentStop:
    - type: command
      command: python3 ${CLAUDE_PROJECT_DIR}/.claude/hooks/scripts/hooks.py --agent=my-agent
      timeout: 5000
      async: true
      statusMessage: SubagentStop
---

Your agent instructions here...
  1. Ajoute les fichiers son aux dossiers de sons dagent :
    • agent_pretooluse/agent_pretooluse.wav
    • agent_posttooluse/agent_posttooluse.wav
    • agent_permissionrequest/agent_permissionrequest.wav
    • agent_posttoolusefailure/agent_posttoolusefailure.wav
    • agent_stop/agent_stop.wav
    • agent_subagentstop/agent_subagentstop.wav

Exemple : agent Weather Fetcher

Voir .claude/agents/claude-code-hook-agent.md pour un exemple complet dagent avec hooks configurés.