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

260 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HOOKS-README
Contient tous les détails, scripts et instructions pour les hooks.
## Vue densemble des événements de hook - [27 hooks officiels](https://code.claude.com/docs/en/hooks)
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](https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md), mais ne sont **pas listés** dans la [référence officielle des hooks](https://code.claude.com/docs/en/hooks) :
| Élément | Ajouté dans | Référence changelog | Notes |
|---------|-------------|---------------------|-------|
| Hook `Setup` | [v2.1.10](https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md#2110) | "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](https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md#210) | "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](https://www.python.org/downloads/) ou installer via `winget install Python.Python.3`
- **macOS** : installer via `brew install python3` (nécessite [Homebrew](https://brew.sh/))
- **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 :
```json
{
"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 :
```json
{
"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 :
```json
{
"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 :
```json
{
"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](https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md#210) 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](https://code.claude.com/docs/en/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/` :
```markdown
---
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...
```
2. 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.