34 34
35Le tableau ci-dessous résume le moment où chaque événement se déclenche. La section [Événements de hook](#hook-events) documente le schéma d'entrée complet et les options de contrôle de décision pour chacun.35Le tableau ci-dessous résume le moment où chaque événement se déclenche. La section [Événements de hook](#hook-events) documente le schéma d'entrée complet et les options de contrôle de décision pour chacun.
36 36
37| Event | When it fires |37| Événement | Quand il se déclenche |
38| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |38| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
39| `SessionStart` | When a session begins or resumes |39| `SessionStart` | Quand une session commence ou reprend |
40| `Setup` | When you start Claude Code with `--init-only`, or with `--init` or `--maintenance` in `-p` mode. For one-time preparation in CI or scripts |40| `Setup` | Quand vous démarrez Claude Code avec `--init-only`, ou avec `--init` ou `--maintenance` en mode `-p`. Pour une préparation unique en CI ou dans les scripts |
41| `UserPromptSubmit` | When you submit a prompt, before Claude processes it |41| `UserPromptSubmit` | Quand vous soumettez une invite, avant que Claude la traite |
42| `UserPromptExpansion` | When a user-typed command expands into a prompt, before it reaches Claude. Can block the expansion |42| `UserPromptExpansion` | Quand une commande tapée par l'utilisateur se développe en une invite, avant qu'elle n'atteigne Claude. Peut bloquer l'expansion |
43| `PreToolUse` | Before a tool call executes. Can block it |43| `PreToolUse` | Avant qu'un appel d'outil s'exécute. Peut le bloquer |
44| `PermissionRequest` | When a tool call needs a permission decision |44| `PermissionRequest` | Quand un appel d'outil nécessite une décision de permission |
45| `PermissionDenied` | When auto mode denies a tool call, including denials without a classifier verdict. Use JSON `hookSpecificOutput.retry: true` to tell the model it may retry the denied tool call. Claude Code ignores `retry` when the classifier produced no verdict |45| `PermissionDenied` | Quand le mode automatique refuse un appel d'outil, y compris les refus sans verdict du classificateur. Utilisez la sortie JSON `hookSpecificOutput.retry: true` pour indiquer au modèle qu'il peut réessayer l'appel d'outil refusé. Claude Code ignore `retry` quand le classificateur n'a produit aucun verdict |
46| `PostToolUse` | After a tool call succeeds |46| `PostToolUse` | Après qu'un appel d'outil réussisse |
47| `PostToolUseFailure` | After a tool call fails |47| `PostToolUseFailure` | Après qu'un appel d'outil échoue |
48| `PostToolBatch` | After a full batch of parallel tool calls resolves, before the next model call |48| `PostToolBatch` | Après qu'un lot complet d'appels d'outils parallèles se résout, avant l'appel du modèle suivant |
49| `Notification` | When Claude Code sends a notification |49| `Notification` | Quand Claude Code envoie une notification |
50| `MessageDisplay` | While assistant message text is displayed |50| `MessageDisplay` | Pendant que le texte du message assistant s'affiche |
51| `SubagentStart` | When a subagent is spawned |51| `SubagentStart` | Quand un sous-agent est généré |
52| `SubagentStop` | When a subagent finishes |52| `SubagentStop` | Quand un sous-agent se termine |
53| `TaskCreated` | When a task is being created via `TaskCreate` |53| `TaskCreated` | Quand une tâche est en cours de création via `TaskCreate` |
54| `TaskCompleted` | When a task is being marked as completed |54| `TaskCompleted` | Quand une tâche est marquée comme complétée |
55| `Stop` | When Claude finishes responding |55| `Stop` | Quand Claude finit de répondre |
56| `StopFailure` | When the turn ends due to an API error |56| `StopFailure` | Quand le tour se termine en raison d'une erreur API |
57| `TeammateIdle` | When an [agent team](/docs/en/agent-teams) teammate is about to go idle |57| `TeammateIdle` | Quand un coéquipier d'une [équipe d'agents](/docs/fr/agent-teams) est sur le point de devenir inactif |
58| `InstructionsLoaded` | When a CLAUDE.md or `.claude/rules/*.md` file is loaded into context. Fires at session start and when files are lazily loaded during a session |58| `InstructionsLoaded` | Quand un fichier CLAUDE.md ou `.claude/rules/*.md` est chargé dans le contexte. Se déclenche au démarrage de la session et quand les fichiers sont chargés paresseusement pendant une session |
59| `ConfigChange` | When a configuration file changes during a session |59| `ConfigChange` | Quand un fichier de configuration change pendant une session |
60| `CwdChanged` | When the working directory changes, for example when Claude executes a `cd` command. Useful for reactive environment management with tools like direnv |60| `CwdChanged` | Quand le répertoire de travail change, par exemple quand Claude exécute une commande `cd`. Utile pour la gestion réactive de l'environnement avec des outils comme direnv |
61| `DirectoryAdded` | When a working directory is added mid-session via `/add-dir` or the SDK `register_repo_root` control request |61| `DirectoryAdded` | Quand un répertoire de travail est ajouté en milieu de session via `/add-dir` ou la demande de contrôle SDK `register_repo_root` |
62| `FileChanged` | When a watched file changes on disk. The `matcher` field specifies which filenames to watch |62| `FileChanged` | Quand un fichier surveillé change sur le disque. Le champ `matcher` spécifie les noms de fichiers à surveiller |
63| `WorktreeCreate` | When a worktree is being created via `--worktree`, `isolation: "worktree"`, or for a background session. Replaces default git behavior |63| `WorktreeCreate` | Quand un worktree est en cours de création via `--worktree`, `isolation: "worktree"`, ou pour une session en arrière-plan. Remplace le comportement git par défaut |
64| `WorktreeRemove` | When a worktree is being removed at session exit, when a subagent finishes, or when you delete a background session |64| `WorktreeRemove` | Quand un worktree est supprimé à la sortie de la session, quand un sous-agent se termine, ou quand vous supprimez une session en arrière-plan |
65| `PreCompact` | Before context compaction |65| `PreCompact` | Avant la compaction du contexte |
66| `PostCompact` | After context compaction completes |66| `PostCompact` | Après la compaction du contexte est complétée |
67| `PreModelSwitch` | Before Claude Code applies a model switch that you or a client requested. Can block the switch |67| `PreModelSwitch` | Avant que Claude Code applique un changement de modèle que vous ou un client avez demandé. Peut bloquer le changement |
68| `PostModelSwitch` | After the session's model changes, including changes Claude Code makes on its own, such as restoring the model when you resume a session |68| `PostModelSwitch` | Après que le modèle de la session change, y compris les changements que Claude Code effectue de lui-même, comme la restauration du modèle quand vous reprenez une session |
69| `Elicitation` | When an MCP server requests user input during a tool call |69| `Elicitation` | Quand un serveur MCP demande une entrée utilisateur pendant un appel d'outil |
70| `ElicitationResult` | After a user responds to an MCP elicitation, before the response is sent back to the server |70| `ElicitationResult` | Après qu'un utilisateur réponde à une élicitation MCP, avant que la réponse soit renvoyée au serveur |
71| `SessionEnd` | When a session terminates |71| `SessionEnd` | Quand une session se termine |
72 72
73<h3 id="how-a-hook-resolves">73<h3 id="how-a-hook-resolves">
74 Comment un hook se résout74 Comment un hook se résout
268| [Skill](/docs/fr/skills) frontmatter | Le reste de la session une fois que le skill est invoqué. Consultez [Hooks dans les skills et agents](#hooks-in-skills-and-agents) | Oui, défini dans le fichier du skill |268| [Skill](/docs/fr/skills) frontmatter | Le reste de la session une fois que le skill est invoqué. Consultez [Hooks dans les skills et agents](#hooks-in-skills-and-agents) | Oui, défini dans le fichier du skill |
269| [Subagent](/docs/fr/sub-agents) frontmatter | Pendant que ce subagent s'exécute | Oui, défini dans le fichier du subagent |269| [Subagent](/docs/fr/sub-agents) frontmatter | Pendant que ce subagent s'exécute | Oui, défini dans le fichier du subagent |
270 270
271Les sessions cloud sur [Claude Code sur le web](/docs/fr/claude-code-on-the-web) ne lisent pas votre `~/.claude/settings.json` local ; les hooks y proviennent du repo et des paramètres gérés par le serveur de votre organisation. Dans un [environnement auto-hébergé](/docs/fr/self-hosted-environments-configuration#permissions-and-tool-approval), Claude Code exécute également les hooks que l'opérateur a ensemencés à partir du `~/.claude/` de l'hôte du runner, et il exécute les hooks dans le fichier de paramètres gérés de l'image du runner lorsque ce fichier figure parmi les [sources gérées que Claude Code applique](/docs/fr/managed-settings#how-claude-code-combines-managed-sources), ce qui par défaut signifie uniquement lorsque ni les paramètres gérés par le serveur ni une politique Claude Code livrée par MDM ne fournissent le niveau géré. Consultez [ce qui se transfère de votre configuration](/docs/fr/cloud-environments#what-carries-over-from-your-setup) pour savoir quels fichiers atteignent une session cloud.271Les sessions cloud sur [Claude Code sur le web](/docs/fr/claude-code-on-the-web) ne lisent pas votre `~/.claude/settings.json` local ; les hooks y proviennent du repo, ce qui signifie son `.claude/settings.json` dans une session avec un seul référentiel et les plugins qu'il déclare dans n'importe quelle session, et à partir des paramètres gérés par le serveur de votre organisation. Dans un [environnement auto-hébergé](/docs/fr/self-hosted-environments-configuration#permissions-and-tool-approval), Claude Code exécute également les hooks que l'opérateur a ensemencés à partir du `~/.claude/` de l'hôte du runner, et il exécute les hooks dans le fichier de paramètres gérés de l'image du runner lorsque ce fichier figure parmi les [sources gérées que Claude Code applique](/docs/fr/managed-settings#how-claude-code-combines-managed-sources), ce qui par défaut signifie uniquement lorsque ni les paramètres gérés par le serveur ni une politique Claude Code livrée par MDM ne fournissent le niveau géré. Consultez [ce qui se transfère de votre configuration](/docs/fr/cloud-environments#what-carries-over-from-your-setup) pour savoir quels fichiers atteignent une session cloud.
272 272
273Pour plus de détails sur la résolution des fichiers de paramètres, consultez [paramètres](/docs/fr/settings).273Pour plus de détails sur la résolution des fichiers de paramètres, consultez [paramètres](/docs/fr/settings).
274 274
329| `CwdChanged` | pas de support de matcher | se déclenche toujours à chaque changement de répertoire |329| `CwdChanged` | pas de support de matcher | se déclenche toujours à chaque changement de répertoire |
330| `DirectoryAdded` | comment le répertoire a été ajouté | `slash_command`, `register_repo_root` |330| `DirectoryAdded` | comment le répertoire a été ajouté | `slash_command`, `register_repo_root` |
331| `FileChanged` | noms de fichiers littéraux à surveiller (consultez [FileChanged](#filechanged)) | `.envrc\|.env` |331| `FileChanged` | noms de fichiers littéraux à surveiller (consultez [FileChanged](#filechanged)) | `.envrc\|.env` |
332| `StopFailure` | type d'erreur | `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `unknown` |332| `StopFailure` | type d'erreur | `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error`, `unknown` |
333| `InstructionsLoaded` | raison du chargement | `session_start`, `nested_traversal`, `path_glob_match`, `include`, `compact` |333| `InstructionsLoaded` | raison du chargement | `session_start`, `nested_traversal`, `path_glob_match`, `include`, `compact` |
334| `UserPromptExpansion` | nom de la commande | vos noms de skill ou de commande |334| `UserPromptExpansion` | nom de la commande | vos noms de skill ou de commande |
335| `Elicitation` | nom du serveur MCP | vos noms de serveur MCP configurés |335| `Elicitation` | nom du serveur MCP | vos noms de serveur MCP configurés |
336| `ElicitationResult` | nom du serveur MCP | mêmes valeurs que `Elicitation` |336| `ElicitationResult` | nom du serveur MCP | mêmes valeurs que `Elicitation` |
337| `UserPromptSubmit`, `PostToolBatch`, `Stop`, `TeammateIdle`, `TaskCreated`, `TaskCompleted`, `WorktreeCreate`, `WorktreeRemove`, `MessageDisplay` | pas de support de matcher | se déclenche toujours à chaque occurrence |337| `UserPromptSubmit`, `PostToolBatch`, `Stop`, `TeammateIdle`, `TaskCreated`, `TaskCompleted`, `WorktreeCreate`, `WorktreeRemove`, `MessageDisplay` | pas de support de matcher | se déclenche toujours à chaque occurrence |
338 338
339Correspondre à `StopFailure` sur `cloud_credential_error` nécessite Claude Code v2.1.267 ou ultérieur, la première version qui signale les échecs de chargement des identifiants sous cette valeur plutôt que `server_error` ou `unknown`.
340
339Pour la plupart des événements, Claude Code évalue le matcher par rapport à un champ de l'[entrée JSON](#hook-input-and-output) qu'il envoie à votre hook sur stdin. Pour les événements d'outil, ce champ est `tool_name`. Pour `PreModelSwitch` et `PostModelSwitch`, Claude Code évalue le matcher par rapport au nom canonique qu'il dérive de `to_model`, comme décrit sous [PreModelSwitch](#premodelswitch). Chaque section [événement de hook](#hook-events) liste l'ensemble complet des valeurs de matcher et le schéma d'entrée pour cet événement.341Pour la plupart des événements, Claude Code évalue le matcher par rapport à un champ de l'[entrée JSON](#hook-input-and-output) qu'il envoie à votre hook sur stdin. Pour les événements d'outil, ce champ est `tool_name`. Pour `PreModelSwitch` et `PostModelSwitch`, Claude Code évalue le matcher par rapport au nom canonique qu'il dérive de `to_model`, comme décrit sous [PreModelSwitch](#premodelswitch). Chaque section [événement de hook](#hook-events) liste l'ensemble complet des valeurs de matcher et le schéma d'entrée pour cet événement.
340 342
341Cet exemple exécute un script de linting uniquement lorsque Claude écrit ou édite un fichier :343Cet exemple exécute un script de linting uniquement lorsque Claude écrit ou édite un fichier :
577 579
578Claude Code lit le contenu textuel de l'outil de la même manière qu'il lit stdout d'un hook de commande, en suivant la [règle d'analyse sous le code de sortie 0](#exit-code-0). Si le serveur nommé n'est pas connecté, ou si l'outil retourne `isError: true`, le hook produit une erreur non-bloquante et l'exécution continue.580Claude Code lit le contenu textuel de l'outil de la même manière qu'il lit stdout d'un hook de commande, en suivant la [règle d'analyse sous le code de sortie 0](#exit-code-0). Si le serveur nommé n'est pas connecté, ou si l'outil retourne `isError: true`, le hook produit une erreur non-bloquante et l'exécution continue.
579 581
580Les hooks de l'outil MCP sont disponibles sur chaque événement de hook une fois que Claude Code s'est connecté à vos serveurs MCP. `SessionStart` et `Setup` se déclenchent généralement avant que les serveurs ne finissent de se connecter, donc les hooks sur ces événements doivent s'attendre à l'erreur « non connecté » à la première exécution.
581
582Cet exemple appelle l'outil `security_scan` sur le serveur MCP `my_server` après chaque `Write` ou `Edit`, en passant le chemin du fichier édité :582Cet exemple appelle l'outil `security_scan` sur le serveur MCP `my_server` après chaque `Write` ou `Edit`, en passant le chemin du fichier édité :
583 583
584```json theme={null}584```json theme={null}
601}601}
602```602```
603 603
604Un hook `mcp_tool` peut s'exécuter uniquement une fois que Claude Code a rendu les serveurs MCP de la session disponibles aux hooks. `SessionStart` et `Setup` peuvent se déclencher avant ce point :
605
606* **Au lancement** : `SessionStart` se déclenche avant que les serveurs ne soient disponibles, y compris lorsque vous lancez avec `--continue` ou `--resume`. Claude Code ignore les hooks `mcp_tool` de l'événement sans appeler leurs outils, et le [journal de débogage](#debug-hooks) enregistre `mcp_tool hooks are not available for the 'SessionStart' hook event (no MCP client context)`.
607* **Plus tard dans une session en cours** : après `/clear` ou une compaction, `SessionStart` se déclenche à nouveau avec les serveurs déjà disponibles, et ses hooks `mcp_tool` s'exécutent.
608* **Sur `Setup`** : `Setup` se déclenche toujours avant que les serveurs ne soient disponibles, donc Claude Code ignore ses hooks `mcp_tool` à chaque fois et enregistre le même message nommant `Setup`.
609
610Par exemple, cette configuration appelle l'outil `load_context` sur le serveur MCP `my_server` à partir d'un hook `SessionStart` sans matcher, donc elle s'applique à chaque source `SessionStart` :
611
612```json theme={null}
613{
614 "hooks": {
615 "SessionStart": [
616 {
617 "hooks": [
618 {
619 "type": "mcp_tool",
620 "server": "my_server",
621 "tool": "load_context"
622 }
623 ]
624 }
625 ]
626 }
627}
628```
629
630Lorsque vous exécutez `claude`, Claude Code ignore ce hook, n'appelle jamais `load_context` et écrit le message `no MCP client context` dans le journal de débogage. Exécutez `/clear` dans cette même session et le hook s'exécute et appelle `load_context`. Un hook `type: "command"` sur `SessionStart` s'exécute au lancement, donc utilisez-en un pour tout ce dont la session a besoin dès son premier tour.
631
604<h4 id="prompt-and-agent-hook-fields">632<h4 id="prompt-and-agent-hook-fields">
605 Champs des hooks de prompt et d'agent633 Champs des hooks de prompt et d'agent
606</h4>634</h4>
619Utilisez ces placeholders pour référencer les scripts de hook par rapport à la racine du projet ou du plugin, indépendamment du répertoire de travail lorsque le hook s'exécute :647Utilisez ces placeholders pour référencer les scripts de hook par rapport à la racine du projet ou du plugin, indépendamment du répertoire de travail lorsque le hook s'exécute :
620 648
621* `${CLAUDE_PROJECT_DIR}` : la racine du projet où la session a démarré. Claude Code définit également cette variable dans l'environnement des [serveurs MCP stdio](/docs/fr/mcp#option-3-add-a-local-stdio-server) et des serveurs LSP de plugin.649* `${CLAUDE_PROJECT_DIR}` : la racine du projet où la session a démarré. Claude Code définit également cette variable dans l'environnement des [serveurs MCP stdio](/docs/fr/mcp#option-3-add-a-local-stdio-server) et des serveurs LSP de plugin.
622* `${CLAUDE_PLUGIN_ROOT}` : le répertoire d'installation du plugin, pour les scripts fournis avec un [plugin](/docs/fr/plugins). Change à chaque mise à jour du plugin.650* `${CLAUDE_PLUGIN_ROOT}` : le répertoire d'installation du plugin, pour les scripts fournis avec un [plugin](/docs/fr/plugins). Consultez [variables d'environnement du plugin](/docs/fr/plugins-reference#environment-variables) pour savoir comment le chemin se comporte lors des mises à jour.
623* `${CLAUDE_PLUGIN_DATA}` : le [répertoire de données persistantes](/docs/fr/plugins-reference#persistent-data-directory) du plugin, pour les dépendances et l'état qui doivent survivre aux mises à jour du plugin.651* `${CLAUDE_PLUGIN_DATA}` : le [répertoire de données persistantes](/docs/fr/plugins-reference#persistent-data-directory) du plugin, pour les dépendances et l'état qui doivent survivre aux mises à jour du plugin.
624 652
625<Note>653<Note>
694* **Hooks de subagent** : Claude Code les exécute uniquement pendant que ce subagent s'exécute et les supprime lorsqu'il se termine. Claude Code convertit un hook `Stop` ici en `SubagentStop`, l'événement qu'il déclenche lorsqu'un subagent se termine.722* **Hooks de subagent** : Claude Code les exécute uniquement pendant que ce subagent s'exécute et les supprime lorsqu'il se termine. Claude Code convertit un hook `Stop` ici en `SubagentStop`, l'événement qu'il déclenche lorsqu'un subagent se termine.
695* **Hooks de skill** : Claude Code les enregistre lorsque vous ou Claude invoquez le skill et continue à les exécuter pour le reste de la session, sur les tours après le tour du skill lui-même. Pour que Claude Code supprime un hook après sa première exécution réussie à la place, définissez [`once: true`](#common-fields) sur celui-ci.723* **Hooks de skill** : Claude Code les enregistre lorsque vous ou Claude invoquez le skill et continue à les exécuter pour le reste de la session, sur les tours après le tour du skill lui-même. Pour que Claude Code supprime un hook après sa première exécution réussie à la place, définissez [`once: true`](#common-fields) sur celui-ci.
696 724
697Tous les événements de hook sont supportés.
698
699Ce skill définit un hook `PreToolUse` qui exécute un script de validation de sécurité avant chaque commande `Bash` :725Ce skill définit un hook `PreToolUse` qui exécute un script de validation de sécurité avant chaque commande `Bash` :
700 726
701```yaml theme={null}727```yaml theme={null}
767| `prompt_id` | UUID identifiant le prompt utilisateur actuellement traité. Correspond à l'[attribut `prompt.id` sur les événements OpenTelemetry](/docs/fr/monitoring-usage#event-correlation-attributes), afin que vous puissiez corréler la sortie du hook avec la télémétrie pour un seul prompt. Absent jusqu'à la première entrée utilisateur. Nécessite Claude Code v2.1.196 ou ultérieur |793| `prompt_id` | UUID identifiant le prompt utilisateur actuellement traité. Correspond à l'[attribut `prompt.id` sur les événements OpenTelemetry](/docs/fr/monitoring-usage#event-correlation-attributes), afin que vous puissiez corréler la sortie du hook avec la télémétrie pour un seul prompt. Absent jusqu'à la première entrée utilisateur. Nécessite Claude Code v2.1.196 ou ultérieur |
768| `transcript_path` | Chemin vers le JSON de conversation. Le fichier de transcription est écrit de manière asynchrone et peut être en retard par rapport à la conversation en mémoire, il se peut donc qu'il n'inclue pas encore les messages les plus récents du tour actuel lorsqu'un hook se déclenche. Les hooks qui ont besoin du texte final de l'assistant du tour actuel doivent utiliser `last_assistant_message` sur [Stop](#stop) et [SubagentStop](#subagentstop) au lieu de lire la transcription |794| `transcript_path` | Chemin vers le JSON de conversation. Le fichier de transcription est écrit de manière asynchrone et peut être en retard par rapport à la conversation en mémoire, il se peut donc qu'il n'inclue pas encore les messages les plus récents du tour actuel lorsqu'un hook se déclenche. Les hooks qui ont besoin du texte final de l'assistant du tour actuel doivent utiliser `last_assistant_message` sur [Stop](#stop) et [SubagentStop](#subagentstop) au lieu de lire la transcription |
769| `cwd` | Répertoire de travail courant lorsque le hook est invoqué |795| `cwd` | Répertoire de travail courant lorsque le hook est invoqué |
796| `scratchpad_dir` | Chemin vers le répertoire scratchpad de la session, où Claude conserve les fichiers de travail temporaires. Absent lorsque la session n'a pas de scratchpad ou que le répertoire temporaire n'est pas disponible. Nécessite Claude Code v2.1.257 ou ultérieur |
770| `permission_mode` | [Mode de permission](/docs/fr/permissions#permission-modes) actuel : `"default"`, `"plan"`, `"acceptEdits"`, `"auto"`, `"dontAsk"` ou `"bypassPermissions"`. Le mode étiqueté **Manuel** arrive comme `"default"`, jamais comme `"manual"`, afin que les scripts qui correspondent à `"default"` continuent de fonctionner. Tous les événements ne reçoivent pas ce champ. Consultez l'exemple JSON de chaque [événement de hook](#hook-events) |797| `permission_mode` | [Mode de permission](/docs/fr/permissions#permission-modes) actuel : `"default"`, `"plan"`, `"acceptEdits"`, `"auto"`, `"dontAsk"` ou `"bypassPermissions"`. Le mode étiqueté **Manuel** arrive comme `"default"`, jamais comme `"manual"`, afin que les scripts qui correspondent à `"default"` continuent de fonctionner. Tous les événements ne reçoivent pas ce champ. Consultez l'exemple JSON de chaque [événement de hook](#hook-events) |
771| `effort` | Objet avec un champ `level` contenant le [niveau d'effort](/docs/fr/model-config#adjust-effort-level) en vigueur lorsque le hook s'exécute : `"low"`, `"medium"`, `"high"`, `"xhigh"` ou `"max"`. Si vous définissez un niveau que le modèle actif ne supporte pas, `level` rapporte le niveau que Claude Code a exécuté à la place ; [Ajuster le niveau d'effort](/docs/fr/model-config#adjust-effort-level) explique comment il choisit ce niveau. Ultracode n'est pas un niveau distinct et est signalé comme `"xhigh"`. L'objet correspond au champ `effort` de la [ligne de statut](/docs/fr/statusline#available-data). Présent pour les événements qui se déclenchent dans un contexte d'utilisation d'outil, tels que `PreToolUse`, `PostToolUse`, `Stop` et `SubagentStop`, lorsque le modèle actuel supporte le paramètre d'effort. Le niveau est également disponible pour les commandes de hook et l'outil Bash en tant que variable d'environnement `$CLAUDE_EFFORT`. |798| `effort` | Objet avec un champ `level` contenant le [niveau d'effort](/docs/fr/model-config#adjust-effort-level) en vigueur lorsque le hook s'exécute : `"low"`, `"medium"`, `"high"`, `"xhigh"` ou `"max"`. Si vous définissez un niveau que le modèle actif ne supporte pas, `level` rapporte le niveau que Claude Code a exécuté à la place ; [Ajuster le niveau d'effort](/docs/fr/model-config#adjust-effort-level) explique comment il choisit ce niveau. Ultracode n'est pas un niveau distinct et est signalé comme `"xhigh"`. L'objet correspond au champ `effort` de la [ligne de statut](/docs/fr/statusline#available-data). Présent pour les événements qui se déclenchent dans un contexte d'utilisation d'outil, tels que `PreToolUse`, `PostToolUse`, `Stop` et `SubagentStop`, lorsque le modèle actuel supporte le paramètre d'effort. Le niveau est également disponible pour les commandes de hook et l'outil Bash en tant que variable d'environnement `$CLAUDE_EFFORT`. |
772| `hook_event_name` | Nom de l'événement qui s'est déclenché |799| `hook_event_name` | Nom de l'événement qui s'est déclenché |
792 "prompt_id": "550e8400-e29b-41d4-a716-446655440000",819 "prompt_id": "550e8400-e29b-41d4-a716-446655440000",
793 "transcript_path": "/home/user/.claude/projects/.../transcript.jsonl",820 "transcript_path": "/home/user/.claude/projects/.../transcript.jsonl",
794 "cwd": "/home/user/my-project",821 "cwd": "/home/user/my-project",
822 "scratchpad_dir": "/tmp/claude-1000/-home-user-my-project/abc123/scratchpad",
795 "permission_mode": "default",823 "permission_mode": "default",
796 "hook_event_name": "PreToolUse",824 "hook_event_name": "PreToolUse",
797 "tool_name": "Bash",825 "tool_name": "Bash",
879Un hook qui ne peut pas démarrer atterrit dans le même bucket non-bloquant. Lorsque le chemin du script n'existe pas ou n'est pas exécutable, le shell quitte avec un code comme 127 et vous voyez le même avis avec le message de l'interpréteur, par exemple `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`. Pour la plupart des événements de hook, l'action procède. Lorsque vous configurez un hook de politique, regardez cet avis à sa première exécution : un chemin mal orthographié dans `settings.json` laisse la porte silencieusement désactivée.907Un hook qui ne peut pas démarrer atterrit dans le même bucket non-bloquant. Lorsque le chemin du script n'existe pas ou n'est pas exécutable, le shell quitte avec un code comme 127 et vous voyez le même avis avec le message de l'interpréteur, par exemple `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`. Pour la plupart des événements de hook, l'action procède. Lorsque vous configurez un hook de politique, regardez cet avis à sa première exécution : un chemin mal orthographié dans `settings.json` laisse la porte silencieusement désactivée.
880 908
881<Warning>909<Warning>
882 Pour la plupart des événements de hook, exit code 2 est le seul code de sortie qui bloque par le code seul. Sans JSON valide sur stdout, Claude Code traite exit code 1 comme une erreur non-bloquante et procède avec l'action, même si 1 est le code d'échec Unix conventionnel. Si votre hook est destiné à appliquer une politique, utilisez `exit 2`. L'exception est `WorktreeCreate`, où tout code de sortie non-zéro abandonne la création du worktree.910 Pour la plupart des événements de hook, exit code 2 est le seul code de sortie qui bloque par le code seul. Sans JSON valide sur stdout, Claude Code traite exit code 1 comme une erreur non-bloquante et procède avec l'action, même si 1 est le code d'échec Unix conventionnel. Si votre hook est destiné à appliquer une politique, utilisez `exit 2`. Les événements worktree diffèrent : tout code de sortie non-zéro de `WorktreeCreate` abandonne la création du worktree, et tout code de sortie non-zéro de `WorktreeRemove` rend la suppression du worktree échouée si le répertoire existe toujours après.
883</Warning>911</Warning>
884 912
885<h4 id="timeouts">913<h4 id="timeouts">
931| `Elicitation` | Oui | Refuse l'élicitation |959| `Elicitation` | Oui | Refuse l'élicitation |
932| `ElicitationResult` | Oui | Bloque la réponse (l'action devient decline) |960| `ElicitationResult` | Oui | Bloque la réponse (l'action devient decline) |
933| `WorktreeCreate` | Oui | Tout code de sortie non-zéro provoque l'échec de la création du worktree |961| `WorktreeCreate` | Oui | Tout code de sortie non-zéro provoque l'échec de la création du worktree |
934| `WorktreeRemove` | Non | Les défaillances sont enregistrées en mode debug uniquement |962| `WorktreeRemove` | Oui | Tout code de sortie non-zéro rend la suppression du worktree échouée si le répertoire existe toujours après. Consultez [WorktreeRemove](#worktreeremove) pour ce qui arrive au répertoire |
935| `InstructionsLoaded` | Non | Exit code est ignoré |963| `InstructionsLoaded` | Non | Exit code est ignoré |
936| `MessageDisplay` | Non | Le texte original est affiché |964| `MessageDisplay` | Non | Le texte original est affiché |
937 965
964 992
965La sortie stdout de votre hook doit contenir uniquement l'objet JSON. Si votre profil shell imprime du texte au démarrage, cela peut interférer avec l'analyse JSON. Consultez [Hook JSON has no effect](/docs/fr/hooks-guide#hook-json-has-no-effect) dans le guide de dépannage.993La sortie stdout de votre hook doit contenir uniquement l'objet JSON. Si votre profil shell imprime du texte au démarrage, cela peut interférer avec l'analyse JSON. Consultez [Hook JSON has no effect](/docs/fr/hooks-guide#hook-json-has-no-effect) dans le guide de dépannage.
966 994
967Les chaînes de sortie du hook, y compris `additionalContext`, `systemMessage` et stdout brut, sont plafonnées à 10 000 caractères. La sortie qui dépasse cette limite est enregistrée dans un fichier et remplacée par un aperçu et un chemin de fichier, de la même manière que les grands résultats d'outils valides sont gérés sous [Output limits](/docs/fr/tools-reference#output-limits).995Les chaînes de sortie du hook, y compris `additionalContext`, `systemMessage` et `initialUserMessage`, et son stdout brut, sont plafonnées à 10 000 caractères :
996
997* **Portée** : Claude Code mesure chaque chaîne seule, même lorsque plusieurs hooks s'exécutent pour le même événement. Pour la sortie JSON, chaque champ est mesuré séparément ; stdout brut est mesuré dans son ensemble.
998* **Au-delà de la limite** : Claude Code enregistre la sortie dans un fichier du répertoire de session et la remplace par le chemin du fichier et un aperçu de jusqu'à 2 000 premiers caractères. Un grand résultat Bash valide est géré de la même manière, décrit sous [Output limits](/docs/fr/tools-reference#output-limits). Contrairement à ce plafond Bash, ce cap n'a pas de paramètre ou de variable d'environnement pour l'augmenter.
999* **Lecture du fichier** : Claude Code ne demande pas à Claude de lire le fichier, donc gardez tout ce que Claude doit toujours voir dans le cap.
968 1000
969L'objet JSON supporte trois types de champs :1001L'objet JSON supporte trois types de champs :
970 1002
975| Champ | Par défaut | Description |1007| Champ | Par défaut | Description |
976| :----------------- | :--------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1008| :----------------- | :--------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
977| `continue` | `true` | Si `false`, Claude arrête complètement le traitement après l'exécution du hook. Prend précédence sur tous les champs de décision spécifiques à l'événement |1009| `continue` | `true` | Si `false`, Claude arrête complètement le traitement après l'exécution du hook. Prend précédence sur tous les champs de décision spécifiques à l'événement |
978| `stopReason` | aucun | Message affiché à l'utilisateur lorsque `continue` est `false`. Non affiché à Claude |1010| `stopReason` | aucun | Message affiché à l'utilisateur lorsque `continue` est `false`. Il reste dans la conversation, afin que Claude le voie si la conversation continue |
979| `suppressOutput` | `false` | N'a aucun effet : Claude Code accepte le champ mais n'agit pas dessus. La sortie stdout d'un hook réussi n'est jamais affichée dans la transcription et est enregistrée dans le journal de débogage |1011| `suppressOutput` | `false` | N'a aucun effet : Claude Code accepte le champ mais n'agit pas dessus. La sortie stdout d'un hook réussi n'est jamais affichée dans la transcription et est enregistrée dans le journal de débogage |
980| `systemMessage` | aucun | Message d'avertissement affiché à l'utilisateur. Dans [Agent SDK](/docs/fr/agent-sdk/overview) et [`--output-format stream-json`](/docs/fr/headless) sortie, il peut arriver comme un [`SDKInformationalMessage`](/docs/fr/agent-sdk/typescript#sdkinformationalmessage) |1012| `systemMessage` | aucun | Message d'avertissement affiché à l'utilisateur. Dans [Agent SDK](/docs/fr/agent-sdk/overview) et [`--output-format stream-json`](/docs/fr/headless) sortie, il peut arriver comme un [`SDKInformationalMessage`](/docs/fr/agent-sdk/typescript#sdkinformationalmessage) |
981| `terminalSequence` | aucun | Une séquence d'échappement de terminal pour Claude Code d'émettre en votre nom, comme une notification de bureau, un titre de fenêtre ou une cloche. Restreint aux OSC `0`/`1`/`2`/`9`/`99`/`777` et BEL. Si la valeur contient quelque chose en dehors de la liste blanche, le champ est ignoré. Utilisez ceci au lieu d'écrire sur `/dev/tty`, qui n'est pas disponible pour les hooks |1013| `terminalSequence` | aucun | Une séquence d'échappement de terminal pour Claude Code d'émettre en votre nom, comme une notification de bureau, un titre de fenêtre ou une cloche. Restreint aux OSC `0`/`1`/`2`/`9`/`99`/`777` et BEL. Si la valeur contient quelque chose en dehors de la liste blanche, le champ est ignoré. Utilisez ceci au lieu d'écrire sur `/dev/tty`, qui n'est pas disponible pour les hooks |
1048* [Stop](#stop) et [SubagentStop](#subagentstop) : à la fin du tour. La conversation continue afin que Claude puisse agir sur les commentaires. Consultez [Contrôle de décision Stop](#stop-decision-control)1080* [Stop](#stop) et [SubagentStop](#subagentstop) : à la fin du tour. La conversation continue afin que Claude puisse agir sur les commentaires. Consultez [Contrôle de décision Stop](#stop-decision-control)
1049* [PostModelSwitch](#postmodelswitch) : avec la prochaine demande après le changement. Consultez [Contrôle de décision PostModelSwitch](#postmodelswitch-decision-control) pour le timing1081* [PostModelSwitch](#postmodelswitch) : avec la prochaine demande après le changement. Consultez [Contrôle de décision PostModelSwitch](#postmodelswitch-decision-control) pour le timing
1050 1082
1051Lorsque plusieurs hooks retournent `additionalContext` pour le même événement, Claude reçoit toutes les valeurs. Si une valeur dépasse 10 000 caractères, Claude Code écrit le texte complet dans un fichier du répertoire de session et transmet à Claude le chemin du fichier avec un court aperçu à la place.1083Lorsque plusieurs hooks retournent `additionalContext` pour le même événement, Claude reçoit toutes les valeurs.
1084
1085Si une valeur dépasse 10 000 caractères, Claude Code écrit le texte dans un fichier du répertoire de session et transmet à Claude le chemin du fichier avec un aperçu de jusqu'à 2 000 premiers caractères à la place. Claude peut lire le fichier, mais Claude Code ne le demande pas.
1052 1086
1053Utilisez `additionalContext` pour les informations que Claude devrait connaître sur l'état actuel de votre environnement ou l'opération qui vient de s'exécuter :1087Utilisez `additionalContext` pour les informations que Claude devrait connaître sur l'état actuel de votre environnement ou l'opération qui vient de s'exécuter :
1054 1088
1069Tous les événements ne supportent pas le blocage ou le contrôle du comportement via JSON. Les événements qui le font utilisent chacun un ensemble différent de champs pour exprimer cette décision. Utilisez ce tableau comme référence rapide avant d'écrire un hook :1103Tous les événements ne supportent pas le blocage ou le contrôle du comportement via JSON. Les événements qui le font utilisent chacun un ensemble différent de champs pour exprimer cette décision. Utilisez ce tableau comme référence rapide avant d'écrire un hook :
1070 1104
1071| Événements | Modèle de décision | Champs clés |1105| Événements | Modèle de décision | Champs clés |
1072| :------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1106| :---------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1073| UserPromptSubmit, UserPromptExpansion, PostToolUse, PostToolUseFailure, PostToolBatch, Stop, SubagentStop, ConfigChange, PreCompact | `decision` au niveau supérieur | `decision: "block"`, `reason`. Stop et SubagentStop acceptent également `hookSpecificOutput.additionalContext` pour [les commentaires non-erreur qui continuent la conversation](#stop-decision-control) |1107| UserPromptSubmit, UserPromptExpansion, PostToolUse, PostToolUseFailure, PostToolBatch, Stop, SubagentStop, ConfigChange, PreCompact | `decision` au niveau supérieur | `decision: "block"`, `reason`. Stop et SubagentStop acceptent également `hookSpecificOutput.additionalContext` pour [les commentaires non-erreur qui continuent la conversation](#stop-decision-control) |
1074| TeammateIdle, TaskCompleted | Exit code ou `continue: false` | Exit code 2 bloque l'action avec commentaires stderr. JSON `{"continue": false, "stopReason": "..."}` arrête également complètement le coéquipier, correspondant au comportement du hook `Stop` ; [TaskCompleted l'ignore lorsque l'outil `TaskUpdate` a déclenché l'événement](#taskcompleted-decision-control) |1108| TeammateIdle, TaskCompleted | Exit code ou `continue: false` | Exit code 2 bloque l'action avec commentaires stderr. JSON `{"continue": false, "stopReason": "..."}` arrête également complètement le coéquipier, correspondant au comportement du hook `Stop` ; [TaskCompleted l'ignore lorsque l'outil `TaskUpdate` a déclenché l'événement](#taskcompleted-decision-control) |
1075| TaskCreated | Exit code ou `decision` au niveau supérieur | Exit code 2 ou `decision: "block"` [annule la tâche](#taskcreated-decision-control) et retourne le message à Claude. `continue: false` est ignoré |1109| TaskCreated | Exit code ou `decision` au niveau supérieur | Exit code 2 ou `decision: "block"` [annule la tâche](#taskcreated-decision-control) et retourne le message à Claude. `continue: false` est ignoré |
1078| PermissionRequest | `hookSpecificOutput` | `decision.behavior` (allow/deny) |1112| PermissionRequest | `hookSpecificOutput` | `decision.behavior` (allow/deny) |
1079| PermissionDenied | `hookSpecificOutput` | `retry: true` indique au modèle qu'il peut réessayer l'appel d'outil refusé ; Claude Code l'ignore pour les [refus sans verdict](#permissiondenied-decision-control) |1113| PermissionDenied | `hookSpecificOutput` | `retry: true` indique au modèle qu'il peut réessayer l'appel d'outil refusé ; Claude Code l'ignore pour les [refus sans verdict](#permissiondenied-decision-control) |
1080| WorktreeCreate | retour de chemin | Le hook de commande imprime le chemin sur stdout ; le hook HTTP retourne `hookSpecificOutput.worktreePath`. L'échec du hook ou l'absence de chemin échoue la création |1114| WorktreeCreate | retour de chemin | Le hook de commande imprime le chemin sur stdout ; le hook HTTP retourne `hookSpecificOutput.worktreePath`. L'échec du hook ou l'absence de chemin échoue la création |
1115| WorktreeRemove | Exit code | Tout code de sortie non-zéro rend la suppression échouée si le répertoire existe toujours après. La sortie JSON est rejetée |
1081| Elicitation | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (valeurs des champs de formulaire pour accept) |1116| Elicitation | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (valeurs des champs de formulaire pour accept) |
1082| ElicitationResult | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (valeurs des champs de formulaire override) |1117| ElicitationResult | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (valeurs des champs de formulaire override) |
1083| MessageDisplay | `hookSpecificOutput` | `displayContent` remplace le texte affiché à l'écran. Affichage uniquement : la transcription et ce que Claude voit conservent l'original |1118| MessageDisplay | `hookSpecificOutput` | `displayContent` remplace le texte affiché à l'écran. Affichage uniquement : la transcription et ce que Claude voit conservent l'original |
1084| SessionStart, SubagentStart, PostModelSwitch | Contexte uniquement | `hookSpecificOutput.additionalContext` ajoute du contexte pour Claude. SessionStart accepte également [`initialUserMessage`, `watchPaths`, `sessionTitle` et `reloadSkills`](#sessionstart-decision-control). Pas de blocage ou de contrôle de décision |1119| SessionStart, SubagentStart, PostModelSwitch | Contexte uniquement | `hookSpecificOutput.additionalContext` ajoute du contexte pour Claude. SessionStart accepte également [`initialUserMessage`, `watchPaths`, `sessionTitle` et `reloadSkills`](#sessionstart-decision-control). Pas de blocage ou de contrôle de décision |
1085| Setup, WorktreeRemove, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, DirectoryAdded, FileChanged | Aucun | Pas de contrôle de décision. Utilisé pour les effets secondaires comme la journalisation ou le nettoyage |1120| Setup, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, DirectoryAdded, FileChanged | Aucun | Pas de contrôle de décision. Utilisé pour les effets secondaires comme la journalisation ou le nettoyage |
1086 1121
1087Quelques événements peuvent également réécrire le contenu plutôt que seulement l'autoriser ou le bloquer :1122Quelques événements peuvent également réécrire le contenu plutôt que seulement l'autoriser ou le bloquer :
1088 1123
1146 Événements de hook1181 Événements de hook
1147</h2>1182</h2>
1148 1183
1149Chaque événement correspond à un point du cycle de vie de Claude Code où les hooks peuvent s'exécuter. Les sections ci-dessous sont ordonnées pour correspondre au cycle de vie : de la configuration de session à travers la boucle agentique jusqu'à la fin de session. Chaque section décrit quand l'événement se déclenche, quels matchers il supporte, l'entrée JSON qu'il reçoit et comment contrôler le comportement via la sortie.1184Chaque événement correspond à un point du cycle de vie de Claude Code où les hooks peuvent s'exécuter. Les sections ci-dessous sont ordonnées pour correspondre au cycle de vie : de la configuration de la session à la boucle agentique jusqu'à la fin de la session. Chaque section décrit quand l'événement se déclenche, quels matchers il supporte, l'entrée JSON qu'il reçoit et comment contrôler le comportement via la sortie.
1150 1185
1151<h3 id="sessionstart">1186<h3 id="sessionstart">
1152 SessionStart1187 SessionStart
1153</h3>1188</h3>
1154 1189
1155S'exécute lorsque Claude Code démarre une nouvelle session ou reprend une session existante. Utile pour charger le contexte de développement comme les problèmes existants ou les modifications récentes de votre codebase, ou pour configurer les variables d'environnement. Pour le contexte statique qui ne nécessite pas de script, utilisez [CLAUDE.md](/docs/fr/memory) à la place.1190S'exécute quand Claude Code démarre une nouvelle session ou reprend une session existante. Utile pour charger le contexte de développement comme les problèmes existants ou les modifications récentes de votre base de code, ou pour configurer des variables d'environnement. Pour un contexte statique qui ne nécessite pas de script, utilisez plutôt [CLAUDE.md](/docs/fr/memory).
1156 1191
1157SessionStart s'exécute à chaque session, donc gardez ces hooks rapides. Seuls les hooks `type: "command"` et `type: "mcp_tool"` sont supportés.1192SessionStart s'exécute à chaque session, donc gardez ces hooks rapides. Seuls les hooks `type: "command"` et `type: "mcp_tool"` sont supportés. Voir [Champs de hook MCP tool](#mcp-tool-hook-fields) pour savoir quand les hooks `mcp_tool` s'exécutent.
1158 1193
1159La valeur du matcher correspond à la façon dont la session a été initiée :1194La valeur du matcher correspond à la façon dont la session a été initiée :
1160 1195
1161| Matcher | Quand il se déclenche |1196| Matcher | Quand il se déclenche |
1162| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------ |1197| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |
1163| `startup` | Nouvelle session |1198| `startup` | Nouvelle session |
1164| `resume` | `--resume`, `--continue` ou `/resume` |1199| `resume` | `--resume`, `--continue`, ou `/resume` |
1165| `clear` | `/clear` |1200| `clear` | `/clear` |
1166| `compact` | Compaction automatique ou manuelle |1201| `compact` | Compaction automatique ou manuelle |
1167| `fork` | Une nouvelle session créée à partir d'une session existante : `--fork-session` avec `--resume` ou `--continue`, la copie en arrière-plan `/fork` ou `/branch` |1202| `fork` | Une nouvelle session créée à partir d'une session existante : `--fork-session` avec `--resume` ou `--continue`, la copie de fond `/fork`, ou `/branch` |
1168 1203
1169Avant v2.1.214, les sessions créées rapportaient la source `"resume"`.1204Avant v2.1.214, les sessions créées rapportaient la source `"resume"`.
1170 1205
1206Quand vous démarrez une session interactive, reprenez une conversation au lancement avec `--continue` ou `--resume`, ou exécutez `/clear`, les hooks SessionStart s'exécutent en arrière-plan. Vous pouvez taper immédiatement, et une conversation que vous avez reprise apparaît sans attendre les hooks. La première réponse de Claude attend toujours que les hooks se terminent, donc leur contexte atteint Claude.
1207
1208Quand vous changez de conversation avec `/resume` dans une session, le changement attend que les hooks se terminent. Si vous exécutez `/clear` ou basculez vers une autre conversation pendant que les hooks en arrière-plan s'exécutent toujours, rien de ce qu'ils retournent ne s'applique à la session.
1209
1210La même attente s'applique au lancement, y compris une session reprise : une invite que vous envoyez pendant que les hooks SessionStart s'exécutent toujours n'atteint pas Claude jusqu'à ce qu'ils se terminent.
1211
1212Pendant l'une ou l'autre attente, appuyez sur `Esc` pour reprendre l'invite dans l'entrée sans l'envoyer. Les hooks continuent de s'exécuter.
1213
1171<h4 id="sessionstart-input">1214<h4 id="sessionstart-input">
1172 Entrée SessionStart1215 Entrée SessionStart
1173</h4>1216</h4>
1174 1217
1175En plus des [champs d'entrée communs](#common-input-fields), les hooks SessionStart reçoivent `source` et optionnellement `model`, `agent_type` et `session_title` :1218En plus des [champs d'entrée communs](#common-input-fields), les hooks SessionStart reçoivent `source` et optionnellement `model`, `agent_type`, et `session_title` :
1176 1219
1177| Champ | Description |1220| Champ | Description |
1178| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1221| :-------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1179| `source` | Comment la session a démarré : `"startup"` pour les nouvelles sessions, `"resume"` pour les sessions reprises, `"clear"` après `/clear`, `"compact"` après compaction ou `"fork"` pour une nouvelle session créée à partir d'une session existante |1222| `source` | Comment la session a démarré : `"startup"` pour les nouvelles sessions, `"resume"` pour les sessions reprises, `"clear"` après `/clear`, `"compact"` après compaction, ou `"fork"` pour une nouvelle session créée à partir d'une session existante |
1180| `model` | L'identifiant du modèle actif. Il peut être omis, par exemple après `/clear` ou lorsqu'une session est restaurée via la récupération de conversation, donc vérifiez le champ avant de le lire |1223| `model` | L'identifiant du modèle actif. Il peut être omis, par exemple après `/clear` ou quand une session est restaurée via la récupération de conversation, donc vérifiez le champ avant de le lire |
1181| `agent_type` | Le nom de l'agent, présent lorsque vous démarrez Claude Code avec `claude --agent <name>` |1224| `agent_type` | Le nom de l'agent, présent quand vous démarrez Claude Code avec `claude --agent <name>` |
1182| `session_title` | Le titre de session actuel s'il est déjà défini, par exemple via `--name` ou `/rename`. Un hook qui émet `sessionTitle` peut vérifier `session_title` en premier pour éviter de remplacer un titre que l'utilisateur a défini explicitement |1225| `session_title` | Le titre de la session actuelle s'il est déjà défini, par exemple via `--name` ou `/rename`. Un hook qui émet `sessionTitle` peut vérifier `session_title` d'abord pour éviter de remplacer un titre que l'utilisateur a défini explicitement |
1183 1226
1184Lorsque `source` est `"resume"` ou `"fork"` et que la transcription contient au moins une réponse de Claude, les hooks SessionStart reçoivent également les quatre champs ci-dessous. Votre hook peut les utiliser pour signaler le coût de la reprise d'une conversation obsolète avant la première demande, par exemple dans un [`systemMessage`](#json-output). Ces champs nécessitent Claude Code v2.1.251 ou ultérieur.1227Quand `source` est `"resume"` ou `"fork"` et que la transcription contient au moins une réponse de Claude, les hooks SessionStart reçoivent également les quatre champs ci-dessous. Votre hook peut les utiliser pour signaler le coût de reprendre une conversation obsolète avant la première demande, par exemple dans un [`systemMessage`](#json-output). Ces champs nécessitent Claude Code v2.1.251 ou ultérieur.
1185 1228
1186| Champ | Description |1229| Champ | Description |
1187| :---------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1230| :---------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1188| `seconds_since_last_response` | Secondes d'horloge murale depuis la dernière réponse dans la transcription reprise |1231| `seconds_since_last_response` | Secondes d'horloge murale depuis la dernière réponse dans la transcription reprise |
1189| `context_tokens` | Tokens que la première demande de la session reprise renvoie comme son prompt |1232| `context_tokens` | Tokens que la première demande de la session reprise renvoie comme son invite |
1190| `prompt_cache_likely_expired` | `true` lorsque la dernière réponse est plus ancienne que la [durée de vie du cache de prompt](/docs/fr/prompt-caching#cache-lifetime) de la session ou qu'une compaction ultérieure a remplacé la conversation en cache |1233| `prompt_cache_likely_expired` | `true` quand la dernière réponse est plus ancienne que la [durée de vie du cache d'invite](/docs/fr/prompt-caching#cache-lifetime) de la session ou qu'une compaction ultérieure a remplacé la conversation en cache |
1191| `estimated_cache_write_usd` | Coût estimé en dollars américains de l'écriture de `context_tokens` dans le cache de prompt sur le modèle de la session, excluant la réponse |1234| `estimated_cache_write_usd` | Coût estimé en dollars américains de l'écriture de `context_tokens` dans le cache d'invite sur le modèle de la session, excluant la réponse |
1192 1235
1193Cet exemple montre l'entrée pour une session reprise 90 minutes après sa dernière réponse :1236Cet exemple montre l'entrée pour une session reprise 90 minutes après sa dernière réponse :
1194 1237
1211 Contrôle de décision SessionStart1254 Contrôle de décision SessionStart
1212</h4>1255</h4>
1213 1256
1214Claude Code ajoute le stdout qu'il [traite comme du texte brut](#exit-code-0) au contexte de Claude. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez retourner ces champs spécifiques à l'événement :1257Claude Code ajoute la sortie standard qu'il [traite comme du texte brut](#exit-code-0) au contexte de Claude. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez retourner ces champs spécifiques à l'événement :
1215 1258
1216| Champ | Description |1259| Champ | Description |
1217| :------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1260| :------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1218| `additionalContext` | Chaîne ajoutée au contexte de Claude au début de la conversation, avant le premier prompt. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) pour savoir comment le texte est livré et ce qu'il faut y mettre |1261| `additionalContext` | Chaîne ajoutée au contexte de Claude au début de la conversation, avant la première invite. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) pour savoir comment le texte est livré et ce qu'il faut y mettre |
1219| `initialUserMessage` | Chaîne utilisée comme premier message utilisateur de la session. S'applique en [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`, où elle devient le premier tour même si aucun prompt n'est fourni. Si un prompt est fourni, il suit comme le tour suivant. Contrairement à `additionalContext`, qui s'attache à un tour existant, ceci crée le tour |1262| `initialUserMessage` | Chaîne utilisée comme premier message utilisateur de la session. S'applique en [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`, où elle devient le premier tour même si aucune invite n'est fournie. Si une invite est fournie, elle suit comme le tour suivant. Contrairement à `additionalContext`, qui s'attache à un tour existant, ceci crée le tour |
1220| `sessionTitle` | Définit le titre de la session, avec le même effet que `/rename`. Utilisez pour nommer les sessions automatiquement à partir du dossier de lancement, de la branche git ou du nom du worktree. S'applique lorsque `source` est `"startup"`, `"resume"` ou `"fork"` ; ignoré sur `"clear"` et `"compact"` |1263| `sessionTitle` | Définit le titre de la session, avec le même effet que `/rename`. Utilisez pour nommer les sessions automatiquement à partir du dossier de lancement, de la branche git, ou du nom du worktree. S'applique quand `source` est `"startup"`, `"resume"`, ou `"fork"` ; ignoré sur `"clear"` et `"compact"` |
1221| `watchPaths` | Tableau de chemins absolus à surveiller pour les événements [FileChanged](#filechanged) pendant cette session |1264| `watchPaths` | Tableau de chemins absolus à surveiller pour les événements [FileChanged](#filechanged) pendant cette session |
1222| `reloadSkills` | Booléen. Lorsque `true`, Claude Code réanalyse les répertoires [skill](/docs/fr/skills) et de commandes après que les hooks SessionStart se terminent, donc les skills que le hook a installées sont disponibles dans la même session, à partir du premier prompt |1265| `reloadSkills` | Booléen. Quand `true`, Claude Code rescanne les répertoires [skill](/docs/fr/skills) et command après que les hooks SessionStart se terminent, donc les skills que le hook a installés sont disponibles dans la même session, à partir de la première invite |
1223 1266
1224```json theme={null}1267```json theme={null}
1225{1268{
1231}1274}
1232```1275```
1233 1276
1234Puisque le stdout brut atteint déjà Claude pour cet événement, un hook qui charge uniquement du contexte peut imprimer sur stdout directement sans construire JSON. Utilisez le formulaire JSON lorsque vous avez besoin de combiner le contexte avec d'autres champs tels que `sessionTitle`.1277Puisque la sortie standard brute atteint déjà Claude pour cet événement, un hook qui charge uniquement du contexte peut imprimer sur la sortie standard directement sans construire JSON. Utilisez la forme JSON quand vous devez combiner le contexte avec d'autres champs comme `sessionTitle`.
1235 1278
1236Utilisez `reloadSkills` lorsqu'un hook SessionStart installe ou met à jour des skills. La découverte de skills s'exécute normalement avant que les hooks SessionStart se terminent, donc les fichiers que le hook écrit dans `~/.claude/skills/` ou `.claude/skills/` n'apparaîtraient autrement que dans la session suivante. Cet exemple synchronise un référentiel de skills partagé et demande la réanalyse :1279Utilisez `reloadSkills` quand un hook SessionStart installe ou met à jour des skills. La découverte de skills s'exécute normalement avant que les hooks SessionStart se terminent, donc les fichiers que le hook écrit dans `~/.claude/skills/` ou `.claude/skills/` n'apparaîtraient autrement que dans la session suivante. Cet exemple synchronise un référentiel de skills partagé et demande la rescanne :
1237 1280
1238```bash theme={null}1281```bash theme={null}
1239#!/bin/bash1282#!/bin/bash
1252 1295
1253Les hooks SessionStart ont accès à la variable d'environnement `CLAUDE_ENV_FILE`, qui fournit un chemin de fichier où vous pouvez persister les variables d'environnement pour les commandes Bash suivantes.1296Les hooks SessionStart ont accès à la variable d'environnement `CLAUDE_ENV_FILE`, qui fournit un chemin de fichier où vous pouvez persister les variables d'environnement pour les commandes Bash suivantes.
1254 1297
1255Pour définir des variables d'environnement individuelles, écrivez des déclarations `export` dans `CLAUDE_ENV_FILE`. Utilisez l'ajout (`>>`) pour préserver les variables définies par d'autres hooks :1298Pour définir des variables d'environnement individuelles, écrivez des instructions `export` dans `CLAUDE_ENV_FILE`. Utilisez l'ajout (`>>`) pour préserver les variables définies par d'autres hooks :
1256 1299
1257```bash theme={null}1300```bash theme={null}
1258#!/bin/bash1301#!/bin/bash
1273 1316
1274ENV_BEFORE=$(export -p | sort)1317ENV_BEFORE=$(export -p | sort)
1275 1318
1276# Exécutez vos commandes de configuration qui modifient l'environnement1319# Run your setup commands that modify the environment
1277source ~/.nvm/nvm.sh1320source ~/.nvm/nvm.sh
1278nvm use 201321nvm use 20
1279 1322
1286```1329```
1287 1330
1288<Note>1331<Note>
1289 `CLAUDE_ENV_FILE` est disponible pour les hooks SessionStart, [Setup](#setup), [CwdChanged](#cwdchanged) et [FileChanged](#filechanged). Les autres types de hooks n'ont pas accès à cette variable.1332 `CLAUDE_ENV_FILE` est disponible pour les hooks SessionStart, [Setup](#setup), [CwdChanged](#cwdchanged), et [FileChanged](#filechanged). Les autres types de hooks n'ont pas accès à cette variable.
1290</Note>1333</Note>
1291 1334
1292<h3 id="setup">1335<h3 id="setup">
1293 Setup1336 Setup
1294</h3>1337</h3>
1295 1338
1296Se déclenche uniquement lorsque vous lancez Claude Code avec `--init-only`, ou avec `--init` ou `--maintenance` en [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`. Il ne se déclenche pas au démarrage normal. Utilisez-le pour l'installation de dépendances ponctuelles ou le nettoyage programmé que vous déclenchez explicitement à partir de CI ou de scripts, séparé du démarrage normal de session. Pour l'initialisation par session, utilisez [SessionStart](#sessionstart) à la place.1339S'exécute uniquement quand vous lancez Claude Code avec `--init-only`, ou avec `--init` ou `--maintenance` en [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`. Il ne s'exécute pas au démarrage normal. Utilisez-le pour l'installation de dépendances ponctuelles ou le nettoyage programmé que vous déclenchez explicitement à partir de CI ou de scripts, séparé du démarrage normal de la session. Pour l'initialisation par session, utilisez plutôt [SessionStart](#sessionstart).
1297 1340
1298La valeur du matcher correspond au drapeau CLI qui a déclenché le hook :1341La valeur du matcher correspond au drapeau CLI qui a déclenché le hook :
1299 1342
1302| `init` | `claude --init-only` ou `claude -p --init` |1345| `init` | `claude --init-only` ou `claude -p --init` |
1303| `maintenance` | `claude -p --maintenance` |1346| `maintenance` | `claude -p --maintenance` |
1304 1347
1305Lorsque vous exécutez `claude --init-only`, Claude Code exécute les hooks Setup et les hooks SessionStart avec le matcher `startup`, puis quitte sans démarrer une conversation.1348Quand vous exécutez `claude --init-only`, Claude Code exécute les hooks Setup et les hooks `SessionStart` avec le matcher `startup`, puis quitte sans démarrer une conversation.
1306 1349
1307Lorsque vous démarrez ou continuez une conversation avec `-p`, vous devez également fournir un prompt, en tant qu'argument ou canalisé sur stdin. Vous pouvez ignorer le prompt lorsqu'un hook `SessionStart` fournit [`initialUserMessage`](#sessionstart-decision-control) ou lorsque vous reprenez une session avec un [appel d'outil différé](#defer-a-tool-call-for-later).1350Quand vous démarrez ou continuez une conversation avec `-p`, vous devez également fournir une invite, comme argument ou piped sur stdin. Vous pouvez ignorer l'invite quand un hook `SessionStart` fournit [`initialUserMessage`](#sessionstart-decision-control) ou quand vous reprenez une session avec un [appel d'outil différé](#defer-a-tool-call-for-later).
1308 1351
1309En cas de succès, `--init-only` n'imprime rien au terminal. Pour confirmer que les hooks se sont exécutés, commencez par `claude --debug-file <path> --init-only`, en remplaçant `<path>` par un emplacement de fichier journal, et vérifiez le journal pour les entrées de hook Setup et SessionStart.1352En cas de succès, `--init-only` n'imprime rien sur le terminal. Pour confirmer que les hooks se sont exécutés, commencez par `claude --debug-file <path> --init-only`, en remplaçant `<path>` par un emplacement de fichier journal, et vérifiez le journal pour les entrées de hook Setup et SessionStart.
1310 1353
1311Parce que Setup ne se déclenche pas à chaque lancement, un plugin qui a besoin d'une dépendance installée ne peut pas compter sur Setup seul. Le modèle pratique est de vérifier la dépendance à la première utilisation et d'installer en cas d'absence, par exemple un hook ou une skill qui teste `${CLAUDE_PLUGIN_DATA}/node_modules` et exécute `npm install` si absent. Consultez le [répertoire de données persistantes](/docs/fr/plugins-reference#persistent-data-directory) pour savoir où stocker les dépendances installées. Si vous distribuez votre plugin via une marketplace, vous n'aurez peut-être pas besoin de ce modèle : Claude Code [installe automatiquement les dépendances de package Node.js éligibles](/docs/fr/plugins-reference#node-js-package-dependencies) lorsqu'il met en cache le plugin.1354Parce que Setup ne s'exécute pas à chaque lancement, un plugin qui a besoin d'une dépendance installée ne peut pas compter sur Setup seul. Le modèle pratique est de vérifier la dépendance à la première utilisation et d'installer en cas d'absence, par exemple un hook ou skill qui teste `${CLAUDE_PLUGIN_DATA}/node_modules` et exécute `npm install` s'il est absent. Voir le [répertoire de données persistantes](/docs/fr/plugins-reference#persistent-data-directory) pour savoir où stocker les dépendances installées. Si vous distribuez votre plugin via une marketplace, vous n'aurez peut-être pas besoin de ce modèle : Claude Code [installe automatiquement les dépendances de package Node.js éligibles](/docs/fr/plugins-reference#node-js-package-dependencies) quand il met en cache le plugin.
1312 1355
1313<h4 id="setup-input">1356<h4 id="setup-input">
1314 Entrée Setup1357 Entrée Setup
1330 Contrôle de décision Setup1373 Contrôle de décision Setup
1331</h4>1374</h4>
1332 1375
1333Les hooks Setup ne peuvent pas bloquer ; l'exécution continue sur n'importe quel code de sortie. Sur chaque code de sortie, Claude Code rejette les [champs de sortie JSON](#json-output) d'un hook Setup, tels que `systemMessage`, `continue` et `hookSpecificOutput.additionalContext`. Avec `-p`, la sortie, l'erreur et le code de sortie d'un hook Setup n'apparaissent dans la sortie de l'exécution que comme des [événements `hook_response`](/docs/fr/headless#read-session-metadata) lorsque vous lancez avec `--output-format stream-json --verbose`.1376Les hooks Setup ne peuvent pas bloquer ; l'exécution continue sur n'importe quel code de sortie. Sur chaque code de sortie, Claude Code rejette les [champs de sortie JSON](#json-output) d'un hook Setup, comme `systemMessage`, `continue`, et `hookSpecificOutput.additionalContext`. Avec `-p`, la sortie standard, stderr, et le code de sortie d'un hook Setup n'apparaissent dans la sortie de la session que comme des événements [`hook_response`](/docs/fr/headless#read-session-metadata) quand vous lancez avec `--output-format stream-json --verbose`.
1334 1377
1335Les hooks Setup ont accès à `CLAUDE_ENV_FILE`. Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes pour la session, tout comme dans les [hooks SessionStart](#persist-environment-variables). Seuls les hooks `type: "command"` et `type: "mcp_tool"` sont supportés.1378Les hooks Setup ont accès à `CLAUDE_ENV_FILE`. Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes pour la session, tout comme dans les [hooks SessionStart](#persist-environment-variables). Seuls les hooks `type: "command"` s'exécutent sur `Setup`. Un hook `type: "mcp_tool"` sur `Setup` est toujours ignoré, comme décrit sous [Champs de hook MCP tool](#mcp-tool-hook-fields).
1336 1379
1337<h3 id="instructionsloaded">1380<h3 id="instructionsloaded">
1338 InstructionsLoaded1381 InstructionsLoaded
1339</h3>1382</h3>
1340 1383
1341Se déclenche lorsqu'un fichier `CLAUDE.md` ou `.claude/rules/*.md` est chargé dans le contexte. Cet événement se déclenche au démarrage de la session pour les fichiers chargés avec impatience et à nouveau plus tard lorsque les fichiers sont chargés avec paresse, par exemple lorsque Claude accède à un sous-répertoire qui contient un `CLAUDE.md` imbriqué ou lorsque les règles conditionnelles avec le frontmatter `paths:` correspondent. Le hook ne supporte pas le blocage ou le contrôle de décision. Il s'exécute de manière asynchrone à des fins d'observabilité.1384S'exécute quand un fichier `CLAUDE.md` ou `.claude/rules/*.md` est chargé dans le contexte. Cet événement se déclenche au démarrage de la session pour les fichiers chargés avec impatience et à nouveau plus tard quand les fichiers sont chargés avec paresse, par exemple quand Claude accède à un sous-répertoire qui contient un `CLAUDE.md` imbriqué ou quand les règles conditionnelles avec le frontmatter `paths:` correspondent. Le hook ne supporte pas le blocage ou le contrôle de décision. Il s'exécute de manière asynchrone à des fins d'observabilité.
1342 1385
1343Le matcher s'exécute sur `load_reason`. Par exemple, utilisez `"matcher": "session_start"` pour se déclencher uniquement pour les fichiers chargés au démarrage de la session, ou `"matcher": "path_glob_match|nested_traversal"` pour se déclencher uniquement pour les chargements paresseux.1386Cet événement ne se déclenche pas quand Claude [lit `AGENTS.md` directement](/docs/fr/memory#agents-md) via le paramètre **Project instructions**. Il se déclenche quand un `CLAUDE.md` importe votre `AGENTS.md`, avec `load_reason` défini à `include` comme pour n'importe quel autre fichier importé, et quand `CLAUDE.md` est un symlink vers lui, comme un chargement normal de `CLAUDE.md`.
1387
1388Le matcher s'exécute contre `load_reason`. Par exemple, utilisez `"matcher": "session_start"` pour se déclencher uniquement pour les fichiers chargés au démarrage de la session, ou `"matcher": "path_glob_match|nested_traversal"` pour se déclencher uniquement pour les chargements avec paresse.
1344 1389
1345<h4 id="instructionsloaded-input">1390<h4 id="instructionsloaded-input">
1346 Entrée InstructionsLoaded1391 Entrée InstructionsLoaded
1349En plus des [champs d'entrée communs](#common-input-fields), les hooks InstructionsLoaded reçoivent ces champs :1394En plus des [champs d'entrée communs](#common-input-fields), les hooks InstructionsLoaded reçoivent ces champs :
1350 1395
1351| Champ | Description |1396| Champ | Description |
1352| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1397| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1353| `file_path` | Chemin absolu vers le fichier d'instructions qui a été chargé |1398| `file_path` | Chemin absolu du fichier d'instructions qui a été chargé |
1354| `memory_type` | Portée du fichier : `"User"`, `"Project"`, `"Local"` ou `"Managed"` |1399| `memory_type` | Portée du fichier : `"User"`, `"Project"`, `"Local"`, ou `"Managed"` |
1355| `load_reason` | Pourquoi le fichier a été chargé : `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` ou `"compact"`. La valeur `"compact"` se déclenche lorsque les fichiers d'instructions sont rechargés après un événement de compaction |1400| `load_reason` | Pourquoi le fichier a été chargé : `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"`, ou `"compact"`. La valeur `"compact"` se déclenche quand les fichiers d'instructions sont rechargés après un événement de compaction |
1356| `globs` | Modèles de glob de chemin du frontmatter `paths:` du fichier, le cas échéant. Présent uniquement pour les chargements `path_glob_match` |1401| `globs` | Modèles de glob de chemin du frontmatter `paths:` du fichier, le cas échéant. Présent uniquement pour les chargements `path_glob_match` |
1357| `trigger_file_path` | Chemin vers le fichier dont l'accès a déclenché ce chargement, pour les chargements paresseux |1402| `trigger_file_path` | Chemin du fichier dont l'accès a déclenché ce chargement, pour les chargements avec paresse |
1358| `parent_file_path` | Chemin vers le fichier d'instructions parent qui a inclus celui-ci, pour les chargements `include` |1403| `parent_file_path` | Chemin du fichier d'instructions parent qui a inclus celui-ci, pour les chargements `include` |
1359 1404
1360```json theme={null}1405```json theme={null}
1361{1406{
1373 Contrôle de décision InstructionsLoaded1418 Contrôle de décision InstructionsLoaded
1374</h4>1419</h4>
1375 1420
1376Les hooks InstructionsLoaded n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer ou modifier le chargement des instructions. Claude Code rejette leurs [champs de sortie JSON](#json-output), tels que `systemMessage` et `continue`. Utilisez cet événement pour la journalisation d'audit, le suivi de conformité ou l'observabilité.1421Les hooks InstructionsLoaded n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer ou modifier le chargement des instructions. Claude Code rejette leurs [champs de sortie JSON](#json-output), comme `systemMessage` et `continue`. Utilisez cet événement pour l'audit logging, le suivi de conformité, ou l'observabilité.
1377 1422
1378<h3 id="userpromptsubmit">1423<h3 id="userpromptsubmit">
1379 UserPromptSubmit1424 UserPromptSubmit
1380</h3>1425</h3>
1381 1426
1382S'exécute lorsque l'utilisateur soumet un prompt, avant que Claude ne le traite. Cela vous permet d'ajouter du contexte supplémentaire basé sur le prompt/conversation, de valider les prompts ou de bloquer certains types de prompts.1427S'exécute quand l'utilisateur soumet une invite, avant que Claude la traite. Cela vous permet d'ajouter du contexte supplémentaire basé sur l'invite/conversation, de valider les invites, ou de bloquer certains types d'invites.
1383 1428
1384Les hooks `UserPromptSubmit` ont un délai d'expiration par défaut de 30 secondes pour les types `command`, `http` et `mcp_tool`, plus court que le délai par défaut de 600 secondes pour ces types sur d'autres événements. Parce que ce hook s'exécute avant chaque prompt et bloque le traitement du modèle jusqu'à son achèvement, un hook bloqué paralyse la session. Si votre hook a besoin de plus de temps, définissez le champ `timeout` dans l'entrée du hook.1429Les hooks `UserPromptSubmit` ont un délai d'expiration par défaut de 30 secondes pour les types `command`, `http`, et `mcp_tool`, plus court que le défaut de 600 secondes pour ces types sur la plupart des autres événements. Parce que ce hook s'exécute avant chaque invite et bloque le traitement du modèle jusqu'à ce qu'il se termine, un hook bloqué paralyse la session. Si votre hook a besoin de plus de temps, définissez le champ `timeout` dans l'entrée du hook.
1385 1430
1386Apart from a command hook you run with [`async: true`](#run-hooks-in-the-background), a `UserPromptSubmit` command, HTTP, or MCP tool hook that reaches its timeout is canceled and its output, including any `additionalContext`, is discarded. The prompt still reaches Claude without that context. The transcript shows a notice naming the hook, the timeout that fired, and that the output was discarded.1431À part un hook de commande que vous exécutez avec [`async: true`](#run-hooks-in-the-background), un hook de commande, HTTP, ou MCP tool `UserPromptSubmit` qui atteint son délai d'expiration est annulé et sa sortie, y compris tout `additionalContext`, est rejetée. L'invite atteint toujours Claude sans ce contexte. La transcription affiche un avis nommant le hook, le délai d'expiration qui s'est déclenché, et que la sortie a été rejetée.
1387 1432
1388Un hook de rappel [Agent SDK](/docs/fr/agent-sdk/hooks) sur `UserPromptSubmit` qui atteint son délai d'expiration bloque le prompt avec un message nommant le hook et le délai d'expiration, car un rappel là peut agir comme une porte de politique qui ne doit pas échouer ouvertement. La session continue. Avant v2.1.208, un délai d'expiration de rappel sur cet événement terminait le tour avec une erreur d'exécution.1433Un hook de rappel [Agent SDK](/docs/fr/agent-sdk/hooks) sur `UserPromptSubmit` qui atteint son délai d'expiration bloque l'invite avec un message nommant le hook et le délai d'expiration, parce qu'un rappel là peut agir comme une porte de politique qui ne doit pas échouer ouvertement. La session continue. Avant v2.1.208, un délai d'expiration de rappel sur cet événement terminait le tour avec une erreur d'exécution.
1389 1434
1390<h4 id="userpromptsubmit-input">1435<h4 id="userpromptsubmit-input">
1391 Entrée UserPromptSubmit1436 Entrée UserPromptSubmit
1408 Contrôle de décision UserPromptSubmit1453 Contrôle de décision UserPromptSubmit
1409</h4>1454</h4>
1410 1455
1411Les hooks `UserPromptSubmit` peuvent contrôler si un prompt utilisateur est traité et ajouter du contexte. Tous les [champs de sortie JSON](#json-output) sont disponibles.1456Les hooks `UserPromptSubmit` peuvent contrôler si une invite utilisateur est traitée et ajouter du contexte. Tous les [champs de sortie JSON](#json-output) sont disponibles.
1412 1457
1413Il y a deux façons d'ajouter du contexte à la conversation sur exit code 0 :1458Il y a deux façons d'ajouter du contexte à la conversation au code de sortie 0 :
1414 1459
1415* **Stdout en texte brut** : Claude Code ajoute le stdout qu'il [traite comme du texte brut](#exit-code-0) au contexte de Claude1460* **Sortie standard en texte brut** : Claude Code ajoute la sortie standard qu'il [traite comme du texte brut](#exit-code-0) au contexte de Claude
1416* **JSON avec `additionalContext`** : utilisez le format JSON ci-dessous pour plus de contrôle. Le champ `additionalContext` est ajouté comme contexte1461* **JSON avec `additionalContext`** : utilisez le format JSON ci-dessous pour plus de contrôle. Le champ `additionalContext` est ajouté comme contexte
1417 1462
1418Aucun canal ne produit une entrée de transcription visible. Le stdout brut et la valeur `additionalContext` sont chacun injectés comme un rappel système qui commence par le nom du hook ; Claude lit les deux. Pour confirmer la livraison, vérifiez le [journal de débogage](#debug-hooks).1463Aucun canal ne produit une entrée de transcription visible. La sortie standard brute et la valeur `additionalContext` sont chacune injectées comme un rappel système qui commence par le nom du hook ; Claude lit les deux. Pour confirmer la livraison, vérifiez le [journal de débogage](#debug-hooks).
1419 1464
1420Pour bloquer un prompt, retournez un objet JSON avec `decision` défini à `"block"` :1465Pour bloquer une invite, retournez un objet JSON avec `decision` défini à `"block"` :
1421 1466
1422| Champ | Description |1467| Champ | Description |
1423| :----------------------- | :------------------------------------------------------------------------------------------------------------------------------------ |1468| :----------------------- | :---------------------------------------------------------------------------------------------------------------------------------- |
1424| `decision` | `"block"` empêche le prompt d'être traité et l'efface du contexte. Omettez pour autoriser le prompt à procéder |1469| `decision` | `"block"` empêche l'invite d'être traitée et l'efface du contexte. Omettez pour permettre à l'invite de procéder |
1425| `reason` | Affiché à l'utilisateur lorsque `decision` est `"block"`. Non ajouté au contexte |1470| `reason` | Montré à l'utilisateur quand `decision` est `"block"`. Non ajouté au contexte |
1426| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés du prompt soumis. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |1471| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés de l'invite soumise. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |
1427| `sessionTitle` | Définit le titre de la session. Utilisez pour nommer les sessions automatiquement en fonction du contenu du prompt |1472| `sessionTitle` | Définit le titre de la session. Utilisez pour nommer les sessions automatiquement en fonction du contenu de l'invite |
1428| `suppressOriginalPrompt` | Si `true` lorsque `decision` est `"block"`, omet le texte du prompt original du message de blocage affiché à l'utilisateur |1473| `suppressOriginalPrompt` | Si `true` quand `decision` est `"block"`, omet le texte d'invite original du message de blocage montré à l'utilisateur |
1429 1474
1430Un hook qui bloque en quittant 2 s'achemine de la même manière que `reason` : le message de blocage affiche le texte stderr à l'utilisateur, et il n'est pas ajouté au contexte.1475Un hook qui bloque en quittant 2 s'achemine de la même façon que `reason` : le message de blocage montre le texte stderr à l'utilisateur, et il n'est pas ajouté au contexte.
1431 1476
1432```json theme={null}1477```json theme={null}
1433{1478{
1445 UserPromptExpansion1490 UserPromptExpansion
1446</h3>1491</h3>
1447 1492
1448S'exécute lorsqu'une commande slash tapée par l'utilisateur se développe en un prompt avant d'atteindre Claude. Utilisez ceci pour bloquer des commandes spécifiques de l'invocation directe, injecter du contexte pour une skill particulière ou enregistrer quelles commandes les utilisateurs invoquent. Par exemple, un hook correspondant à `deploy` peut bloquer `/deploy` sauf si un fichier d'approbation est présent, ou un hook correspondant à une skill de révision peut ajouter la liste de contrôle de révision de l'équipe comme `additionalContext`.1493S'exécute quand une commande tapée par l'utilisateur se développe en une invite avant d'atteindre Claude. Utilisez ceci pour bloquer des commandes spécifiques de l'invocation directe, injecter du contexte pour une skill particulière, ou enregistrer quelles commandes les utilisateurs invoquent. Par exemple, un hook correspondant à `deploy` peut bloquer `/deploy` sauf si un fichier d'approbation est présent, ou un hook correspondant à une skill de révision peut ajouter la liste de contrôle de révision de l'équipe comme `additionalContext`.
1449 1494
1450Cet événement couvre le chemin que `PreToolUse` ne couvre pas : un hook `PreToolUse` correspondant à l'outil `Skill` se déclenche uniquement lorsque Claude appelle l'outil, mais taper `/skillname` directement contourne `PreToolUse`. `UserPromptExpansion` se déclenche sur ce chemin direct.1495Cet événement couvre le chemin que `PreToolUse` ne couvre pas : un hook `PreToolUse` correspondant à l'outil `Skill` se déclenche uniquement quand Claude appelle l'outil, mais taper `/skillname` directement contourne `PreToolUse`. `UserPromptExpansion` se déclenche sur ce chemin direct.
1451 1496
1452Correspond à `command_name`. Laissez le matcher vide pour se déclencher sur chaque commande de type prompt.1497Correspond à `command_name`. Laissez le matcher vide pour se déclencher sur chaque commande de type invite.
1453 1498
1454<h4 id="userpromptexpansion-input">1499<h4 id="userpromptexpansion-input">
1455 Entrée UserPromptExpansion1500 Entrée UserPromptExpansion
1456</h4>1501</h4>
1457 1502
1458En plus des [champs d'entrée communs](#common-input-fields), les hooks UserPromptExpansion reçoivent `expansion_type`, `command_name`, `command_args`, `command_source` et la chaîne `prompt` originale. Le champ `expansion_type` est `slash_command` pour les skills et commandes personnalisées, ou `mcp_prompt` pour les prompts du serveur MCP.1503En plus des [champs d'entrée communs](#common-input-fields), les hooks UserPromptExpansion reçoivent `expansion_type`, `command_name`, `command_args`, `command_source`, et la chaîne `prompt` originale. Le champ `expansion_type` est `slash_command` pour les skills et commandes personnalisées, ou `mcp_prompt` pour les invites du serveur MCP.
1459 1504
1460```json theme={null}1505```json theme={null}
1461{1506{
1479Les hooks `UserPromptExpansion` peuvent bloquer l'expansion ou ajouter du contexte. Tous les [champs de sortie JSON](#json-output) sont disponibles.1524Les hooks `UserPromptExpansion` peuvent bloquer l'expansion ou ajouter du contexte. Tous les [champs de sortie JSON](#json-output) sont disponibles.
1480 1525
1481| Champ | Description |1526| Champ | Description |
1482| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------- |1527| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------- |
1483| `decision` | `"block"` empêche la slash command de se développer. Omettez pour autoriser sa progression |1528| `decision` | `"block"` empêche la commande de se développer. Omettez pour permettre à la commande de procéder |
1484| `reason` | Affiché à l'utilisateur lorsque `decision` est `"block"` |1529| `reason` | Montré à l'utilisateur quand `decision` est `"block"` |
1485| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés du prompt développé. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |1530| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés de l'invite développée. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |
1486 1531
1487Un hook qui bloque en quittant 2 s'achemine de la même manière que `reason` : le message de blocage affiche le texte stderr à l'utilisateur.1532Un hook qui bloque en quittant 2 s'achemine de la même façon que `reason` : le message de blocage montre le texte stderr à l'utilisateur.
1488 1533
1489```json theme={null}1534```json theme={null}
1490{1535{
1501 MessageDisplay1546 MessageDisplay
1502</h3>1547</h3>
1503 1548
1504S'exécute pendant qu'un message d'assistant se diffuse à l'écran. Claude Code affiche le message par incréments : chaque fois qu'un lot de lignes nouvellement complétées est prêt à être rendu, le hook s'exécute une fois avec ces lignes et Claude Code rend le texte de remplacement du hook à leur place. Un long message produit plusieurs appels ; un court message peut ne produire qu'un seul.1549S'exécute pendant qu'un message d'assistant s'affiche à l'écran. Claude Code affiche le message par incréments : chaque fois qu'un lot de lignes nouvellement complétées est prêt à être rendu, le hook s'exécute une fois avec ces lignes et Claude Code rend le texte de remplacement du hook à leur place. Un long message produit plusieurs appels ; un court message peut ne produire qu'un seul.
1505 1550
1506Utilisez MessageDisplay pour :1551Utilisez MessageDisplay pour :
1507 1552
1508* supprimer le markdown pour un affichage minimal1553* supprimer le markdown pour un affichage minimal
1509* transformer le texte qu'une application Agent SDK affiche à ses utilisateurs1554* transformer le texte qu'une application Agent SDK montre à ses utilisateurs
1510* masquer les clés API ou les noms d'hôtes internes des réponses de Claude1555* masquer les clés API ou les noms d'hôtes internes des réponses de Claude
1511 1556
1512Claude Code retient chaque lot jusqu'à ce que votre hook retourne, donc gardez le hook rapide. Si le hook échoue ou expire, Claude Code affiche le texte original. Le délai d'expiration par défaut pour cet événement est 10 secondes ; si votre hook a besoin de plus de temps, définissez le champ `timeout` dans l'entrée du hook.1557Claude Code attend chaque lot jusqu'à ce que votre hook retourne, donc gardez le hook rapide. Si le hook échoue ou expire, Claude Code affiche le texte original. Le délai d'expiration par défaut pour cet événement est 10 secondes ; si votre hook a besoin de plus de temps, définissez le champ `timeout` dans l'entrée du hook.
1513 1558
1514MessageDisplay est affichage uniquement : le texte de remplacement change uniquement ce qui est rendu à l'écran. La transcription et ce que Claude voit conservent le texte original, donc Claude ne voit jamais le remplacement, et le mode verbeux affiche l'original. Le hook reçoit uniquement le texte du message d'assistant, donc les résultats d'outil et le texte que vous tapez s'affichent inchangés.1559MessageDisplay est affichage uniquement : le texte de remplacement change uniquement ce qui est rendu à l'écran. La transcription et ce que Claude voit conservent le texte original, donc Claude ne voit jamais le remplacement, et le mode verbeux montre l'original. Le hook reçoit uniquement le texte du message d'assistant, donc les résultats d'outils et le texte que vous tapez s'affichent inchangés.
1515 1560
1516MessageDisplay ne supporte pas les matchers et se déclenche pour chaque message d'assistant qui diffuse du texte ; les messages sans texte, comme les réponses d'appel d'outil uniquement, ne le déclenchent pas.1561MessageDisplay ne supporte pas les matchers et se déclenche pour chaque message d'assistant qui affiche du texte ; les messages sans texte, comme les réponses contenant uniquement des appels d'outils, ne le déclenchent pas.
1517 1562
1518Dans les exécutions non-interactives, y compris les requêtes Agent SDK et `claude -p`, MessageDisplay s'exécute une fois par message d'assistant au lieu d'une fois par lot de lignes. L'appel unique arrive après que le message se termine et porte le texte du message complet : `index` est `0`, `final` est `true` et `delta` contient le message entier. Un hook qui collecte le texte `delta` pour chaque message reçoit le même texte total dans les deux modes.1563Dans les exécutions non-interactives, y compris les requêtes Agent SDK et `claude -p`, MessageDisplay s'exécute une fois par message d'assistant au lieu d'une fois par lot de lignes. L'appel unique arrive après que le message se termine et porte le texte du message complet : `index` est `0`, `final` est `true`, et `delta` contient le message entier. Un hook qui collecte le texte `delta` pour chaque message reçoit le même texte total dans les deux modes.
1519 1564
1520<h4 id="messagedisplay-input">1565<h4 id="messagedisplay-input">
1521 Entrée MessageDisplay1566 Entrée MessageDisplay
1522</h4>1567</h4>
1523 1568
1524En plus des [champs d'entrée communs](#common-input-fields), les hooks MessageDisplay reçoivent des identifiants pour le tour et le message, la position de cet appel dans le message et le nouveau texte dans `delta`. Les limites de lot dépendent de la façon dont le texte se diffuse, donc utilisez `index` et `final` pour suivre la progression à travers un message plutôt que de vous attendre à ce que les lignes soient groupées d'une manière particulière.1569En plus des [champs d'entrée communs](#common-input-fields), les hooks MessageDisplay reçoivent des identifiants pour le tour et le message, la position de cet appel dans le message, et le nouveau texte dans `delta`. Les limites de lot dépendent de la façon dont le texte s'affiche, donc utilisez `index` et `final` pour suivre la progression à travers un message plutôt que de vous attendre à ce que les lignes soient groupées d'une manière particulière.
1525 1570
1526| Champ | Description |1571| Champ | Description |
1527| :----------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1572| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1528| `turn_id` | UUID du tour actuel |1573| `turn_id` | UUID du tour actuel |
1529| `message_id` | UUID du message d'assistant en cours d'affichage. Stable sur chaque lot du même message. Ce n'est pas l'API `msg_…` id, donc il ne peut pas être corrélé avec les ids de message de transcription |1574| `message_id` | UUID du message d'assistant en cours d'affichage. Stable sur chaque lot du même message. Ce n'est pas l'ID API `msg_…`, donc il ne peut pas être corrélé avec les IDs de message de transcription |
1530| `index` | Index de base zéro de ce lot dans le message |1575| `index` | Index de base zéro de ce lot dans le message |
1531| `final` | `true` sur le dernier lot du message. Chaque message a exactement un dernier lot |1576| `final` | `true` sur le dernier lot du message. Chaque message a exactement un lot final |
1532| `delta` | Les lignes nouvellement complétées depuis le lot précédent, y compris les sauts de ligne de fin. Toujours des lignes entières, sauf le dernier lot qui peut se terminer au milieu d'une ligne. Dans les exécutions interactives, le delta du dernier lot est vide lorsque le message se termine sur un saut de ligne, donc traitez `final`, pas un delta non-vide, comme le signal de fin de message. Dans les exécutions Agent SDK et `claude -p`, l'appel unique porte le message entier |1577| `delta` | Les lignes nouvellement complétées depuis le lot précédent, y compris les sauts de ligne de fin. Toujours des lignes complètes, sauf le lot final qui peut se terminer au milieu d'une ligne. Dans les exécutions interactives, le delta du lot final est vide quand le message se termine sur un saut de ligne, donc traitez `final`, pas un delta non-vide, comme le signal de fin de message. Dans les exécutions Agent SDK et `claude -p`, l'appel unique porte le message entier |
1533 1578
1534```json theme={null}1579```json theme={null}
1535{1580{
1555| :--------------- | :--------------------------------------------------------------------- |1600| :--------------- | :--------------------------------------------------------------------- |
1556| `displayContent` | Texte affiché à la place du delta. Omettez-le pour afficher l'original |1601| `displayContent` | Texte affiché à la place du delta. Omettez-le pour afficher l'original |
1557 1602
1558Les hooks MessageDisplay n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le message ou modifier ce qui est stocké dans la transcription ou envoyé à Claude. Claude Code agit sur `displayContent` de leur sortie JSON et rejette `systemMessage` et `continue`.1603Les hooks MessageDisplay n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le message ou changer ce qui est stocké dans la transcription ou envoyé à Claude. Claude Code agit sur `displayContent` de leur sortie JSON et rejette `systemMessage` et `continue`.
1559 1604
1560Cet exemple supprime la mise en forme markdown des réponses de Claude pour un affichage en texte brut. Le script lit chaque lot depuis stdin, supprime les marqueurs gras et les backticks de code en ligne du `delta`, et retourne le résultat comme `displayContent`.1605Cet exemple supprime la mise en forme markdown des réponses de Claude pour un affichage en texte brut. Le script lit chaque lot depuis stdin, supprime les marqueurs gras et les backticks de code en ligne de `delta`, et retourne le résultat comme `displayContent`.
1561 1606
1562<Tabs>1607<Tabs>
1563 <Tab title="macOS/Linux">1608 <Tab title="macOS/Linux">
1616 }1661 }
1617 ```1662 ```
1618 1663
1619 Le drapeau `-NoProfile` saute le chargement de votre profil PowerShell afin que le hook démarre rapidement, et `-ExecutionPolicy Bypass` permet à PowerShell d'exécuter le fichier de script local.1664 Le drapeau `-NoProfile` ignore le chargement de votre profil PowerShell pour que le hook démarre rapidement, et `-ExecutionPolicy Bypass` permet à PowerShell d'exécuter le fichier de script local.
1620 1665
1621 Enregistrez ce script dans `.claude/hooks/plain-display.ps1` dans votre projet :1666 Enregistrez ce script dans `.claude/hooks/plain-display.ps1` dans votre projet :
1622 1667
1639 PreToolUse1684 PreToolUse
1640</h3>1685</h3>
1641 1686
1642S'exécute après que Claude crée les paramètres de l'outil et avant le traitement de l'appel d'outil. Correspond au nom de l'outil sauf `EndConversation` : les outils intégrés tels que `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` et `ExitPlanMode`, et tout [nom d'outil MCP](#match-mcp-tools).1687S'exécute après que Claude crée les paramètres d'outil et avant de traiter l'appel d'outil. Correspond à n'importe quel nom d'outil sauf `EndConversation` : les outils intégrés comme `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion`, et `ExitPlanMode`, et n'importe quels [noms d'outils MCP](#match-mcp-tools).
1643 1688
1644Pour exécuter un hook lorsqu'un fichier spécifique change sur le disque, quel que soit ce qui l'a écrit, utilisez [FileChanged](#filechanged) à la place de la correspondance des outils d'édition de fichiers par nom. Contrairement à PreToolUse, Claude Code exécute les hooks FileChanged après la modification, et ils n'ont pas de contrôle de décision, donc ils ne peuvent pas bloquer l'écriture.1689Pour exécuter un hook quand un fichier spécifique change sur le disque, quel que soit ce qui l'a écrit, utilisez [FileChanged](#filechanged) au lieu de correspondre aux outils d'édition de fichiers par nom. Contrairement à PreToolUse, Claude Code exécute les hooks FileChanged après le changement, et ils n'ont pas de contrôle de décision, donc ils ne peuvent pas bloquer l'écriture.
1645 1690
1646<Warning>1691<Warning>
1647 PreToolUse s'exécute uniquement lorsque Claude appelle un outil. Les fichiers que vous [référencez avec `@` dans votre prompt](/docs/fr/common-workflows#reference-files-and-directories) sont ajoutés sans aucun appel d'outil : Claude Code insère leurs contenus lors de la construction du prompt, donc aucun hook PreToolUse ne se déclenche pour eux, y compris les hooks correspondant à `Read`. Pour bloquer des chemins spécifiques des références `@`, utilisez une [règle de refus `Read`](/docs/fr/permissions#read-and-edit) à la place.1692 PreToolUse s'exécute uniquement quand Claude appelle un outil. Les fichiers que vous [référencez avec `@` dans votre invite](/docs/fr/common-workflows#reference-files-and-directories) sont ajoutés sans aucun appel d'outil : Claude Code insère leur contenu lors de la construction de l'invite, donc aucun hook PreToolUse ne se déclenche pour eux, y compris les hooks correspondant à `Read`. Pour bloquer des chemins spécifiques des références `@`, utilisez plutôt une [règle de refus `Read`](/docs/fr/permissions#read-and-edit).
1648 1693
1649 PreToolUse ne se déclenche pas non plus pour [`EndConversation`](/docs/fr/tools-reference#endconversation-tool-behavior).1694 PreToolUse ne se déclenche pas non plus pour [`EndConversation`](/docs/fr/tools-reference#endconversation-tool-behavior).
1650</Warning>1695</Warning>
1651 1696
1652Utilisez [Contrôle de décision PreToolUse](#pretooluse-decision-control) pour autoriser, refuser, demander ou différer l'appel d'outil.1697Utilisez [Contrôle de décision PreToolUse](#pretooluse-decision-control) pour permettre, refuser, demander, ou différer l'appel d'outil.
1653 1698
1654Un hook de rappel [Agent SDK](/docs/fr/agent-sdk/hooks) sur `PreToolUse` qui dépasse son délai d'expiration bloque l'appel d'outil, et Claude reçoit un résultat d'erreur nommant le délai d'expiration. Un refus explicite retourné par un autre hook a toujours la priorité.1699Un hook de rappel [Agent SDK](/docs/fr/agent-sdk/hooks) sur `PreToolUse` qui dépasse son délai d'expiration bloque l'appel d'outil, et Claude reçoit un résultat d'erreur nommant le délai d'expiration. Un refus explicite retourné par un autre hook a toujours la priorité.
1655 1700
1657 Entrée PreToolUse1702 Entrée PreToolUse
1658</h4>1703</h4>
1659 1704
1660En plus des [champs d'entrée communs](#common-input-fields), les hooks PreToolUse reçoivent `tool_name`, `tool_input` et `tool_use_id`.1705En plus des [champs d'entrée communs](#common-input-fields), les hooks PreToolUse reçoivent `tool_name`, `tool_input`, et `tool_use_id`.
1661 1706
1662Pour les outils de fichier `Write`, `Edit` et `Read`, `tool_input.file_path` est toujours absolu :1707Pour un [outil MCP](#match-mcp-tools), l'entrée porte également `mcp_server`, un objet avec le `name` du serveur et une `source` qui dit d'où la définition du serveur provient. Les valeurs `source` incluent `plugin`, `sdk`, et les portées de configuration comme `user` et `project`. [`McpServerProvenance`](/docs/fr/agent-sdk/typescript#mcpserverprovenance) dans la référence Agent SDK les liste tous et dit comment traiter celui que vous ne reconnaissez pas. Basez les décisions de confiance sur `source` plutôt que sur `name` ou le préfixe d'outil `mcp__<server>__`. Le champ `mcp_server` nécessite Claude Code v2.1.274 ou ultérieur.
1663 1708
1664* Claude Code développe `~` et les chemins relatifs avant que les hooks ne s'exécutent, donc un hook qui correspond aux chemins ne peut pas être contourné via `~` ou une orthographe relative du même chemin1709Pour les outils de fichier `Write`, `Edit`, et `Read`, `tool_input.file_path` est toujours absolu :
1665* Sur Windows, le chemin arrive avec des séparateurs de barre oblique inverse, même lorsque votre hook s'exécute sous Git Bash où `$PWD` ressemble à `/c/project`1710
1711* Claude Code développe `~` et les chemins relatifs avant que les hooks s'exécutent, donc un hook qui correspond à des chemins ne peut pas être contourné via `~` ou une orthographe relative du même chemin
1712* Sur Windows, le chemin arrive avec des séparateurs de barre oblique inverse, même quand votre hook s'exécute sous Git Bash où `$PWD` ressemble à `/c/project`
1666* Une comparaison écrite avec des barres obliques avant, comme une vérification `/src/`, ne correspond jamais à un chemin de barre oblique inverse, et l'appel d'outil procède comme si le hook n'avait rien à bloquer1713* Une comparaison écrite avec des barres obliques avant, comme une vérification `/src/`, ne correspond jamais à un chemin de barre oblique inverse, et l'appel d'outil procède comme si le hook n'avait rien à bloquer
1667* Normalisez les séparateurs avant de comparer : `FILE_PATH="${FILE_PATH//\\//}"` en Bash, ou `file_path.replace("\\", "/")` en Python, puis correspondez à un segment de chemin tel que `/src/` plutôt que d'ancrer avec `^`, puisque le chemin est absolu1714* Normalisez les séparateurs avant de comparer : `FILE_PATH="${FILE_PATH//\\//}"` en Bash, ou `file_path.replace("\\", "/")` en Python, puis correspondez à un segment de chemin comme `/src/` plutôt que d'ancrer avec `^`, puisque le chemin est absolu
1668 1715
1669Un appel `Write` sur Windows livre :1716Un appel `Write` sur Windows livre :
1670 1717
1682 1729
1683Les champs `tool_input` dépendent de l'outil :1730Les champs `tool_input` dépendent de l'outil :
1684 1731
1732<a id="bash" />
1733
1685<h5 id="bash">1734<h5 id="bash">
1686 Bash1735 Bash
1687</h5>1736</h5>
1691| Champ | Type | Exemple | Description |1740| Champ | Type | Exemple | Description |
1692| :------------------ | :------ | :----------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1741| :------------------ | :------ | :----------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1693| `command` | string | `"npm test"` | La commande shell à exécuter |1742| `command` | string | `"npm test"` | La commande shell à exécuter |
1694| `description` | string | `"Run test suite"` | Description optionnelle de ce que fait la commande |1743| `description` | string | `"Run test suite"` | Description optionnelle de ce que la commande fait |
1695| `timeout` | number | `120000` | Délai d'expiration optionnel en millisecondes. Les valeurs au-dessus du [maximum](/docs/fr/tools-reference#bash-tool-behavior) sont réduites au maximum plutôt que rejetées |1744| `timeout` | number | `120000` | Délai d'expiration optionnel en millisecondes. Les valeurs au-dessus du [maximum](/docs/fr/tools-reference#bash-tool-behavior) sont réduites au maximum plutôt que rejetées |
1696| `run_in_background` | boolean | `false` | Si la commande doit s'exécuter en arrière-plan |1745| `run_in_background` | boolean | `false` | Si la commande doit s'exécuter en arrière-plan |
1697 1746
1747Quand une commande Bash change des fichiers dans un référentiel Git, Claude Code peut enregistrer ce qui a changé. Il enregistre les changements dans chaque mode de permission quand le paramètre [`bashEditDiffEnabled`](/docs/fr/settings-reference#basheditdiffenabled) active l'enregistrement ; l'entrée de ce paramètre dit quels fichiers peuvent le définir. Sinon, il les enregistre uniquement en mode auto et en mode `bypassPermissions`, et uniquement quand Claude Code dirige Claude à éditer des fichiers via Bash. Définissez `bashEditDiffEnabled` à `false` pour désactiver l'enregistrement. Les commandes en arrière-plan et les commandes en lecture seule ne portent pas de diff.
1748
1749Votre hook [PostToolUse](#posttooluse) reçoit alors les fichiers modifiés dans `tool_response.bashEditDiff`. La liste couvre ce qui a changé sous le référentiel pendant que la commande s'exécutait. Les fichiers que Git ignore et les fichiers dans les sous-modules ne sont pas listés. Nécessite Claude Code v2.1.269 ou ultérieur.
1750
1751<Note>
1752 La liste est au mieux un effort et en bêta publique. Claude Code peut manquer un changement, inclure un fichier qu'un autre processus a changé au même moment, ou s'arrêter à ses limites de taille. La forme du champ peut changer. Utilisez la liste pour trouver ce à examiner, pas pour appliquer une politique.
1753</Note>
1754
1755`changedFiles` et `files` listent ce que la commande a changé ; les champs restants disent à quel point cette liste est complète et fiable.
1756
1757| Champ | Type | Exemple | Description |
1758| :------------- | :------ | :------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1759| `changedFiles` | array | `["/path/to/src/app.ts"]` | Chemins absolus des fichiers que la commande a changés, au maximum 200. Présent chaque fois que `files` contient un diff ou `moreFiles` est au-dessus de zéro |
1760| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs de jusqu'à 5 fichiers modifiés, pour l'affichage. `created` ou `deleted` est `true` pour un fichier que la commande a ajouté ou supprimé |
1761| `moreFiles` | number | `2` | Nombre de fichiers modifiés sans diff dans `files` |
1762| `unavailable` | boolean | `true` | Défini quand le diff est incomplet ou n'a pas pu être pris |
1763| `skipped` | boolean | `true` | Défini pour une commande Git qui déplace l'arborescence de travail, comme `git checkout` ou `git stash`, donc Claude Code ne prend pas de diff |
1764| `shared` | boolean | `true` | Défini quand un autre appel d'outil Bash, comme celui d'un sous-agent, s'exécutait dans le même référentiel au même moment, donc certains changements listés peuvent être celui de cette commande |
1765
1698<a id="powershell" />1766<a id="powershell" />
1699 1767
1700<h5 id="powershell">1768<h5 id="powershell">
1701 PowerShell1769 PowerShell
1702</h5>1770</h5>
1703 1771
1704Exécute les commandes PowerShell. Consultez l'[outil PowerShell](/docs/fr/tools-reference#powershell-tool) pour la disponibilité par plateforme.1772Exécute les commandes PowerShell. Voir l'[outil PowerShell](/docs/fr/tools-reference#powershell-tool) pour la disponibilité par plateforme.
1705 1773
1706Les champs correspondent à l'outil Bash, avec la chaîne de commande dans `command` :1774Les champs correspondent à l'outil Bash, avec la chaîne de commande dans `command` :
1707 1775
1708| Champ | Type | Exemple | Description |1776| Champ | Type | Exemple | Description |
1709| :------------------ | :------ | :------------------------- | :------------------------------------------------- |1777| :------------------ | :------ | :------------------------- | :------------------------------------------------- |
1710| `command` | string | `"Get-ChildItem -Recurse"` | La commande PowerShell à exécuter |1778| `command` | string | `"Get-ChildItem -Recurse"` | La commande PowerShell à exécuter |
1711| `description` | string | `"List files recursively"` | Description optionnelle de ce que fait la commande |1779| `description` | string | `"List files recursively"` | Description optionnelle de ce que la commande fait |
1712| `timeout` | number | `120000` | Délai d'expiration optionnel en millisecondes |1780| `timeout` | number | `120000` | Délai d'expiration optionnel en millisecondes |
1713| `run_in_background` | boolean | `false` | Si la commande doit s'exécuter en arrière-plan |1781| `run_in_background` | boolean | `false` | Si la commande doit s'exécuter en arrière-plan |
1714 1782
1715Correspondez à `Bash|PowerShell` dans les hooks qui inspectent les commandes shell, afin qu'ils couvrent les deux outils :1783Correspondez à `Bash|PowerShell` dans les hooks qui inspectent les commandes shell, pour qu'ils couvrent les deux outils :
1716 1784
1717* Sur Windows, partout où l'outil PowerShell est activé, Claude traite PowerShell comme le shell principal et achemine les commandes shell à travers lui.1785* Sur Windows, partout où l'outil PowerShell est activé, Claude traite PowerShell comme le shell principal et achemine les commandes shell à travers lui.
1718* Sur Windows sans Git Bash, l'outil est activé automatiquement et Claude Code n'enregistre pas du tout l'outil Bash.1786* Sur Windows sans Git Bash, l'outil est activé automatiquement et Claude Code n'enregistre pas l'outil Bash du tout.
1719* Un hook qui correspond uniquement à `Bash` ne se déclenche jamais là.1787* Un hook qui correspond uniquement à `Bash` ne se déclenche jamais là.
1720 1788
1721<h5 id="write">1789<h5 id="write">
1722 Write1790 Write
1723</h5>1791</h5>
1724 1792
1725Crée ou écrase un fichier.1793Crée ou remplace un fichier.
1726 1794
1727| Champ | Type | Exemple | Description |1795| Champ | Type | Exemple | Description |
1728| :---------- | :----- | :-------------------- | :------------------------------------- |1796| :---------- | :----- | :-------------------- | :-------------------------------- |
1729| `file_path` | string | `"/path/to/file.txt"` | Chemin absolu vers le fichier à écrire |1797| `file_path` | string | `"/path/to/file.txt"` | Chemin absolu du fichier à écrire |
1730| `content` | string | `"file content"` | Contenu à écrire dans le fichier |1798| `content` | string | `"file content"` | Contenu à écrire dans le fichier |
1731 1799
1732<h5 id="edit">1800<h5 id="edit">
1737 1805
1738| Champ | Type | Exemple | Description |1806| Champ | Type | Exemple | Description |
1739| :------------ | :------ | :-------------------- | :------------------------------------------------ |1807| :------------ | :------ | :-------------------- | :------------------------------------------------ |
1740| `file_path` | string | `"/path/to/file.txt"` | Chemin absolu vers le fichier à éditer |1808| `file_path` | string | `"/path/to/file.txt"` | Chemin absolu du fichier à éditer |
1741| `old_string` | string | `"original text"` | Texte à trouver et remplacer |1809| `old_string` | string | `"original text"` | Texte à trouver et remplacer |
1742| `new_string` | string | `"replacement text"` | Texte de remplacement |1810| `new_string` | string | `"replacement text"` | Texte de remplacement |
1743| `replace_all` | boolean | `false` | Si toutes les occurrences doivent être remplacées |1811| `replace_all` | boolean | `false` | Si toutes les occurrences doivent être remplacées |
1749Lit le contenu des fichiers.1817Lit le contenu des fichiers.
1750 1818
1751| Champ | Type | Exemple | Description |1819| Champ | Type | Exemple | Description |
1752| :---------- | :----- | :-------------------- | :------------------------------------------------------------- |1820| :---------- | :----- | :-------------------- | :-------------------------------------------------- |
1753| `file_path` | string | `"/path/to/file.txt"` | Chemin absolu vers le fichier à lire |1821| `file_path` | string | `"/path/to/file.txt"` | Chemin absolu du fichier à lire |
1754| `offset` | number | `10` | Numéro de ligne optionnel à partir duquel commencer la lecture |1822| `offset` | number | `10` | Numéro de ligne optionnel pour commencer la lecture |
1755| `limit` | number | `50` | Nombre optionnel de lignes à lire |1823| `limit` | number | `50` | Nombre optionnel de lignes à lire |
1756 1824
1757<h5 id="glob">1825<h5 id="glob">
1761Trouve les fichiers correspondant à un modèle glob.1829Trouve les fichiers correspondant à un modèle glob.
1762 1830
1763| Champ | Type | Exemple | Description |1831| Champ | Type | Exemple | Description |
1764| :-------- | :----- | :--------------- | :----------------------------------------------------------------------------- |1832| :-------- | :----- | :--------------- | :---------------------------------------------------------------------------- |
1765| `pattern` | string | `"**/*.ts"` | Modèle glob pour correspondre aux fichiers |1833| `pattern` | string | `"**/*.ts"` | Modèle glob pour correspondre aux fichiers |
1766| `path` | string | `"/path/to/dir"` | Répertoire optionnel à rechercher. Par défaut le répertoire de travail courant |1834| `path` | string | `"/path/to/dir"` | Répertoire optionnel à rechercher. Par défaut le répertoire de travail actuel |
1767 1835
1768<h5 id="grep">1836<h5 id="grep">
1769 Grep1837 Grep
1772Recherche le contenu des fichiers avec des expressions régulières.1840Recherche le contenu des fichiers avec des expressions régulières.
1773 1841
1774| Champ | Type | Exemple | Description |1842| Champ | Type | Exemple | Description |
1775| :------------ | :------ | :--------------- | :---------------------------------------------------------------------------------- |1843| :------------ | :------ | :--------------- | :----------------------------------------------------------------------------------- |
1776| `pattern` | string | `"TODO.*fix"` | Modèle d'expression régulière à rechercher |1844| `pattern` | string | `"TODO.*fix"` | Modèle d'expression régulière à rechercher |
1777| `path` | string | `"/path/to/dir"` | Fichier ou répertoire optionnel à rechercher |1845| `path` | string | `"/path/to/dir"` | Fichier ou répertoire optionnel à rechercher |
1778| `glob` | string | `"*.ts"` | Modèle glob optionnel pour filtrer les fichiers |1846| `glob` | string | `"*.ts"` | Modèle glob optionnel pour filtrer les fichiers |
1779| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` ou `"count"`. Par défaut `"files_with_matches"` |1847| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"`, ou `"count"`. Par défaut `"files_with_matches"` |
1780| `-i` | boolean | `true` | Recherche insensible à la casse |1848| `-i` | boolean | `true` | Recherche insensible à la casse |
1781| `multiline` | boolean | `false` | Activer la correspondance multiligne |1849| `multiline` | boolean | `false` | Activer la correspondance multiligne |
1782 1850
1787Récupère et traite le contenu web.1855Récupère et traite le contenu web.
1788 1856
1789| Champ | Type | Exemple | Description |1857| Champ | Type | Exemple | Description |
1790| :------- | :----- | :---------------------------- | :-------------------------------------------- |1858| :------- | :----- | :---------------------------- | :---------------------------------------- |
1791| `url` | string | `"https://example.com/api"` | URL à partir de laquelle récupérer le contenu |1859| `url` | string | `"https://example.com/api"` | URL pour récupérer le contenu |
1792| `prompt` | string | `"Extract the API endpoints"` | Prompt à exécuter sur le contenu récupéré |1860| `prompt` | string | `"Extract the API endpoints"` | Invite à exécuter sur le contenu récupéré |
1793 1861
1794<h5 id="websearch">1862<h5 id="websearch">
1795 WebSearch1863 WebSearch
1796</h5>1864</h5>
1797 1865
1798Recherche sur le web.1866Recherche le web.
1799 1867
1800| Champ | Type | Exemple | Description |1868| Champ | Type | Exemple | Description |
1801| :---------------- | :----- | :----------------------------- | :----------------------------------------------------------- |1869| :---------------- | :----- | :----------------------------- | :----------------------------------------------------------- |
1807 Agent1875 Agent
1808</h5>1876</h5>
1809 1877
1810Lance un [subagent](/docs/fr/sub-agents).1878Crée un [sous-agent](/docs/fr/sub-agents).
1811 1879
1812| Champ | Type | Exemple | Description |1880| Champ | Type | Exemple | Description |
1813| :-------------- | :----- | :------------------------- | :------------------------------------------------------------ |1881| :-------------- | :----- | :------------------------- | :------------------------------------------------- |
1814| `prompt` | string | `"Find all API endpoints"` | La tâche pour l'agent à effectuer |1882| `prompt` | string | `"Find all API endpoints"` | La tâche pour l'agent à effectuer |
1815| `description` | string | `"Find API endpoints"` | Description courte de la tâche |1883| `description` | string | `"Find API endpoints"` | Description courte de la tâche |
1816| `subagent_type` | string | `"Explore"` | Type d'agent spécialisé à utiliser |1884| `subagent_type` | string | `"Explore"` | Type d'agent spécialisé à utiliser |
1817| `model` | string | `"sonnet"` | Alias de modèle optionnel pour remplacer la valeur par défaut |1885| `model` | string | `"sonnet"` | Alias de modèle optionnel pour remplacer le défaut |
1818 1886
1819Lorsqu'un appel Agent au premier plan se termine, votre hook [PostToolUse](#posttooluse) reçoit le texte final du subagent et la télémétrie d'exécution dans `tool_response`. Lisez ces champs pour inspecter l'exécution ; pour les cumuls de tokens et de coûts entre les subagents, utilisez les [compteurs de tokens et de coûts](/docs/fr/monitoring-usage#token-counter) filtrés sur `query_source` `"subagent"`, puisque `totalTokens` et `usage` couvrent uniquement la demande finale :1887Quand un appel Agent au premier plan se termine, votre hook [PostToolUse](#posttooluse) reçoit le texte final du sous-agent et la télémétrie d'exécution dans `tool_response`. Lisez ces champs pour inspecter l'exécution ; pour les cumuls de tokens et de coûts entre les sous-agents, utilisez les [compteurs de tokens et de coûts](/docs/fr/monitoring-usage#token-counter) filtrés à `query_source` `"subagent"`, puisque `totalTokens` et `usage` couvrent uniquement la demande finale :
1820 1888
1821| Champ | Type | Exemple | Description |1889| Champ | Type | Exemple | Description |
1822| :------------------ | :----- | :---------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1890| :------------------ | :----- | :---------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1823| `status` | string | `"completed"` | `"completed"` pour les subagents au premier plan, `"async_launched"` pour les subagents en arrière-plan. À partir de v2.1.198, les subagents s'exécutent en arrière-plan par défaut, donc un `run_in_background` omis produit également `"async_launched"` |1891| `status` | string | `"completed"` | `"completed"` pour les sous-agents au premier plan, `"async_launched"` pour les sous-agents en arrière-plan. À partir de v2.1.198, les sous-agents s'exécutent en arrière-plan par défaut, donc un `run_in_background` omis produit également `"async_launched"` |
1824| `agentId` | string | `"a4d2c8f1e0b3a297"` | Identifiant pour l'exécution du subagent |1892| `agentId` | string | `"a4d2c8f1e0b3a297"` | Identifiant pour l'exécution du sous-agent |
1825| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Les blocs de texte finaux du subagent |1893| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Les blocs de texte finaux du sous-agent, ou, pour un sous-agent dont le rapport passe par `SubagentHandback`, une note courte sur ce hand-back à leur place |
1826| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modèle sur lequel le subagent a fonctionné, qui peut différer du modèle demandé. Nécessite Claude Code v2.1.174 ou ultérieur |1894| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modèle sur lequel le sous-agent a démarré, qui peut différer du modèle demandé |
1827| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Modèles utilisés dans l'ordre, avec les répétitions consécutives effondrées ; défini uniquement lorsque le modèle a été échangé en milieu d'exécution. Nécessite Claude Code v2.1.212 ou ultérieur |1895| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Modèles utilisés dans l'ordre, avec les répétitions consécutives effondrées ; défini uniquement quand le modèle a été échangé en cours d'exécution. Nécessite Claude Code v2.1.212 ou ultérieur |
1828| `totalTokens` | number | `12450` | Nombre de tokens de la demande API finale du subagent : tokens d'entrée, de sortie et de cache combinés. Ce n'est pas un total sur toute l'exécution |1896| `totalTokens` | number | `12450` | Nombre de tokens de la demande API finale du sous-agent : tokens d'entrée, de sortie, et de cache combinés. Ce n'est pas un total sur toute l'exécution |
1829| `totalDurationMs` | number | `48211` | Durée murale de l'exécution du subagent |1897| `totalDurationMs` | number | `48211` | Durée d'horloge murale de l'exécution du sous-agent |
1830| `totalToolUseCount` | number | `7` | Nombre d'appels d'outil que le subagent a effectués |1898| `totalToolUseCount` | number | `7` | Nombre d'appels d'outils que le sous-agent a effectués |
1831| `usage` | object | `{"input_tokens": 8320, ...}` | Ventilation des tokens par type de la demande API finale : `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1899| `usage` | object | `{"input_tokens": 8320, ...}` | Ventilation des tokens par type de la demande API finale : `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1832 1900
1833Pour les subagents en arrière-plan, l'outil retourne lorsque la tâche passe en arrière-plan, donc `tool_response` ne porte aucun champ d'utilisation : un lancement en arrière-plan retourne immédiatement, et une tâche au premier plan que Claude Code met en arrière-plan en milieu d'exécution retourne à cette transition. Il a `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` et `resolvedModel`.1901Sur Claude Code v2.1.271 ou ultérieur, un sous-agent qui s'exécute avec l'outil [`SubagentHandback`](/docs/fr/tools-reference) que Claude Code fournit en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) livre son rapport via cet outil plutôt que de le retourner comme texte. Le champ `content` de son résultat `completed` porte alors une note courte sur ce hand-back plutôt que le rapport lui-même. Pour lire le rapport, correspondez un hook `PreToolUse` ou `PostToolUse` sur `SubagentHandback` et lisez `tool_input.message`.
1834 1902
1835Sur une réponse `completed`, `resolvedModel` nomme le modèle sur lequel le subagent a commencé, qui peut différer de la valeur `model` dans `tool_input`, comme lorsque `availableModels` ou un autre remplacement s'applique. Il nécessite Claude Code v2.1.174 ou ultérieur. Sur une réponse `async_launched`, `resolvedModel` nomme le modèle en usage lorsque l'agent a passé en arrière-plan, donc un échange qui s'est produit avant la mise en arrière-plan est reflété là. `modelsUsed` et le comportement `resolvedModel` au moment de la mise en arrière-plan nécessitent Claude Code v2.1.212 ou ultérieur.1903Pour les sous-agents en arrière-plan, l'outil retourne quand la tâche passe en arrière-plan, donc `tool_response` ne porte pas de champs d'utilisation : un lancement en arrière-plan retourne immédiatement, et une tâche au premier plan que Claude Code met en arrière-plan en cours d'exécution retourne à cette transition. Il a `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile`, et `resolvedModel`.
1904
1905Sur une réponse `completed`, `resolvedModel` nomme le modèle sur lequel le sous-agent a démarré, qui peut différer de la valeur `model` dans `tool_input`, comme quand `availableModels` ou un autre remplacement s'applique. Sur une réponse `async_launched`, `resolvedModel` nomme le modèle en utilisation quand l'agent a passé en arrière-plan, donc un échange qui s'est produit avant la mise en arrière-plan est reflété là. `modelsUsed` et le comportement `resolvedModel` au moment de la mise en arrière-plan nécessitent Claude Code v2.1.212 ou ultérieur.
1836 1906
1837<a id="askuserquestion" />1907<a id="askuserquestion" />
1838 1908
1843Pose à l'utilisateur une à quatre questions à choix multiples.1913Pose à l'utilisateur une à quatre questions à choix multiples.
1844 1914
1845| Champ | Type | Exemple | Description |1915| Champ | Type | Exemple | Description |
1846| :---------- | :----- | :----------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1916| :---------- | :----- | :----------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1847| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Questions à présenter, chacune avec une chaîne `question`, un court `header`, un tableau `options` et un drapeau optionnel `multiSelect` |1917| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Questions à présenter, chacune avec une chaîne `question`, un court `header`, un tableau `options`, et un drapeau `multiSelect` optionnel |
1848| `answers` | object | `{"Which framework?": "React"}` | Optionnel. Mappe le texte de la question à l'étiquette de l'option sélectionnée. Les réponses multi-sélection joignent les étiquettes avec des virgules. Claude ne définit pas ce champ ; fournissez-le via `updatedInput` pour répondre par programmation |1918| `answers` | object | `{"Which framework?": "React"}` | Optionnel. Mappe le texte de la question à l'étiquette d'option sélectionnée. Les réponses multi-sélection joignent les étiquettes avec des virgules. Claude ne définit pas ce champ ; fournissez-le via `updatedInput` pour répondre par programmation |
1849 1919
1850<h5 id="exitplanmode">1920<h5 id="exitplanmode">
1851 ExitPlanMode1921 ExitPlanMode
1852</h5>1922</h5>
1853 1923
1854Présente un plan et demande à l'utilisateur de l'approuver avant que Claude ne quitte le [mode plan](/docs/fr/permission-modes#analyze-before-you-edit-with-plan-mode). Claude écrit le plan dans un fichier sur le disque avant d'appeler l'outil, donc l'`tool_input` littéral du modèle est généralement vide. Claude Code injecte le contenu du plan et le chemin du fichier avant de transmettre l'entrée aux hooks.1924Présente un plan et demande à l'utilisateur de l'approuver avant que Claude quitte le [mode plan](/docs/fr/permission-modes#analyze-before-you-edit-with-plan-mode). Claude écrit le plan dans un fichier sur le disque avant d'appeler l'outil, donc l'`tool_input` littéral du modèle est généralement vide. Claude Code injecte le contenu du plan et le chemin du fichier avant de passer l'entrée aux hooks.
1855 1925
1856| Champ | Type | Exemple | Description |1926| Champ | Type | Exemple | Description |
1857| :--------------- | :----- | :------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1927| :--------------- | :----- | :------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1858| `plan` | string | `"## Refactor auth\n1. Extract..."` | Contenu du plan en Markdown. Injecté à partir du fichier de plan sur le disque |1928| `plan` | string | `"## Refactor auth\n1. Extract..."` | Contenu du plan en Markdown. Injecté à partir du fichier de plan sur le disque |
1859| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Chemin vers le fichier de plan. Injecté |1929| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Chemin du fichier de plan. Injecté |
1860| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Dépréciée. Claude Code accepte le champ mais l'ignore. Avant v2.1.205, il portait les permissions basées sur les prompts que Claude demandait pour implémenter le plan |1930| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Déprécié. Claude Code accepte le champ mais l'ignore. Avant v2.1.205, il portait les permissions basées sur les invites que Claude a demandées pour implémenter le plan |
1861 1931
1862Dans `PostToolUse`, `tool_response` est un objet avec les champs `plan` et `filePath` contenant le plan approuvé, plus les drapeaux d'état internes. Lisez `tool_response.plan` pour le contenu du plan plutôt que de relire le fichier depuis le disque.1932Dans `PostToolUse`, `tool_response` est un objet avec les champs `plan` et `filePath` contenant le plan approuvé, plus les drapeaux d'état internes. Lisez `tool_response.plan` pour le contenu du plan plutôt que de relire le fichier depuis le disque.
1863 1933
1865 Contrôle de décision PreToolUse1935 Contrôle de décision PreToolUse
1866</h4>1936</h4>
1867 1937
1868Les hooks `PreToolUse` peuvent contrôler si un appel d'outil procède. Contrairement aux autres hooks qui utilisent un champ `decision` au niveau supérieur, PreToolUse retourne sa décision à l'intérieur d'un objet `hookSpecificOutput`. Cela lui donne un contrôle plus riche : quatre résultats (autoriser, refuser, demander ou différer) plus la capacité de modifier l'entrée de l'outil avant l'exécution.1938Les hooks `PreToolUse` peuvent contrôler si un appel d'outil procède. Contrairement aux autres hooks qui utilisent un champ `decision` de haut niveau, PreToolUse retourne sa décision à l'intérieur d'un objet `hookSpecificOutput`. Cela lui donne un contrôle plus riche : quatre résultats (permettre, refuser, demander, ou différer) plus la capacité de modifier l'entrée d'outil avant l'exécution.
1869 1939
1870| Champ | Description |1940| Champ | Description |
1871| :------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1941| :------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1872| `permissionDecision` | `"allow"` contourne le dialogue de permission, sauf pour les [actions que le mode auto n'approuve pas automatiquement](/docs/fr/permission-modes#actions-no-mode-auto-approves) et pour `AskUserQuestion` et `ExitPlanMode`, qui ont besoin de [`updatedInput` associé à lui](#allow-with-updatedinput). `"deny"` empêche l'appel d'outil. `"ask"` demande à l'utilisateur de confirmer. `"defer"` sort gracieusement afin que l'outil puisse être repris plus tard. Les règles [Deny and ask](/docs/fr/permissions#manage-permissions) s'appliquent toujours indépendamment de ce que le hook retourne |1942| `permissionDecision` | `"allow"` ignore l'invite de permission, sauf pour les [actions que aucun mode n'approuve automatiquement](/docs/fr/permission-modes#actions-no-mode-auto-approves) et pour `AskUserQuestion` et `ExitPlanMode`, qui ont besoin de [`updatedInput` associé](#allow-with-updatedinput). `"deny"` empêche l'appel d'outil. `"ask"` invite l'utilisateur à confirmer. `"defer"` quitte proprement pour que l'outil puisse être repris plus tard. Les [règles de refus et de demande](/docs/fr/permissions#manage-permissions) sont toujours évaluées indépendamment de ce que le hook retourne |
1873| `permissionDecisionReason` | Pour `"allow"` et `"ask"`, affiché à l'utilisateur mais pas à Claude. Pour `"deny"`, affiché à Claude. Pour `"defer"`, ignoré |1943| `permissionDecisionReason` | Pour `"allow"` et `"ask"`, montré à l'utilisateur mais pas à Claude. Pour `"deny"`, montré à Claude. Pour `"defer"`, ignoré |
1874| `updatedInput` | Modifie les paramètres d'entrée de l'outil avant l'exécution. Remplace l'objet d'entrée entier, donc incluez les champs inchangés aux côtés des champs modifiés. Claude Code évalue les règles de permission et l'éligibilité de [mise en arrière-plan automatique](/docs/fr/tools-reference#background-commands) d'une commande Bash par rapport à l'entrée que votre hook retourne, pas l'entrée que Claude a envoyée. Combinez avec `"allow"` pour approuver automatiquement, ou `"ask"` pour montrer l'entrée modifiée à l'utilisateur. Pour `"defer"`, ignoré |1944| `updatedInput` | Modifie les paramètres d'entrée de l'outil avant l'exécution. Remplace l'objet d'entrée entier, donc incluez les champs inchangés aux côtés des champs modifiés. Claude Code évalue les règles de permission et l'éligibilité de [mise en arrière-plan automatique](/docs/fr/tools-reference#background-commands) d'une commande Bash contre l'entrée que votre hook retourne, pas l'entrée que Claude a envoyée. Combinez avec `"allow"` pour approuver automatiquement, ou `"ask"` pour montrer l'entrée modifiée à l'utilisateur. Pour `"defer"`, ignoré |
1875| `additionalContext` | Chaîne ajoutée au contexte de Claude avant l'exécution de l'outil. Ignoré lorsque `permissionDecision` est `"defer"`. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |1945| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés du résultat de l'outil. Ignoré quand `permissionDecision` est `"defer"`. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |
1876 1946
1877Lorsque plusieurs hooks PreToolUse retournent des décisions différentes, la précédence est `deny` > `defer` > `ask` > `allow`.1947Quand plusieurs hooks PreToolUse retournent des décisions différentes, la priorité est `deny` > `defer` > `ask` > `allow`.
1878 1948
1879Un hook qui bloque en quittant 2 s'achemine de la même manière que `"deny"` : Claude voit le message stderr comme la raison du refus.1949Un hook qui bloque en quittant 2 s'achemine de la même façon que `"deny"` : Claude voit le message stderr comme la raison du refus.
1880 1950
1881Lorsqu'un hook retourne `"ask"`, le dialogue de permission affiché à l'utilisateur inclut un libellé identifiant d'où provient le hook : `[settings]` pour un hook de n'importe quel fichier de paramètres ou du frontmatter de l'agent, `[plugin:<name>]` pour le hook d'un plugin, ou `[skill]` pour un hook du frontmatter de la skill. Cela aide les utilisateurs à comprendre quelle source de configuration demande une confirmation.1951Quand un hook retourne `"ask"`, l'invite de permission affichée à l'utilisateur inclut une étiquette identifiant d'où le hook provient : `[settings]` pour un hook de n'importe quel fichier de paramètres ou du frontmatter d'agent, `[plugin:<name>]` pour le hook d'un plugin, ou `[skill]` pour un hook du frontmatter de skill. Cela aide les utilisateurs à comprendre quelle source de configuration demande la confirmation.
1882 1952
1883Un `"ask"` d'un hook force également un dialogue de permission en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) : le classificateur peut toujours refuser l'appel d'outil, mais il ne peut pas l'approuver silencieusement. Avant v2.1.211, le classificateur pouvait approuver une commande Bash s'exécutant en dehors du [sandbox](/docs/fr/sandboxing) sans afficher le dialogue que le hook demandait ; le classificateur appliquait toujours ses propres règles de sécurité à cette commande, et un refus de hook était toujours honoré.1953Un `"ask"` d'un hook force également une invite de permission en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) : le classificateur peut toujours refuser l'appel d'outil, mais il ne peut pas approuver l'appel silencieusement. Avant v2.1.211, le classificateur pouvait approuver une commande Bash s'exécutant en dehors du [sandbox](/docs/fr/sandboxing) sans montrer l'invite que le hook a demandée ; le classificateur appliquait toujours ses propres règles de sécurité à cette commande, et un `"deny"` de hook était toujours honoré.
1884 1954
1885```json theme={null}1955```json theme={null}
1886{1956{
1898 1968
1899<span id="allow-with-updatedinput" />1969<span id="allow-with-updatedinput" />
1900 1970
1901`AskUserQuestion` et `ExitPlanMode` nécessitent une interaction utilisateur et bloquent normalement en [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`. Retourner `permissionDecision: "allow"` avec `updatedInput` satisfait cette exigence : le hook lit l'entrée de l'outil depuis stdin, collecte la réponse via votre propre interface utilisateur et la retourne dans `updatedInput` afin que l'outil s'exécute sans inviter. Retourner `"allow"` seul n'est pas suffisant pour ces outils. Pour `AskUserQuestion`, renvoyez le tableau `questions` original et ajoutez un objet [`answers`](#askuserquestion) mappant le texte de chaque question à la réponse choisie.1971En [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`, Claude Code offre `AskUserQuestion` et `ExitPlanMode` uniquement quand l'exécution a un [hôte de permission](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs) pour recevoir l'invite, comme un rappel `canUseTool` du SDK Agent. Ces outils nécessitent l'interaction de l'utilisateur. Retourner `permissionDecision: "allow"` avec `updatedInput` satisfait cette exigence : le hook lit l'entrée de l'outil depuis stdin, collecte la réponse via votre propre interface utilisateur, et la retourne dans `updatedInput` pour que l'outil s'exécute sans inviter. Retourner `"allow"` seul n'est pas suffisant pour ces outils. Pour `AskUserQuestion`, renvoyez le tableau `questions` original et ajoutez un objet [`answers`](#askuserquestion) mappant le texte de chaque question à la réponse choisie.
1902 1972
1903À partir de v2.1.199, un outil MCP dont le serveur le marque avec [`_meta["anthropic/requiresUserInteraction"]`](/docs/fr/mcp#require-approval-for-a-specific-tool) est plus strict : un hook ne peut pas ignorer son dialogue d'approbation avec `"allow"`, avec ou sans `updatedInput`, car Claude Code ne peut pas confirmer que le hook a collecté l'interaction dont l'outil a besoin.1973À partir de v2.1.199, un outil MCP dont le serveur le marque avec [`_meta["anthropic/requiresUserInteraction"]`](/docs/fr/mcp#require-approval-for-a-specific-tool) est plus strict : un hook ne peut pas ignorer son invite d'approbation avec `"allow"`, avec ou sans `updatedInput`, parce que Claude Code ne peut pas confirmer que le hook a collecté l'interaction que l'outil nécessite.
1904 1974
1905<Note>1975<Note>
1906 PreToolUse utilisait auparavant les champs `decision` et `reason` au niveau supérieur, mais ceux-ci sont dépréciés pour cet événement. Utilisez `hookSpecificOutput.permissionDecision` et `hookSpecificOutput.permissionDecisionReason` à la place. Les valeurs dépréciées `"approve"` et `"block"` correspondent à `"allow"` et `"deny"` respectivement. Les autres événements comme PostToolUse et Stop continuent d'utiliser `decision` et `reason` au niveau supérieur comme format actuel.1976 PreToolUse utilisait auparavant les champs `decision` et `reason` de haut niveau, mais ceux-ci sont dépréciés pour cet événement. Utilisez plutôt `hookSpecificOutput.permissionDecision` et `hookSpecificOutput.permissionDecisionReason`. Les valeurs dépréciées `"approve"` et `"block"` correspondent à `"allow"` et `"deny"` respectivement. D'autres événements comme PostToolUse et Stop continuent d'utiliser `decision` et `reason` de haut niveau comme leur format actuel.
1907</Note>1977</Note>
1908 1978
1909<h4 id="defer-a-tool-call-for-later">1979<h4 id="defer-a-tool-call-for-later">
1910 Différer un appel d'outil pour plus tard1980 Différer un appel d'outil pour plus tard
1911</h4>1981</h4>
1912 1982
1913`"defer"` est pour les intégrations qui exécutent `claude -p` en tant que sous-processus et lisent sa sortie JSON, comme une application Agent SDK ou une interface utilisateur personnalisée construite sur Claude Code. Il permet à ce processus appelant de mettre en pause Claude à un appel d'outil, de collecter l'entrée via sa propre interface et de reprendre où il s'était arrêté. Claude Code honore cette valeur uniquement en [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`. Dans les sessions interactives, il enregistre un avertissement et ignore le résultat du hook.1983`"defer"` est pour les intégrations qui exécutent `claude -p` comme un sous-processus et lisent sa sortie JSON, comme une application Agent SDK ou une interface utilisateur personnalisée construite au-dessus de Claude Code. Cela permet à ce processus appelant de mettre en pause Claude à un appel d'outil, de collecter l'entrée via sa propre interface, et de reprendre où il s'était arrêté. Claude Code honore cette valeur uniquement en [mode non-interactif](/docs/fr/headless) avec le drapeau `-p`. Dans les sessions interactives, il enregistre un avertissement et ignore le résultat du hook.
1914 1984
1915L'outil `AskUserQuestion` est le cas typique : Claude veut poser une question à l'utilisateur, mais il n'y a pas de terminal pour répondre. Le cycle aller-retour fonctionne comme ceci :1985L'outil `AskUserQuestion` est le cas typique : Claude veut poser une question à l'utilisateur, mais il n'y a pas de terminal pour répondre. Une exécution `-p` offre `AskUserQuestion` uniquement quand elle a un [hôte de permission](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs), comme un outil MCP que vous passez avec `--permission-prompt-tool`, donc commencez l'exécution avec un. Le aller-retour fonctionne comme ceci :
1916 1986
19171. Claude appelle `AskUserQuestion`. Le hook `PreToolUse` se déclenche.19871. Claude appelle `AskUserQuestion`. Le hook `PreToolUse` se déclenche.
19182. Le hook retourne `permissionDecision: "defer"`. L'outil ne s'exécute pas. Le processus quitte avec `stop_reason: "tool_deferred"` et l'appel d'outil en attente préservé dans la transcription.19882. Le hook retourne `permissionDecision: "defer"`. L'outil ne s'exécute pas. Le processus quitte avec `stop_reason: "tool_deferred"` et l'appel d'outil en attente préservé dans la transcription.
19193. Le processus appelant lit `deferred_tool_use` du résultat SDK, affiche la question dans sa propre interface utilisateur et attend une réponse.19893. Le processus appelant lit `deferred_tool_use` du résultat du SDK, affiche la question dans sa propre interface utilisateur, et attend une réponse.
19204. Le processus appelant exécute `claude -p --resume <session-id>`. Le même appel d'outil déclenche `PreToolUse` à nouveau.19904. Le processus appelant exécute `claude -p --resume <session-id>` avec le même hôte de permission. Le même appel d'outil déclenche `PreToolUse` à nouveau.
19215. Le hook retourne `permissionDecision: "allow"` avec la réponse dans `updatedInput`. L'outil s'exécute et Claude continue.19915. Le hook retourne `permissionDecision: "allow"` avec la réponse dans `updatedInput`. L'outil s'exécute et Claude continue.
1922 1992
1923Le champ `deferred_tool_use` porte l'`id`, le `name` et l'`input` de l'outil. L'`input` est les paramètres que Claude a générés pour l'appel d'outil, capturés avant l'exécution :1993Le champ `deferred_tool_use` porte l'`id`, le `name`, et l'`input` de l'outil. L'`input` est les paramètres que Claude a générés pour l'appel d'outil, capturés avant l'exécution :
1924 1994
1925```json theme={null}1995```json theme={null}
1926{1996{
1936}2006}
1937```2007```
1938 2008
1939Il n'y a pas de délai d'expiration ou de limite de tentatives. La session reste sur le disque jusqu'à ce que vous la repreniez, soumise au balayage de rétention [`cleanupPeriodDays`](/docs/fr/settings-reference#cleanupperioddays) qui supprime les fichiers de session après 30 jours par défaut, suivant les [règles du balayage de rétention](/docs/fr/claude-directory#cleaned-up-automatically). Si la réponse n'est pas prête lorsque vous reprenez, le hook peut retourner `"defer"` à nouveau et le processus quitte de la même manière. Le processus appelant contrôle quand casser la boucle en retournant finalement `"allow"` ou `"deny"` du hook.2009Il n'y a pas de délai d'expiration ou de limite de tentatives. La session reste sur le disque jusqu'à ce que vous la repreniez, soumise aux règles de balayage de rétention [`cleanupPeriodDays`](/docs/fr/settings-reference#cleanupperioddays), qui supprime les fichiers de session après 30 jours par défaut, en suivant les [règles de balayage de rétention](/docs/fr/claude-directory#cleaned-up-automatically). Si la réponse n'est pas prête quand vous reprenez, le hook peut retourner `"defer"` à nouveau et le processus quitte de la même façon. Le processus appelant contrôle quand casser la boucle en retournant finalement `"allow"` ou `"deny"` du hook.
1940 2010
1941`"defer"` ne fonctionne que lorsque Claude fait un seul appel d'outil dans le tour. Si Claude fait plusieurs appels d'outil à la fois, `"defer"` est ignoré avec un avertissement et l'outil procède à travers le flux de permission normal. La contrainte existe car la reprise ne peut réexécuter qu'un seul outil : il n'y a aucun moyen de différer un appel d'une batch sans laisser les autres non résolus.2011`"defer"` fonctionne uniquement quand Claude effectue un seul appel d'outil dans le tour. Si Claude effectue plusieurs appels d'outils à la fois, `"defer"` est ignoré avec un avertissement et l'outil procède à travers le flux de permission normal. La contrainte existe parce que la reprise ne peut relancer qu'un seul outil : il n'y a aucun moyen de différer un appel d'un lot sans laisser les autres non résolus.
1942 2012
1943Si l'outil différé n'est plus disponible lorsque vous reprenez, le processus quitte avec `stop_reason: "tool_deferred_unavailable"` et `is_error: true` avant que le hook ne se déclenche. Cela se produit lorsqu'un serveur MCP qui a fourni l'outil n'est pas connecté pour la session reprise. La charge utile `deferred_tool_use` est toujours incluse afin que vous puissiez identifier quel outil a disparu.2013Si l'outil différé n'est plus disponible quand vous reprenez, le processus quitte avec `stop_reason: "tool_deferred_unavailable"` et `is_error: true` avant que le hook se déclenche. Cela se produit quand un serveur MCP qui a fourni l'outil n'est pas connecté pour la session reprise. La charge utile `deferred_tool_use` est toujours incluse pour que vous puissiez identifier quel outil a disparu.
1944 2014
1945<Note>2015<Note>
1946 Pour reprendre une session différée en mode plan, passez [`--permission-prompt-tool`](/docs/fr/cli-reference#cli-flags) avec `--resume` afin que Claude Code puisse présenter le plan pour approbation. Sans lui, Claude Code ne restaure pas le mode plan. Nécessite Claude Code v2.1.246 ou ultérieur.2016 Pour reprendre une session différée en mode plan, passez [`--permission-prompt-tool`](/docs/fr/cli-reference#cli-flags) avec `--resume` pour que Claude Code puisse présenter le plan pour approbation. Sans cela, Claude Code ne restaure pas le mode plan. Nécessite Claude Code v2.1.246 ou ultérieur.
1947 2017
1948 Lorsque vous reprenez avec `-p`, Claude Code ne restaure aucun autre mode de permission stocké. Il démarre l'exécution dans le mode de permission qu'une nouvelle exécution `claude -p` démarrerait, donc passez `--permission-mode` ou `--dangerously-skip-permissions` à nouveau si la session différée en utilisait un. Lorsque vous reprenez avec `claude --resume <session-id>` sans `-p`, Claude Code restaure le mode de permission stocké, avec les exceptions listées dans [mode de permission à la reprise](/docs/fr/sessions#permission-mode-on-resume).2018 Quand vous reprenez avec `-p`, Claude Code ne restaure aucun autre mode de permission stocké. Il démarre l'exécution dans le mode de permission qu'une nouvelle exécution `claude -p` démarrerait, donc passez `--permission-mode` ou `--dangerously-skip-permissions` à nouveau si la session différée en utilisait un. Quand vous reprenez avec `claude --resume <session-id>` sans `-p`, Claude Code restaure le mode de permission stocké, avec les exceptions listées dans [mode de permission à la reprise](/docs/fr/sessions#permission-mode-on-resume).
1949</Note>2019</Note>
1950 2020
1951<h3 id="permissionrequest">2021<h3 id="permissionrequest">
1952 PermissionRequest2022 PermissionRequest
1953</h3>2023</h3>
1954 2024
1955S'exécute lorsque Claude Code est sur le point de vous demander la permission d'utiliser un outil. Dans les sessions qui ne peuvent pas afficher un dialogue, comme les subagents en arrière-plan en [mode non-interactif](/docs/fr/headless), Claude Code exécute toujours ces hooks, et si aucun hook ne retourne une décision, il refuse l'appel d'outil.2025S'exécute quand Claude Code est sur le point de vous demander la permission d'utiliser un outil. Dans les sessions qui ne peuvent pas montrer une invite, comme les sous-agents en arrière-plan en [mode non-interactif](/docs/fr/headless), Claude Code exécute toujours ces hooks, et si aucun hook ne retourne une décision, il refuse l'appel d'outil.
1956Utilisez [Contrôle de décision PermissionRequest](#permissionrequest-decision-control) pour autoriser ou refuser au nom de l'utilisateur.2026Utilisez [Contrôle de décision PermissionRequest](#permissionrequest-decision-control) pour permettre ou refuser au nom de l'utilisateur.
1957 2027
1958Utilisez cet événement lorsque vous avez besoin d'un signal au moment où Claude demande la permission d'utiliser un outil. Claude Code exécute un hook [Notification](#notification) avec le type `permission_prompt` uniquement après que le dialogue ait attendu environ six secondes.2028Utilisez cet événement quand vous avez besoin d'un signal au moment où Claude demande la permission d'utiliser un outil. Claude Code exécute un hook [Notification](#notification) avec le type `permission_prompt` uniquement après que l'invite ait attendu environ six secondes.
1959 2029
1960Claude Code n'exécute pas les hooks PermissionRequest pour la [demande réseau](/docs/fr/sandboxing#network-isolation) d'une commande en sandbox. Pour obtenir un signal pour ce dialogue, utilisez le type de notification `permission_prompt`.2030Claude Code n'exécute pas les hooks PermissionRequest pour la [demande réseau](/docs/fr/sandboxing#network-isolation) d'une commande en sandbox. Pour obtenir un signal pour cette invite, utilisez le type de notification `permission_prompt`.
1961 2031
1962Correspond au nom de l'outil, mêmes valeurs que PreToolUse.2032Correspond au nom de l'outil, mêmes valeurs que PreToolUse.
1963 2033
1965 Entrée PermissionRequest2035 Entrée PermissionRequest
1966</h4>2036</h4>
1967 2037
1968Les hooks PermissionRequest reçoivent les champs `tool_name` et `tool_input` comme les hooks PreToolUse, mais sans `tool_use_id`. Un tableau optionnel `permission_suggestions` contient les [entrées de mise à jour de permission](#permission-update-entries) que Claude Code suggère pour cette demande, comme l'ajout d'une règle d'autorisation ou la modification du mode de permission.2038Les hooks PermissionRequest reçoivent les champs `tool_name` et `tool_input` comme les hooks PreToolUse, mais sans `tool_use_id`. Pour un outil MCP, ils reçoivent également l'objet [`mcp_server`](#pretooluse-input). Un tableau optionnel `permission_suggestions` contient les [mises à jour de permission](#permission-update-entries) que Claude Code suggère pour cette demande, comme ajouter une règle d'autorisation ou changer le mode de permission.
1969 2039
1970Le dialogue de permission construit ses options « toujours autoriser » à partir de ces suggestions, mais le tableau n'est pas une liste exacte des options que vous voyez. Le dialogue peut retenir une option dont la suggestion reste dans le tableau, par exemple lorsque [`allowManagedPermissionRulesOnly`](/docs/fr/settings-reference#allowmanagedpermissionrulesonly) masque les options d'enregistrement de règles. Il peut également offrir des options qui n'ont pas d'entrée de suggestion, comme [**Oui, et basculer en mode auto**](/docs/fr/permission-modes#switch-permission-modes), qui change le mode de permission directement plutôt que via une mise à jour de permission.2040Le tableau `permission_suggestions` n'est pas une liste exacte des options que vous voyez, parce que chaque dialogue de permission construit ses propres options. Certains dialogues, comme celui pour les éditions de fichiers, ne lisent pas du tout le tableau et dérivent leurs options de la demande elle-même. Un dialogue qui le lit peut toujours retenir une option dont la suggestion reste dans le tableau, par exemple quand [`allowManagedPermissionRulesOnly`](/docs/fr/settings-reference#allowmanagedpermissionrulesonly) cache les options de sauvegarde de règles. Il peut également offrir des options qui n'ont pas d'entrée de suggestion, comme [**Oui, et basculer en mode auto**](/docs/fr/permission-modes#switch-permission-modes), qui change le mode de permission directement plutôt que via une mise à jour de permission.
1971 2041
1972Les hooks PreToolUse s'exécutent avant chaque appel d'outil, qu'il ait besoin de permission ou non. Les hooks PermissionRequest s'exécutent uniquement lorsque Claude Code est sur le point de vous demander la permission, ou lorsqu'il refuserait autrement un appel qui ne peut pas inviter. Aucun événement ne se déclenche pour [`EndConversation`](/docs/fr/tools-reference#endconversation-tool-behavior).2042Les hooks PreToolUse s'exécutent avant chaque appel d'outil, qu'il ait besoin de permission ou non. Les hooks PermissionRequest s'exécutent uniquement quand Claude Code est sur le point de vous demander la permission, ou quand il refuserait autrement automatiquement un appel qui ne peut pas inviter. Aucun événement ne se déclenche pour [`EndConversation`](/docs/fr/tools-reference#endconversation-tool-behavior).
1973 2043
1974```json theme={null}2044```json theme={null}
1975{2045{
1998 Contrôle de décision PermissionRequest2068 Contrôle de décision PermissionRequest
1999</h4>2069</h4>
2000 2070
2001Les hooks `PermissionRequest` peuvent autoriser ou refuser les demandes de permission. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, votre script de hook peut retourner un objet `decision` avec ces champs spécifiques à l'événement :2071Les hooks `PermissionRequest` peuvent permettre ou refuser les demandes de permission. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, votre script de hook peut retourner un objet `decision` avec ces champs spécifiques à l'événement :
2002 2072
2003| Champ | Description |2073| Champ | Description |
2004| :------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2074| :------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2005| `behavior` | `"allow"` accorde la permission, `"deny"` la refuse. Les règles [Deny and ask](/docs/fr/permissions#manage-permissions) sont toujours évaluées, donc un hook retournant `"allow"` ne remplace pas une règle deny correspondante |2075| `behavior` | `"allow"` accorde la permission, `"deny"` la refuse. Les [règles de refus et de demande](/docs/fr/permissions#manage-permissions) sont toujours évaluées, donc un hook retournant `"allow"` ne remplace pas une règle de refus correspondante |
2006| `updatedInput` | Pour `"allow"` uniquement : modifie les paramètres d'entrée de l'outil avant l'exécution. Remplace l'objet d'entrée entier, donc incluez les champs inchangés aux côtés des champs modifiés. L'entrée modifiée est réévaluée par rapport aux règles deny et ask |2076| `updatedInput` | Pour `"allow"` uniquement : modifie les paramètres d'entrée de l'outil avant l'exécution. Remplace l'objet d'entrée entier, donc incluez les champs inchangés aux côtés des champs modifiés. L'entrée modifiée est réévaluée contre les règles de refus et de demande |
2007| `updatedPermissions` | Pour `"allow"` uniquement : tableau d'[entrées de mise à jour de permission](#permission-update-entries) à appliquer, comme l'ajout d'une règle d'autorisation ou la modification du mode de permission de session |2077| `updatedPermissions` | Pour `"allow"` uniquement : tableau des [entrées de mise à jour de permission](#permission-update-entries) à appliquer, comme ajouter une règle d'autorisation ou changer le mode de permission de la session |
2008| `message` | Pour `"deny"` uniquement : indique à Claude pourquoi la permission a été refusée |2078| `message` | Pour `"deny"` uniquement : dit à Claude pourquoi la permission a été refusée |
2009| `interrupt` | Pour `"deny"` uniquement : si `true`, arrête Claude |2079| `interrupt` | Pour `"deny"` uniquement : si `true`, arrête Claude |
2010 2080
2011Un hook qui quitte 2 sans un objet `decision` laisse le flux de permission inchangé, et son stderr est rejeté. Seul l'objet `decision` peut accorder ou refuser la demande.2081Un hook qui quitte 2 sans un objet `decision` laisse le flux de permission inchangé, et son stderr est rejeté. Seul l'objet `decision` peut accorder ou refuser la demande.
2028 Entrées de mise à jour de permission2098 Entrées de mise à jour de permission
2029</h4>2099</h4>
2030 2100
2031Le champ de sortie `updatedPermissions` et le champ d'[entrée `permission_suggestions`](#permissionrequest-input) utilisent tous deux le même tableau d'objets d'entrée. Chaque entrée a un `type` qui détermine ses autres champs, et une `destination` qui contrôle où la modification est écrite.2101Le champ de sortie `updatedPermissions` et le champ d'entrée [`permission_suggestions`](#permissionrequest-input) utilisent tous deux le même tableau d'objets d'entrée. Chaque entrée a un `type` qui détermine ses autres champs, et une `destination` qui contrôle où le changement est écrit.
2032 2102
2033| `type` | Champs | Effet |2103| `type` | Champs | Effet |
2034| :------------------ | :--------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2104| :------------------ | :--------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2035| `addRules` | `rules`, `behavior`, `destination` | Ajoute des règles de permission. `rules` est un tableau d'objets `{toolName, ruleContent?}`. Omettez `ruleContent` pour correspondre à l'outil entier. `behavior` est `"allow"`, `"deny"` ou `"ask"` |2105| `addRules` | `rules`, `behavior`, `destination` | Ajoute des règles de permission. `rules` est un tableau d'objets `{toolName, ruleContent?}`. Omettez `ruleContent` pour correspondre à l'outil entier. `behavior` est `"allow"`, `"deny"`, ou `"ask"` |
2036| `replaceRules` | `rules`, `behavior`, `destination` | Remplace toutes les règles du `behavior` donné à la `destination` par les `rules` fournies |2106| `replaceRules` | `rules`, `behavior`, `destination` | Remplace toutes les règles du `behavior` donné à la `destination` par les `rules` fournies |
2037| `removeRules` | `rules`, `behavior`, `destination` | Supprime les règles correspondantes du `behavior` donné |2107| `removeRules` | `rules`, `behavior`, `destination` | Supprime les règles correspondantes du `behavior` donné |
2038| `setMode` | `mode`, `destination` | Change le mode de permission. Les modes valides sont `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` et `manual` comme alias pour `default`. L'alias `manual` nécessite Claude Code v2.1.200 ou ultérieur |2108| `setMode` | `mode`, `destination` | Change le mode de permission. Les modes valides sont `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan`, et `manual` comme alias pour `default`. L'alias `manual` nécessite Claude Code v2.1.200 ou ultérieur |
2039| `addDirectories` | `directories`, `destination` | Ajoute des répertoires de travail. `directories` est un tableau de chaînes de chemin |2109| `addDirectories` | `directories`, `destination` | Ajoute des répertoires de travail. `directories` est un tableau de chaînes de chemin |
2040| `removeDirectories` | `directories`, `destination` | Supprime les répertoires de travail |2110| `removeDirectories` | `directories`, `destination` | Supprime les répertoires de travail |
2041 2111
2042<Note>2112<Note>
2043 `setMode` avec `bypassPermissions` ne prend effet que si vous avez lancé la session avec le mode bypass déjà disponible : `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions` ou `permissions.defaultMode: "bypassPermissions"` dans les [paramètres utilisateur, `--settings` ou gérés](/docs/fr/settings-reference#permissions-defaultmode). Sinon la mise à jour est un non-op. La mise à jour est également un non-op lorsque [`permissions.disableBypassPermissionsMode`](/docs/fr/permissions#managed-settings) désactive le mode, ou lorsque la session démarre en [mode restreint](/docs/fr/cli-reference#cli-flags).2113 `setMode` avec `bypassPermissions` ne prend effet que si vous avez lancé la session avec le mode bypass déjà disponible : `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions`, ou `permissions.defaultMode: "bypassPermissions"` dans les [paramètres utilisateur, `--settings`, ou gérés](/docs/fr/settings-reference#permissions-defaultmode). Sinon, la mise à jour est un non-op. La mise à jour est également un non-op quand [`permissions.disableBypassPermissionsMode`](/docs/fr/permissions#managed-settings) désactive le mode, ou quand la session démarre en [mode restreint](/docs/fr/cli-reference#cli-flags).
2044 2114
2045 `bypassPermissions` n'est jamais persisté comme `defaultMode` indépendamment de `destination`.2115 `bypassPermissions` n'est jamais persisté comme `defaultMode` indépendamment de `destination`.
2046</Note>2116</Note>
2047 2117
2048Le champ `destination` sur chaque entrée détermine si la modification reste en mémoire ou persiste dans un fichier de paramètres.2118Le champ `destination` sur chaque entrée détermine si le changement reste en mémoire ou persiste dans un fichier de paramètres.
2049 2119
2050| `destination` | Écrit dans |2120| `destination` | Écrit dans |
2051| :---------------- | :----------------------------------------------------- |2121| :---------------- | :-------------------------------------------------------- |
2052| `session` | en mémoire uniquement, supprimé à la fin de la session |2122| `session` | en mémoire uniquement, rejeté quand la session se termine |
2053| `localSettings` | `.claude/settings.local.json` |2123| `localSettings` | `.claude/settings.local.json` |
2054| `projectSettings` | `.claude/settings.json` |2124| `projectSettings` | `.claude/settings.json` |
2055| `userSettings` | `~/.claude/settings.json` |2125| `userSettings` | `~/.claude/settings.json` |
2064 2134
2065Correspond au nom de l'outil, mêmes valeurs que PreToolUse.2135Correspond au nom de l'outil, mêmes valeurs que PreToolUse.
2066 2136
2067Correspondez plus largement lorsque le nom de l'outil n'est pas le bon filtre :2137Correspondez plus largement quand le nom de l'outil n'est pas le bon filtre :
2068 2138
2069* Pour exécuter un hook après que n'importe quel outil se termine avec succès, omettez le `matcher` ou définissez-le à `"*"`. Votre hook peut alors découvrir ce qui a changé lui-même, par exemple en exécutant `git status --porcelain`, qui liste également les fichiers non suivis que `git diff` manque. Pour les appels d'outil qui échouent, ajoutez le même hook sous [PostToolUseFailure](#posttoolusefailure).2139* Pour exécuter un hook après que n'importe quel outil se termine avec succès, omettez le `matcher` ou définissez-le à `"*"`. Votre hook peut alors découvrir ce qui a changé lui-même, par exemple en exécutant `git status --porcelain`, qui liste également les fichiers non suivis que `git diff` manque. Pour les appels d'outils qui échouent, ajoutez le même hook sous [PostToolUseFailure](#posttoolusefailure).
2070* Pour exécuter un hook lorsqu'un fichier spécifique change sur le disque, quel que soit ce qui l'a écrit, utilisez [FileChanged](#filechanged). Claude Code n'exécute pas un hook `PostToolUse` correspondant à `Edit|Write` lorsqu'une commande `Bash` ou un processus en dehors de Claude Code réécrit le même fichier.2140* Pour exécuter un hook quand un fichier spécifique change sur le disque, quel que soit ce qui l'a écrit, utilisez [FileChanged](#filechanged). Claude Code n'exécute pas un hook `PostToolUse` correspondant à `Edit|Write` quand une commande `Bash` ou un processus en dehors de Claude Code réécrit le même fichier.
2071 2141
2072<h4 id="posttooluse-input">2142<h4 id="posttooluse-input">
2073 Entrée PostToolUse2143 Entrée PostToolUse
2074</h4>2144</h4>
2075 2145
2076Les hooks `PostToolUse` se déclenchent après qu'un outil s'est déjà exécuté avec succès. L'entrée inclut à la fois `tool_input`, les arguments envoyés à l'outil, et `tool_response`, le résultat qu'il a retourné. Le schéma exact pour les deux dépend de l'outil. Les chemins `tool_input` des outils de fichier arrivent dans le même format que pour [PreToolUse](#pretooluse-input) : toujours absolu, avec les séparateurs natifs de la plateforme, donc des barres obliques inverses sur Windows.2146Les hooks `PostToolUse` se déclenchent après qu'un outil s'est déjà exécuté avec succès. L'entrée inclut à la fois `tool_input`, les arguments envoyés à l'outil, et `tool_response`, le résultat qu'il a retourné. Le schéma exact pour les deux dépend de l'outil. Les chemins d'outil de fichier `tool_input` arrivent dans le même format que pour [PreToolUse](#pretooluse-input) : toujours absolu, avec les séparateurs natifs de la plateforme, donc les barres obliques inverses sur Windows. Pour un outil MCP, l'entrée porte également l'objet [`mcp_server`](#pretooluse-input).
2077 2147
2078```json theme={null}2148```json theme={null}
2079{2149{
2089 },2159 },
2090 "tool_response": {2160 "tool_response": {
2091 "filePath": "/path/to/file.txt",2161 "filePath": "/path/to/file.txt",
2092 "success": true2162 "type": "create"
2093 },2163 },
2094 "tool_use_id": "toolu_01ABC123...",2164 "tool_use_id": "toolu_01ABC123...",
2095 "duration_ms": 122165 "duration_ms": 12
2097```2167```
2098 2168
2099| Champ | Description |2169| Champ | Description |
2100| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------- |2170| :------------ | :------------------------------------------------------------------------------------------------------------------------------------- |
2101| `duration_ms` | Optionnel. Temps d'exécution de l'outil en millisecondes. Exclut le temps passé dans les dialogues de permission et les hooks PreToolUse |2171| `duration_ms` | Optionnel. Temps d'exécution de l'outil en millisecondes. Exclut le temps passé dans les invites de permission et les hooks PreToolUse |
2102 2172
2103<h4 id="posttooluse-decision-control">2173<h4 id="posttooluse-decision-control">
2104 Contrôle de décision PostToolUse2174 Contrôle de décision PostToolUse
2107Les hooks `PostToolUse` peuvent fournir des commentaires à Claude après l'exécution de l'outil. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, votre script de hook peut retourner ces champs spécifiques à l'événement :2177Les hooks `PostToolUse` peuvent fournir des commentaires à Claude après l'exécution de l'outil. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, votre script de hook peut retourner ces champs spécifiques à l'événement :
2108 2178
2109| Champ | Description |2179| Champ | Description |
2110| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |2180| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2111| `decision` | `"block"` ajoute la `reason` à côté du résultat de l'outil. Claude voit toujours la sortie originale ; pour la remplacer, utilisez `updatedToolOutput` |2181| `decision` | `"block"` ajoute la `reason` à côté du résultat de l'outil. Claude voit toujours la sortie originale ; pour la remplacer, utilisez `updatedToolOutput` |
2112| `reason` | Explication affichée à Claude lorsque `decision` est `"block"` |2182| `reason` | Explication montrée à Claude quand `decision` est `"block"` |
2113| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés du résultat de l'outil. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |2183| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés du résultat de l'outil. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |
2114| `classifierContext` | Note courte sur le résultat de cet appel pour le classificateur du [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) plutôt que pour Claude. Consultez [Annoter un résultat pour le classificateur du mode auto](#annotate-a-result-for-the-auto-mode-classifier). Nécessite Claude Code v2.1.236 ou ultérieur |2184| `classifierContext` | Note courte sur le résultat de cet appel pour le classificateur du [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) plutôt que pour Claude. Voir [Annoter un résultat pour le classificateur du mode auto](#annotate-a-result-for-the-auto-mode-classifier). Nécessite Claude Code v2.1.236 ou ultérieur |
2115| `updatedToolOutput` | Remplace la sortie de l'outil par la valeur fournie avant qu'elle ne soit envoyée à Claude. La valeur doit correspondre à la forme de sortie de l'outil |2185| `updatedToolOutput` | Remplace la sortie de l'outil par la valeur fournie avant qu'elle ne soit envoyée à Claude. La valeur doit correspondre à la forme de sortie de l'outil |
2116| `updatedMCPToolOutput` | Remplace la sortie pour les [outils MCP](#match-mcp-tools) uniquement. Préférez `updatedToolOutput`, qui fonctionne pour tous les outils |2186| `updatedMCPToolOutput` | Remplace la sortie pour les [outils MCP](#match-mcp-tools) uniquement. Préférez `updatedToolOutput`, qui fonctionne pour tous les outils |
2117 2187
2133```2203```
2134 2204
2135<Warning>2205<Warning>
2136 `updatedToolOutput` change uniquement ce que Claude voit. L'outil a déjà fonctionné au moment où le hook se déclenche, donc tous les fichiers écrits, commandes exécutées ou demandes réseau envoyées ont déjà pris effet. La télémétrie telle que les spans d'outils OpenTelemetry et les événements d'analyse capturent également la sortie originale avant l'exécution du hook. Pour empêcher ou modifier un appel d'outil avant son exécution, utilisez un hook [PreToolUse](#pretooluse) à la place.2206 `updatedToolOutput` change uniquement ce que Claude voit. L'outil s'est déjà exécuté au moment où le hook se déclenche, donc tous les fichiers écrits, commandes exécutées, ou demandes réseau envoyées ont déjà pris effet. La télémétrie comme les spans d'outils OpenTelemetry et les événements d'analyse capturent également la sortie originale avant que le hook s'exécute. Pour empêcher ou modifier un appel d'outil avant qu'il s'exécute, utilisez plutôt un hook [PreToolUse](#pretooluse).
2137 2207
2138 La valeur de remplacement doit correspondre à la forme de sortie de l'outil. Les outils intégrés retournent des objets structurés plutôt que des chaînes brutes. Par exemple, `Bash` retourne un objet avec les champs `stdout`, `stderr`, `interrupted` et `isImage`. Pour les outils intégrés, une valeur qui ne correspond pas au schéma de sortie de l'outil est ignorée et la sortie originale est utilisée. La sortie de l'outil MCP est transmise sans validation de schéma. Supprimer les détails d'erreur dont Claude a besoin peut le faire procéder sur une fausse hypothèse.2208 La valeur de remplacement doit correspondre à la forme de sortie de l'outil. Les outils intégrés retournent des objets structurés plutôt que des chaînes brutes. Par exemple, `Bash` retourne un objet avec les champs `stdout`, `stderr`, `interrupted`, et `isImage`. Pour les outils intégrés, une valeur qui ne correspond pas au schéma de sortie de l'outil est ignorée et la sortie originale est utilisée. La sortie d'outil MCP est transmise sans validation de schéma. Supprimer les détails d'erreur que Claude a besoin peut le faire procéder sur une fausse hypothèse.
2139</Warning>2209</Warning>
2140 2210
2141<h4 id="annotate-a-result-for-the-auto-mode-classifier">2211<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2142 Annoter un résultat pour le classificateur du mode auto2212 Annoter un résultat pour le classificateur du mode auto
2143</h4>2213</h4>
2144 2214
2145Retournez `classifierContext` pour envoyer une note courte sur le résultat de l'appel d'outil au classificateur du [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) plutôt qu'à Claude. Le classificateur [ne reçoit jamais les résultats des outils eux-mêmes](/docs/fr/permission-modes#how-the-classifier-evaluates-actions), donc ce champ est la façon supportée de lui dire quelque chose sur ce qu'un appel a retourné avant qu'il examine les actions ultérieures. Le champ nécessite Claude Code v2.1.236 ou ultérieur.2215Retournez `classifierContext` pour envoyer une note courte sur le résultat de l'appel d'outil au classificateur du [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) plutôt qu'à Claude. Le classificateur [ne reçoit jamais les résultats d'outils eux-mêmes](/docs/fr/permission-modes#how-the-classifier-evaluates-actions), donc ce champ est la façon supportée de lui dire quelque chose sur ce qu'un appel a retourné avant qu'il examine les actions ultérieures. Le champ nécessite Claude Code v2.1.236 ou ultérieur.
2146 2216
2147L'exemple ci-dessous indique au classificateur d'où provient la sortie d'une requête :2217L'exemple ci-dessous dit au classificateur d'où la sortie d'une requête provient :
2148 2218
2149```json theme={null}2219```json theme={null}
2150{2220{
2157 2227
2158Le poids que le classificateur donne à la note dépend de l'endroit où vous avez configuré le hook :2228Le poids que le classificateur donne à la note dépend de l'endroit où vous avez configuré le hook :
2159 2229
2160* **Hooks configurés dans Claude Code** : pour les hooks des fichiers de paramètres, des plugins, des skills et du frontmatter de l'agent, le classificateur traite la note comme du contexte non vérifié fourni par l'application. La note n'établit jamais l'intention de l'utilisateur, et si elle prétend que vous avez approuvé ou demandé quelque chose, le classificateur vérifie cette affirmation par rapport à vos propres messages dans la conversation2230* **Hooks configurés dans Claude Code** : pour les hooks des fichiers de paramètres, plugins, skills, et frontmatter d'agent, le classificateur traite la note comme du contexte non vérifié fourni par l'application. La note n'établit jamais l'intention de l'utilisateur, et si elle prétend que vous avez approuvé ou demandé quelque chose, le classificateur vérifie cette affirmation contre vos propres messages dans la conversation
2161* **Rappels Agent SDK en processus** : lorsqu'une application intégrant Claude Code enregistre le hook comme un [rappel SDK TypeScript](/docs/fr/agent-sdk/hooks) et retourne la note pendant la session en direct, le classificateur peut peser une déclaration d'utilisateur relayée dans la note comme intention de l'utilisateur. Une telle déclaration peut satisfaire une exigence de consentement que le classificateur accepterait d'un message que vous envoyez, mais elle ne lève jamais un blocage que votre propre message ne pourrait pas lever non plus. Après qu'une session reprenne, Claude Code traite les notes restaurées comme du contexte non vérifié. Lorsque les hooks des deux groupes annotent le même appel, le classificateur traite la note combinée comme non vérifiée2231* **Rappels Agent SDK en processus** : quand une application intégrant Claude Code enregistre le hook comme un [rappel SDK TypeScript](/docs/fr/agent-sdk/hooks) et retourne la note pendant la session en direct, le classificateur peut peser une déclaration d'utilisateur relayée dans la note comme intention de l'utilisateur. Une telle déclaration peut satisfaire une exigence de consentement que le classificateur accepterait d'un message que vous envoyez, mais elle ne lève jamais un blocage que votre propre message ne pourrait pas lever non plus. Après qu'une session reprenne, Claude Code traite les notes restaurées comme du contexte non vérifié. Quand les hooks des deux groupes annotent le même appel, le classificateur traite la note combinée comme non vérifiée
2162 2232
2163Claude Code applique ces limites lors de la livraison de la note :2233Claude Code applique ces limites lors de la livraison de la note :
2164 2234
2165* **Longueur** : Claude Code plafonne les notes pour un appel d'outil à 2 000 caractères et tronque le reste. Le plafond est partagé entre chaque hook qui répond à cet appel2235* **Longueur** : Claude Code plafonne les notes pour un appel d'outil à 2 000 caractères et tronque le reste. Le plafond est partagé entre chaque hook qui répond à cet appel
2166* **Réponses synchrones uniquement** : Claude Code ignore le champ dans la réponse d'un hook qui [s'exécute en arrière-plan](#run-hooks-in-the-background), car cette réponse arrive après que Claude Code enregistre le résultat de l'outil2236* **Réponses synchrones uniquement** : Claude Code ignore le champ dans la réponse d'un hook qui [s'exécute en arrière-plan](#run-hooks-in-the-background), parce que cette réponse arrive après que Claude Code enregistre le résultat de l'outil
2167* **Appels que le classificateur n'enregistre pas** : la transcription du classificateur omet les recherches en lecture seule telles que les lectures de fichiers et les recherches. Claude Code rejette une note attachée à l'un de ces appels2237* **Appels que le classificateur n'enregistre pas** : la transcription du classificateur omet les recherches en lecture seule comme les lectures de fichiers et les recherches. Claude Code rejette une note attachée à l'un de ces appels
2168* **Interaction avec les réécritures** : lorsque la note décrit la sortie que vous remplacez avec `updatedToolOutput`, retournez les deux champs dans la même réponse du hook. Claude Code rejette la note si cette réécriture est rejetée ou qu'une réécriture d'un autre hook la remplace. Claude Code livre une note que vous retournez sans réécriture même lorsqu'un autre hook réécrit la sortie2238* **Interaction avec les réécritures** : quand la note décrit la sortie que vous remplacez avec `updatedToolOutput`, retournez les deux champs dans la même réponse de hook. Claude Code abandonne la note si cette réécriture est rejetée ou qu'une réécriture d'un autre hook la remplace. Claude Code livre une note que vous retournez sans réécriture même quand un autre hook réécrit la sortie
2169 2239
2170<Warning>2240<Warning>
2171 Le classificateur lit le contenu que vous placez dans `classifierContext` comme des informations de l'application hébergeant la session, donc ne copiez pas la sortie d'outil non fiable ou le texte tiers dans celui-ci. Gardez la note à une courte affirmation sur cet appel uniquement, comme un fait sur son origine ou une déclaration d'utilisateur à ce sujet ; n'utilisez pas le champ pour livrer des messages non liés ou un flux d'événements.2241 Le classificateur lit le contenu que vous placez dans `classifierContext` comme des informations de l'application hébergeant la session, donc ne copiez pas la sortie d'outil non fiable ou le texte tiers dedans. Gardez la note à une courte affirmation sur cet appel uniquement, comme un fait sur son origine ou une déclaration d'utilisateur à ce sujet ; n'utilisez pas le champ pour livrer des messages non liés ou un flux d'événements.
2172</Warning>2242</Warning>
2173 2243
2174<h3 id="posttoolusefailure">2244<h3 id="posttoolusefailure">
2175 PostToolUseFailure2245 PostToolUseFailure
2176</h3>2246</h3>
2177 2247
2178S'exécute lorsqu'un outil qui a commencé à s'exécuter échoue : l'outil a levé une erreur ou un outil MCP a retourné un résultat d'erreur. Utilisez ceci pour enregistrer les défaillances, envoyer des alertes ou fournir des commentaires correctifs à Claude.2248S'exécute quand un outil qui a commencé à s'exécuter échoue : l'outil a levé une erreur, ou un outil MCP a retourné un résultat d'erreur. Utilisez ceci pour enregistrer les échecs, envoyer des alertes, ou fournir des commentaires correctifs à Claude.
2179 2249
2180Correspond au nom de l'outil, mêmes valeurs que PreToolUse.2250Correspond au nom de l'outil, mêmes valeurs que PreToolUse.
2181 2251
2182<Note>2252<Note>
2183 Cet événement ne se déclenche pas pour les appels d'outil rejetés avant l'exécution : un nom d'outil inconnu, une entrée qui échoue la validation de schéma ou spécifique à l'outil, ou un refus de permission. Les rejets de validation sont retournés comme résultats `tool_use_error` et se produisent avant que les hooks ne s'exécutent, donc ils ne déclenchent ni `PreToolUse` ni cet événement. Les refus de permission déclenchent `PreToolUse` mais pas cet événement ; consultez [PermissionDenied](#permissiondenied).2253 Cet événement ne se déclenche pas pour les appels d'outils refusés avant l'exécution : un nom d'outil inconnu, une entrée qui échoue la validation de schéma ou spécifique à l'outil, ou un refus de permission. Les rejets de validation sont retournés comme résultats `tool_use_error` et se produisent avant que les hooks s'exécutent, donc ils ne déclenchent ni `PreToolUse` ni `PostToolUseFailure`. Les refus de permission déclenchent `PreToolUse` mais pas cet événement ; voir [PermissionDenied](#permissiondenied).
2184</Note>2254</Note>
2185 2255
2186<h4 id="posttoolusefailure-input">2256<h4 id="posttoolusefailure-input">
2187 Entrée PostToolUseFailure2257 Entrée PostToolUseFailure
2188</h4>2258</h4>
2189 2259
2190Les hooks PostToolUseFailure reçoivent les mêmes champs `tool_name` et `tool_input` que PostToolUse, ainsi que les informations d'erreur comme champs au niveau supérieur. Par exemple, une commande `npm test` échouée pourrait livrer :2260Les hooks PostToolUseFailure reçoivent les mêmes champs `tool_name` et `tool_input` que PostToolUse, ainsi que les informations d'erreur comme champs de haut niveau. Pour un outil MCP, ils reçoivent également l'objet [`mcp_server`](#pretooluse-input). Par exemple, une commande `npm test` échouée pourrait livrer :
2191 2261
2192```json theme={null}2262```json theme={null}
2193{2263{
2209```2279```
2210 2280
2211| Champ | Description |2281| Champ | Description |
2212| :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2282| :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2213| `error` | Chaîne décrivant ce qui s'est mal passé. Le format dépend de l'outil qui a échoué |2283| `error` | Chaîne décrivant ce qui s'est mal passé. Le format dépend de l'outil qui a échoué |
2214| `is_interrupt` | Booléen optionnel. True lorsque l'échec a atteint Claude Code en tant qu'abandon plutôt qu'en tant qu'erreur que l'outil a signalée. L'annulation d'un outil en cours d'exécution ne déclenche pas ce hook ; le résultat de l'outil porte le message d'interruption à la place |2284| `is_interrupt` | Booléen optionnel. True quand l'échec a atteint Claude Code comme un abandon plutôt que comme une erreur que l'outil a signalée. L'annulation d'un outil en cours d'exécution ne déclenche pas ce hook ; le résultat de l'outil porte le message d'interruption à la place |
2215| `duration_ms` | Optionnel. Temps d'exécution de l'outil en millisecondes. Exclut le temps passé dans les dialogues de permission et les hooks PreToolUse |2285| `duration_ms` | Optionnel. Temps d'exécution de l'outil en millisecondes. Exclut le temps passé dans les invites de permission et les hooks PreToolUse |
2216 2286
2217La chaîne `error` est généralement le même texte que Claude reçoit comme résultat échoué de l'outil. Son format varie selon l'outil et l'échec. Basez votre hook sur `tool_name`, `is_interrupt` et la première ligne `Exit code N` ; traitez le reste de la chaîne comme du texte d'affichage, pas un format stable.2287La chaîne `error` est généralement le même texte que Claude reçoit comme résultat de l'outil échoué. Son format varie selon l'outil et l'échec. Clé votre hook sur `tool_name`, `is_interrupt`, et la première ligne `Exit code N` ; traitez le reste de la chaîne comme du texte d'affichage, pas un format stable.
2218 2288
2219* Pour Bash et PowerShell, une commande qui a fonctionné et s'est terminée produit une première ligne `Exit code N`, puis toute sortie que la commande a produite en tant qu'un bloc avec stdout et stderr entrelacés2289* Pour Bash et PowerShell, une commande qui s'est exécutée et a quitté produit une première ligne `Exit code N`, puis toute sortie que la commande a produite comme un bloc avec stdout et stderr entrelacés
2220* Une charge utile peut également porter un message d'échec brut sans ligne de code de sortie, lorsque Claude Code n'a pas pu démarrer le processus shell lui-même2290* Une charge utile peut également porter un message d'échec nu sans ligne de code de sortie, quand Claude Code n'a pas pu démarrer le processus shell lui-même
2221* Claude Code tronque au milieu les chaînes plus longues que 10 000 caractères autour d'un marqueur `... [N characters truncated] ...`, et peut insérer ses propres lignes, comme `Command timed out after 2m 0s`2291* Claude Code tronque au milieu les longues chaînes autour d'un marqueur `... [N characters truncated] ...`, et peut insérer ses propres lignes, comme `Command timed out after 2m 0s`
2222 2292
2223<h4 id="posttoolusefailure-decision-control">2293<h4 id="posttoolusefailure-decision-control">
2224 Contrôle de décision PostToolUseFailure2294 Contrôle de décision PostToolUseFailure
2225</h4>2295</h4>
2226 2296
2227Les hooks `PostToolUseFailure` peuvent fournir du contexte à Claude après l'échec d'un outil. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, votre script de hook peut retourner ces champs spécifiques à l'événement :2297Les hooks `PostToolUseFailure` peuvent fournir du contexte à Claude après un échec d'outil. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, votre script de hook peut retourner ces champs spécifiques à l'événement :
2228 2298
2229| Champ | Description |2299| Champ | Description |
2230| :------------------ | :------------------------------------------------------------------------------------------------------------------------------- |2300| :------------------ | :-------------------------------------------------------------------------------------------------------------------------- |
2231| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés de l'erreur. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |2301| `additionalContext` | Chaîne ajoutée au contexte de Claude aux côtés de l'erreur. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |
2232 2302
2233```json theme={null}2303```json theme={null}
2234{2304{
2243 PostToolBatch2313 PostToolBatch
2244</h3>2314</h3>
2245 2315
2246S'exécute une fois après que chaque appel d'outil dans une batch ait été résolu, avant que Claude Code n'envoie la demande suivante au modèle. `PostToolUse` se déclenche une fois par outil, ce qui signifie qu'il se déclenche simultanément lorsque Claude fait des appels d'outil parallèles. `PostToolBatch` se déclenche exactement une fois avec la batch complète, donc c'est le bon endroit pour injecter du contexte qui dépend de l'ensemble des outils qui ont fonctionné plutôt que sur un seul outil. Il n'y a pas de matcher pour cet événement.2316S'exécute une fois après que chaque appel d'outil dans un lot se soit résolu, avant que Claude Code envoie la demande suivante au modèle. `PostToolUse` se déclenche une fois par outil, ce qui signifie qu'il se déclenche simultanément quand Claude effectue des appels d'outils parallèles. `PostToolBatch` se déclenche exactement une fois avec le lot complet, donc c'est le bon endroit pour injecter du contexte qui dépend de l'ensemble des outils qui se sont exécutés plutôt que de n'importe quel outil unique. Il n'y a pas de matcher pour cet événement.
2247 2317
2248<h4 id="posttoolbatch-input">2318<h4 id="posttoolbatch-input">
2249 Entrée PostToolBatch2319 Entrée PostToolBatch
2250</h4>2320</h4>
2251 2321
2252En plus des [champs d'entrée communs](#common-input-fields), les hooks PostToolBatch reçoivent `tool_calls`, un tableau décrivant chaque appel d'outil dans la batch :2322En plus des [champs d'entrée communs](#common-input-fields), les hooks PostToolBatch reçoivent `tool_calls`, un tableau décrivant chaque appel d'outil dans le lot :
2253 2323
2254```json theme={null}2324```json theme={null}
2255{2325{
2275}2345}
2276```2346```
2277 2347
2278`tool_response` contient le même contenu que le modèle reçoit dans le bloc `tool_result` correspondant. La valeur est une chaîne sérialisée ou un tableau de blocs de contenu, exactement comme l'outil l'a émis. Pour `Read`, cela signifie du texte préfixé par le numéro de ligne plutôt que le contenu brut du fichier. Les réponses peuvent être volumineuses, donc analysez uniquement les champs dont vous avez besoin.2348`tool_response` contient le même contenu que le modèle reçoit dans le bloc `tool_result` correspondant. La valeur est une chaîne sérialisée ou un tableau de bloc de contenu, exactement comme l'outil l'a émis. Pour `Read`, cela signifie du texte préfixé par un numéro de ligne plutôt que du contenu de fichier brut. Les réponses peuvent être grandes, donc analysez uniquement les champs dont vous avez besoin.
2279 2349
2280<Note>2350<Note>
2281 La forme `tool_response` diffère de celle de `PostToolUse`. `PostToolUse` transmet l'objet `Output` structuré de l'outil, comme `{filePath: "...", success: true}` pour `Write` ; `PostToolBatch` transmet le contenu `tool_result` sérialisé que le modèle voit.2351 La forme `tool_response` diffère de celle de `PostToolUse`. `PostToolUse` passe l'objet `Output` structuré de l'outil, comme `{filePath: "...", type: "create"}` pour `Write` ; `PostToolBatch` passe le contenu `tool_result` sérialisé que le modèle voit.
2282</Note>2352</Note>
2283 2353
2284<h4 id="posttoolbatch-decision-control">2354<h4 id="posttoolbatch-decision-control">
2288Les hooks `PostToolBatch` peuvent injecter du contexte pour Claude. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, votre script de hook peut retourner ces champs spécifiques à l'événement :2358Les hooks `PostToolBatch` peuvent injecter du contexte pour Claude. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, votre script de hook peut retourner ces champs spécifiques à l'événement :
2289 2359
2290| Champ | Description |2360| Champ | Description |
2291| :------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2361| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2292| `additionalContext` | Chaîne de contexte injectée une fois avant l'appel du modèle suivant. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) pour les détails de livraison, ce qu'il faut y mettre et comment les sessions reprises gèrent les valeurs passées |2362| `additionalContext` | Chaîne de contexte injectée une fois avant l'appel du modèle suivant. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) pour les détails de livraison, ce qu'il faut y mettre, et comment les sessions reprises gèrent les valeurs passées |
2293 2363
2294```json theme={null}2364```json theme={null}
2295{2365{
2300}2370}
2301```2371```
2302 2372
2303Retourner `decision: "block"` ou `continue: false` arrête la boucle agentique avant l'appel du modèle suivant. Le message de blocage provient du JSON `reason` ou `stopReason`, ou de stderr sur exit 2. Vous le voyez comme un avertissement dans la transcription, et il reste dans la conversation, donc Claude le voit lorsque la conversation continue.2373Retourner `decision: "block"` ou `continue: false` arrête la boucle agentique avant l'appel du modèle suivant. Le message de blocage provient du JSON `reason` ou `stopReason`, ou de stderr en quittant 2. Vous le voyez comme un avertissement dans la transcription, et il reste dans la conversation, donc Claude le voit quand la conversation continue.
2304 2374
2305<h3 id="permissiondenied">2375<h3 id="permissiondenied">
2306 PermissionDenied2376 PermissionDenied
2307</h3>2377</h3>
2308 2378
2309S'exécute lorsque le [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) refuse un appel d'outil, y compris lorsqu'il refuse sans un verdict du classificateur parce qu'[une vérification de sécurité séparée du mode auto a refusé la demande du classificateur](/docs/fr/errors#auto-mode-cannot-determine-the-safety-of-an-action) ou sa réponse n'a pas analysé. Ce hook ne se déclenche que en mode auto : il ne s'exécute pas lorsque vous refusez manuellement un dialogue de permission, lorsqu'un hook `PreToolUse` bloque un appel ou lorsqu'une règle `deny` correspond. Utilisez-le pour enregistrer les refus, ajuster la configuration ou indiquer au modèle qu'il peut réessayer l'appel d'outil.2379S'exécute quand le [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) refuse un appel d'outil, y compris quand il refuse sans verdict de classificateur parce qu'une [vérification de sécurité séparée du mode auto a refusé la demande du classificateur lui-même](/docs/fr/errors#auto-mode-cannot-determine-the-safety-of-an-action) ou sa réponse n'a pas analysé. Ce hook ne se déclenche que en mode auto : il ne s'exécute pas quand vous refusez manuellement un dialogue de permission, quand un hook `PreToolUse` bloque un appel, ou quand une règle `deny` correspond. Utilisez-le pour enregistrer les refus, ajuster la configuration, ou dire au modèle qu'il peut réessayer l'appel d'outil.
2310 2380
2311Correspond au nom de l'outil, mêmes valeurs que PreToolUse.2381Correspond au nom de l'outil, mêmes valeurs que PreToolUse.
2312 2382
2314 Entrée PermissionDenied2384 Entrée PermissionDenied
2315</h4>2385</h4>
2316 2386
2317En plus des [champs d'entrée communs](#common-input-fields), les hooks PermissionDenied reçoivent `tool_name`, `tool_input`, `tool_use_id` et `reason`.2387En plus des [champs d'entrée communs](#common-input-fields), les hooks PermissionDenied reçoivent `tool_name`, `tool_input`, `tool_use_id`, et `reason`. Pour un outil MCP, ils reçoivent également l'objet [`mcp_server`](#pretooluse-input).
2318 2388
2319```json theme={null}2389```json theme={null}
2320{2390{
2329 "description": "Clean build directory"2399 "description": "Clean build directory"
2330 },2400 },
2331 "tool_use_id": "toolu_01ABC123...",2401 "tool_use_id": "toolu_01ABC123...",
2332 "reason": "Blocked by classifier"2402 "reason": "[Irreversible Local Destruction]"
2333}2403}
2334```2404```
2335 2405
2336| Champ | Description |2406| Champ | Description |
2337| :------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2407| :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2338| `reason` | La raison du refus : le texte fixe `Blocked by classifier` dans la plupart des sessions, ou l'explication écrite du classificateur lorsque le modèle du classificateur de la session en fournit une. Pour un refus où une vérification de sécurité séparée du mode auto a refusé la demande du classificateur ou sa réponse n'a pas analysé, la raison commence par `Auto mode could not evaluate this action and is blocking it for safety`. Pour un refus parce que le modèle du classificateur n'était pas disponible, la raison est le texte fixe `Classifier unavailable`. Consultez [Examiner les refus](/docs/fr/auto-mode-config#review-denials) |2408| `reason` | La raison du refus. Pour un verdict de classificateur, dans la plupart des sessions, il nomme la règle correspondante entre crochets, comme `[Data Exfiltration]` ; voir [Examiner les refus](/docs/fr/auto-mode-config#review-denials) pour les autres formes. Pour un [refus sans verdict](#permissiondenied-decision-control), il commence par `Auto mode could not evaluate this action and is blocking it for safety`. Pour un refus parce que le modèle de classificateur n'était pas disponible, c'est le texte fixe `Classifier unavailable` |
2339 2409
2340<h4 id="permissiondenied-decision-control">2410<h4 id="permissiondenied-decision-control">
2341 Contrôle de décision PermissionDenied2411 Contrôle de décision PermissionDenied
2342</h4>2412</h4>
2343 2413
2344Les hooks PermissionDenied peuvent indiquer au modèle qu'il peut réessayer l'appel d'outil refusé. Retournez un objet JSON avec `hookSpecificOutput.retry` défini à `true` :2414Les hooks PermissionDenied peuvent dire au modèle qu'il peut réessayer l'appel d'outil refusé. Retournez un objet JSON avec `hookSpecificOutput.retry` défini à `true` :
2345 2415
2346```json theme={null}2416```json theme={null}
2347{2417{
2352}2422}
2353```2423```
2354 2424
2355Lorsque `retry` est `true`, Claude Code ajoute un message à la conversation indiquant au modèle qu'il peut réessayer l'appel d'outil. Le refus lui-même n'est pas inversé. Si votre hook ne retourne pas JSON ou retourne `retry: false`, le refus tient et le modèle reçoit le message de rejet original.2425Quand `retry` est `true`, Claude Code ajoute un message à la conversation disant au modèle qu'il peut réessayer l'appel d'outil. Claude Code ne renverse pas le refus lui-même. Si votre hook ne retourne pas JSON, ou retourne `retry: false`, le refus tient et le modèle reçoit le message de rejet original.
2356 2426
2357Claude Code ignore `retry: true` lorsque le classificateur n'a produit [aucun verdict sur l'action](/docs/fr/errors#auto-mode-cannot-determine-the-safety-of-an-action) : sa réponse n'a pas analysé, ou une vérification de sécurité séparée du mode auto a refusé la demande du classificateur. Pour ces refus, Claude Code indique déjà au modèle dans le message de rejet s'il faut réessayer plus tard ou continuer.2427Claude Code ignore `retry: true` quand le classificateur a produit [aucun verdict sur l'action](/docs/fr/errors#auto-mode-cannot-determine-the-safety-of-an-action) : sa réponse n'a pas analysé, ou une vérification de sécurité séparée du mode auto a refusé la demande du classificateur. Pour ces refus, Claude Code dit déjà au modèle dans le message de rejet s'il faut réessayer plus tard ou continuer.
2358 2428
2359<h3 id="notification">2429<h3 id="notification">
2360 Notification2430 Notification
2361</h3>2431</h3>
2362 2432
2363S'exécute lorsque Claude Code envoie des notifications. Correspond au type de notification. Omettez le matcher pour exécuter les hooks pour tous les types de notification.2433S'exécute quand Claude Code envoie des notifications. Correspond au type de notification. Omettez le matcher pour exécuter les hooks pour tous les types de notification.
2364 2434
2365Vous recevez ces événements de hook même avec les notifications de bureau désactivées : le paramètre `preferredNotifChannel`, y compris `notifications_disabled`, change uniquement comment vous êtes alerté, pas si votre hook s'exécute.2435Vous recevez ces événements de hook même avec les notifications de bureau désactivées : le paramètre `preferredNotifChannel`, y compris `notifications_disabled`, change uniquement comment vous êtes alerté, pas si votre hook s'exécute.
2366 2436
2367| Matcher | Quand il se déclenche |2437| Matcher | Quand il se déclenche |
2368| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2438| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2369| `permission_prompt` | Claude a besoin de votre approbation pour un appel d'outil ou la [demande réseau](/docs/fr/sandboxing#network-isolation) d'une commande en sandbox, et le dialogue a attendu environ six secondes |2439| `permission_prompt` | Claude a besoin de votre permission pour utiliser un outil ou une [demande réseau](/docs/fr/sandboxing#network-isolation) d'une commande en sandbox, et l'invite a attendu environ six secondes |
2370| `idle_prompt` | Claude a terminé de répondre il y a environ 60 secondes et vous n'avez pas tapé depuis |2440| `idle_prompt` | Claude a fini de répondre il y a environ 60 secondes et vous n'avez pas tapé depuis |
2371| `auth_success` | L'authentification se termine |2441| `auth_success` | L'authentification se termine |
2372| `elicitation_dialog` | Un serveur MCP ouvre un formulaire d'élicitation et vous n'avez pas tapé depuis environ six secondes |2442| `elicitation_dialog` | Un serveur MCP ouvre un formulaire d'élicitation et vous n'avez pas tapé pendant environ six secondes |
2373| `elicitation_url_dialog` | Un serveur MCP vous demande d'ouvrir une URL de navigateur et vous n'avez pas tapé depuis environ six secondes |2443| `elicitation_url_dialog` | Un serveur MCP vous demande d'ouvrir une URL de navigateur et vous n'avez pas tapé pendant environ six secondes |
2374| `elicitation_complete` | Un serveur MCP signale qu'une [élicitation en mode URL](#elicitation-input) est complète |2444| `elicitation_complete` | Un serveur MCP signale qu'une [élicitation en mode URL](#elicitation-input) est complète |
2375| `elicitation_response` | Une réponse d'élicitation MCP est renvoyée au serveur |2445| `elicitation_response` | Une réponse d'élicitation MCP est renvoyée au serveur |
2376| `agent_needs_input` | Une session en arrière-plan commence à attendre votre entrée pendant que la [vue agent](/docs/fr/agent-view) est ouverte dans un terminal, ou la session actuelle vous pose une [question de configuration de terminal d'un coéquipier d'équipe d'agents](/docs/fr/agent-teams#choose-a-display-mode) et vous n'avez pas tapé depuis environ six secondes |2446| `agent_needs_input` | Une session en arrière-plan commence à attendre votre entrée pendant que la [vue agent](/docs/fr/agent-view) est ouverte dans un terminal, ou la session actuelle vous pose une [question de configuration de terminal d'un coéquipier d'équipe agent](/docs/fr/agent-teams#choose-a-display-mode) et vous n'avez pas tapé pendant environ six secondes |
2377| `agent_completed` | Une session en arrière-plan se termine ou échoue. Se déclenche uniquement pendant que la [vue agent](/docs/fr/agent-view) est ouverte dans un terminal |2447| `agent_completed` | Une session en arrière-plan se termine ou échoue. Se déclenche uniquement pendant que la [vue agent](/docs/fr/agent-view) est ouverte dans un terminal |
2378| `quota_auto_resume_fired` | Claude Code continue votre tâche après qu'une limite d'utilisation de claude.ai l'ait mise en pause : à la réinitialisation, ou plus tôt lorsque quelque chose que vous faites dans Claude Code pendant l'attente, comme l'ajout de crédits d'utilisation, la mise à niveau de votre plan ou le changement de modèles, rend l'utilisation disponible à nouveau, avec l'[exception de paramètre de modèle](/docs/fr/interactive-mode#wait-for-a-usage-limit-to-reset) |2448| `quota_auto_resume_fired` | Claude Code continue votre tâche après qu'une limite d'utilisation claude.ai l'ait mise en pause : à la réinitialisation, ou plus tôt quand quelque chose que vous faites dans Claude Code pendant l'attente, comme ajouter des crédits d'utilisation, mettre à niveau votre plan, ou changer de modèles, rend l'utilisation disponible à nouveau, avec l'[exception de paramètre de modèle](/docs/fr/interactive-mode#wait-for-a-usage-limit-to-reset) |
2379| `quota_auto_resume_stale` | Une limite d'utilisation de claude.ai s'est réinitialisée pendant que votre ordinateur dormait pendant plus d'environ 30 minutes. Claude Code attend que vous appuyiez sur `Enter` au lieu de continuer. Après un sommeil plus court, il continue et déclenche `quota_auto_resume_fired` à la place |2449| `quota_auto_resume_stale` | Une limite d'utilisation claude.ai s'est réinitialisée pendant que votre ordinateur dormait pendant plus d'environ 30 minutes. Claude Code attend que vous appuyiez sur `Enter` au lieu de continuer. Après un sommeil plus court, il continue et se déclenche `quota_auto_resume_fired` à la place |
2380| `quota_auto_resume_disabled` | Claude Code termine son attente pour une limite d'utilisation de claude.ai sans continuer votre tâche : [`autoContinueAtUsageLimit`](/docs/fr/settings-reference#autocontinueatusagelimit) s'est désactivé ou la réinitialisation s'est déplacée de plus de 24 heures pendant une attente que Claude Code a commencée seul, la tâche continuée a continué à frapper la limite, ou la continuation a été bloquée avant d'atteindre le modèle. Ne se déclenche pas lorsque vous appuyez sur `Esc` ou `Ctrl+C`, ou choisissez **Ne pas continuer automatiquement** |2450| `quota_auto_resume_disabled` | Claude Code termine son attente pour une limite d'utilisation claude.ai sans continuer votre tâche : [`autoContinueAtUsageLimit`](/docs/fr/settings-reference#autocontinueatusagelimit) s'est désactivé ou la réinitialisation s'est déplacée de plus de 24 heures pendant une attente que Claude Code a démarrée seul, la tâche continuée a continué à frapper la limite, ou la continuation a été bloquée avant d'atteindre le modèle. Ne se déclenche pas quand vous appuyez sur `Esc` ou `Ctrl+C`, ou choisissez **Ne pas continuer automatiquement** |
2381 2451
2382Les types `agent_needs_input` et `agent_completed` nécessitent Claude Code v2.1.198 ou ultérieur.2452Les types `agent_needs_input` et `agent_completed` nécessitent Claude Code v2.1.198 ou ultérieur.
2383 2453
2384Les types `quota_auto_resume_fired`, `quota_auto_resume_stale` et `quota_auto_resume_disabled` nécessitent Claude Code v2.1.234 ou ultérieur.2454Les types `quota_auto_resume_fired`, `quota_auto_resume_stale`, et `quota_auto_resume_disabled` nécessitent Claude Code v2.1.234 ou ultérieur.
2385 2455
2386Dans les sessions de terminal, `permission_prompt` pour la [demande réseau](/docs/fr/sandboxing#network-isolation) d'une commande en sandbox nécessite Claude Code v2.1.246 ou ultérieur.2456Dans les sessions de terminal, `permission_prompt` pour une demande réseau d'une commande en sandbox nécessite Claude Code v2.1.246 ou ultérieur.
2387 2457
2388`agent_needs_input` pour une question de configuration de terminal d'un coéquipier nécessite Claude Code v2.1.248 ou ultérieur.2458`agent_needs_input` pour une question de configuration de terminal d'un coéquipier nécessite Claude Code v2.1.248 ou ultérieur.
2389 2459
2390<Note>2460<Note>
2391 Les types `permission_prompt`, `idle_prompt`, `elicitation_dialog` et `elicitation_url_dialog` partagent leur timing avec les notifications de bureau, donc dans les sessions de terminal vous ne les voyez que lorsque vous semblez être loin du terminal :2461 Les types `permission_prompt`, `idle_prompt`, `elicitation_dialog`, et `elicitation_url_dialog` partagent leur timing avec les notifications de bureau, donc dans les sessions de terminal vous ne les voyez que quand vous semblez être loin du terminal :
2462
2463 * Attendez `permission_prompt` une fois que vous n'avez pas tapé pendant environ six secondes. Le minuteur démarre quand l'invite de permission apparaît, et chaque frappe le reporte. Pour exécuter un hook immédiatement quand Claude demande la permission d'utiliser un outil, utilisez [PermissionRequest](#permissionrequest) à la place.
2464 * Attendez `idle_prompt` environ 60 secondes après que Claude finisse de répondre, et uniquement si vous n'avez pas tapé depuis. Claude Code n'envoie pas `idle_prompt` pendant qu'il attend qu'une limite d'utilisation claude.ai se réinitialise. Quand l'attente se termine d'elle-même, l'un des types `quota_auto_resume_*` se déclenche à la place.
2465 * Attendez `elicitation_dialog` pour un formulaire d'élicitation, ou `elicitation_url_dialog` pour une demande d'URL de navigateur, une fois que vous n'avez pas tapé pendant environ six secondes. Les deux partagent la même porte de six secondes que `permission_prompt` : le minuteur démarre quand le dialogue apparaît, et chaque frappe le reporte.
2392 2466
2393 * Attendez `permission_prompt` une fois que vous n'avez pas tapé depuis environ six secondes. Le minuteur démarre lorsque le dialogue de permission apparaît, et chaque frappe le reporte. Pour exécuter un hook immédiatement lorsque Claude demande la permission d'utiliser un outil, utilisez [PermissionRequest](#permissionrequest) à la place.2467 Une demande de permission ou d'élicitation qui arrive pendant qu'un autre dialogue est à l'écran garde la même porte de six secondes, chronométrée à partir de quand la demande arrive. Sa notification peut vous atteindre pendant que la demande attend toujours derrière le dialogue ouvert.
2394 * Attendez `idle_prompt` environ 60 secondes après que Claude ait terminé de répondre, et uniquement si vous n'avez pas tapé depuis. Claude Code n'envoie pas `idle_prompt` pendant qu'il attend qu'une limite d'utilisation de claude.ai se réinitialise. Lorsque l'attente se termine seule, l'un des types `quota_auto_resume_*` se déclenche à la place.
2395 * Attendez `elicitation_dialog` pour un formulaire d'élicitation, ou `elicitation_url_dialog` pour une demande d'URL de navigateur, une fois que vous n'avez pas tapé depuis environ six secondes. Les deux partagent la même porte de six secondes que `permission_prompt` : le minuteur démarre lorsque le dialogue apparaît, et chaque frappe le reporte.
2396</Note>2468</Note>
2397 2469
2398Claude Code chronométre `permission_prompt` différemment dans les sessions où il envoie les demandes de permission au rappel [`canUseTool`](/docs/fr/agent-sdk/user-input) du SDK Agent, ce qui est la façon dont Claude Desktop et l'extension VS Code hébergent Claude Code :2470Claude Code chronomètre `permission_prompt` différemment dans les sessions où il envoie les demandes de permission au rappel [`canUseTool`](/docs/fr/agent-sdk/user-input) du SDK Agent, ce qui est comment Claude Desktop et l'extension VS Code hébergent Claude Code :
2399 2471
2400* Attendez `permission_prompt` environ six secondes après que Claude demande la permission. Claude Code ne le reporte pas pendant que vous tapez.2472* Attendez `permission_prompt` environ six secondes après que Claude demande la permission. Claude Code ne le reporte pas pendant que vous tapez.
2401* Si vous ou un hook [PermissionRequest](#permissionrequest) répondez plus tôt, Claude Code n'exécute pas `permission_prompt`.2473* Si vous ou un hook [PermissionRequest](#permissionrequest) répondez plus tôt, Claude Code ne l'exécute pas.
2402* Définissez [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/fr/env-vars) à `1` pour désactiver `permission_prompt` dans ces sessions.2474* Définissez [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/fr/env-vars) à `1` pour désactiver `permission_prompt` dans ces sessions.
2403 2475
2404Avant v2.1.233, `permission_prompt` ne se déclenchait pas dans ces sessions.2476Avant v2.1.233, `permission_prompt` ne se déclenchait pas dans ces sessions.
2405 2477
2406Utilisez des matchers séparés pour exécuter différents gestionnaires selon le type de notification. Cette configuration déclenche un script d'alerte spécifique à la permission lorsque Claude a besoin d'approbation de permission et une notification différente lorsque Claude a été inactif :2478Utilisez des matchers séparés pour exécuter différents gestionnaires selon le type de notification. Cette configuration déclenche un script d'alerte spécifique à la permission quand Claude a besoin d'approbation de permission et une notification différente quand Claude a été inactif :
2407 2479
2408```json theme={null}2480```json theme={null}
2409{2481{
2436 Entrée Notification2508 Entrée Notification
2437</h4>2509</h4>
2438 2510
2439En plus des [champs d'entrée communs](#common-input-fields), les hooks Notification reçoivent `message` avec le texte de notification, un `title` optionnel et `notification_type` indiquant quel type s'est déclenché.2511En plus des [champs d'entrée communs](#common-input-fields), les hooks Notification reçoivent `message` avec le texte de notification, un `title` optionnel, et `notification_type` indiquant quel type s'est déclenché.
2440 2512
2441```json theme={null}2513```json theme={null}
2442{2514{
2450}2522}
2451```2523```
2452 2524
2453Les hooks Notification ne peuvent pas bloquer ou modifier les notifications. Claude Code rejette leurs `systemMessage` et `continue` mais émet toujours [`terminalSequence`](#emit-terminal-notifications), sur lequel l'exemple de notification de bureau s'appuie. Les hooks Notification sont destinés aux effets secondaires tels que le transfert de la notification vers un service externe.2525Les hooks Notification ne peuvent pas bloquer ou modifier les notifications. Claude Code rejette leurs champs `systemMessage` et `continue` mais émet toujours [`terminalSequence`](#emit-terminal-notifications), sur lequel l'exemple de notification de bureau s'appuie. Les hooks Notification sont destinés aux effets secondaires comme transférer la notification à un service externe.
2454 2526
2455<h3 id="subagentstart">2527<h3 id="subagentstart">
2456 SubagentStart2528 SubagentStart
2457</h3>2529</h3>
2458 2530
2459S'exécute lorsqu'un subagent Claude Code est lancé via l'outil Agent. Supporte les matchers pour filtrer par nom de type d'agent. Pour les agents intégrés, c'est le nom de l'agent comme `general-purpose`, `Explore` ou `Plan`. Pour les [subagents personnalisés](/docs/fr/sub-agents), c'est le champ `name` du frontmatter de l'agent, pas le nom du fichier.2531S'exécute quand Claude crée un sous-agent avec l'outil Agent, quand Claude [reprend un sous-agent](/docs/fr/sub-agents#resume-subagents), et chaque fois qu'un [coéquipier d'équipe agent](/docs/fr/agent-teams) en processus gère un nouveau message. Supporte les matchers pour filtrer par nom de type d'agent. Pour les agents intégrés, c'est le nom de l'agent comme `general-purpose`, `Explore`, ou `Plan`. Pour les [sous-agents personnalisés](/docs/fr/sub-agents), c'est le champ `name` du frontmatter de l'agent, pas le nom de fichier.
2460 2532
2461Pour les subagents fournis par un [plugin](/docs/fr/plugins), l'identifiant de type d'agent est l'identifiant limité au plugin comme `my-plugin:reviewer`, pas le nom brut du frontmatter. Le deux-points place un nom limité au plugin sur le chemin d'expression régulière, donc ancrez le matcher avec `^` et `$` pour une correspondance exacte : `^my-plugin:reviewer$`.2533Pour les sous-agents expédiés par un [plugin](/docs/fr/plugins), le type d'agent est l'identifiant scoped du plugin comme `my-plugin:reviewer`, pas le nom du frontmatter nu. Le deux-points place un nom scoped du plugin sur le chemin d'expression régulière, donc ancrez le matcher avec `^` et `$` pour une correspondance exacte : `^my-plugin:reviewer$`.
2462 2534
2463<h4 id="subagentstart-input">2535<h4 id="subagentstart-input">
2464 Entrée SubagentStart2536 Entrée SubagentStart
2465</h4>2537</h4>
2466 2538
2467En plus des [champs d'entrée communs](#common-input-fields), les hooks SubagentStart reçoivent `agent_id` avec l'identifiant unique du subagent et `agent_type` avec le nom de l'agent que le matcher filtre.2539En plus des [champs d'entrée communs](#common-input-fields), les hooks SubagentStart reçoivent `agent_id` avec l'identifiant unique du sous-agent et `agent_type` avec le nom de l'agent que le matcher filtre.
2468 2540
2469```json theme={null}2541```json theme={null}
2470{2542{
2477}2549}
2478```2550```
2479 2551
2480Les hooks SubagentStart ne peuvent pas bloquer la création de subagent, mais ils peuvent injecter du contexte dans le subagent. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez retourner :2552Les hooks SubagentStart ne peuvent pas bloquer la création de sous-agent, mais ils peuvent injecter du contexte dans le sous-agent. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez retourner :
2481 2553
2482| Champ | Description |2554| Champ | Description |
2483| :------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------- |2555| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2484| `additionalContext` | Chaîne ajoutée au contexte du subagent au début de sa conversation, avant son premier prompt. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |2556| `additionalContext` | Chaîne ajoutée au contexte du sous-agent au début de sa conversation, avant sa première invite. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |
2485 2557
2486```json theme={null}2558```json theme={null}
2487{2559{
2492}2564}
2493```2565```
2494 2566
2567Quand le hook s'exécute à nouveau pour le même sous-agent, Claude Code injecte le contexte retourné uniquement quand le contexte du sous-agent ne contient pas déjà la copie d'une exécution antérieure. La copie injectée au lancement reste en place, laissant le [cache d'invite](/docs/fr/prompt-caching#subagents-and-the-cache) du sous-agent intact. Après que la [compaction automatique](/docs/fr/sub-agents#auto-compaction) rejette cette copie, Claude Code injecte le contexte de la prochaine exécution à nouveau.
2568
2495<h3 id="subagentstop">2569<h3 id="subagentstop">
2496 SubagentStop2570 SubagentStop
2497</h3>2571</h3>
2498 2572
2499S'exécute lorsqu'un subagent Claude Code a terminé sa réponse. Correspond au type d'agent, mêmes valeurs que SubagentStart.2573S'exécute quand un sous-agent Claude Code a fini de répondre. Correspond au type d'agent, mêmes valeurs que SubagentStart.
2500 2574
2501<h4 id="subagentstop-input">2575<h4 id="subagentstop-input">
2502 Entrée SubagentStop2576 Entrée SubagentStop
2503</h4>2577</h4>
2504 2578
2505En plus des [champs d'entrée communs](#common-input-fields), les hooks SubagentStop reçoivent `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path` et `last_assistant_message`. Le champ `agent_type` est la valeur utilisée pour le filtrage du matcher. Le `transcript_path` est la transcription de la session principale, tandis que `agent_transcript_path` est la propre transcription du subagent stockée dans un dossier `subagents/` imbriqué. Le champ `last_assistant_message` contient le contenu textuel de la réponse finale du subagent, donc les hooks peuvent y accéder sans analyser le fichier de transcription.2579En plus des [champs d'entrée communs](#common-input-fields), les hooks SubagentStop reçoivent `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path`, et `last_assistant_message`. Le champ `agent_type` est la valeur utilisée pour le filtrage du matcher. Le `transcript_path` est la transcription de la session principale, tandis que `agent_transcript_path` est la propre transcription du sous-agent stockée dans un dossier `subagents/` imbriqué. Le champ `last_assistant_message` contient le contenu textuel de la réponse finale du sous-agent, donc les hooks peuvent y accéder sans analyser le fichier de transcription.
2580
2581Sur Claude Code v2.1.271 ou ultérieur, un sous-agent qui s'exécute avec l'outil [`SubagentHandback`](/docs/fr/tools-reference) livre son rapport via cet outil avant qu'il s'arrête. Le champ `last_assistant_message` porte alors le texte de fermeture du sous-agent, le cas échéant, qui n'est pas le rapport livré. Le rapport est l'entrée `message` de cet appel, qu'un hook `PreToolUse` ou `PostToolUse` correspondant à `SubagentHandback` reçoit comme `tool_input.message`.
2506 2582
2507Les hooks SubagentStop reçoivent également les tableaux `background_tasks` et `session_crons` décrits sous [Entrée Stop](#stop-input). Les deux tableaux sont limités à la session parent, pas au subagent.2583Les hooks SubagentStop reçoivent également les tableaux `background_tasks` et `session_crons` décrits sous [Entrée Stop](#stop-input). Les deux tableaux sont scoped à la session parent, pas au sous-agent.
2508 2584
2509```json theme={null}2585```json theme={null}
2510{2586{
2523}2599}
2524```2600```
2525 2601
2526Les hooks SubagentStop utilisent le même format de contrôle de décision que les [hooks Stop](#stop-decision-control), y compris `hookSpecificOutput.additionalContext` avec `hookEventName` défini à `"SubagentStop"`, pour les commentaires sans erreur qui gardent le subagent en cours d'exécution. Retourner `decision: "block"` avec une `reason` garde le subagent en cours d'exécution et livre `reason` au subagent comme sa prochaine instruction. Un hook qui bloque en quittant 2 livre son message stderr de la même manière. Pour injecter du contexte dans la session parent après qu'un subagent retourne, utilisez un hook [`PostToolUse`](#posttooluse) sur l'outil `Agent` à la place.2602Les hooks SubagentStop utilisent le même format de contrôle de décision que les [hooks Stop](#stop-decision-control), y compris `hookSpecificOutput.additionalContext` avec `hookEventName` défini à `"SubagentStop"`, pour les commentaires sans erreur qui gardent le sous-agent en cours d'exécution. Retourner `decision: "block"` avec une `reason` garde le sous-agent en cours d'exécution et livre `reason` au sous-agent comme sa prochaine instruction. Un hook qui bloque en quittant 2 livre son message stderr de la même façon. Pour injecter du contexte dans la session parent après qu'un sous-agent retourne, utilisez plutôt un hook [`PostToolUse`](#posttooluse) sur l'outil `Agent`.
2527 2603
2528<h3 id="taskcreated">2604<h3 id="taskcreated">
2529 TaskCreated2605 TaskCreated
2530</h3>2606</h3>
2531 2607
2532S'exécute lorsqu'une tâche est en cours de création via l'outil `TaskCreate`. Utilisez ceci pour appliquer les conventions de nommage, exiger les descriptions de tâches ou empêcher certaines tâches d'être créées. Dans une [session sans les outils Task](/docs/fr/tools-reference#task-tool-availability), cet événement ne se déclenche pas.2608S'exécute quand une tâche est en cours de création via l'outil `TaskCreate`. Utilisez ceci pour appliquer les conventions de nommage, exiger les descriptions de tâches, ou empêcher certaines tâches d'être créées. Dans une [session sans les outils Task](/docs/fr/tools-reference#task-tool-availability), cet événement ne se déclenche pas.
2533 2609
2534Les hooks TaskCreated ne supportent pas les matchers et se déclenchent à chaque occurrence.2610Les hooks TaskCreated ne supportent pas les matchers et se déclenchent à chaque occurrence.
2535 2611
2537 Entrée TaskCreated2613 Entrée TaskCreated
2538</h4>2614</h4>
2539 2615
2540En plus des [champs d'entrée communs](#common-input-fields), les hooks TaskCreated reçoivent `task_id`, `task_subject` et optionnellement `task_description`, `teammate_name` et `team_name`.2616En plus des [champs d'entrée communs](#common-input-fields), les hooks TaskCreated reçoivent `task_id`, `task_subject`, et optionnellement `task_description`, `teammate_name`, et `team_name`.
2541 2617
2542```json theme={null}2618```json theme={null}
2543{2619{
2554```2630```
2555 2631
2556| Champ | Description |2632| Champ | Description |
2557| :----------------- | :------------------------------------------------------------------------------------ |2633| :----------------- | :---------------------------------------------------------------------------------- |
2558| `task_id` | Identifiant de la tâche en cours de création |2634| `task_id` | Identifiant de la tâche en cours de création |
2559| `task_subject` | Titre de la tâche |2635| `task_subject` | Titre de la tâche |
2560| `task_description` | Description détaillée de la tâche. Peut être absent |2636| `task_description` | Description détaillée de la tâche. Peut être absent |
2561| `teammate_name` | Nom du coéquipier créant la tâche. Peut être absent |2637| `teammate_name` | Nom du coéquipier créant la tâche. Peut être absent |
2562| `team_name` | Dépréciée. Nom d'équipe dérivé de la session ; sera supprimée dans une version future |2638| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |
2563 2639
2564<h4 id="taskcreated-decision-control">2640<h4 id="taskcreated-decision-control">
2565 Contrôle de décision TaskCreated2641 Contrôle de décision TaskCreated
2589 TaskCompleted2665 TaskCompleted
2590</h3>2666</h3>
2591 2667
2592S'exécute lorsqu'une tâche est marquée comme complétée. Cela se déclenche dans deux situations : lorsqu'un agent marque explicitement une tâche comme complétée via l'outil TaskUpdate, ou lorsqu'un coéquipier d'une [équipe d'agents](/docs/fr/agent-teams) termine son tour avec des tâches en cours. Utilisez ceci pour appliquer les critères d'achèvement comme passer les tests ou les vérifications de lint avant qu'une tâche ne puisse se fermer.2668S'exécute quand une tâche est en cours de marquage comme complétée. Cela se déclenche dans deux situations : quand n'importe quel agent marque explicitement une tâche comme complétée via l'outil TaskUpdate, ou quand un [coéquipier d'équipe agent](/docs/fr/agent-teams) termine son tour avec des tâches en cours. Utilisez ceci pour appliquer les critères de complétion comme passer les tests ou les vérifications de lint avant qu'une tâche puisse se fermer.
2593 2669
2594Les hooks TaskCompleted ne supportent pas les matchers et se déclenchent à chaque occurrence.2670Les hooks TaskCompleted ne supportent pas les matchers et se déclenchent à chaque occurrence.
2595 2671
2597 Entrée TaskCompleted2673 Entrée TaskCompleted
2598</h4>2674</h4>
2599 2675
2600En plus des [champs d'entrée communs](#common-input-fields), les hooks TaskCompleted reçoivent `task_id`, `task_subject` et optionnellement `task_description`, `teammate_name` et `team_name`.2676En plus des [champs d'entrée communs](#common-input-fields), les hooks TaskCompleted reçoivent `task_id`, `task_subject`, et optionnellement `task_description`, `teammate_name`, et `team_name`.
2601 2677
2602```json theme={null}2678```json theme={null}
2603{2679{
2615```2691```
2616 2692
2617| Champ | Description |2693| Champ | Description |
2618| :----------------- | :------------------------------------------------------------------------------------ |2694| :----------------- | :---------------------------------------------------------------------------------- |
2619| `task_id` | Identifiant de la tâche en cours de réalisation |2695| `task_id` | Identifiant de la tâche en cours de complétion |
2620| `task_subject` | Titre de la tâche |2696| `task_subject` | Titre de la tâche |
2621| `task_description` | Description détaillée de la tâche. Peut être absent |2697| `task_description` | Description détaillée de la tâche. Peut être absent |
2622| `teammate_name` | Nom du coéquipier complétant la tâche. Peut être absent |2698| `teammate_name` | Nom du coéquipier complétant la tâche. Peut être absent |
2623| `team_name` | Dépréciée. Nom d'équipe dérivé de la session ; sera supprimée dans une version future |2699| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |
2624 2700
2625<h4 id="taskcompleted-decision-control">2701<h4 id="taskcompleted-decision-control">
2626 Contrôle de décision TaskCompleted2702 Contrôle de décision TaskCompleted
2627</h4>2703</h4>
2628 2704
2629Les hooks TaskCompleted supportent deux façons de contrôler l'achèvement de la tâche :2705Les hooks TaskCompleted supportent deux façons de contrôler la complétion de tâche :
2630 2706
2631* **Code de sortie 2** : la tâche n'est pas marquée comme complétée et le message stderr est renvoyé au modèle comme commentaire.2707* **Code de sortie 2** : la tâche n'est pas marquée comme complétée et le message stderr est renvoyé au modèle comme commentaire.
2632* **JSON `{"continue": false, "stopReason": "..."}`** : arrête complètement le coéquipier, correspondant au comportement du hook `Stop`. Le `stopReason` est affiché à l'utilisateur.2708* **JSON `{"continue": false, "stopReason": "..."}`** : quand un coéquipier terminant son tour a déclenché l'événement, arrête le coéquipier entièrement, correspondant au comportement du hook `Stop`. Le `stopReason` est montré à l'utilisateur. Quand l'outil `TaskUpdate` a déclenché l'événement, Claude Code ignore `continue: false` ; le code de sortie 2 bloque toujours la complétion.
2633 2709
2634Cet exemple exécute les tests et bloque l'achèvement de la tâche s'ils échouent :2710Cet exemple exécute les tests et bloque la complétion de tâche s'ils échouent :
2635 2711
2636```bash theme={null}2712```bash theme={null}
2637#!/bin/bash2713#!/bin/bash
2638INPUT=$(cat)2714INPUT=$(cat)
2639TASK_SUBJECT=$(echo "$INPUT" | jq -r '.task_subject')2715TASK_SUBJECT=$(echo "$INPUT" | jq -r '.task_subject')
2640 2716
2641# Exécutez la suite de tests2717# Run the test suite
2642if ! npm test 2>&1; then2718if ! npm test 2>&1; then
2643 echo "Tests not passing. Fix failing tests before completing: $TASK_SUBJECT" >&22719 echo "Tests not passing. Fix failing tests before completing: $TASK_SUBJECT" >&2
2644 exit 22720 exit 2
2651 Stop2727 Stop
2652</h3>2728</h3>
2653 2729
2654S'exécute lorsque l'agent Claude Code principal a terminé sa réponse. Ne s'exécute pas si l'arrêt s'est produit en raison d'une interruption utilisateur. Les erreurs API déclenchent [StopFailure](#stopfailure) à la place.2730S'exécute quand l'agent Claude Code principal a fini de répondre. Ne s'exécute pas si l'arrêt s'est produit en raison d'une interruption utilisateur. Les erreurs API déclenchent [StopFailure](#stopfailure) à la place.
2655 2731
2656<Tip>2732<Tip>
2657 La commande [`/goal`](/docs/fr/goal) est un raccourci intégré pour un hook Stop basé sur un prompt limité à la session. Utilisez-la lorsque vous voulez que Claude continue à travailler jusqu'à ce qu'une condition soit remplie sans écrire de configuration de hook.2733 La commande [`/goal`](/docs/fr/goal) est un raccourci intégré pour un hook Stop basé sur une invite scoped à la session. Utilisez-le quand vous voulez que Claude continue à travailler vers une condition sans écrire la configuration du hook.
2658</Tip>2734</Tip>
2659 2735
2660<h4 id="stop-input">2736<h4 id="stop-input">
2661 Entrée Stop2737 Entrée Stop
2662</h4>2738</h4>
2663 2739
2664En plus des [champs d'entrée communs](#common-input-fields), les hooks Stop reçoivent `stop_hook_active`, `last_assistant_message`, `background_tasks` et `session_crons`. Le champ `stop_hook_active` est `true` lorsque Claude Code continue déjà en raison d'un hook stop. Vérifiez cette valeur ou traitez la transcription pour empêcher de bloquer sur une condition qui ne se résoudra jamais. Claude Code remplace le hook et termine le tour après 8 blocages consécutifs.2740En plus des [champs d'entrée communs](#common-input-fields), les hooks Stop reçoivent `stop_hook_active`, `last_assistant_message`, `background_tasks`, et `session_crons`. Le champ `stop_hook_active` est `true` quand Claude Code continue déjà en raison d'un hook stop. Vérifiez cette valeur ou traitez la transcription pour éviter de bloquer sur une condition qui ne se résoudra jamais. Claude Code remplace le hook et termine le tour après 8 blocages consécutifs.
2665 2741
2666Le champ `last_assistant_message` contient le contenu textuel de la réponse finale de Claude, donc les hooks peuvent y accéder sans analyser le fichier de transcription. Pour les hooks qui agissent sur le tour qui vient de se terminer, comme la lecture à haute voix ou les hooks de notification, utilisez ce champ plutôt que de relire `transcript_path` : le fichier de transcription n'est pas garanti d'inclure le message final au moment de Stop sur toutes les versions.2742Le champ `last_assistant_message` contient le contenu textuel de la réponse finale de Claude, donc les hooks peuvent y accéder sans analyser le fichier de transcription. Pour les hooks qui agissent sur le tour qui vient de se terminer, comme les hooks de lecture à haute voix ou de notification, utilisez ce champ plutôt que de lire `transcript_path` : le fichier de transcription n'est pas garanti d'inclure le message final au moment du Stop sur toutes les versions.
2667 2743
2668Les tableaux `background_tasks` et `session_crons` permettent aux hooks de distinguer « la session est terminée » de « la session est en pause en attente du réveil du travail en arrière-plan ». Les deux tableaux sont présents lorsque le registre des tâches est accessible et sont vides lorsque rien n'est en vol ou programmé.2744Les tableaux `background_tasks` et `session_crons` permettent aux hooks de distinguer « la session est terminée » de « la session est mise en pause en attente que le travail en arrière-plan la réveille ». Les deux tableaux sont présents quand le registre de tâches est accessible et sont vides quand rien n'est en vol ou programmé.
2669 2745
2670Chaque entrée dans `background_tasks` décrit une tâche en vol et utilise ces champs :2746Chaque entrée dans `background_tasks` décrit une tâche en vol et utilise ces champs :
2671 2747
2672| Champ | Description |2748| Champ | Description |
2673| :------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2749| :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2674| `id` | Identifiant de la tâche |2750| `id` | Identifiant de tâche |
2675| `type` | Étiquette de type de tâche conviviale telle que `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` ou `MCP task`. Chaque étiquette identifie quelle fonctionnalité Claude Code a créé la tâche. Revient au discriminant brut pour les types non reconnus |2751| `type` | Étiquette de type de tâche conviviale comme `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session`, ou `MCP task`. Chaque étiquette identifie quelle fonctionnalité Claude Code a créé la tâche. Revient au discriminant brut pour les types non reconnus |
2676| `status` | Statut actuel de la tâche |2752| `status` | Statut de tâche actuel |
2677| `description` | Description en texte libre, limitée à 1 000 caractères avec un marqueur `… [+N chars]` en chaîne lorsqu'elle est coupée |2753| `description` | Description en texte libre, plafonnée à 1 000 caractères avec un marqueur `… [+N chars]` en chaîne quand clippée |
2678| `command` | Ligne de commande shell, limitée à 1 000 caractères. Présent uniquement pour les tâches `shell` |2754| `command` | Ligne de commande shell, plafonnée à 1 000 caractères. Présent uniquement pour les tâches `shell` |
2679| `agent_type` | Nom du type de subagent. Présent uniquement pour les tâches `subagent` |2755| `agent_type` | Nom de type de sous-agent. Présent uniquement pour les tâches `subagent` |
2680| `server` | Nom du serveur MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |2756| `server` | Nom du serveur MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |
2681| `tool` | Nom de l'outil MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |2757| `tool` | Nom de l'outil MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |
2682| `name` | Nom du workflow. Présent uniquement pour les tâches `workflow` |2758| `name` | Nom du workflow. Présent uniquement pour les tâches `workflow` |
2683 2759
2684Chaque entrée dans `session_crons` décrit un réveil programmé limité à la session, provenant de `CronCreate`, `ScheduleWakeup` et `/loop` :2760Chaque entrée dans `session_crons` décrit un réveil programmé scoped à la session, provenant de `CronCreate`, `ScheduleWakeup`, et `/loop` :
2685 2761
2686| Champ | Description |2762| Champ | Description |
2687| :---------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- |2763| :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------ |
2688| `id` | Identifiant de la tâche cron |2764| `id` | Identifiant de tâche cron |
2689| `schedule` | Expression cron, par exemple `0 9 * * 1-5` |2765| `schedule` | Expression cron, par exemple `0 9 * * 1-5` |
2690| `recurring` | `false` pour les réveils ponctuels dont le calendrier encode un seul moment de déclenchement, `true` pour les tâches qui se redéclenchent à chaque correspondance |2766| `recurring` | `false` pour les réveils ponctuels dont l'horaire encode un seul moment de déclenchement, `true` pour les tâches qui se redéclenchent à chaque correspondance |
2691| `prompt` | Prompt soumis lorsque le cron se déclenche, limité à 1 000 caractères avec le même marqueur `… [+N chars]` |2767| `prompt` | Invite soumise quand le cron se déclenche, plafonnée à 1 000 caractères avec le même marqueur `… [+N chars]` |
2692 2768
2693Cet exemple montre une entrée Stop avec une tâche shell en vol et un cron récurrent :2769Cet exemple montre une entrée Stop avec une tâche shell en vol et un cron récurrent :
2694 2770
2728Les hooks `Stop` et `SubagentStop` peuvent contrôler si Claude continue. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, votre script de hook peut retourner ces champs spécifiques à l'événement :2804Les hooks `Stop` et `SubagentStop` peuvent contrôler si Claude continue. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, votre script de hook peut retourner ces champs spécifiques à l'événement :
2729 2805
2730| Champ | Description |2806| Champ | Description |
2731| :------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |2807| :------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2732| `decision` | `"block"` empêche Claude de s'arrêter. Omettez pour autoriser Claude à s'arrêter |2808| `decision` | `"block"` empêche Claude de s'arrêter. Omettez pour permettre à Claude de s'arrêter |
2733| `reason` | Requis lorsque `decision` est `"block"`. Indique à Claude pourquoi il doit continuer |2809| `reason` | Requis quand `decision` est `"block"`. Dit à Claude pourquoi il devrait continuer |
2734| `hookSpecificOutput.additionalContext` | Commentaires sans erreur pour Claude. La conversation continue afin que Claude puisse agir dessus, mais contrairement à `decision: "block"`, elle est affichée dans la transcription comme commentaire de hook plutôt qu'une erreur de hook |2810| `hookSpecificOutput.additionalContext` | Commentaires sans erreur pour Claude. La conversation continue pour que Claude puisse agir dessus, mais contrairement à `decision: "block"` elle est montrée dans la transcription comme commentaire de hook plutôt qu'une erreur de hook |
2735 2811
2736Un hook qui bloque en quittant 2 s'achemine de la même manière que `reason` : Claude reçoit le message stderr comme l'explication pour pourquoi il doit continuer.2812Un hook qui bloque en quittant 2 s'achemine de la même façon que `reason` : Claude reçoit le message stderr comme l'explication de pourquoi il devrait continuer.
2737 2813
2738```json theme={null}2814```json theme={null}
2739{2815{
2742}2818}
2743```2819```
2744 2820
2745Utilisez `additionalContext` lorsque le hook fonctionne comme prévu et donne des conseils à Claude, comme « exécutez la suite de tests avant de terminer ». Cela garde la conversation en cours à travers les mêmes protections de boucle que `decision: "block"`, à savoir l'entrée `stop_hook_active` et le plafond de 8 continuations consécutives, mais la transcription l'étiquette `Stop hook feedback` et aucune notification d'erreur de hook n'est affichée :2821Utilisez `additionalContext` quand le hook fonctionne comme prévu et donne des conseils à Claude, comme « exécutez la suite de tests avant de terminer ». Cela garde la conversation en cours à travers les mêmes protections de boucle que `decision: "block"`, à savoir l'entrée `stop_hook_active` et le plafond de 8 continuations consécutives, mais la transcription l'étiquette `Stop hook feedback` et aucune notification d'erreur de hook n'est montrée :
2746 2822
2747```json theme={null}2823```json theme={null}
2748{2824{
2757 StopFailure2833 StopFailure
2758</h3>2834</h3>
2759 2835
2760S'exécute à la place de [Stop](#stop) lorsque le tour se termine en raison d'une erreur API. Claude Code ignore la sortie du hook et le code de sortie, à part [`terminalSequence`](#emit-terminal-notifications). Utilisez ceci pour enregistrer les défaillances, envoyer des alertes ou prendre des mesures de récupération lorsque Claude ne peut pas terminer une réponse en raison de limites de débit, de problèmes d'authentification ou d'autres erreurs API.2836S'exécute à la place de [Stop](#stop) quand le tour se termine en raison d'une erreur API. Claude Code ignore la sortie et le code de sortie du hook, à part [`terminalSequence`](#emit-terminal-notifications). Utilisez ceci pour enregistrer les échecs, envoyer des alertes, ou prendre des actions de récupération quand Claude ne peut pas terminer une réponse en raison des limites de débit, des problèmes d'authentification, ou d'autres erreurs API.
2761 2837
2762<h4 id="stopfailure-input">2838<h4 id="stopfailure-input">
2763 Entrée StopFailure2839 Entrée StopFailure
2764</h4>2840</h4>
2765 2841
2766En plus des [champs d'entrée communs](#common-input-fields), les hooks StopFailure reçoivent `error`, optionnellement `error_details` et optionnellement `last_assistant_message`. Le champ `error` identifie le type d'erreur et est utilisé pour le filtrage du matcher.2842En plus des [champs d'entrée communs](#common-input-fields), les hooks StopFailure reçoivent `error`, optionnel `error_details`, et optionnel `last_assistant_message`. Le champ `error` identifie le type d'erreur et est utilisé pour le filtrage du matcher.
2767 2843
2768| Champ | Description |2844| Champ | Description |
2769| :----------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2845| :----------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
2770| `error` | Type d'erreur : `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens` ou `unknown` |2846| `error` | Type d'erreur : `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error`, ou `unknown` |
2771| `error_details` | Détails supplémentaires sur l'erreur, le cas échéant |2847| `error_details` | Détails supplémentaires sur l'erreur, quand disponibles |
2772| `last_assistant_message` | Le texte d'erreur rendu affiché dans la conversation. Contrairement à `Stop` et `SubagentStop`, où ce champ contient la sortie conversationnelle de Claude, pour `StopFailure` il contient la chaîne d'erreur API elle-même, comme `"API Error: Rate limit reached"` |2848| `last_assistant_message` | Le texte d'erreur rendu montré dans la conversation. Contrairement à `Stop` et `SubagentStop`, où ce champ contient la sortie conversationnelle de Claude, pour `StopFailure` il contient la chaîne d'erreur API elle-même, comme `"API Error: Rate limit reached"` |
2773 2849
2774```json theme={null}2850```json theme={null}
2775{2851{
2783}2859}
2784```2860```
2785 2861
2786Les hooks StopFailure n'ont pas de contrôle de décision. Ils s'exécutent à des fins de notification et de journalisation uniquement.2862Les hooks StopFailure n'ont pas de contrôle de décision. Ils s'exécutent à des fins de notification et de logging uniquement.
2787 2863
2788<h3 id="teammateidle">2864<h3 id="teammateidle">
2789 TeammateIdle2865 TeammateIdle
2790</h3>2866</h3>
2791 2867
2792S'exécute lorsqu'un coéquipier d'une [équipe d'agents](/docs/fr/agent-teams) est sur le point de devenir inactif après avoir terminé son tour. Utilisez ceci pour appliquer des portes de qualité avant qu'un coéquipier ne cesse de travailler, comme exiger des vérifications de lint réussies ou vérifier que les fichiers de sortie existent.2868S'exécute quand un [coéquipier d'équipe agent](/docs/fr/agent-teams) est sur le point de devenir inactif après avoir terminé son tour. Utilisez ceci pour appliquer les portes de qualité avant qu'un coéquipier arrête de travailler, comme exiger que les vérifications de lint passent ou vérifier que les fichiers de sortie existent.
2793 2869
2794Les hooks TeammateIdle ne supportent pas les matchers et se déclenchent à chaque occurrence.2870Les hooks TeammateIdle ne supportent pas les matchers et se déclenchent à chaque occurrence.
2795 2871
2812```2888```
2813 2889
2814| Champ | Description |2890| Champ | Description |
2815| :-------------- | :------------------------------------------------------------------------------------ |2891| :-------------- | :---------------------------------------------------------------------------------- |
2816| `teammate_name` | Nom du coéquipier qui est sur le point de devenir inactif |2892| `teammate_name` | Nom du coéquipier qui est sur le point de devenir inactif |
2817| `team_name` | Dépréciée. Nom d'équipe dérivé de la session ; sera supprimée dans une version future |2893| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |
2818 2894
2819<h4 id="teammateidle-decision-control">2895<h4 id="teammateidle-decision-control">
2820 Contrôle de décision TeammateIdle2896 Contrôle de décision TeammateIdle
2823Les hooks TeammateIdle supportent deux façons de contrôler le comportement du coéquipier :2899Les hooks TeammateIdle supportent deux façons de contrôler le comportement du coéquipier :
2824 2900
2825* **Code de sortie 2** : le coéquipier reçoit le message stderr comme commentaire et continue de travailler au lieu de devenir inactif.2901* **Code de sortie 2** : le coéquipier reçoit le message stderr comme commentaire et continue de travailler au lieu de devenir inactif.
2826* **JSON `{"continue": false, "stopReason": "..."}`** : arrête complètement le coéquipier, correspondant au comportement du hook `Stop`. Le `stopReason` est affiché à l'utilisateur.2902* **JSON `{"continue": false, "stopReason": "..."}`** : arrête le coéquipier entièrement, correspondant au comportement du hook `Stop`. Le `stopReason` est montré à l'utilisateur.
2827 2903
2828Cet exemple vérifie qu'un artefact de construction existe avant d'autoriser un coéquipier à devenir inactif :2904Cet exemple vérifie qu'un artefact de construction existe avant de permettre à un coéquipier de devenir inactif :
2829 2905
2830```bash theme={null}2906```bash theme={null}
2831#!/bin/bash2907#!/bin/bash
2842 ConfigChange2918 ConfigChange
2843</h3>2919</h3>
2844 2920
2845S'exécute lorsqu'un fichier de configuration change pendant une session. Utilisez ceci pour auditer les modifications de paramètres, appliquer les politiques de sécurité ou bloquer les modifications non autorisées aux fichiers de configuration.2921S'exécute quand un fichier de configuration change pendant une session. Utilisez ceci pour auditer les changements de paramètres, appliquer les politiques de sécurité, ou bloquer les modifications non autorisées aux fichiers de configuration.
2846 2922
2847Claude Code exécute les hooks ConfigChange lorsqu'un fichier de paramètres, un fichier de politique gérée ou un fichier de skill change. Pour la politique gérée, il les exécute uniquement lorsque `managed-settings.json` ou un fichier dans `managed-settings.d/` change. Il applique les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) et les modifications aux préférences gérées macOS ou à la politique de registre Windows sans les exécuter. Sur WSL avec [`wslInheritsWindowsSettings`](/docs/fr/settings-reference#wslinheritswindowssettings), il applique également un fichier de paramètres gérés Windows modifié côté sur son sondage de politique sans les exécuter.2923Claude Code exécute les hooks ConfigChange quand un fichier de paramètres, un fichier de politique gérée, ou un fichier de skill change. Pour la politique gérée, il les exécute uniquement quand `managed-settings.json` ou un fichier dans `managed-settings.d/` change. Il applique les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) et les changements aux préférences gérées macOS ou à la politique de registre Windows sans les exécuter. Sur WSL avec [`wslInheritsWindowsSettings`](/docs/fr/settings-reference#wslinheritswindowssettings), il applique également un fichier de paramètres gérés Windows modifié sur son sondage de politique sans les exécuter.
2848 2924
2849Le matcher filtre sur la source de configuration :2925Le matcher filtre sur la source de configuration :
2850 2926
2856| `policy_settings` | `managed-settings.json` ou un fichier dans `managed-settings.d/` change |2932| `policy_settings` | `managed-settings.json` ou un fichier dans `managed-settings.d/` change |
2857| `skills` | Un fichier de skill dans `.claude/skills/` change |2933| `skills` | Un fichier de skill dans `.claude/skills/` change |
2858 2934
2859Cet exemple enregistre toutes les modifications de configuration pour l'audit de sécurité :2935Cet exemple enregistre tous les changements de configuration pour l'audit de sécurité :
2860 2936
2861```json theme={null}2937```json theme={null}
2862{2938{
2880 Entrée ConfigChange2956 Entrée ConfigChange
2881</h4>2957</h4>
2882 2958
2883En plus des [champs d'entrée communs](#common-input-fields), les hooks ConfigChange reçoivent `source` et optionnellement `file_path`. Le champ `source` indique quel type de configuration a changé, et `file_path` fournit le chemin vers le fichier spécifique qui a été modifié.2959En plus des [champs d'entrée communs](#common-input-fields), les hooks ConfigChange reçoivent `source` et optionnellement `file_path`. Le champ `source` indique quel type de configuration a changé, et `file_path` fournit le chemin du fichier spécifique qui a été modifié.
2884 2960
2885```json theme={null}2961```json theme={null}
2886{2962{
2897 Contrôle de décision ConfigChange2973 Contrôle de décision ConfigChange
2898</h4>2974</h4>
2899 2975
2900Les hooks ConfigChange peuvent bloquer les modifications de configuration de prendre effet. Utilisez le code de sortie 2 ou une `decision` JSON pour empêcher la modification. Lorsqu'elle est bloquée, les nouveaux paramètres ne sont pas appliqués à la session en cours d'exécution.2976Les hooks ConfigChange peuvent bloquer les changements de configuration de prendre effet. Utilisez le code de sortie 2 ou un JSON `decision` pour empêcher le changement. Quand bloqué, les nouveaux paramètres ne sont pas appliqués à la session en cours d'exécution.
2901 2977
2902| Champ | Description |2978| Champ | Description |
2903| :--------- | :---------------------------------------------------------------------------------------------------------- |2979| :--------- | :----------------------------------------------------------------------------------------------------------------- |
2904| `decision` | `"block"` empêche la modification de configuration d'être appliquée. Omettez pour autoriser la modification |2980| `decision` | `"block"` empêche le changement de configuration d'être appliqué. Omettez pour permettre au changement de procéder |
2905| `reason` | Accepté mais jamais affiché |2981| `reason` | Accepté mais jamais montré |
2906 2982
2907```json theme={null}2983```json theme={null}
2908{2984{
2911}2987}
2912```2988```
2913 2989
2914Les modifications `policy_settings` ne peuvent pas être bloquées. Les hooks se déclenchent toujours pour les sources `policy_settings`, vous pouvez donc les utiliser pour la journalisation d'audit, mais toute décision de blocage est ignorée. Cela garantit que les paramètres gérés par l'entreprise prennent toujours effet. Claude Code n'exécute pas les hooks ConfigChange lorsque les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) arrivent ou se rafraîchissent.2990Les changements `policy_settings` ne peuvent pas être bloqués. Les hooks se déclenchent toujours pour les sources `policy_settings` quand un fichier de paramètres gérés sur la machine change, pour que vous puissiez enregistrer ces édits, mais toute décision de blocage est ignorée. Cela garantit que les paramètres gérés par l'entreprise prennent toujours effet. Claude Code n'exécute pas les hooks `ConfigChange` quand les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) arrivent ou se rafraîchissent.
2915 2991
2916Claude Code agit sur la décision de blocage de la sortie JSON d'un hook ConfigChange et rejette `systemMessage` et `continue`. Un changement bloqué ne surface aucun message à vous ou à Claude, que vous bloquez avec `reason` ou avec stderr sur exit 2. Claude Code écrit uniquement une ligne au journal de débogage.2992Claude Code agit sur la décision de blocage de la sortie JSON d'un hook ConfigChange et rejette `systemMessage` et `continue`. Un changement bloqué ne surface aucun message pour vous ou pour Claude, que vous bloquez avec `reason` ou avec stderr en quittant 2. Claude Code écrit uniquement une ligne au journal de débogage.
2917 2993
2918<h3 id="cwdchanged">2994<h3 id="cwdchanged">
2919 CwdChanged2995 CwdChanged
2920</h3>2996</h3>
2921 2997
2922S'exécute lorsque le répertoire de travail change pendant une session, par exemple lorsque Claude exécute une commande `cd`. Utilisez ceci pour réagir aux changements de répertoire : recharger les variables d'environnement, activer les chaînes d'outils spécifiques au projet ou exécuter les scripts de configuration automatiquement. S'associe avec [FileChanged](#filechanged) pour les outils comme [direnv](https://direnv.net/) qui gèrent l'environnement par répertoire.2998S'exécute quand une commande shell dans la conversation principale change le répertoire de travail, par exemple quand Claude exécute une commande `cd`. Utilisez ceci pour réagir aux changements de répertoire : recharger les variables d'environnement, activer les chaînes d'outils spécifiques au projet, ou exécuter les scripts de configuration automatiquement. S'apparie avec [FileChanged](#filechanged) pour les outils comme [direnv](https://direnv.net/) qui gèrent l'environnement par répertoire.
2923 2999
2924Les hooks CwdChanged ont accès à `CLAUDE_ENV_FILE`. Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes pour la session, tout comme dans les [hooks SessionStart](#persist-environment-variables).3000Les hooks CwdChanged ont accès à [`CLAUDE_ENV_FILE`](#persist-environment-variables). Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes jusqu'au prochain événement [CwdChanged](#cwdchanged), quand Claude Code les efface.
2925 3001
2926CwdChanged ne supporte pas les matchers et se déclenche à chaque changement de répertoire.3002CwdChanged ne supporte pas les matchers et se déclenche à chaque occurrence.
2927 3003
2928<h4 id="cwdchanged-input">3004<h4 id="cwdchanged-input">
2929 Entrée CwdChanged3005 Entrée CwdChanged
2946 Sortie CwdChanged3022 Sortie CwdChanged
2947</h4>3023</h4>
2948 3024
2949En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, les hooks CwdChanged peuvent retourner `watchPaths` pour définir dynamiquement quels chemins de fichiers [FileChanged](#filechanged) surveille :3025En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, les hooks CwdChanged peuvent retourner `watchPaths` pour définir dynamiquement quels chemins de fichier [FileChanged](#filechanged) surveille :
2950 3026
2951| Champ | Description |3027| Champ | Description |
2952| :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3028| :----------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2953| `watchPaths` | Tableau de chemins absolus. Remplace la liste de surveillance dynamique actuelle. Les chemins de votre configuration `matcher` sont toujours surveillés. Retourner un tableau vide efface la liste dynamique, ce qui est typique lors de l'entrée dans un nouveau répertoire |3029| `watchPaths` | Tableau de chemins absolus. Remplace la liste de surveillance dynamique actuelle. Les chemins de votre configuration `matcher` sont toujours surveillés. Retourner un tableau vide efface la liste dynamique, ce qui est typique quand vous entrez un nouveau répertoire |
2954 3030
2955Les hooks CwdChanged n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le changement de répertoire.3031Les hooks CwdChanged n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le changement de répertoire.
2956 3032
2957Claude Code lit `watchPaths` et `systemMessage` de leur sortie JSON et rejette `continue`. Dans les sessions interactives, il affiche le `systemMessage` comme une brève notification de terminal. Le message n'atteint pas le flux de messages SDK.3033Claude Code lit `watchPaths` et `systemMessage` de leur sortie JSON et rejette `continue`. Dans les sessions interactives, il montre le `systemMessage` comme une brève notification de terminal. Le message n'atteint pas le flux de message du SDK.
2958 3034
2959<h3 id="directoryadded">3035<h3 id="directoryadded">
2960 DirectoryAdded3036 DirectoryAdded
2961</h3>3037</h3>
2962 3038
2963S'exécute après que vous ajoutiez un répertoire de travail en milieu de session avec la commande `/add-dir`, ou après qu'un client SDK en ajoute un avec la demande de contrôle `register_repo_root`. Utilisez ceci pour préparer un référentiel nouvellement ajouté, par exemple en installant ses dépendances.3039S'exécute après que vous ajoutiez un répertoire de travail en cours de session avec la commande `/add-dir`, ou après qu'un client SDK en ajoute un avec la demande de contrôle `register_repo_root`. Utilisez ceci pour préparer un référentiel nouvellement ajouté, par exemple en installant ses dépendances.
2964 3040
2965Claude Code ne déclenche pas cet événement lorsque :3041Claude Code ne déclenche pas cet événement quand :
2966 3042
2967* Vous passez un répertoire avec le drapeau de démarrage `--add-dir` ; [SessionStart](#sessionstart) couvre ces répertoires3043* Vous passez un répertoire avec le drapeau de démarrage `--add-dir` ; [SessionStart](#sessionstart) couvre ces répertoires
2968* Vous ajoutez un répertoire sur l'onglet Workspace `/permissions`3044* Vous ajoutez un répertoire sur l'onglet Workspace `/permissions`
2969* Vous ajoutez un répertoire qui est déjà un répertoire de travail ou à l'intérieur d'un3045* Vous ajoutez un répertoire qui est déjà un répertoire de travail ou à l'intérieur d'un
2970 3046
2971Claude Code déclenche DirectoryAdded après avoir rafraîchi l'état du sandbox et de la permission, donc les outils en sandbox voient déjà le nouveau répertoire lorsque votre hook s'exécute. Les commandes du hook elles-mêmes s'exécutent sans sandbox.3047Claude Code se déclenche DirectoryAdded après avoir rafraîchi l'état du sandbox et de la permission, donc les outils en sandbox voient déjà le nouveau répertoire quand votre hook s'exécute. Les commandes du hook elles-mêmes s'exécutent sans sandbox.
2972 3048
2973Claude Code n'attend pas le hook : l'ajout se termine immédiatement, et le hook s'exécute en arrière-plan avec le délai d'expiration par défaut de 600 secondes.3049Claude Code n'attend pas le hook : l'ajout se termine immédiatement, et le hook s'exécute en arrière-plan avec le délai d'expiration par défaut de 600 secondes.
2974 3050
2986En plus des [champs d'entrée communs](#common-input-fields), les hooks DirectoryAdded reçoivent `directory` et `source`.3062En plus des [champs d'entrée communs](#common-input-fields), les hooks DirectoryAdded reçoivent `directory` et `source`.
2987 3063
2988| Champ | Description |3064| Champ | Description |
2989| :---------- | :------------------------------------------------------------------------------------------------------------------------------ |3065| :---------- | :--------------------------------------------------------------------------------------------------------------------------------- |
2990| `directory` | Chemin absolu du répertoire qui a été ajouté |3066| `directory` | Chemin absolu du répertoire qui a été ajouté |
2991| `source` | Comment le répertoire a été ajouté, `"slash_command"` pour `/add-dir` ou `"register_repo_root"` pour la demande de contrôle SDK |3067| `source` | Comment le répertoire a été ajouté, `"slash_command"` pour `/add-dir` ou `"register_repo_root"` pour la demande de contrôle du SDK |
2992 3068
2993```json theme={null}3069```json theme={null}
2994{3070{
3001}3077}
3002```3078```
3003 3079
3004Les hooks DirectoryAdded n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer l'ajout, qui s'est déjà terminé lorsque le hook s'exécute. Claude Code rejette le champ `continue` de leur sortie JSON et affiche le reste différemment par source :3080Les hooks DirectoryAdded n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer l'ajout, qui s'est déjà terminé quand le hook s'exécute. Claude Code rejette le champ `continue` de leur sortie JSON et affiche le reste différemment par source :
3005 3081
3006* `slash_command` : Claude Code livre le `systemMessage` du hook à Claude comme contexte sur le tour de conversation suivant, plutôt que de vous l'afficher. Un nombre de hooks échoués apparaît dans la transcription. La sortie d'échec complète va au journal de débogage3082* `slash_command` : Claude Code livre le `systemMessage` du hook à Claude comme contexte sur le tour de conversation suivant, plutôt que de vous le montrer. Un nombre de hooks échoués apparaît dans la transcription. La sortie d'échec complète va au journal de débogage
3007* `register_repo_root` : Claude Code écrit la sortie `systemMessage` et la sortie d'échec au journal de débogage uniquement3083* `register_repo_root` : Claude Code écrit la sortie `systemMessage` et la sortie d'échec au journal de débogage uniquement
3008 3084
3009<h3 id="filechanged">3085<h3 id="filechanged">
3010 FileChanged3086 FileChanged
3011</h3>3087</h3>
3012 3088
3013S'exécute lorsqu'un fichier surveillé change sur le disque. Claude Code détecte les modifications avec un observateur de système de fichiers, pas en inspectant les appels d'outil, donc il exécute le hook peu importe ce qui a changé le fichier : un appel d'outil `Edit` ou `Write`, un script que Claude exécute avec `Bash`, ou un processus en dehors de Claude Code entièrement. Un usage courant est de recharger les variables d'environnement lorsque les fichiers de configuration du projet changent.3089S'exécute quand un fichier surveillé change sur le disque. Claude Code détecte les changements avec un observateur de système de fichiers, pas en inspectant les appels d'outils, donc il exécute le hook peu importe ce qui a changé le fichier : un appel d'outil `Edit` ou `Write`, un script que Claude exécute avec `Bash`, ou un processus en dehors de Claude Code entièrement. Un usage courant est de recharger les variables d'environnement quand les fichiers de configuration du projet changent.
3014 3090
3015Le `matcher` pour cet événement sert deux rôles :3091Le `matcher` pour cet événement sert deux rôles :
3016 3092
3017* **Construire la liste de surveillance** : la valeur est divisée sur `|` et chaque segment est enregistré comme un nom de fichier littéral dans le répertoire de travail, donc `".envrc|.env"` surveille exactement ces deux fichiers. Les modèles regex ne sont pas utiles ici : une valeur comme `^\.env` surveillerait un fichier littéralement nommé `^\.env`.3093* **Construire la liste de surveillance** : la valeur est divisée sur `|` et chaque segment est enregistré comme un nom de fichier littéral dans le répertoire de travail, donc `".envrc|.env"` surveille exactement ces deux fichiers. Les modèles regex ne sont pas utiles ici : une valeur comme `^\.env` surveillerait un fichier littéralement nommé `^\.env`.
3018* **Filtrer quels hooks s'exécutent** : lorsqu'un fichier surveillé change, la même valeur filtre quels groupes de hook s'exécutent en utilisant les [règles de matcher](#matcher-patterns) standard par rapport au basename du fichier modifié.3094* **Filtrer quels hooks s'exécutent** : quand un fichier surveillé change, la même valeur filtre quels groupes de hook s'exécutent en utilisant les [règles de matcher](#matcher-patterns) standard contre le nom de base du fichier modifié.
3019 3095
3020Cet exemple normalise les fins de ligne dans `data.csv` après n'importe quel changement, y compris une commande `Bash` ou un script externe réécrivant le fichier :3096Cet exemple normalise les fins de ligne dans `data.csv` après n'importe quel changement, y compris une commande `Bash` ou un script externe réécrivant le fichier :
3021 3097
3037}3113}
3038```3114```
3039 3115
3040Le hook lit le chemin absolu du fichier modifié depuis le champ `file_path` de l'[entrée JSON](#filechanged-input) sur stdin. Sa garde `grep` teste la même chose que `perl` supprime, un CR à la fin d'une ligne, donc l'exécution après une normalisation quitte sans toucher le fichier. Une garde plus lâche boucle pour toujours, parce que `perl -i` réécrit le fichier même lorsqu'il ne substitue rien et Claude Code exécute le hook à nouveau après chaque réécriture. Enregistrez ce script à `/path/to/normalize-line-endings.sh` et rendez-le exécutable :3116Le hook lit le chemin absolu du fichier modifié du champ `file_path` de l'[entrée JSON](#filechanged-input) sur stdin. Sa garde `grep` teste la même chose que `perl` supprime, un CR à la fin d'une ligne, donc l'exécution après une normalisation quitte sans toucher le fichier. Une garde plus lâche boucle pour toujours, parce que `perl -i` réécrit le fichier même quand il ne substitue rien et Claude Code exécute le hook à nouveau après chaque réécriture. Enregistrez ce script dans `/path/to/normalize-line-endings.sh` et rendez-le exécutable :
3041 3117
3042```bash theme={null}3118```bash theme={null}
3043#!/bin/bash3119#!/bin/bash
3047fi3123fi
3048```3124```
3049 3125
3050Pour confirmer que le hook fonctionne, demandez à Claude d'ajouter une ligne CRLF à `data.csv` avec une commande `Bash`. Claude Code exécute le hook et le fichier se termine avec des fins de ligne LF.3126Pour confirmer que le hook fonctionne, demandez à Claude d'ajouter une ligne CRLF à `data.csv` avec une commande `Bash`. Claude Code exécute le hook et le fichier se termine avec les fins de ligne LF.
3051 3127
3052Pour surveiller les fichiers que vous ne pouvez pas nommer à l'avance, retournez [`watchPaths`](#filechanged-output) d'un hook pour mettre à jour la liste de surveillance dynamiquement. Claude Code démarre l'observateur uniquement lorsque quelque chose nomme un fichier à surveiller, donc semez la liste avec un groupe FileChanged dont le matcher nomme au moins un fichier, ou avec un hook [SessionStart](#sessionstart-decision-control) ou [CwdChanged](#cwdchanged) qui retourne `watchPaths`. Le matcher filtre toujours quels groupes de hook s'exécutent lorsqu'un fichier surveillé change, donc donnez au groupe qui gère les chemins dynamiques un matcher omis, qui correspond à chaque fichier surveillé et n'ajoute rien à la liste de surveillance. Un matcher `"*"` correspond également à chaque fichier, mais Claude Code l'enregistre dans la liste de surveillance comme un nom de fichier littéral `*`.3128Pour surveiller les fichiers que vous ne pouvez pas nommer à l'avance, retournez [`watchPaths`](#filechanged-output) d'un hook pour mettre à jour la liste de surveillance dynamiquement. Claude Code démarre l'observateur uniquement quand quelque chose nomme un fichier à surveiller, donc semez la liste avec un groupe FileChanged dont le matcher nomme au moins un fichier, ou avec un hook [SessionStart](#sessionstart-decision-control) ou [CwdChanged](#cwdchanged) qui retourne `watchPaths`. Le matcher filtre toujours quels groupes de hook s'exécutent quand un fichier surveillé change, donc donnez au groupe qui gère les chemins dynamiques un matcher omis, qui correspond à chaque fichier surveillé et n'ajoute rien à la liste de surveillance. Un matcher `"*"` correspond également à chaque fichier, mais Claude Code l'enregistre dans la liste de surveillance comme n'importe quelle autre valeur, comme un fichier littéralement nommé `*`.
3053 3129
3054Les hooks FileChanged ont accès à `CLAUDE_ENV_FILE`. Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes pour la session, tout comme dans les [hooks SessionStart](#persist-environment-variables).3130Les hooks FileChanged ont accès à [`CLAUDE_ENV_FILE`](#persist-environment-variables). Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes jusqu'au prochain événement [CwdChanged](#cwdchanged), quand Claude Code les efface.
3055 3131
3056<h4 id="filechanged-input">3132<h4 id="filechanged-input">
3057 Entrée FileChanged3133 Entrée FileChanged
3060En plus des [champs d'entrée communs](#common-input-fields), les hooks FileChanged reçoivent `file_path` et `event`.3136En plus des [champs d'entrée communs](#common-input-fields), les hooks FileChanged reçoivent `file_path` et `event`.
3061 3137
3062| Champ | Description |3138| Champ | Description |
3063| :---------- | :--------------------------------------------------------------------------------------------------------------------------- |3139| :---------- | :---------------------------------------------------------------------------------------------------------------------------- |
3064| `file_path` | Chemin absolu vers le fichier qui a changé |3140| `file_path` | Chemin absolu du fichier qui a changé |
3065| `event` | Ce qui s'est passé : `"change"` pour un fichier modifié, `"add"` pour un fichier créé ou `"unlink"` pour un fichier supprimé |3141| `event` | Ce qui s'est passé : `"change"` pour un fichier modifié, `"add"` pour un fichier créé, ou `"unlink"` pour un fichier supprimé |
3066 3142
3067```json theme={null}3143```json theme={null}
3068{3144{
3079 Sortie FileChanged3155 Sortie FileChanged
3080</h4>3156</h4>
3081 3157
3082En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, les hooks FileChanged peuvent retourner `watchPaths` pour mettre à jour dynamiquement quels chemins de fichiers sont surveillés :3158En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, les hooks FileChanged peuvent retourner `watchPaths` pour mettre à jour dynamiquement quels chemins de fichier sont surveillés :
3083 3159
3084| Champ | Description |3160| Champ | Description |
3085| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |3161| :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3086| `watchPaths` | Tableau de chemins absolus. Remplace la liste de surveillance dynamique actuelle. Les chemins de votre configuration `matcher` sont toujours surveillés. Utilisez ceci lorsque votre script de hook découvre des fichiers supplémentaires à surveiller en fonction du fichier modifié |3162| `watchPaths` | Tableau de chemins absolus. Remplace la liste de surveillance dynamique actuelle. Les chemins de votre configuration `matcher` sont toujours surveillés. Utilisez ceci quand votre script de hook découvre des fichiers supplémentaires à surveiller en fonction du fichier modifié |
3087 3163
3088Les hooks FileChanged n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le changement de fichier de se produire.3164Les hooks FileChanged n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le changement de fichier de se produire.
3089 3165
3090Claude Code lit `watchPaths` et `systemMessage` de leur sortie JSON et rejette `continue`. Dans les sessions interactives, il affiche le `systemMessage` comme une brève notification de terminal. Le message n'atteint pas le flux de messages SDK.3166Claude Code lit `watchPaths` et `systemMessage` de leur sortie JSON et rejette `continue`. Dans les sessions interactives, il montre le `systemMessage` comme une brève notification de terminal. Le message n'atteint pas le flux de message du SDK.
3091 3167
3092<h3 id="worktreecreate">3168<h3 id="worktreecreate">
3093 WorktreeCreate3169 WorktreeCreate
3094</h3>3170</h3>
3095 3171
3096S'exécute lorsqu'un worktree est en cours de création, soit à partir de `claude --worktree`, soit à partir d'un [subagent utilisant `isolation: "worktree"`](/docs/fr/sub-agents#choose-the-subagent-scope), soit pour une [session en arrière-plan](/docs/fr/agent-view#how-file-edits-are-isolated) que Claude Code isole dans son propre worktree. Par défaut, Claude Code crée la copie de travail isolée avec `git worktree`. Configurer un hook WorktreeCreate remplace ce comportement git par défaut, vous permettant d'utiliser un système de contrôle de version différent comme SVN, Perforce ou Mercurial.3172S'exécute quand un worktree est en cours de création, que ce soit à partir de `claude --worktree`, à partir d'un [sous-agent utilisant `isolation: "worktree"`](/docs/fr/sub-agents#choose-the-subagent-scope), ou pour une [session en arrière-plan](/docs/fr/agent-view#how-file-edits-are-isolated) que Claude Code isole dans son propre worktree. Par défaut, Claude Code crée la copie de travail isolée avec `git worktree`. Configurer un hook WorktreeCreate remplace ce comportement git par défaut, vous permettant d'utiliser un système de contrôle de version différent comme SVN, Perforce, ou Mercurial.
3097 3173
3098Parce que le hook remplace le comportement par défaut entièrement, [`.worktreeinclude`](/docs/fr/worktrees#copy-gitignored-files-into-worktrees) n'est pas traité. Si vous avez besoin de copier les fichiers de configuration locaux comme `.env` dans le nouveau worktree, faites-le à l'intérieur de votre script de hook.3174Parce que le hook remplace le comportement par défaut entièrement, [`.worktreeinclude`](/docs/fr/worktrees#copy-gitignored-files-into-worktrees) n'est pas traité. Si vous avez besoin de copier les fichiers de configuration locaux comme `.env` dans le nouveau worktree, faites-le à l'intérieur de votre script de hook.
3099 3175
3100Le hook doit retourner le chemin du répertoire du worktree créé. Claude Code utilise ce chemin comme répertoire de travail pour la session isolée. Consultez [Sortie WorktreeCreate](#worktreecreate-output) pour savoir comment chaque type de hook retourne le chemin.3176Le hook doit retourner le chemin du répertoire worktree créé. Claude Code utilise ce chemin comme le répertoire de travail pour la session isolée. Voir [Sortie WorktreeCreate](#worktreecreate-output) pour savoir comment chaque type de hook retourne le chemin.
3101 3177
3102Claude Code agit sur le succès du hook et le chemin retourné, et rejette `systemMessage` et `continue`.3178Claude Code agit sur le succès du hook et le chemin retourné, et rejette `systemMessage` et `continue`.
3103 3179
3120}3196}
3121```3197```
3122 3198
3123Le hook lit le `name` du worktree depuis l'entrée JSON sur stdin, extrait une copie fraîche dans un nouveau répertoire et imprime le chemin du répertoire. Le `echo` sur la dernière ligne est ce que Claude Code lit comme chemin du worktree. Redirigez toute autre sortie du hook vers stderr afin qu'elle n'interfère pas avec le chemin.3199Le hook lit le `name` du worktree de l'entrée JSON sur stdin, extrait une copie fraîche dans un nouveau répertoire, et imprime le chemin du répertoire. Le `echo` sur la dernière ligne est ce que Claude Code lit comme le chemin du worktree. Redirigez toute autre sortie vers stderr pour qu'elle n'interfère pas avec le chemin.
3124 3200
3125<h4 id="worktreecreate-input">3201<h4 id="worktreecreate-input">
3126 Entrée WorktreeCreate3202 Entrée WorktreeCreate
3127</h4>3203</h4>
3128 3204
3129En plus des [champs d'entrée communs](#common-input-fields), les hooks WorktreeCreate reçoivent le champ `name`. C'est un identifiant slug pour le nouveau worktree, soit spécifié par l'utilisateur, soit généré automatiquement, par exemple `bold-oak-a3f2`.3205En plus des [champs d'entrée communs](#common-input-fields), les hooks WorktreeCreate reçoivent le champ `name`. C'est un identifiant slug pour le nouveau worktree, soit spécifié par l'utilisateur, soit auto-généré, par exemple `bold-oak-a3f2`.
3130 3206
3131```json theme={null}3207```json theme={null}
3132{3208{
3142 Sortie WorktreeCreate3218 Sortie WorktreeCreate
3143</h4>3219</h4>
3144 3220
3145Les hooks WorktreeCreate n'utilisent pas le modèle de décision autoriser/bloquer standard. Au lieu de cela, le succès ou l'échec du hook détermine le résultat. Le hook doit retourner le chemin du répertoire du worktree créé :3221Les hooks WorktreeCreate n'utilisent pas le modèle de décision permettre/bloquer standard. Au lieu de cela, le succès ou l'échec du hook détermine le résultat. Le hook doit retourner le chemin du répertoire worktree créé :
3146 3222
3147* **Hooks de commande** (`type: "command"`) : imprimez le chemin comme la dernière ligne non-vide de stdout. Claude Code supprime les codes d'échappement ANSI avant de lire cette ligne, donc les bannières de démarrage du shell imprimées avant votre `echo` sont ignorées. Redirigez toute autre sortie du hook vers stderr.3223* **Hooks de commande** (`type: "command"`) : imprimez le chemin comme la dernière ligne non-vide de la sortie standard. Claude Code supprime les codes d'échappement ANSI avant de lire cette ligne, donc les bannières de démarrage du shell imprimées avant votre `echo` sont ignorées. Redirigez toute autre sortie du hook vers stderr.
3148* **Hooks HTTP** (`type: "http"`) : retournez `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` dans le corps de la réponse.3224* **Hooks HTTP** (`type: "http"`) : retournez `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` dans le corps de la réponse.
3149 3225
3150Si le hook échoue ou ne produit aucun chemin, la création du worktree échoue avec une erreur.3226Si le hook échoue ou ne produit pas de chemin, la création du worktree échoue avec une erreur.
3151 3227
3152Claude Code résout un chemin relatif par rapport au répertoire dans lequel le hook s'est exécuté, en effondrant tout segment `.` ou `..` dans celui-ci. Si le chemin résultant n'est pas un répertoire dans lequel Claude Code peut entrer, la session imprime une erreur nommant le chemin et quitte avec le code 1.3228Claude Code résout un chemin relatif contre le répertoire où le hook s'est exécuté, en effondrant tout segment `.` ou `..` dedans. Si le chemin résultant n'est pas un répertoire que Claude Code peut entrer, la session imprime une erreur nommant le chemin et quitte avec le code 1.
3153 3229
3154Claude Code refuse un chemin absolu qui contient des segments `.` ou `..`, et tout chemin qui passe par un symlink en dessous de la racine du référentiel, parce qu'un symlink engagé au référentiel pourrait rediriger le worktree en dehors de celui-ci. L'erreur nomme le composant rejeté. Retournez un chemin normalisé qui ne passe pas par un symlink à l'intérieur du référentiel. Avant v2.1.216, la création du worktree suivait le chemin du hook sans ce dépistage.3230Claude Code refuse un chemin absolu qui contient des segments `.` ou `..`, et n'importe quel chemin qui passe à travers un symlink en dessous de la racine du référentiel, parce qu'un symlink commis au référentiel pourrait rediriger le worktree en dehors de lui. L'erreur nomme le composant rejeté. Retournez un chemin normalisé qui ne passe pas à travers un symlink à l'intérieur du référentiel. Avant v2.1.216, la création du worktree suivait le chemin du hook sans ce dépistage.
3155 3231
3156<h3 id="worktreeremove">3232<h3 id="worktreeremove">
3157 WorktreeRemove3233 WorktreeRemove
3158</h3>3234</h3>
3159 3235
3160S'exécute lorsqu'un worktree est en cours de suppression. Cela se produit lorsque :3236S'exécute quand un worktree est en cours de suppression. C'est la contrepartie de nettoyage de [WorktreeCreate](#worktreecreate). L'événement se déclenche quand :
3161 3237
3162* vous quittez une session `--worktree` et choisissez de la supprimer3238* vous quittez une session `--worktree` et choisissez de la supprimer
3163* un subagent avec `isolation: "worktree"` se termine3239* un sous-agent avec `isolation: "worktree"` se termine
3164* vous supprimez une [session en arrière-plan](/docs/fr/agent-view#what-deleting-a-session-removes) dont le worktree a été créé par le hook3240* vous supprimez une [session en arrière-plan](/docs/fr/agent-view#what-deleting-a-session-removes) dont le worktree le hook a créé
3165 3241
3166Pour les worktrees basés sur git, Claude Code gère le nettoyage automatiquement avec `git worktree remove`. Si vous avez configuré un hook WorktreeCreate pour un système de contrôle de version non-git, associez-le à un hook WorktreeRemove pour gérer le nettoyage. Sans lui, le répertoire du worktree est laissé sur le disque.3242Pour les worktrees basés sur git, Claude Code gère le nettoyage automatiquement avec `git worktree remove`. Si vous avez configuré un hook WorktreeCreate pour un système de contrôle de version non-git, associez-le avec un hook WorktreeRemove pour gérer le nettoyage. Sans un, le répertoire worktree est laissé sur le disque.
3167 3243
3168Claude Code rejette les [champs de sortie JSON](#json-output) d'un hook WorktreeRemove, tels que `systemMessage` et `continue`.3244Claude Code rejette les [champs de sortie JSON](#json-output) d'un hook WorktreeRemove, comme `systemMessage` et `continue`.
3169 3245
3170Pour une suppression de session en arrière-plan, Claude Code vérifie le chemin du worktree stocké avant d'exécuter le hook et refuse un chemin qui est un symlink ou passe par un en dessous de la racine du référentiel. Le hook s'exécute pour un worktree qui contient toujours des fichiers uniquement lorsque vous confirmez la suppression dans la [vue agent](/docs/fr/agent-view#what-deleting-a-session-removes) ; pour un tel worktree, [`claude rm`](/docs/fr/agent-view#manage-sessions-from-the-shell) garde la session et le worktree à la place. Avant v2.1.216, le hook s'exécutait sur le chemin stocké sans ces vérifications.3246Pour une suppression de session en arrière-plan, Claude Code vérifie le chemin du worktree stocké avant d'exécuter le hook et refuse un chemin qui est un symlink ou passe à travers un en dessous de la racine du référentiel. Le hook s'exécute pour un worktree qui contient toujours des fichiers uniquement quand vous confirmez la suppression dans la [vue agent](/docs/fr/agent-view#what-deleting-a-session-removes) ; pour un tel worktree, [`claude rm`](/docs/fr/agent-view#manage-sessions-from-the-shell) garde la session et le worktree à la place. Avant v2.1.216, le hook s'exécutait sur le chemin stocké sans ces vérifications.
3171 3247
3172Claude Code transmet le chemin que WorktreeCreate a retourné comme `worktree_path` dans l'entrée du hook. Cet exemple lit ce chemin et supprime le répertoire :3248Claude Code passe le chemin retourné par WorktreeCreate comme `worktree_path` dans l'entrée du hook. Cet exemple lit ce chemin et supprime le répertoire :
3173 3249
3174```json theme={null}3250```json theme={null}
3175{3251{
3204}3280}
3205```3281```
3206 3282
3207Les hooks WorktreeRemove n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer la suppression du worktree mais peuvent effectuer des tâches de nettoyage comme supprimer l'état du contrôle de version ou archiver les modifications. Les défaillances des hooks sont enregistrées en mode debug uniquement.3283Le code de sortie d'un hook WorktreeRemove décide du résultat. Quand un hook quitte non-zéro et le répertoire à `worktree_path` existe toujours après, la suppression échoue :
3284
3285* Le worktree reste sur le disque, et la commande du hook et stderr vont au [journal de débogage](#debug-hooks).
3286* Si vous supprimiez une session en arrière-plan, la session reste aussi. Le message de refus dans la [vue agent](/docs/fr/agent-view#what-deleting-a-session-removes) rapporte comment le hook s'est terminé, comme `exited 1`, cite le début de son stderr, et dit si la suppression de la session à nouveau supprime le répertoire de toute façon.
3208 3287
3209<h3 id="precompact">3288<h3 id="precompact">
3210 PreCompact3289 PreCompact
3211</h3>3290</h3>
3212 3291
3213S'exécute avant que Claude Code ne soit sur le point d'exécuter une opération de compaction.3292S'exécute avant que Claude Code soit sur le point d'exécuter une opération de compaction.
3214 3293
3215La valeur du matcher indique si la compaction a été déclenchée manuellement ou automatiquement :3294La valeur du matcher indique si la compaction a été déclenchée manuellement ou automatiquement :
3216 3295
3217| Matcher | Quand il se déclenche |3296| Matcher | Quand il se déclenche |
3218| :------- | :--------------------------------------------------------------- |3297| :------- | :---------------------------------------------------------------------------------------------------------------------------------------- |
3219| `manual` | `/compact` |3298| `manual` | `/compact` |
3220| `auto` | Compaction automatique lorsque la fenêtre de contexte est pleine |3299| `auto` | Compaction automatique quand la conversation atteint la [fenêtre de compaction automatique](/docs/fr/model-config#set-the-auto-compact-window) |
3221 3300
3222Quittez avec le code 2 pour bloquer la compaction. Pour un `/compact` manuel, le message stderr est affiché à l'utilisateur. Vous pouvez également bloquer en retournant JSON avec `"decision": "block"`.3301Quittez avec le code 2 pour bloquer la compaction. Pour un `/compact` manuel, le message stderr est montré à l'utilisateur. Vous pouvez également bloquer en retournant JSON avec `"decision": "block"`.
3223 3302
3224Le blocage de la compaction automatique a des effets différents selon le moment où il se déclenche. Si la compaction a été déclenchée de manière proactive avant la limite de contexte, Claude Code la saute et la conversation continue sans compaction. Si la compaction a été déclenchée pour récupérer d'une erreur de limite de contexte déjà retourné par l'API, l'erreur sous-jacente remonte et la demande actuelle échoue.3303Bloquer la compaction automatique a des effets différents selon quand elle se déclenche. Si la compaction a été déclenchée de manière proactive avant la limite de contexte, Claude Code la saute et la conversation continue non-compactée. Si la compaction a été déclenchée pour récupérer d'une erreur de limite de contexte déjà retourné par l'API, l'erreur sous-jacente surface et la demande actuelle échoue.
3225 3304
3226Claude Code rejette les champs `systemMessage` et `continue` d'un hook PreCompact.3305Claude Code rejette les champs `systemMessage` et `continue` d'un hook PreCompact.
3227 3306
3229 Entrée PreCompact3308 Entrée PreCompact
3230</h4>3309</h4>
3231 3310
3232En plus des [champs d'entrée communs](#common-input-fields), les hooks PreCompact reçoivent `trigger` et `custom_instructions`. Pour `manual`, `custom_instructions` contient ce que l'utilisateur transmet dans `/compact` et est `null` lorsqu'il ne transmet rien. Pour `auto`, `custom_instructions` est `null`.3311En plus des [champs d'entrée communs](#common-input-fields), les hooks PreCompact reçoivent `trigger` et `custom_instructions`. Pour `manual`, `custom_instructions` contient ce que l'utilisateur passe dans `/compact` et est `null` quand il ne passe rien. Pour `auto`, `custom_instructions` est `null`.
3233 3312
3234```json theme={null}3313```json theme={null}
3235{3314{
3246 PostCompact3325 PostCompact
3247</h3>3326</h3>
3248 3327
3249S'exécute après que Claude Code complète une opération de compaction. Utilisez cet événement pour réagir au nouvel état compacté, par exemple pour enregistrer le résumé généré ou mettre à jour l'état externe. Claude Code rejette les champs `systemMessage` et `continue` d'un hook PostCompact.3328S'exécute après que Claude Code termine une opération de compaction. Utilisez cet événement pour réagir à l'état compacté nouveau, par exemple pour enregistrer le résumé généré ou mettre à jour l'état externe. Claude Code rejette les champs `systemMessage` et `continue` d'un hook PostCompact.
3250 3329
3251Les mêmes valeurs de matcher s'appliquent que pour `PreCompact` :3330Les mêmes valeurs de matcher s'appliquent que pour `PreCompact` :
3252 3331
3253| Matcher | Quand il se déclenche |3332| Matcher | Quand il se déclenche |
3254| :------- | :--------------------------------------------------------------------- |3333| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |
3255| `manual` | Après `/compact` |3334| `manual` | Après `/compact` |
3256| `auto` | Après compaction automatique lorsque la fenêtre de contexte est pleine |3335| `auto` | Après la compaction automatique quand la conversation atteint la [fenêtre de compaction automatique](/docs/fr/model-config#set-the-auto-compact-window) |
3257 3336
3258<h4 id="postcompact-input">3337<h4 id="postcompact-input">
3259 Entrée PostCompact3338 Entrée PostCompact
3278 PreModelSwitch3357 PreModelSwitch
3279</h3>3358</h3>
3280 3359
3281S'exécute avant que Claude Code n'applique un changement de modèle que vous ou un client avez demandé. Utilisez-le pour bloquer un changement, exiger une confirmation ou afficher le coût du changement avant qu'il ne se produise.3360S'exécute avant que Claude Code applique un changement de modèle que vous ou un client avez demandé. Utilisez-le pour bloquer un changement, exiger une confirmation, ou montrer quel coût le changement aura avant qu'il se produise.
3282 3361
3283PreModelSwitch nécessite Claude Code v2.1.251 ou ultérieur. Claude Code l'exécute pour ces demandes :3362PreModelSwitch nécessite Claude Code v2.1.251 ou ultérieur. Claude Code l'exécute pour ces demandes :
3284 3363
3285* `/model <name>` et le sélecteur `/model`3364* `/model <name>` et le sélecteur `/model`
3286* Le sélecteur de modèle `Option+P` ou `Alt+P`3365* Le sélecteur de modèle `Option+P` ou `Alt+P`
3287* Le paramètre Model dans `/config`3366* Le paramètre Model dans `/config`
3288* L'activation du [mode rapide](/docs/fr/fast-mode) lorsque cela change le modèle de la session3367* Activer le [mode rapide](/docs/fr/fast-mode) quand cela change le modèle de la session
3289* Une demande `set_model`, ou un changement de modèle dans une demande `apply_flag_settings`, d'un hôte [Agent SDK](/docs/fr/agent-sdk/typescript#query-object) ou [Remote Control](/docs/fr/remote-control)3368* Une demande `set_model`, ou un changement de modèle dans une demande `apply_flag_settings`, d'un hôte [Agent SDK](/docs/fr/agent-sdk/typescript#query-object) ou [Remote Control](/docs/fr/remote-control)
3290 3369
3291Claude Code n'exécute pas les hooks PreModelSwitch pour les changements qu'il fait seul, comme un [repli de modèle automatique](/docs/fr/model-config#automatic-model-fallback) ou la restauration du modèle lorsque vous reprenez une session. Ces changements atteignent [PostModelSwitch](#postmodelswitch) uniquement.3370Claude Code n'exécute pas les hooks PreModelSwitch pour les changements qu'il fait seul, comme un [fallback de modèle automatique](/docs/fr/model-config#automatic-model-fallback) ou la restauration du modèle quand vous reprenez une session. Ces changements atteignent [PostModelSwitch](#postmodelswitch) uniquement.
3292 3371
3293Claude Code compare le matcher par rapport au nom canonique du modèle vers lequel la session bascule, en ignorant tout suffixe `[1m]`. Un alias comme `opus`, un ID de modèle daté et un ID spécifique au fournisseur comme un ID de modèle Amazon Bedrock correspondent tous au nom canonique unique auquel ils se résolvent, donc `claude-opus-5` couvre chaque orthographe d'Opus 5.3372Claude Code compare le matcher contre le nom canonique du modèle vers lequel la session bascule, en ignorant tout suffixe `[1m]`. Un alias comme `opus`, un ID de modèle daté, et un ID spécifique au fournisseur comme un ID de modèle Amazon Bedrock correspondent tous au nom canonique unique auquel ils se résolvent, donc `claude-opus-5` couvre chaque orthographe d'Opus 5.
3294 3373
3295Lorsque Claude Code ne peut pas déterminer un nom canonique pour la cible, par exemple un ID de modèle personnalisé que seule votre [passerelle LLM](/docs/fr/llm-gateway) connaît, il exécute chaque hook PreModelSwitch indépendamment du matcher. Un hook qui bloque doit donc vérifier `to_model` de son entrée plutôt que de compter uniquement sur le matcher.3374Quand Claude Code ne peut pas déterminer un nom canonique pour la cible, par exemple un ID de modèle personnalisé que seule votre [passerelle LLM](/docs/fr/llm-gateway) connaît, il exécute chaque hook PreModelSwitch indépendamment du matcher. Un hook qui bloque devrait donc vérifier `to_model` de son entrée plutôt que de compter uniquement sur le matcher.
3296 3375
3297Écrivez le matcher comme un nom exact, une liste séparée par `|` comme `claude-opus-4-6|claude-opus-5`, ou une expression régulière comme `.*opus.*`. Cet exemple utilise un matcher de nom exact et vérifie également `to_model` de l'entrée du hook, donc il refuse un changement vers Opus 4.6 en quittant avec le code 2 et laisse n'importe quelle autre cible passer :3376Écrivez le matcher comme un nom exact, une liste séparée par `|` comme `claude-opus-4-6|claude-opus-5`, ou une expression régulière comme `.*opus.*`. Cet exemple utilise un matcher de nom exact et vérifie également `to_model` de l'entrée du hook, donc il refuse un changement vers Opus 4.6 en quittant avec le code 2 et laisse n'importe quelle autre cible passer :
3298 3377
3360 </Tab>3439 </Tab>
3361</Tabs>3440</Tabs>
3362 3441
3363Pour confirmer que le hook fonctionne, exécutez `/model claude-opus-4-6` à partir d'une session exécutant un modèle différent. Claude Code garde le modèle actuel et signale qu'un hook PreModelSwitch a bloqué le changement, avec votre message comme raison.3442Pour confirmer que le hook fonctionne, exécutez `/model claude-opus-4-6` à partir d'une session exécutant un modèle différent. Claude Code garde le modèle actuel et rapporte qu'un hook PreModelSwitch a bloqué le changement, avec votre message comme raison.
3364 3443
3365<h4 id="premodelswitch-input">3444<h4 id="premodelswitch-input">
3366 Entrée PreModelSwitch3445 Entrée PreModelSwitch
3367</h4>3446</h4>
3368 3447
3369En plus des [champs d'entrée communs](#common-input-fields), les hooks PreModelSwitch reçoivent les champs du tableau ci-dessous. Les cinq derniers décrivent le coût de l'envoi de la conversation au nouveau modèle, donc un hook peut afficher ce chiffre avant le changement.3448En plus des [champs d'entrée communs](#common-input-fields), les hooks PreModelSwitch reçoivent les champs du tableau ci-dessous. Les cinq derniers décrivent quel coût la renvoi de la conversation au nouveau modèle a, pour qu'un hook puisse montrer ce chiffre avant que le changement se produise.
3370 3449
3371| Champ | Type | Description |3450| Champ | Type | Description |
3372| :-------------------------- | :--------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3451| :-------------------------- | :--------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3373| `from_model` | string | ID du modèle à partir duquel le changement s'effectue |3452| `from_model` | string | ID de modèle du changement |
3374| `to_model` | string | ID du modèle vers lequel le changement s'effectue. Le matcher compare par rapport au nom canonique de ce modèle |3453| `to_model` | string | ID de modèle du changement vers. Le matcher compare contre le nom canonique de ce modèle |
3375| `requested_model` | string ou `null` | Le modèle que la demande a nommé : un alias comme `opus`, un ID de modèle complet, ou `null` lorsque la demande était pour le modèle par défaut |3454| `requested_model` | string ou `null` | Le modèle que la demande a nommé : un alias comme `opus`, un ID de modèle complet, ou `null` quand la demande était pour le modèle par défaut |
3376| `source` | string | D'où provient la demande : `"command"` pour `/model <name>`, le paramètre Model dans `/config` ou l'activation du mode rapide ; `"picker"` pour un sélecteur de modèle ; `"sdk"` pour une demande `set_model`, ou un changement de modèle dans une demande `apply_flag_settings`, d'un hôte Agent SDK ou Remote Control |3455| `source` | string | D'où la demande provient : `"command"` pour `/model <name>`, le paramètre Model dans `/config`, ou l'activation du mode rapide ; `"picker"` pour un sélecteur de modèle ; `"sdk"` pour une demande `set_model`, ou un changement de modèle dans une demande `apply_flag_settings`, d'un hôte Agent SDK ou Remote Control |
3377| `context_tokens` | number | Tokens que la demande suivante renvoie comme son prompt : les tokens d'entrée, de lecture de cache, de création de cache et de sortie de la dernière réponse dans la conversation principale, combinés. `0` avant la première réponse |3456| `context_tokens` | number | Tokens que la demande suivante renvoie comme son invite : les tokens d'entrée, de lecture de cache, de création de cache, et de sortie de la dernière réponse dans la conversation principale, combinés. `0` avant la première réponse |
3378| `prompt_cache_warm` | boolean | Si le cache de prompt du modèle actuel est probablement toujours chaud, ce qui signifie que le changement le perd |3457| `prompt_cache_warm` | boolean | Si le cache d'invite du modèle actuel est probablement toujours chaud, ce qui signifie que le changement le perd |
3379| `cache_ttl` | string | [Durée de vie du cache de prompt](/docs/fr/prompt-caching#cache-lifetime) que Claude Code demande pour cette session : `"5m"` ou `"1h"` |3458| `cache_ttl` | string | [Durée de vie du cache d'invite](/docs/fr/prompt-caching#cache-lifetime) que Claude Code demande pour cette session : `"5m"` ou `"1h"` |
3380| `estimated_cache_write_usd` | number | Coût estimé en dollars américains de l'écriture de `context_tokens` dans le cache de prompt sur `to_model` au taux `cache_ttl`, excluant la réponse suivante. Le serveur n'a peut-être pas besoin de re-cacher le contexte entier, donc traitez-le comme une estimation |3459| `estimated_cache_write_usd` | number | Coût estimé en dollars américains de l'écriture de `context_tokens` dans le cache d'invite sur `to_model` au taux `cache_ttl`, excluant la réponse suivante. Le serveur n'a peut-être pas besoin de re-cacher le contexte entier, donc traitez-le comme une estimation |
3381| `pricing` | string | Comment Claude Code a tarifé `estimated_cache_write_usd` : `"configured"` à vos propres taux d'organisation lorsqu'elle les a configurés, `"catalog"` au prix catalogue, ou `"default"` lorsque `to_model` n'a pas de prix connu et Claude Code a supposé un taux par défaut |3460| `pricing` | string | Comment Claude Code a tarifé `estimated_cache_write_usd` : `"configured"` à vos propres taux d'organisation quand elle les a configurés, `"catalog"` au prix catalogue, ou `"default"` quand `to_model` n'a pas de prix connu et Claude Code a supposé un taux par défaut |
3382 3461
3383Cet exemple montre l'entrée pour `/model opus` dans une session exécutant Sonnet 5 :3462Cet exemple montre l'entrée pour `/model opus` dans une session exécutant Sonnet 5 :
3384 3463
3404 Contrôle de décision PreModelSwitch3483 Contrôle de décision PreModelSwitch
3405</h4>3484</h4>
3406 3485
3407Les hooks `PreModelSwitch` peuvent annuler le changement, demander à l'utilisateur de le confirmer ou le laisser procéder. Le code de sortie 2 ou un `decision: "block"` au niveau supérieur annule le changement.3486Les hooks `PreModelSwitch` peuvent annuler le changement, demander à l'utilisateur de le confirmer, ou le laisser procéder. Le code de sortie 2 ou un `decision: "block"` de haut niveau annule le changement.
3408 3487
3409Pour un contrôle plus fin, retournez `permissionDecision` et `permissionDecisionReason` dans un objet `hookSpecificOutput`, comme sur [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` accepte `"allow"`, `"deny"` et `"ask"`. Il n'accepte pas `"defer"`, `updatedInput` ou `additionalContext`. Le tableau ci-dessous décrit les deux champs :3488Pour un contrôle plus fin, retournez `permissionDecision` et `permissionDecisionReason` dans un objet `hookSpecificOutput`, comme sur [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` accepte `"allow"`, `"deny"`, et `"ask"`. Il n'accepte pas `"defer"`, `updatedInput`, ou `additionalContext`. Le tableau ci-dessous décrit les deux champs :
3410 3489
3411| Champ | Description |3490| Champ | Description |
3412| :------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3491| :------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3413| `permissionDecision` | `"allow"` procède et saute la [confirmation que Claude Code affiche pendant que le cache de prompt est chaud](/docs/fr/prompt-caching#switching-models). `"deny"` annule le changement. `"ask"` demande à l'utilisateur de le confirmer |3492| `permissionDecision` | `"allow"` procède et ignore la [confirmation que Claude Code montre pendant que le cache d'invite est chaud](/docs/fr/prompt-caching#switching-models). `"deny"` annule le changement. `"ask"` invite l'utilisateur à le confirmer |
3414| `permissionDecisionReason` | Pour `"deny"`, affiché à l'utilisateur comme la raison du blocage du changement, ou retourné comme l'erreur pour une demande `set_model`. Pour `"ask"`, affiché dans le dialogue de confirmation. Ignoré pour `"allow"` |3493| `permissionDecisionReason` | Pour `"deny"`, montré à l'utilisateur comme la raison du blocage du changement, ou retourné comme l'erreur pour une demande `set_model`. Pour `"ask"`, montré dans l'invite de confirmation. Ignoré pour `"allow"` |
3415 3494
3416Seul `/model` dans une session interactive peut afficher le dialogue `"ask"`. Sur chaque autre surface, y compris le mode non-interactif avec le drapeau `-p`, `/config` et les demandes `set_model`, Claude Code traite `"ask"` comme un refus.3495Seul `/model` dans une session interactive peut montrer l'invite `"ask"`. Sur chaque autre surface, y compris le mode non-interactif avec le drapeau `-p`, `/config`, et les demandes `set_model`, Claude Code traite `"ask"` comme un refus.
3417 3496
3418Cet exemple demande à l'utilisateur de confirmer et cite le nombre de tokens de `context_tokens` :3497Cet exemple demande à l'utilisateur de confirmer et cite le nombre de tokens de `context_tokens` :
3419 3498
3427}3506}
3428```3507```
3429 3508
3430Lorsque plusieurs hooks PreModelSwitch retournent des décisions différentes, la précédence est `deny` > `ask` > `allow`.3509Quand plusieurs hooks PreModelSwitch retournent des décisions différentes, la priorité est `deny` > `ask` > `allow`.
3431 3510
3432Claude Code affiche tout `systemMessage` que votre hook retourne indépendamment de la décision, donc un hook de rapport de coûts peut retourner `{"systemMessage": "..."}` et quitter 0.3511Claude Code montre à l'utilisateur n'importe quel `systemMessage` que votre hook retourne indépendamment de la décision, pour qu'un hook de rapport de coût puisse retourner `{"systemMessage": "..."}` et quitter 0.
3433 3512
3434Un hook PreModelSwitch qui ne répond pas avant son délai d'expiration bloque le changement. Sur [PreToolUse](#timeouts), par contraste, un hook de commande qui expire laisse l'appel d'outil continuer. Le délai d'expiration par défaut pour cet événement est 30 secondes. `PreModelSwitch` exécute uniquement les hooks `command`, `http` et `mcp_tool`, donc les valeurs par défaut `prompt` et `agent` ne s'appliquent pas.3513Un hook PreModelSwitch qui ne répond pas avant son délai d'expiration bloque le changement. Sur [PreToolUse](#timeouts), par contraste, un hook de commande qui expire laisse l'appel d'outil continuer. Le délai d'expiration par défaut pour cet événement est 30 secondes. `PreModelSwitch` exécute uniquement les hooks `command`, `http`, et `mcp_tool`, donc les défauts `prompt` et `agent` ne s'appliquent pas.
3435 3514
3436Un hook qui quitte avec un code autre que 0 ou 2 et n'imprime aucune décision JSON ne bloque pas : Claude Code affiche son stderr et applique le changement, comme décrit sous [Autres codes de sortie](#other-exit-codes).3515Un hook qui quitte avec un code autre que 0 ou 2 et n'imprime pas de décision JSON ne bloque pas : Claude Code montre son stderr et applique le changement, comme décrit sous [Autres codes de sortie](#other-exit-codes).
3437 3516
3438<h3 id="postmodelswitch">3517<h3 id="postmodelswitch">
3439 PostModelSwitch3518 PostModelSwitch
3444PostModelSwitch nécessite Claude Code v2.1.251 ou ultérieur. Il ne peut pas bloquer, parce que le modèle a déjà changé. Claude Code exécute les hooks PostModelSwitch après n'importe lequel de ces changements :3523PostModelSwitch nécessite Claude Code v2.1.251 ou ultérieur. Il ne peut pas bloquer, parce que le modèle a déjà changé. Claude Code exécute les hooks PostModelSwitch après n'importe lequel de ces changements :
3445 3524
3446* Un changement que vous ou un client avez demandé3525* Un changement que vous ou un client avez demandé
3447* Un [repli de modèle automatique](/docs/fr/model-config#automatic-model-fallback), qui change le modèle de la session3526* Un [fallback de modèle automatique](/docs/fr/model-config#automatic-model-fallback), qui change le modèle de la session
3448* Un paramètre comme [`opusplan`](/docs/fr/model-config#opusplan-model-setting) entrant ou quittant le mode plan3527* Un paramètre comme [`opusplan`](/docs/fr/model-config#opusplan-model-setting) entrant ou quittant le mode plan
3449* Claude Code restaurant le modèle lorsque vous reprenez une session3528* Claude Code restaurant le modèle quand vous reprenez une session
3450 3529
3451Claude Code n'exécute pas les hooks PostModelSwitch lorsqu'un modèle d'une [chaîne de modèles de repli](/docs/fr/model-config#fallback-model-chains) sert un tour, parce que cette substitution dure un tour et laisse le modèle de la session inchangé.3530Claude Code n'exécute pas les hooks PostModelSwitch quand un modèle d'une [chaîne de modèle de fallback](/docs/fr/model-config#fallback-model-chains) sert un tour, parce que cette substitution dure un tour et laisse le modèle de la session inchangé.
3452 3531
3453Le matcher suit les mêmes règles que [PreModelSwitch](#premodelswitch) : Claude Code le compare par rapport au nom canonique du modèle vers lequel la session a basculé.3532Le matcher suit les mêmes règles que [PreModelSwitch](#premodelswitch) : Claude Code compare le matcher contre le nom canonique du modèle vers lequel la session a basculé.
3454 3533
3455Cet exemple ajoute des conseils chaque fois que le modèle de la session change vers n'importe quel modèle Opus :3534Cet exemple ajoute des conseils chaque fois que le modèle de la session change vers n'importe quel modèle Opus :
3456 3535
3478 Entrée PostModelSwitch3557 Entrée PostModelSwitch
3479</h4>3558</h4>
3480 3559
3481Les hooks PostModelSwitch reçoivent les mêmes champs que [PreModelSwitch](#premodelswitch-input), avec `hook_event_name` défini à `"PostModelSwitch"` et deux valeurs `source` supplémentaires : `"auto"` pour un repli automatique ou un autre changement que Claude Code a fait seul, et `"resume"` pour le modèle restauré lorsque vous reprenez une session.3560Les hooks PostModelSwitch reçoivent les mêmes champs que [PreModelSwitch](#premodelswitch-input), avec `hook_event_name` défini à `"PostModelSwitch"` et deux valeurs `source` supplémentaires : `"auto"` pour un fallback automatique ou un autre changement que Claude Code a fait seul, et `"resume"` pour le modèle restauré quand vous reprenez une session.
3482 3561
3483`requested_model` est `null` lorsque `source` est `"auto"`. Lorsque `source` est `"resume"`, c'est le paramètre de modèle sauvegardé que Claude Code a restauré.3562`requested_model` est `null` quand `source` est `"auto"`. Quand `source` est `"resume"`, c'est le paramètre de modèle sauvegardé que Claude Code a restauré.
3484 3563
3485<h4 id="postmodelswitch-decision-control">3564<h4 id="postmodelswitch-decision-control">
3486 Contrôle de décision PostModelSwitch3565 Contrôle de décision PostModelSwitch
3487</h4>3566</h4>
3488 3567
3489Claude Code prend votre stdout en texte brut du hook [](#exit-code-0) sur exit 0, ou `additionalContext` de la sortie JSON, et le livre à Claude avec la demande suivante après le changement. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez retourner :3568Claude Code prend votre sortie standard brute du hook sur la sortie 0, ou `additionalContext` de la sortie JSON, et la livre à Claude avec la demande suivante après le changement. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez retourner :
3490 3569
3491| Champ | Description |3570| Champ | Description |
3492| :------------------ | :---------------------------------------------------------------------------------------------------------------------------------- |3571| :------------------ | :----------------------------------------------------------------------------------------------------------------------------- |
3493| `additionalContext` | Chaîne ajoutée au contexte de Claude avec la demande suivante. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |3572| `additionalContext` | Chaîne ajoutée au contexte de Claude avec la demande suivante. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |
3494 3573
3495Si le hook n'a pas terminé dans les cinq secondes après que vous ayez envoyé la demande suivante, Claude Code envoie cette demande sans la sortie et l'attache à la demande suivante à la place. Si le modèle change plusieurs fois avant la demande suivante, Claude Code livre uniquement la sortie pour le changement vers le modèle cible final.3574Si le hook n'a pas terminé dans les cinq secondes après que vous envoyiez la demande suivante, Claude Code envoie cette demande sans la sortie et l'attache à la demande suivante à la place. Si le modèle change plusieurs fois avant la demande suivante, Claude Code livre uniquement la sortie pour le changement vers le modèle cible du dernier.
3496 3575
3497<h3 id="sessionend">3576<h3 id="sessionend">
3498 SessionEnd3577 SessionEnd
3499</h3>3578</h3>
3500 3579
3501S'exécute lorsqu'une session Claude Code se termine. Utile pour les tâches de nettoyage, la journalisation des statistiques de session ou l'enregistrement de l'état de session. Supporte les matchers pour filtrer par raison de sortie.3580S'exécute quand une session Claude Code se termine. Utile pour les tâches de nettoyage, l'enregistrement des statistiques de session, ou la sauvegarde de l'état de la session. Supporte les matchers pour filtrer par raison de sortie.
3502 3581
3503Le champ `reason` dans l'entrée du hook indique pourquoi la session s'est terminée :3582Le champ `reason` dans l'entrée du hook indique pourquoi la session s'est terminée :
3504 3583
3507| `clear` | Session effacée avec la commande `/clear` |3586| `clear` | Session effacée avec la commande `/clear` |
3508| `resume` | Session basculée via `/resume` interactif |3587| `resume` | Session basculée via `/resume` interactif |
3509| `logout` | L'utilisateur s'est déconnecté |3588| `logout` | L'utilisateur s'est déconnecté |
3510| `prompt_input_exit` | L'utilisateur a quitté pendant que l'entrée du prompt était visible |3589| `prompt_input_exit` | L'utilisateur a quitté pendant que l'entrée d'invite était visible |
3511| `other` | Autres raisons de sortie |3590| `other` | Autres raisons de sortie |
3512| `bypass_permissions_disabled` | Supprimé dans v2.1.234 ; Claude Code ne l'envoie pas. Supprimez-le de vos matchers `SessionEnd` |3591| `bypass_permissions_disabled` | Supprimé dans v2.1.234 ; Claude Code ne l'envoie pas. Supprimez-le de vos matchers `SessionEnd` |
3513 3592
3515 Entrée SessionEnd3594 Entrée SessionEnd
3516</h4>3595</h4>
3517 3596
3518En plus des [champs d'entrée communs](#common-input-fields), les hooks SessionEnd reçoivent un champ `reason` indiquant pourquoi la session s'est terminée. Consultez le [tableau des raisons](#sessionend) ci-dessus pour toutes les valeurs.3597En plus des [champs d'entrée communs](#common-input-fields), les hooks SessionEnd reçoivent un champ `reason` indiquant pourquoi la session s'est terminée. Voir le [tableau de raison](#sessionend) ci-dessus pour toutes les valeurs.
3519 3598
3520```json theme={null}3599```json theme={null}
3521{3600{
3527}3606}
3528```3607```
3529 3608
3530Les hooks SessionEnd n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer la terminaison de session mais peuvent effectuer des tâches de nettoyage. Claude Code rejette leurs [champs de sortie JSON](#json-output), tels que `systemMessage`.3609Les hooks SessionEnd n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer la terminaison de la session mais peuvent effectuer les tâches de nettoyage. Claude Code rejette leurs [champs de sortie JSON](#json-output), comme `systemMessage`.
3610
3611Les hooks SessionEnd ont un délai d'expiration par défaut de 1,5 secondes. Il s'applique quand vous quittez, exécutez `/clear`, ou basculez les sessions avec `/resume` interactif. Vous pouvez donner à un hook plus de temps de deux façons :
3612
3613* **`timeout` par hook** : définissez `timeout` dans la configuration de ce hook. Le budget global augmente automatiquement pour correspondre au `timeout` par hook le plus élevé dans vos fichiers de paramètres, jusqu'à 60 secondes. Si vous augmentez le budget de cette façon, un hook sans son propre `timeout` garde toujours le défaut. Les délais d'expiration définis sur les hooks fournis par les plugins ne lèvent pas le budget.
3614* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`** : définissez cette variable d'environnement en millisecondes pour remplacer le budget explicitement. La valeur que vous définissez devient également le délai d'expiration pour chaque hook sans son propre `timeout`.
3531 3615
3532Les hooks SessionEnd ont un délai d'expiration par défaut de 1,5 secondes. Cela s'applique à la sortie de session, à `/clear` et au basculement de sessions via `/resume` interactif. Si un hook a besoin de plus de temps, définissez un `timeout` par hook dans la configuration du hook. Le budget global est automatiquement augmenté au délai d'expiration par hook le plus élevé configuré dans les fichiers de paramètres, jusqu'à 60 secondes. Les délais d'expiration définis sur les hooks fournis par les plugins ne relèvent pas le budget. Pour remplacer le budget explicitement, définissez la variable d'environnement `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` en millisecondes.3616Cet exemple définit le budget à 5 secondes :
3533 3617
3534```bash theme={null}3618```bash theme={null}
3535CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude3619CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
3536```3620```
3537 3621
3622Avant v2.1.268, `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` levait uniquement le budget global, et un hook sans son propre `timeout` était toujours annulé après 1,5 secondes.
3623
3538<h3 id="elicitation">3624<h3 id="elicitation">
3539 Elicitation3625 Elicitation
3540</h3>3626</h3>
3541 3627
3542S'exécute lorsqu'un serveur MCP demande une entrée utilisateur en milieu de tâche. Par défaut, Claude Code affiche un dialogue interactif pour que l'utilisateur réponde. Les hooks peuvent intercepter cette demande et répondre par programmation, en ignorant complètement le dialogue.3628S'exécute quand un serveur MCP demande l'entrée de l'utilisateur en cours de tâche. Par défaut, Claude Code montre un dialogue interactif pour que l'utilisateur réponde. Les hooks peuvent intercepter cette demande et répondre par programmation, ignorant entièrement le dialogue.
3543 3629
3544Le champ matcher correspond au nom du serveur MCP.3630Le champ matcher correspond au nom du serveur MCP.
3545 3631
3547 Entrée Elicitation3633 Entrée Elicitation
3548</h4>3634</h4>
3549 3635
3550En plus des [champs d'entrée communs](#common-input-fields), les hooks Elicitation reçoivent `mcp_server_name`, `message` et les champs optionnels `mode`, `url`, `elicitation_id` et `requested_schema`.3636En plus des [champs d'entrée communs](#common-input-fields), les hooks Elicitation reçoivent `mcp_server_name`, `message`, et les champs optionnels `mode`, `url`, `elicitation_id`, et `requested_schema`.
3551 3637
3552Pour l'élicitation en mode formulaire (le cas le plus courant) :3638Pour l'élicitation en mode formulaire, le cas le plus courant :
3553 3639
3554```json theme={null}3640```json theme={null}
3555{3641{
3556 "session_id": "abc123",3642 "session_id": "abc123",
3557 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",3643 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
3558 "cwd": "/Users/...",3644 "cwd": "/Users/...",
3559 "permission_mode": "default",
3560 "hook_event_name": "Elicitation",3645 "hook_event_name": "Elicitation",
3561 "mcp_server_name": "my-mcp-server",3646 "mcp_server_name": "my-mcp-server",
3562 "message": "Please provide your credentials",3647 "message": "Please provide your credentials",
3570}3655}
3571```3656```
3572 3657
3573Pour l'élicitation en mode URL (authentification basée sur navigateur) :3658Pour l'élicitation en mode URL, utilisée pour l'authentification basée sur navigateur :
3574 3659
3575```json theme={null}3660```json theme={null}
3576{3661{
3577 "session_id": "abc123",3662 "session_id": "abc123",
3578 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",3663 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
3579 "cwd": "/Users/...",3664 "cwd": "/Users/...",
3580 "permission_mode": "default",
3581 "hook_event_name": "Elicitation",3665 "hook_event_name": "Elicitation",
3582 "mcp_server_name": "my-mcp-server",3666 "mcp_server_name": "my-mcp-server",
3583 "message": "Please authenticate",3667 "message": "Please authenticate",
3590 Sortie Elicitation3674 Sortie Elicitation
3591</h4>3675</h4>
3592 3676
3593Pour répondre par programmation sans afficher le dialogue, retournez un objet JSON avec `hookSpecificOutput` :3677Pour répondre par programmation sans montrer le dialogue, retournez un objet JSON avec `hookSpecificOutput` :
3594 3678
3595```json theme={null}3679```json theme={null}
3596{3680{
3605```3689```
3606 3690
3607| Champ | Valeurs | Description |3691| Champ | Valeurs | Description |
3608| :-------- | :---------------------------- | :--------------------------------------------------------------------------------------------- |3692| :-------- | :---------------------------- | :----------------------------------------------------------------------------------------- |
3609| `action` | `accept`, `decline`, `cancel` | Si accepter, refuser ou annuler la demande |3693| `action` | `accept`, `decline`, `cancel` | Si accepter, refuser, ou annuler la demande |
3610| `content` | object | Valeurs des champs de formulaire à soumettre. Utilisé uniquement lorsque `action` est `accept` |3694| `content` | object | Valeurs de champ de formulaire à soumettre. Utilisé uniquement quand `action` est `accept` |
3611 3695
3612Le code de sortie 2 refuse l'élicitation. Claude Code n'affiche votre message stderr nulle part.3696Le code de sortie 2 refuse l'élicitation. Claude Code ne montre votre message stderr nulle part.
3613 3697
3614Claude Code agit sur `hookSpecificOutput` de la sortie JSON d'un hook Elicitation et rejette `systemMessage` et `continue`.3698Claude Code agit sur `hookSpecificOutput` de la sortie JSON d'un hook Elicitation et rejette `systemMessage` et `continue`.
3615 3699
3617 ElicitationResult3701 ElicitationResult
3618</h3>3702</h3>
3619 3703
3620S'exécute après qu'un utilisateur répond à une élicitation MCP. Les hooks peuvent observer, modifier ou bloquer la réponse avant qu'elle ne soit renvoyée au serveur MCP.3704S'exécute après qu'un utilisateur réponde à une élicitation MCP. Les hooks peuvent observer, modifier, ou bloquer la réponse avant qu'elle ne soit renvoyée au serveur MCP.
3621 3705
3622Le champ matcher correspond au nom du serveur MCP.3706Le champ matcher correspond au nom du serveur MCP.
3623 3707
3625 Entrée ElicitationResult3709 Entrée ElicitationResult
3626</h4>3710</h4>
3627 3711
3628En plus des [champs d'entrée communs](#common-input-fields), les hooks ElicitationResult reçoivent `mcp_server_name`, `action` et les champs optionnels `mode`, `elicitation_id` et `content`.3712En plus des [champs d'entrée communs](#common-input-fields), les hooks ElicitationResult reçoivent `mcp_server_name`, `action`, et les champs optionnels `mode`, `elicitation_id`, et `content`.
3629 3713
3630```json theme={null}3714```json theme={null}
3631{3715{
3632 "session_id": "abc123",3716 "session_id": "abc123",
3633 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",3717 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
3634 "cwd": "/Users/...",3718 "cwd": "/Users/...",
3635 "permission_mode": "default",
3636 "hook_event_name": "ElicitationResult",3719 "hook_event_name": "ElicitationResult",
3637 "mcp_server_name": "my-mcp-server",3720 "mcp_server_name": "my-mcp-server",
3638 "action": "accept",3721 "action": "accept",
3659```3742```
3660 3743
3661| Champ | Valeurs | Description |3744| Champ | Valeurs | Description |
3662| :-------- | :---------------------------- | :--------------------------------------------------------------------------------------------------- |3745| :-------- | :---------------------------- | :----------------------------------------------------------------------------------------------- |
3663| `action` | `accept`, `decline`, `cancel` | Remplace l'action de l'utilisateur |3746| `action` | `accept`, `decline`, `cancel` | Remplace l'action de l'utilisateur |
3664| `content` | object | Remplace les valeurs des champs de formulaire. Significatif uniquement lorsque `action` est `accept` |3747| `content` | object | Remplace les valeurs de champ de formulaire. Significatif uniquement quand `action` est `accept` |
3665 3748
3666Le code de sortie 2 bloque la réponse, changeant l'action effective en `decline`. Claude Code n'affiche votre message stderr nulle part.3749Le code de sortie 2 bloque la réponse, changeant l'action effective à `decline`. Claude Code ne montre votre message stderr nulle part.
3667 3750
3668Claude Code agit sur `hookSpecificOutput` de la sortie JSON d'un hook ElicitationResult et rejette `systemMessage` et `continue`.3751Claude Code agit sur `hookSpecificOutput` de la sortie JSON d'un hook ElicitationResult et rejette `systemMessage` et `continue`.
3669 3752
3710* `WorktreeCreate`3793* `WorktreeCreate`
3711* `WorktreeRemove`3794* `WorktreeRemove`
3712 3795
3713`SessionStart` et `Setup` supportent les hooks `command` et `mcp_tool`. Ils ne supportent pas les hooks `http`, `prompt` ou `agent`.3796`SessionStart` et `Setup` supportent les hooks `command` et `mcp_tool`, et [les champs des hooks MCP tool](#mcp-tool-hook-fields) décrivent quand leurs hooks `mcp_tool` s'exécutent. Ils ne supportent pas les hooks `http`, `prompt` ou `agent`.
3714 3797
3715<h3 id="how-prompt-based-hooks-work">3798<h3 id="how-prompt-based-hooks-work">
3716 Comment fonctionnent les hooks basés sur des prompts3799 Comment fonctionnent les hooks basés sur des prompts
3840 Configuration des hooks d'agent3923 Configuration des hooks d'agent
3841</h3>3924</h3>
3842 3925
3843Définissez `type` à `"agent"` et fournissez une chaîne `prompt`. Les champs de configuration sont les mêmes que les [hooks de prompt](#prompt-hook-configuration), sauf que les hooks d'agent ont un délai d'expiration par défaut plus long et aucun champ `continueOnBlock` :3926Définissez `type` à `"agent"` et fournissez une chaîne `prompt`, en utilisant `$ARGUMENTS` comme placeholder pour l'entrée JSON du hook. Les champs de configuration sont les mêmes que les [hooks de prompt](#prompt-hook-configuration), sauf que les hooks d'agent ont un délai d'expiration par défaut plus long de 60 secondes et aucun champ `continueOnBlock`.
3844
3845| Champ | Requis | Description |
3846| :-------- | :----- | :------------------------------------------------------------------------------------------------- |
3847| `type` | oui | Doit être `"agent"` |
3848| `prompt` | oui | Prompt décrivant ce à vérifier. Utilisez `$ARGUMENTS` comme placeholder pour l'entrée JSON du hook |
3849| `model` | non | Modèle à utiliser. Par défaut un modèle rapide |
3850| `timeout` | non | Délai d'expiration en secondes. Par défaut : 60 |
3851 3927
3852Le schéma de réponse est `{ "ok": true }` pour autoriser ou `{ "ok": false, "reason": "..." }` pour bloquer. Sur `ok: false`, Claude Code traite un hook d'agent de la même manière qu'il traite un [hook de prompt avec `continueOnBlock: true`](#response-schema) sur le même événement ; les hooks d'agent n'ont pas de champ `continueOnBlock` et ne supportent pas le champ `impossible` du hook de prompt.3928Le schéma de réponse est `{ "ok": true }` pour autoriser ou `{ "ok": false, "reason": "..." }` pour bloquer. Sur `ok: false`, Claude Code traite un hook d'agent de la même manière qu'il traite un [hook de prompt avec `continueOnBlock: true`](#response-schema) sur le même événement ; les hooks d'agent n'ont pas de champ `continueOnBlock` et ne supportent pas le champ `impossible` du hook de prompt.
3853 3929
4065 Déboguer les hooks4141 Déboguer les hooks
4066</h2>4142</h2>
4067 4143
4068Les détails d'exécution des hooks, y compris les hooks qui ont correspondu, leurs codes de sortie et la sortie complète stdout et stderr, sont écrits dans le fichier journal de débogage. Démarrez Claude Code avec `claude --debug-file <path>` pour écrire le journal à un emplacement connu, ou exécutez `claude --debug` et lisez le journal à `~/.claude/debug/<session-id>.txt`. Le drapeau `--debug` n'imprime pas sur le terminal.4144Les détails d'exécution des hooks sont écrits dans le fichier journal de débogage. Démarrez Claude Code avec `claude --debug-file <path>` pour écrire le journal à un emplacement connu, ou exécutez `claude --debug` et lisez le journal à `~/.claude/debug/<session-id>.txt`. Le drapeau `--debug` n'imprime pas sur le terminal.
4069 4145
4070Par exemple, un hook `PostToolUse` sur `Write` dont la commande affiche `hook-ran` produit des entrées comme :4146Par exemple, un hook `PostToolUse` sur `Write` dont la commande affiche `hook-ran` produit des entrées comme :
4071 4147
4072```text theme={null}4148```text theme={null}
40732026-07-19T02:03:24.382Z [DEBUG] Hook output does not start with {, treating as plain text41492026-07-19T02:03:24.382Z [DEBUG] Hook output does not start with {, treating as plain text
40742026-07-19T02:03:24.382Z [DEBUG] Hook PostToolUse:Write (PostToolUse) success:41502026-07-19T02:03:24.382Z [DEBUG] "Hook PostToolUse:Write (PostToolUse) success:\nhook-ran"
4075hook-ran
4076```4151```
4077 4152
4078Pour plus de détails granulaires sur la correspondance des hooks, définissez `CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose` pour voir des lignes de journal supplémentaires telles que les comptes de matcher de hook et la correspondance de requête.4153Pour plus de détails granulaires sur la correspondance des hooks, définissez `CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose` pour voir des lignes de journal supplémentaires telles que les comptes de matcher de hook et la correspondance de requête.