777| `cwd` | Répertoire de travail courant lorsque le hook est invoqué |777| `cwd` | Répertoire de travail courant lorsque le hook est invoqué |
778| `scratchpad_dir` | Chemin vers le [répertoire scratchpad](/docs/fr/claude-directory#session-scratchpad-directory) 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 |778| `scratchpad_dir` | Chemin vers le [répertoire scratchpad](/docs/fr/claude-directory#session-scratchpad-directory) 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 |
779| `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) |779| `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) |
780| `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. 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`. |780| `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. L'objet correspond au champ `effort` de la [barre 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`. |
781| `hook_event_name` | Nom de l'événement qui s'est déclenché |781| `hook_event_name` | Nom de l'événement qui s'est déclenché |
782 782
783Lors de l'exécution avec `--agent` ou à l'intérieur d'un subagent, deux champs supplémentaires sont inclus :783Lors de l'exécution avec `--agent` ou à l'intérieur d'un sous-agent, deux champs supplémentaires sont inclus :
784 784
785| Champ | Description |785| Champ | Description |
786| :- | :- |786| :- | :- |
787| `agent_id` | Identifiant unique pour le subagent. Présent uniquement lorsque le hook se déclenche à l'intérieur d'un appel de subagent. Utilisez ceci pour distinguer les appels de hook de subagent des appels du thread principal. |787| `agent_id` | Identifiant unique pour le sous-agent. Présent uniquement lorsque le hook se déclenche à l'intérieur d'un appel de sous-agent. Utilisez ceci pour distinguer les appels de hook de sous-agent des appels du thread principal. |
788| `agent_type` | Nom de l'agent (par exemple, `"Explore"` ou `"security-reviewer"`). Présent lorsque la session utilise `--agent` ou que le hook se déclenche à l'intérieur d'un subagent. Pour les subagents, le type du subagent prend précédence sur la valeur `--agent` de la session. Consultez [SubagentStart](#subagentstart) pour les valeurs que les subagents personnalisés et fournis par un plugin rapportent et comment écrire un matcher contre un nom scoped du plugin. |788| `agent_type` | Nom de l'agent (par exemple, `"Explore"` ou `"security-reviewer"`). Présent lorsque la session utilise `--agent` ou que le hook se déclenche à l'intérieur d'un sous-agent. Pour les sous-agents, le type du sous-agent a priorité sur la valeur `--agent` de la session. Consultez [SubagentStart](#subagentstart) pour les valeurs que les sous-agents personnalisés et fournis par un plugin rapportent et comment écrire un matcher contre un nom limité au plugin. |
789 789
790Seuls les hooks [`SessionStart`](#sessionstart) peuvent recevoir un champ `model`, et Claude Code ne l'inclut pas toujours. Les hooks [`PreModelSwitch`](#premodelswitch) et [`PostModelSwitch`](#postmodelswitch) reçoivent `from_model` et `to_model` à la place, utilisez donc un hook PostModelSwitch pour suivre le modèle au fur et à mesure qu'il change pendant une session.790Seuls les hooks [`SessionStart`](#sessionstart) peuvent recevoir un champ `model`, et Claude Code ne l'inclut pas toujours. Les hooks [`PreModelSwitch`](#premodelswitch) et [`PostModelSwitch`](#postmodelswitch) reçoivent `from_model` et `to_model` à la place, utilisez donc un hook PostModelSwitch pour suivre le modèle au fur et à mesure qu'il change pendant une session.
791 791
843 843
844Pour les événements qui utilisent le modèle de décision standard, lorsque Claude Code essaie d'analyser votre stdout comme JSON et ne peut pas, il rapporte une erreur non-bloquante sur chaque code de sortie autre que 2. La transcription affiche un avis `<hook name> hook error` avec le message d'analyse. Sur les événements qui ajoutent stdout en texte brut comme contexte, Claude Code n'ajoute pas le texte. Avant v2.1.248, Claude Code traitait ce stdout comme du texte brut.844Pour les événements qui utilisent le modèle de décision standard, lorsque Claude Code essaie d'analyser votre stdout comme JSON et ne peut pas, il rapporte une erreur non-bloquante sur chaque code de sortie autre que 2. La transcription affiche un avis `<hook name> hook error` avec le message d'analyse. Sur les événements qui ajoutent stdout en texte brut comme contexte, Claude Code n'ajoute pas le texte. Avant v2.1.248, Claude Code traitait ce stdout comme du texte brut.
845 845
846Stderr d'un hook qui quitte 0 va uniquement au journal de débogage, jamais à la transcription, et Claude ne le voit jamais. Pour le lire vous-même, activez [la journalisation de débogage](#debug-hooks). Pour afficher un avertissement à Claude à partir d'un hook `PostToolUse` ou `PostToolUseFailure`, quittez 2 à la place afin que [Claude voie stderr](#exit-code-2-behavior-per-event) même si l'outil a déjà s'exécuté.846Stderr d'un hook qui quitte 0 va uniquement au journal de débogage, jamais à la transcription, et Claude ne le voit jamais. Pour le lire vous-même, activez [la journalisation de débogage](#debug-hooks). Pour afficher un avertissement à Claude à partir d'un hook `PostToolUse` ou `PostToolUseFailure`, quittez 2 à la place afin que [Claude voie stderr](#exit-code-2-behavior-per-event) même si l'outil s'est déjà exécuté.
847 847
848<h4 id="exit-code-2">848<h4 id="exit-code-2">
849 Exit code 2849 Exit code 2
850</h4>850</h4>
851 851
852Exit 2 signifie une erreur bloquante. Sur [les événements qui peuvent bloquer](#exit-code-2-behavior-per-event), exit 2 bloque que vous imprimiez JSON ou non : même une `permissionDecision` JSON de `"allow"` ne peut pas la remplacer. Claude Code lit toujours tout [sortie JSON](#json-output) valide sur stdout. Sur `Elicitation` et `ElicitationResult`, le `hookSpecificOutput` d'un hook exit-2 est ignoré.852Exit 2 signifie une erreur bloquante. Sur [les événements qui peuvent bloquer](#exit-code-2-behavior-per-event), exit 2 bloque que vous imprimiez JSON ou non : même une `permissionDecision` JSON de `"allow"` ne peut pas la remplacer. Claude Code lit toujours toute [sortie JSON](#json-output) valide sur stdout. Sur `Elicitation` et `ElicitationResult`, le `hookSpecificOutput` d'un hook exit-2 est ignoré.
853 853
854Le message de blocage est la raison de la décision de blocage de votre JSON lorsqu'elle en fait une, et votre texte stderr sinon. Ce que le blocage fait varie selon l'événement : `PreToolUse` bloque l'appel d'outil, `UserPromptSubmit` rejette le prompt, et ainsi de suite. [Comportement du code de sortie 2 par événement](#exit-code-2-behavior-per-event) énumère l'effet pour chaque événement, et chaque section d'événement dit où le message va.854Le message de blocage est la raison de la décision de blocage de votre JSON lorsqu'elle en fait une, et votre texte stderr sinon. Ce que le blocage fait varie selon l'événement : `PreToolUse` bloque l'appel d'outil, `UserPromptSubmit` rejette le prompt, et ainsi de suite. [Comportement du code de sortie 2 par événement](#exit-code-2-behavior-per-event) énumère l'effet pour chaque événement, et chaque section d'événement dit où le message va.
855 855
856Un hook qui quitte 2 tout en imprimant JSON qui échoue la validation du schéma [sortie JSON](#json-output) bloque toujours : Claude Code utilise stderr comme raison de blocage et enregistre l'échec de validation dans le journal de débogage. Avant v2.1.214, Claude Code traitait cette combinaison comme une erreur non-bloquante et l'action procédait.856Un hook qui quitte 2 tout en imprimant JSON qui échoue la validation du schéma [sortie JSON](#json-output) bloque toujours : Claude Code utilise stderr comme raison de blocage et consigne l'échec de validation dans le journal de débogage. Avant v2.1.214, Claude Code traitait cette combinaison comme une erreur non-bloquante et l'action procédait.
857 857
858Ce script bloque les commandes `rm` en quittant 2 et laisse chaque autre commande au flux de permission normal :858Ce script bloque les commandes `rm` en quittant 2 et laisse chaque autre commande au flux de permission normal :
859 859
884* Avec stdout que Claude Code [essaie d'analyser comme JSON](#exit-code-0) et ne peut pas, Claude Code rapporte la même erreur non-bloquante que sur exit 0 pour les événements qui utilisent le modèle de décision standard. L'action procède, et l'avis porte le message d'analyse.884* Avec stdout que Claude Code [essaie d'analyser comme JSON](#exit-code-0) et ne peut pas, Claude Code rapporte la même erreur non-bloquante que sur exit 0 pour les événements qui utilisent le modèle de décision standard. L'action procède, et l'avis porte le message d'analyse.
885* Avec stdout que Claude Code [traite comme du texte brut](#exit-code-0), ou avec stdout vide, c'est une erreur non-bloquante pour la plupart des événements de hook : l'action procède, et la transcription affiche un avis `<hook name> hook error` suivi de la première ligne de stderr, préfixée par `Failed with non-blocking status code:`. Pour capturer le stderr complet, activez [la journalisation de débogage](#debug-hooks).885* Avec stdout que Claude Code [traite comme du texte brut](#exit-code-0), ou avec stdout vide, c'est une erreur non-bloquante pour la plupart des événements de hook : l'action procède, et la transcription affiche un avis `<hook name> hook error` suivi de la première ligne de stderr, préfixée par `Failed with non-blocking status code:`. Pour capturer le stderr complet, activez [la journalisation de débogage](#debug-hooks).
886 886
887Les événements en dehors du modèle de décision standard gardent leurs propres lignes dans le [tableau par événement](#exit-code-2-behavior-per-event) : `WorktreeCreate` échoue la création sur tout code de sortie non-zéro peu importe ce que votre JSON dit, et les événements qui rejettent complètement la sortie du hook, comme `StopFailure`, ignorent votre JSON sur chaque code de sortie, à part les champs d'effet secondaire comme `terminalSequence`, qui se déclenchent toujours.887Les événements en dehors du modèle de décision standard gardent leurs propres lignes dans le [tableau par événement](#exit-code-2-behavior-per-event) : `WorktreeCreate` fait échouer la création sur tout code de sortie non-zéro peu importe ce que votre JSON dit, et les événements qui rejettent complètement la sortie du hook, comme `StopFailure`, ignorent votre JSON sur chaque code de sortie, à part les champs d'effet secondaire comme `terminalSequence`, qui se déclenchent toujours.
888 888
889Un 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.889Un hook qui ne peut pas démarrer atterrit dans la même catégorie non-bloquante. 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, surveillez cet avis à sa première exécution : un chemin mal orthographié dans `settings.json` laisse le contrôle silencieusement désactivé.
890 890
891<Warning>891<Warning>
892 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.892 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` fait échouer la suppression du worktree si le répertoire existe toujours après.
893</Warning>893</Warning>
894 894
895<h4 id="timeouts">895<h4 id="timeouts">
900 900
901Sur [`PreModelSwitch`](#premodelswitch), un hook annulé à son délai d'expiration bloque le changement de modèle. Sur `PreToolUse`, les deux familles de hooks diffèrent :901Sur [`PreModelSwitch`](#premodelswitch), un hook annulé à son délai d'expiration bloque le changement de modèle. Sur `PreToolUse`, les deux familles de hooks diffèrent :
902 902
903* Un hook `command`, `http` ou `mcp_tool` expiré ne bloque pas l'appel d'outil. L'appel continue via le [flux de permission](/docs/fr/permissions) normal, donc ne comptez pas sur un hook bloqué pour agir comme une porte.903* Un hook `command`, `http` ou `mcp_tool` expiré ne bloque pas l'appel d'outil. L'appel continue via le [flux de permission](/docs/fr/permissions) normal, donc ne comptez pas sur un hook bloqué pour agir comme un contrôle.
904* Un hook de rappel [Agent SDK](/docs/fr/agent-sdk/hooks) qui dépasse son délai d'expiration [bloque l'appel d'outil](#pretooluse).904* Un hook de rappel [Agent SDK](/docs/fr/agent-sdk/hooks) qui dépasse son délai d'expiration [bloque l'appel d'outil](#pretooluse).
905 905
906<h4 id="exit-code-2-behavior-per-event">906<h4 id="exit-code-2-behavior-per-event">
916| `UserPromptSubmit` | Oui | Bloque le prompt, il ne parvient jamais à Claude. Consultez [Ce qu'un prompt bloqué laisse derrière](#what-a-blocked-prompt-leaves-behind) |916| `UserPromptSubmit` | Oui | Bloque le prompt, il ne parvient jamais à Claude. Consultez [Ce qu'un prompt bloqué laisse derrière](#what-a-blocked-prompt-leaves-behind) |
917| `UserPromptExpansion` | Oui | Bloque l'expansion |917| `UserPromptExpansion` | Oui | Bloque l'expansion |
918| `Stop` | Oui | Empêche Claude de s'arrêter, continue la conversation |918| `Stop` | Oui | Empêche Claude de s'arrêter, continue la conversation |
919| `SubagentStop` | Oui | Empêche le subagent de s'arrêter |919| `SubagentStop` | Oui | Empêche le sous-agent de s'arrêter |
920| `TeammateIdle` | Oui | Empêche le coéquipier de devenir inactif, le coéquipier continue de travailler |920| `TeammateIdle` | Oui | Empêche le coéquipier de devenir inactif, le coéquipier continue de travailler |
921| `TaskCreated` | Oui | Annule la création de la tâche |921| `TaskCreated` | Oui | Annule la création de la tâche |
922| `TaskCompleted` | Oui | Empêche la tâche d'être marquée comme complétée |922| `TaskCompleted` | Oui | Empêche la tâche d'être marquée comme complétée |
923| `ConfigChange` | Oui | Bloque la modification de configuration de prendre effet (sauf `policy_settings`) |923| `ConfigChange` | Oui | Bloque la modification de configuration de prendre effet (sauf `policy_settings`) |
924| `StopFailure` | Non | La sortie et le code de sortie sont ignorés, sauf `terminalSequence` |924| `StopFailure` | Non | La sortie et le code de sortie sont ignorés, sauf `terminalSequence` |
925| `PostToolUse` | Non | Affiche stderr à Claude ; l'outil a déjà s'exécuté |925| `PostToolUse` | Non | Affiche stderr à Claude ; l'outil s'est déjà exécuté |
926| `PostToolUseFailure` | Non | Affiche stderr à Claude ; l'outil a déjà échoué |926| `PostToolUseFailure` | Non | Affiche stderr à Claude ; l'outil a déjà échoué |
927| `PostToolBatch` | Oui | Arrête la boucle agentique avant l'appel du modèle suivant |927| `PostToolBatch` | Oui | Arrête la boucle agentique avant l'appel du modèle suivant |
928| `PermissionDenied` | Non | Exit code et stderr sont ignorés car le refus a déjà eu lieu. Utilisez JSON `hookSpecificOutput.retry: true` pour indiquer au modèle qu'il peut réessayer ; Claude Code ignore `retry: true` pour les [refus sans verdict](#permissiondenied-decision-control) |928| `PermissionDenied` | Non | Exit code et stderr sont ignorés car le refus a déjà eu lieu. Utilisez JSON `hookSpecificOutput.retry: true` pour indiquer au modèle qu'il peut réessayer ; Claude Code ignore `retry: true` pour les [refus sans verdict](#permissiondenied-decision-control) |
938| `PostCompact` | Non | Affiche stderr à l'utilisateur uniquement |938| `PostCompact` | Non | Affiche stderr à l'utilisateur uniquement |
939| `PreModelSwitch` | Oui | Bloque le changement de modèle et affiche stderr à l'utilisateur |939| `PreModelSwitch` | Oui | Bloque le changement de modèle et affiche stderr à l'utilisateur |
940| `PostModelSwitch` | Non | Affiche stderr à l'utilisateur uniquement ; le modèle a déjà changé |940| `PostModelSwitch` | Non | Affiche stderr à l'utilisateur uniquement ; le modèle a déjà changé |
941| `Elicitation` | Oui | Refuse l'élicitation |941| `Elicitation` | Oui | Refuse la requête, et aucune boîte de dialogue n'apparaît |
942| `ElicitationResult` | Oui | Bloque la réponse (l'action devient decline) |942| `ElicitationResult` | Oui | Bloque la réponse (l'action devient decline) |
943| `WorktreeCreate` | Oui | Tout code de sortie non-zéro provoque l'échec de la création du worktree |943| `WorktreeCreate` | Oui | Tout code de sortie non-zéro provoque l'échec de la création du worktree |
944| `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 |944| `WorktreeRemove` | Oui | Tout code de sortie non-zéro fait échouer la suppression du worktree si le répertoire existe toujours après. Consultez [WorktreeRemove](#worktreeremove) pour ce qui arrive au répertoire |
945| `InstructionsLoaded` | Non | Exit code est ignoré |945| `InstructionsLoaded` | Non | Exit code est ignoré |
946| `MessageDisplay` | Non | Le texte original est affiché |946| `MessageDisplay` | Non | Le texte original est affiché |
947 947
948Pour `SessionStart`, `SubagentStart` et `PostModelSwitch`, Claude Code rend le stderr du code de sortie 2 dans la transcription comme un avis `<hook name> hook error`, de la même manière qu'il rend une [erreur non-bloquante](#exit-code-output). Claude ne le voit pas, et la session ou le subagent procède. Pour `SubagentStart`, l'avis apparaît dans la propre transcription du subagent, pas dans la conversation parent.948Pour `SessionStart`, `SubagentStart` et `PostModelSwitch`, Claude Code rend le stderr du code de sortie 2 dans la transcription comme un avis `<hook name> hook error`, de la même manière qu'il rend une [erreur non-bloquante](#exit-code-output). Claude ne le voit pas, et la session ou le sous-agent procède. Pour `SubagentStart`, l'avis apparaît dans la propre transcription du sous-agent, pas dans la conversation parent.
949 949
950<h3 id="http-response-handling">950<h3 id="http-response-handling">
951 Gestion des réponses HTTP951 Gestion des réponses HTTP
974 974
975La 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.975La 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.
976 976
977Les chaînes de sortie du hook, y compris `additionalContext`, `systemMessage` et `initialUserMessage`, et son stdout brut, sont plafonnées à 10 000 caractères :977Les chaînes `additionalContext`, `systemMessage` et `initialUserMessage` d'un hook, ainsi que son stdout brut, sont plafonnées à 10 000 caractères :
978 978
979* **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.979* **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.
980* **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.980* **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 plafond n'a pas de paramètre ou de variable d'environnement pour l'augmenter.
981* **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.981* **Lecture du fichier** : Claude Code ne demande pas à Claude de lire le fichier, donc gardez tout ce que Claude doit toujours voir dans le plafond.
982 982
983L'objet JSON supporte trois types de champs :983L'objet JSON supporte trois types de champs :
984 984
988 988
989| Champ | Par défaut | Description |989| Champ | Par défaut | Description |
990| :- | :- | :- |990| :- | :- | :- |
991| `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 |991| `continue` | `true` | Si `false`, Claude arrête complètement le traitement après l'exécution du hook. A priorité sur tous les champs de décision spécifiques à l'événement |
992| `stopReason` | aucun | Message affiché à l'utilisateur lorsque `continue` est `false`. Il reste dans la conversation, afin que Claude le voie si la conversation continue |992| `stopReason` | aucun | Message affiché à l'utilisateur lorsque `continue` est `false`. Il reste dans la conversation, afin que Claude le voie si la conversation continue |
993| `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 |993| `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 consignée dans le journal de débogage |
994| `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) |994| `systemMessage` | aucun | Message d'avertissement affiché à l'utilisateur. Dans la sortie [Agent SDK](/docs/fr/agent-sdk/overview) et [`--output-format stream-json`](/docs/fr/headless), il peut arriver comme un [`SDKInformationalMessage`](/docs/fr/agent-sdk/typescript#sdkinformationalmessage) |
995| `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 |995| `terminalSequence` | aucun | Une séquence d'échappement de terminal que Claude Code émet 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 d'autorisation, le champ est ignoré. Utilisez ceci au lieu d'écrire sur `/dev/tty`, qui n'est pas disponible pour les hooks |
996 996
997Pour arrêter Claude entièrement :997Pour arrêter Claude entièrement :
998 998
1000{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }1000{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }
1001```1001```
1002 1002
1003Pour les hooks `PreToolUse` et `PostToolUse`, l'arrêt s'applique même lorsque l'appel d'outil échoue ou se termine tandis que Claude diffuse toujours une réponse.1003Pour les hooks `PreToolUse` et `PostToolUse`, l'arrêt s'applique même lorsque l'appel d'outil échoue ou se termine tandis que Claude diffuse toujours une réponse en streaming.
1004 1004
1005<h4 id="emit-terminal-notifications">1005<h4 id="emit-terminal-notifications">
1006 Émettre des notifications de terminal1006 Émettre des notifications de terminal
1007</h4>1007</h4>
1008 1008
1009Les hooks s'exécutent sans terminal de contrôle, donc écrire des séquences d'échappement directement sur `/dev/tty` échoue. À la place, retournez la séquence d'échappement dans le champ `terminalSequence` et Claude Code l'émet pour vous via son propre chemin d'écriture de terminal. C'est sans course, fonctionne à l'intérieur de tmux et GNU screen, et fonctionne sur Windows où il n'y a pas de `/dev/tty`.1009Les hooks s'exécutent sans terminal de contrôle, donc écrire des séquences d'échappement directement sur `/dev/tty` échoue. À la place, retournez la séquence d'échappement dans le champ `terminalSequence` et Claude Code l'émet pour vous via son propre chemin d'écriture de terminal. C'est sans situation de concurrence, fonctionne à l'intérieur de tmux et GNU screen, et fonctionne sur Windows où il n'y a pas de `/dev/tty`.
1010 1010
1011Le champ accepte une chaîne d'une ou plusieurs séquences d'échappement en liste blanche :1011Le champ accepte une chaîne d'une ou plusieurs séquences d'échappement figurant dans la liste d'autorisation :
1012 1012
1013* OSC `0`, `1`, `2` : titres de fenêtre et d'icône1013* OSC `0`, `1`, `2` : titres de fenêtre et d'icône
1014* OSC `9` : notifications iTerm2, ConEmu, Windows Terminal et WezTerm, y compris la progression de la barre des tâches `9;4`1014* OSC `9` : notifications iTerm2, ConEmu, Windows Terminal et WezTerm, y compris la progression de la barre des tâches `9;4`
1016* OSC `777` : notifications urxvt, Ghostty et Warp1016* OSC `777` : notifications urxvt, Ghostty et Warp
1017* BEL nu1017* BEL nu
1018 1018
1019Les séquences peuvent être terminées avec BEL ou avec ST. Tout ce qui est en dehors de la liste blanche, y compris les séquences de curseur CSI et les séquences de couleur, les séquences de palette OSC, les hyperliens OSC 8, les écritures de presse-papiers OSC 52 et OSC 1337, est rejeté et le champ est ignoré.1019Les séquences peuvent être terminées avec BEL ou avec ST. Tout ce qui est en dehors de la liste d'autorisation, y compris les séquences de curseur CSI et les séquences de couleur, les séquences de palette OSC, les hyperliens OSC 8, les écritures de presse-papiers OSC 52 et OSC 1337, est rejeté et le champ est ignoré.
1020 1020
1021Claude Code écrit la séquence elle-même lorsqu'il traite la sortie de votre hook, donc le champ fonctionne sur les événements qui rejettent `systemMessage` et `continue`, tels que `Notification` et `StopFailure`. Il a deux limites :1021Claude Code écrit la séquence lui-même lorsqu'il traite la sortie de votre hook, donc le champ fonctionne sur les événements qui rejettent `systemMessage` et `continue`, tels que `Notification` et `StopFailure`. Il a deux limites :
1022 1022
1023* Claude Code écrit la séquence uniquement dans une session interactive, et uniquement tandis que son interface est à l'écran. En mode non-interactif avec le drapeau `-p` et dans l'Agent SDK, il ignore le champ.1023* Claude Code écrit la séquence uniquement dans une session interactive, et uniquement tandis que son interface est à l'écran. En mode non interactif avec le flag `-p` et dans l'Agent SDK, il ignore le champ.
1024* Un hook de commande `WorktreeCreate` ne peut pas retourner JSON, car Claude Code lit son stdout comme le chemin du worktree. Un hook HTTP `WorktreeCreate` retourne JSON et peut inclure le champ.1024* Un hook de commande `WorktreeCreate` ne peut pas retourner JSON, car Claude Code lit son stdout comme le chemin du worktree. Un hook HTTP `WorktreeCreate` retourne JSON et peut inclure le champ.
1025 1025
1026L'exemple ci-dessous déclenche une notification de bureau à partir d'un hook `Notification`. La séquence d'échappement est construite avec des échappements octaux `printf` afin que les octets de contrôle n'apparaissent jamais sur la ligne de commande shell, et `jq -n --arg` construit la sortie JSON afin que les guillemets, les barres obliques inverses et les sauts de ligne dans le message de notification soient correctement échappés :1026L'exemple ci-dessous déclenche une notification de bureau à partir d'un hook `Notification`. La séquence d'échappement est construite avec des échappements octaux `printf` afin que les octets de contrôle n'apparaissent jamais sur la ligne de commande shell, et `jq -n --arg` construit la sortie JSON afin que les guillemets, les barres obliques inverses et les sauts de ligne dans le message de notification soient correctement échappés :
1041 Ajouter du contexte pour Claude1041 Ajouter du contexte pour Claude
1042</h4>1042</h4>
1043 1043
1044Le champ `additionalContext` transmet une chaîne de votre hook dans la fenêtre de contexte de Claude. Claude Code enveloppe la chaîne dans un [rappel système](/docs/fr/glossary#system-reminder) et l'insère dans la conversation au point où le hook s'est déclenché. Claude lit le rappel lors de la prochaine demande du modèle, mais il n'apparaît pas comme un message de chat dans l'interface.1044Le champ `additionalContext` transmet une chaîne de votre hook dans la fenêtre de contexte de Claude. Claude Code enveloppe la chaîne dans un [rappel système](/docs/fr/glossary#system-reminder) et l'insère dans la conversation au point où le hook s'est déclenché. Claude lit le rappel lors de la prochaine requête au modèle, mais il n'apparaît pas comme un message de chat dans l'interface.
1045 1045
1046Retournez `additionalContext` à l'intérieur de `hookSpecificOutput` aux côtés du nom de l'événement :1046Retournez `additionalContext` à l'intérieur de `hookSpecificOutput` aux côtés du nom de l'événement :
1047 1047
1060* [UserPromptSubmit](#userpromptsubmit) et [UserPromptExpansion](#userpromptexpansion) : aux côtés du prompt soumis1060* [UserPromptSubmit](#userpromptsubmit) et [UserPromptExpansion](#userpromptexpansion) : aux côtés du prompt soumis
1061* [PreToolUse](#pretooluse), [PostToolUse](#posttooluse), [PostToolUseFailure](#posttoolusefailure) et [PostToolBatch](#posttoolbatch) : à côté du résultat de l'outil1061* [PreToolUse](#pretooluse), [PostToolUse](#posttooluse), [PostToolUseFailure](#posttoolusefailure) et [PostToolBatch](#posttoolbatch) : à côté du résultat de l'outil
1062* [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)1062* [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)
1063* [PostModelSwitch](#postmodelswitch) : avec la prochaine demande après le changement. Consultez [Contrôle de décision PostModelSwitch](#postmodelswitch-decision-control) pour le timing1063* [PostModelSwitch](#postmodelswitch) : avec la prochaine requête après le changement. Consultez [Contrôle de décision PostModelSwitch](#postmodelswitch-decision-control) pour le timing
1064 1064
1065Lorsque plusieurs hooks retournent `additionalContext` pour le même événement, Claude reçoit toutes les valeurs.1065Lorsque plusieurs hooks retournent `additionalContext` pour le même événement, Claude reçoit toutes les valeurs.
1066 1066
1067Si 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.1067Si 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 lui demande pas.
1068 1068
1069Utilisez `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 :1069Utilisez `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 :
1070 1070
1071* **État de l'environnement** : la branche actuelle, la cible de déploiement ou les drapeaux de fonctionnalité actifs1071* **État de l'environnement** : la branche actuelle, la cible de déploiement ou les feature flags actifs
1072* **Règles de projet conditionnelles** : quelle commande de test s'applique au fichier qui vient d'être modifié, quels répertoires sont en lecture seule dans ce worktree1072* **Règles de projet conditionnelles** : quelle commande de test s'applique au fichier qui vient d'être modifié, quels répertoires sont en lecture seule dans ce worktree
1073* **Données externes** : problèmes ouverts qui vous sont assignés, résultats CI récents, contenu récupéré à partir d'un service interne1073* **Données externes** : problèmes ouverts qui vous sont assignés, résultats CI récents, contenu récupéré à partir d'un service interne
1074 1074
1076 1076
1077Écrivez le texte sous forme de déclarations factuelles plutôt que d'instructions système impératives. Des formulations telles que « La cible de déploiement est production » ou « Ce repo utilise `bun test` » se lisent comme des informations de projet. Le texte encadré comme des commandes système hors bande peut déclencher les défenses contre l'injection de prompt de Claude, ce qui amène Claude à vous présenter le texte au lieu de le traiter comme du contexte.1077Écrivez le texte sous forme de déclarations factuelles plutôt que d'instructions système impératives. Des formulations telles que « La cible de déploiement est production » ou « Ce repo utilise `bun test` » se lisent comme des informations de projet. Le texte encadré comme des commandes système hors bande peut déclencher les défenses contre l'injection de prompt de Claude, ce qui amène Claude à vous présenter le texte au lieu de le traiter comme du contexte.
1078 1078
1079Claude Code enregistre le texte injecté dans la transcription de session. Pour les événements mid-session comme `PostToolUse` ou `UserPromptSubmit`, lorsque vous reprenez avec `--continue` ou `--resume`, Claude Code rejoue le texte enregistré plutôt que de réexécuter le hook pour les tours passés, de sorte que les valeurs comme les horodatages ou les SHA de commit deviennent obsolètes. Les hooks `SessionStart` s'exécutent à nouveau à la reprise avec `source` défini sur `"resume"`, ou `"fork"` si vous avez ajouté `--fork-session`, afin qu'ils puissent actualiser leur contexte.1079Claude Code enregistre le texte injecté dans la transcription de session. Pour les événements en cours de session comme `PostToolUse` ou `UserPromptSubmit`, lorsque vous reprenez avec `--continue` ou `--resume`, Claude Code rejoue le texte enregistré plutôt que de réexécuter le hook pour les tours passés, de sorte que les valeurs comme les horodatages ou les SHA de commit deviennent obsolètes. Les hooks `SessionStart` s'exécutent à nouveau à la reprise avec `source` défini sur `"resume"`, ou `"fork"` si vous avez ajouté `--fork-session`, afin qu'ils puissent actualiser leur contexte.
1080 1080
1081<h4 id="decision-control">1081<h4 id="decision-control">
1082 Contrôle de décision1082 Contrôle de décision
1093| PreModelSwitch | `hookSpecificOutput` ou `decision` au niveau supérieur | `permissionDecision` (allow/deny/ask), `permissionDecisionReason`. `decision: "block"` [annule également le changement](#premodelswitch-decision-control) |1093| PreModelSwitch | `hookSpecificOutput` ou `decision` au niveau supérieur | `permissionDecision` (allow/deny/ask), `permissionDecisionReason`. `decision: "block"` [annule également le changement](#premodelswitch-decision-control) |
1094| PermissionRequest | `hookSpecificOutput` | `decision.behavior` (allow/deny) |1094| PermissionRequest | `hookSpecificOutput` | `decision.behavior` (allow/deny) |
1095| 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) |1095| 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) |
1096| 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 |1096| 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 fait échouer la création |
1097| 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 |1097| WorktreeRemove | Exit code | Tout code de sortie non-zéro fait échouer la suppression si le répertoire existe toujours après. La sortie JSON est rejetée |
1098| Elicitation | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (valeurs des champs de formulaire pour accept) |1098| Elicitation, ElicitationResult | `hookSpecificOutput` ou `decision` au niveau supérieur | `action` (accept/decline/cancel), `content` (valeurs des champs de formulaire). `decision: "block"` [refuse également](#other-ways-to-decline-an-elicitation) |
1099| ElicitationResult | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (valeurs des champs de formulaire override) |
1100| MessageDisplay | `hookSpecificOutput` | `displayContent` remplace le texte affiché à l'écran. Affichage uniquement : la transcription et ce que Claude voit conservent l'original |1099| MessageDisplay | `hookSpecificOutput` | `displayContent` remplace le texte affiché à l'écran. Affichage uniquement : la transcription et ce que Claude voit conservent l'original |
1101| 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 |1100| 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 |
1102| 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 |1101| 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 |
1139 </Tab>1138 </Tab>
1140 1139
1141 <Tab title="PermissionRequest">1140 <Tab title="PermissionRequest">
1142 Utilise `hookSpecificOutput` pour autoriser ou refuser une demande de permission au nom de l'utilisateur. Lors de l'autorisation, vous pouvez également modifier l'entrée de l'outil ou appliquer des règles de permission afin que l'utilisateur ne soit pas invité à nouveau. Consultez [Contrôle de décision PermissionRequest](#permissionrequest-decision-control) pour l'ensemble complet des options.1141 Utilise `hookSpecificOutput` pour autoriser ou refuser une demande de permission au nom de l'utilisateur. Lors de l'autorisation, vous pouvez également modifier l'entrée de l'outil ou appliquer des règles de permission afin que l'utilisateur ne soit pas sollicité à nouveau. Consultez [Contrôle de décision PermissionRequest](#permissionrequest-decision-control) pour l'ensemble complet des options.
1143 1142
1144 ```json theme={null}1143 ```json theme={null}
1145 {1144 {
1157 </Tab>1156 </Tab>
1158</Tabs>1157</Tabs>
1159 1158
1160Pour des exemples étendus incluant la validation de commandes Bash, le filtrage de prompts et les scripts d'approbation automatique, consultez [Ce que vous pouvez automatiser](/docs/fr/hooks-guide#what-you-can-automate) dans le guide et la [implémentation de référence du validateur de commandes Bash](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py).1159Pour des exemples étendus incluant la validation de commandes Bash, le filtrage de prompts et les scripts d'approbation automatique, consultez [Ce que vous pouvez automatiser](/docs/fr/hooks-guide#what-you-can-automate) dans le guide et l'[implémentation de référence du validateur de commandes Bash](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py).
1161 1160
1162<h2 id="hook-events">1161<h2 id="hook-events">
1163 Événements de hook1162 Événements de hook
1164</h2>1163</h2>
1165 1164
1166Chaque événement correspond à un point du cycle de vie de Claude Code où des hooks peuvent s'exécuter. Les sections ci-dessous suivent l'ordre du cycle de vie : de la configuration de la session à la fin de la session, en passant par la boucle agentique. Chaque section décrit quand l'événement se déclenche, quels matchers il prend en charge, l'entrée JSON qu'il reçoit et comment contrôler le comportement via la sortie.1165Chaque événement correspond à un moment du cycle de vie de Claude Code où des hooks peuvent s'exécuter. Les sections ci-dessous suivent l'ordre du cycle de vie : de la configuration de la session à la fin de la session, en passant par la boucle agentique. Chaque section décrit quand l'événement se déclenche, quels matchers il prend en charge, l'entrée JSON qu'il reçoit et comment contrôler le comportement via la sortie.
1167 1166
1168<h3 id="sessionstart">1167<h3 id="sessionstart">
1169 SessionStart1168 SessionStart
1171 1170
1172S'exécute lorsque Claude Code démarre une nouvelle session ou reprend une session existante. Utile pour charger du contexte de développement, comme les issues existantes ou les modifications récentes de votre base de code, ou pour définir des variables d'environnement. Pour un contexte statique qui ne nécessite pas de script, utilisez plutôt [CLAUDE.md](/docs/fr/memory).1171S'exécute lorsque Claude Code démarre une nouvelle session ou reprend une session existante. Utile pour charger du contexte de développement, comme les issues existantes ou les modifications récentes de votre base de code, ou pour définir des variables d'environnement. Pour un contexte statique qui ne nécessite pas de script, utilisez plutôt [CLAUDE.md](/docs/fr/memory).
1173 1172
1174SessionStart s'exécute à chaque session, gardez donc ces hooks rapides. Seuls les hooks `type: "command"` et `type: "mcp_tool"` sont pris en charge. Consultez [Champs des hooks d'outil MCP](#mcp-tool-hook-fields) pour savoir quand les hooks `mcp_tool` s'exécutent.1173SessionStart s'exécute à chaque session, alors veillez à ce que ces hooks restent rapides. Seuls les hooks `type: "command"` et `type: "mcp_tool"` sont pris en charge. Consultez [Champs des hooks d'outil MCP](#mcp-tool-hook-fields) pour savoir quand les hooks `mcp_tool` s'exécutent.
1175 1174
1176La valeur du matcher correspond à la manière dont la session a été initiée :1175La valeur du matcher correspond à la manière dont la session a été lancée :
1177 1176
1178| Matcher | Quand il se déclenche |1177| Matcher | Quand il se déclenche |
1179| :- | :- |1178| :- | :- |
1181| `resume` | `--resume`, `--continue` ou `/resume` |1180| `resume` | `--resume`, `--continue` ou `/resume` |
1182| `clear` | `/clear` |1181| `clear` | `/clear` |
1183| `compact` | Compaction automatique ou manuelle |1182| `compact` | Compaction automatique ou manuelle |
1184| `fork` | Une nouvelle session dérivée d'une session existante : `--fork-session` avec `--resume` ou `--continue`, la copie en arrière-plan de `/fork`, `/branch`, ou une conversation que vous [déplacez en arrière-plan](/docs/fr/agent-view#from-inside-a-session) |1183| `fork` | Une nouvelle session dérivée d'une session existante : `--fork-session` avec `--resume` ou `--continue`, la copie en arrière-plan de `/fork`, `/branch`, ou une conversation que vous [passez en arrière-plan](/docs/fr/agent-view#from-inside-a-session) |
1185 1184
1186Avant la v2.1.214, les sessions dérivées indiquaient la source `"resume"`.1185Avant la v2.1.214, les sessions dérivées signalaient la source `"resume"`.
1187 1186
1188Lorsque 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 saisir du texte immédiatement, et une conversation que vous avez reprise s'affiche sans attendre les hooks. La première réponse de Claude attend toujours la fin des hooks, afin que leur contexte parvienne à Claude.1187Lorsque 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 saisir du texte immédiatement, et une conversation reprise s'affiche sans attendre les hooks. La première réponse de Claude attend tout de même la fin des hooks, afin que leur contexte parvienne à Claude.
1189 1188
1190Lorsque vous changez de conversation avec `/resume` au sein d'une session, le changement attend au contraire la fin des hooks. Si vous exécutez `/clear` ou passez à une autre conversation alors que des hooks en arrière-plan sont encore en cours d'exécution, rien de ce qu'ils renvoient ne s'applique à la session.1189Lorsque vous changez de conversation avec `/resume` au sein d'une session, le changement attend au contraire la fin des hooks. Si vous exécutez `/clear` ou passez à une autre conversation alors que des hooks en arrière-plan sont encore en cours d'exécution, rien de ce qu'ils renvoient ne s'applique à la session.
1191 1190
1192La même attente s'applique au lancement, y compris pour une session reprise : un prompt que vous envoyez pendant que les hooks SessionStart sont encore en cours d'exécution ne parvient à Claude qu'une fois ceux-ci terminés.1191La même attente s'applique au lancement, y compris pour une session reprise : un prompt que vous envoyez alors que des hooks SessionStart sont encore en cours d'exécution ne parvient pas à Claude avant leur fin.
1193 1192
1194Pendant l'une ou l'autre attente, appuyez sur `Esc` pour ramener le prompt dans la zone de saisie sans l'envoyer. Les hooks continuent de s'exécuter.1193Pendant l'une ou l'autre de ces attentes, appuyez sur `Esc` pour ramener le prompt dans la zone de saisie sans l'envoyer. Les hooks continuent de s'exécuter.
1195 1194
1196<h4 id="sessionstart-input">1195<h4 id="sessionstart-input">
1197 Entrée de SessionStart1196 Entrée de SessionStart
1198</h4>1197</h4>
1199 1198
1200En plus des [champs d'entrée communs](#common-input-fields), les hooks SessionStart reçoivent `source` et, facultativement, `model`, `agent_type` et `session_title` :1199En plus des [champs d'entrée communs](#common-input-fields), les hooks SessionStart reçoivent `source` et, de manière facultative, `model`, `agent_type` et `session_title` :
1201 1200
1202| Champ | Description |1201| Champ | Description |
1203| :- | :- |1202| :- | :- |
1204| `source` | Comment la session a démarré : `"startup"` pour les nouvelles sessions, `"resume"` pour les sessions reprises, `"clear"` après `/clear`, `"compact"` après une compaction, ou `"fork"` pour une nouvelle session dérivée d'une session existante |1203| `source` | La manière dont la session a démarré : `"startup"` pour les nouvelles sessions, `"resume"` pour les sessions reprises, `"clear"` après `/clear`, `"compact"` après une compaction, ou `"fork"` pour une nouvelle session dérivée d'une session existante |
1205| `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 ; vérifiez donc la présence du champ avant de le lire |1204| `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 ; vérifiez donc la présence du champ avant de le lire |
1206| `agent_type` | Le nom de l'agent, présent lorsque vous démarrez Claude Code avec `claude --agent <name>` |1205| `agent_type` | Le nom de l'agent, présent lorsque vous démarrez Claude Code avec `claude --agent <name>` |
1207| `session_title` | Le titre personnalisé de la session, présent lorsqu'il est défini, par exemple avec `--name`, `/rename`, la sortie `sessionTitle` d'un hook, ou `renameSession()` de l'Agent SDK. Un hook qui émet `sessionTitle` peut d'abord vérifier ce champ pour éviter d'écraser un titre personnalisé existant |1206| `session_title` | Le titre personnalisé de la session, présent lorsqu'il est défini, par exemple avec `--name`, `/rename`, la sortie `sessionTitle` d'un hook ou `renameSession()` de l'Agent SDK. Un hook qui émet `sessionTitle` peut d'abord vérifier ce champ pour éviter d'écraser un titre personnalisé existant |
1208 1207
1209Une session que vous n'avez pas nommée peut tout de même avoir un [titre généré](/docs/fr/sessions#name-your-sessions). Ce titre n'est pas un titre personnalisé et n'apparaît pas dans `session_title`.1208Une session que vous n'avez pas nommée peut tout de même avoir un [titre généré](/docs/fr/sessions#name-your-sessions). Ce titre n'est pas un titre personnalisé et n'apparaît pas dans `session_title`.
1210 1209
1211Lorsque `source` vaut `"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 indiquer ce que coûte la reprise d'une conversation ancienne avant la première requête, par exemple dans un [`systemMessage`](#json-output). Ces champs nécessitent Claude Code v2.1.251 ou ultérieure.1210Lorsque `source` vaut `"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 indiquer ce que coûte la reprise d'une conversation ancienne avant la première requête, par exemple dans un [`systemMessage`](#json-output). Ces champs nécessitent Claude Code v2.1.251 ou une version ultérieure.
1212 1211
1213| Champ | Description |1212| Champ | Description |
1214| :- | :- |1213| :- | :- |
1215| `seconds_since_last_response` | Secondes réelles écoulées depuis la dernière réponse dans la transcription reprise |1214| `seconds_since_last_response` | Secondes réelles écoulées depuis la dernière réponse de la transcription reprise |
1216| `context_tokens` | Tokens que la première requête de la session reprise renvoie comme prompt |1215| `context_tokens` | Tokens que la première requête de la session reprise renvoie comme prompt |
1217| `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 mise en cache |1216| `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 mise en cache |
1218| `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, hors réponse |1217| `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, hors réponse |
1243| Champ | Description |1242| Champ | Description |
1244| :- | :- |1243| :- | :- |
1245| `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 transmis et ce qu'il faut y mettre |1244| `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 transmis et ce qu'il faut y mettre |
1246| `initialUserMessage` | Chaîne utilisée comme premier message utilisateur de la session. S'applique en [mode non interactif](/docs/fr/headless) avec le flag `-p`, où elle devient le premier tour même si aucun prompt n'est fourni. Si un prompt est fourni, il suit comme tour suivant. Contrairement à `additionalContext`, qui s'attache à un tour existant, ce champ crée le tour |1245| `initialUserMessage` | Chaîne utilisée comme premier message utilisateur de la session. S'applique en [mode non interactif](/docs/fr/headless) avec le flag `-p`, où elle devient le premier tour même si aucun prompt n'est fourni. Si un prompt est fourni, il suit comme tour suivant. Contrairement à `additionalContext`, qui se rattache à un tour existant, ce champ crée le tour |
1247| `sessionTitle` | Définit le titre de la session, avec le même effet que `/rename`. Utilisez-le pour nommer automatiquement les sessions à partir du dossier de lancement, de la branche git ou du nom du worktree. S'applique lorsque `source` vaut `"startup"`, `"resume"` ou `"fork"` ; ignoré pour `"clear"` et `"compact"` |1246| `sessionTitle` | Définit le titre de la session, avec le même effet que `/rename`. À utiliser pour nommer automatiquement les sessions à partir du dossier de lancement, de la branche git ou du nom du worktree. S'applique lorsque `source` vaut `"startup"`, `"resume"` ou `"fork"` ; ignoré pour `"clear"` et `"compact"` |
1248| `watchPaths` | Tableau de chemins absolus à surveiller pour les événements [FileChanged](#filechanged) pendant cette session |1247| `watchPaths` | Tableau de chemins absolus à surveiller pour les événements [FileChanged](#filechanged) pendant cette session |
1249| `reloadSkills` | Booléen. Lorsqu'il vaut `true`, Claude Code analyse à nouveau les répertoires de [skills](/docs/fr/skills) et de commandes une fois les hooks SessionStart terminés, de sorte que les skills installés par le hook sont disponibles dans la même session, dès le premier prompt |1248| `reloadSkills` | Booléen. Lorsqu'il vaut `true`, Claude Code analyse à nouveau les répertoires de [skills](/docs/fr/skills) et de commandes une fois les hooks SessionStart terminés, afin que les skills installés par le hook soient disponibles dans la même session, dès le premier prompt |
1250 1249
1251```json theme={null}1250```json theme={null}
1252{1251{
1258}1257}
1259```1258```
1260 1259
1261Comme la sortie stdout brute parvient déjà à Claude pour cet événement, un hook qui ne fait que charger du contexte peut écrire directement sur stdout sans construire de JSON. Utilisez la forme JSON lorsque vous devez combiner du contexte avec d'autres champs tels que `sessionTitle`.1260Comme la sortie stdout brute parvient déjà à Claude pour cet événement, un hook qui se contente de charger du contexte peut écrire directement sur stdout sans construire de JSON. Utilisez la forme JSON lorsque vous devez combiner le contexte avec d'autres champs comme `sessionTitle`.
1262 1261
1263Utilisez `reloadSkills` lorsqu'un hook SessionStart installe ou met à jour des skills. La découverte des skills s'exécute normalement avant la fin des hooks SessionStart, de sorte que les fichiers que le hook écrit dans `~/.claude/skills/` ou `.claude/skills/` n'apparaîtraient sinon que dans la session suivante. Cet exemple synchronise un dépôt de skills partagé et demande la nouvelle analyse :1262Utilisez `reloadSkills` lorsqu'un hook SessionStart installe ou met à jour des skills. La découverte des skills s'exécute normalement avant la fin des hooks SessionStart ; les fichiers que le hook écrit dans `~/.claude/skills/` ou `.claude/skills/` n'apparaîtraient donc sinon que dans la session suivante. Cet exemple synchronise un dépôt de skills partagé et demande la nouvelle analyse :
1264 1263
1265```bash theme={null}1264```bash theme={null}
1266#!/bin/bash1265#!/bin/bash
1271echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1270echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1272```1271```
1273 1272
1274L'URL du dépôt est un espace réservé ; remplacez-la par votre propre dépôt de skills. Avec l'espace réservé, le clone échoue et affiche un message `fatal:` sur stderr. La sortie stderr d'un hook SessionStart qui se termine avec le code 0 est uniquement informative, donc la demande `reloadSkills` s'applique quand même.1273L'URL du dépôt est un exemple fictif ; remplacez-la par votre propre dépôt de skills. Avec cette URL fictive, le clonage échoue et affiche un message `fatal:` sur stderr. La sortie stderr d'un hook SessionStart qui se termine avec le code 0 est purement informative, donc la demande `reloadSkills` s'applique tout de même.
1275 1274
1276<h4 id="persist-environment-variables">1275<h4 id="persist-environment-variables">
1277 Conserver les variables d'environnement1276 Conserver les variables d'environnement
1293exit 01292exit 0
1294```1293```
1295 1294
1296Pour capturer toutes les modifications d'environnement effectuées par des commandes de configuration, comparez les variables exportées avant et après :1295Pour capturer toutes les modifications de l'environnement effectuées par des commandes de configuration, comparez les variables exportées avant et après :
1297 1296
1298```bash theme={null}1297```bash theme={null}
1299#!/bin/bash1298#!/bin/bash
1320 Setup1319 Setup
1321</h3>1320</h3>
1322 1321
1323Se 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 flag `-p`. Il ne se déclenche pas lors d'un démarrage normal. Utilisez-le pour une installation ponctuelle de dépendances ou un nettoyage planifié que vous déclenchez explicitement depuis la CI ou des scripts, indépendamment du démarrage normal de session. Pour une initialisation par session, utilisez plutôt [SessionStart](#sessionstart).1322Se 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 flag `-p`. Il ne se déclenche pas lors d'un démarrage normal. Utilisez-le pour une installation ponctuelle de dépendances ou un nettoyage planifié que vous déclenchez explicitement depuis la CI ou des scripts, indépendamment du démarrage normal de la session. Pour une initialisation par session, utilisez plutôt [SessionStart](#sessionstart).
1324 1323
1325La valeur du matcher correspond au flag CLI qui a déclenché le hook :1324La valeur du matcher correspond au flag CLI qui a déclenché le hook :
1326 1325
1333 1332
1334Lorsque vous démarrez ou poursuivez une conversation avec `-p`, vous devez également fournir un prompt, en argument ou transmis via stdin. Vous pouvez omettre 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).1333Lorsque vous démarrez ou poursuivez une conversation avec `-p`, vous devez également fournir un prompt, en argument ou transmis via stdin. Vous pouvez omettre 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).
1335 1334
1336En cas de succès, `--init-only` n'affiche rien dans le terminal. Pour confirmer que les hooks se sont exécutés, lancez `claude --debug-file <path> --init-only`, en remplaçant `<path>` par l'emplacement d'un fichier de log, et recherchez dans le log les entrées des hooks Setup et SessionStart.1335En cas de succès, `--init-only` n'affiche rien dans le terminal. Pour vérifier que les hooks se sont exécutés, lancez `claude --debug-file <path> --init-only` en remplaçant `<path>` par l'emplacement d'un fichier de log, puis recherchez dans le log les entrées des hooks Setup et SessionStart.
1337 1336
1338Comme Setup ne se déclenche pas à chaque lancement, un plugin qui a besoin d'une dépendance installée ne peut pas s'appuyer uniquement sur Setup. L'approche pratique consiste à vérifier la présence de la dépendance lors de la première utilisation et à l'installer si elle est absente, par exemple avec un hook ou un skill qui teste la présence de `${CLAUDE_PLUGIN_DATA}/node_modules` et exécute `npm install` en son absence. Consultez le [répertoire de données persistantes](/docs/fr/plugins/components#path-variables-and-persistent-data) 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 cette approche : Claude Code [installe automatiquement les dépendances de packages Node.js éligibles](/docs/fr/plugins/loading#node-js-package-dependencies) lorsqu'il met le plugin en cache.1337Comme Setup ne se déclenche pas à chaque lancement, un plugin qui a besoin d'une dépendance installée ne peut pas s'appuyer uniquement sur Setup. L'approche pratique consiste à vérifier la présence de la dépendance lors de la première utilisation et à l'installer si elle est absente, par exemple un hook ou un skill qui teste `${CLAUDE_PLUGIN_DATA}/node_modules` et exécute `npm install` en son absence. Consultez le [répertoire de données persistantes](/docs/fr/plugins/components#path-variables-and-persistent-data) 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 cette approche : Claude Code [installe automatiquement les dépendances de packages Node.js éligibles](/docs/fr/plugins/loading#node-js-package-dependencies) lorsqu'il met le plugin en cache.
1339 1338
1340<h4 id="setup-input">1339<h4 id="setup-input">
1341 Entrée de Setup1340 Entrée de Setup
1357 Contrôle de décision de Setup1356 Contrôle de décision de Setup
1358</h4>1357</h4>
1359 1358
1360Les hooks Setup ne peuvent pas bloquer ; l'exécution continue quel que soit le code de sortie. Quel que soit le code de sortie, Claude Code ignore les [champs de sortie JSON](#json-output) d'un hook Setup, tels que `systemMessage`, `continue` et `hookSpecificOutput.additionalContext`. Avec `-p`, la sortie stdout, la sortie stderr et le code de sortie d'un hook Setup n'apparaissent dans la sortie de l'exécution que sous forme d'[événements `hook_response`](/docs/fr/headless#read-session-metadata) lorsque vous lancez avec `--output-format stream-json --verbose`.1359Les hooks Setup ne peuvent pas bloquer ; l'exécution se poursuit quel que soit le code de sortie. Quel que soit le code de sortie, Claude Code ignore les [champs de sortie JSON](#json-output) d'un hook Setup, comme `systemMessage`, `continue` et `hookSpecificOutput.additionalContext`. Avec `-p`, la sortie stdout, la sortie stderr et le code de sortie d'un hook Setup n'apparaissent dans la sortie de l'exécution que sous forme d'[événements `hook_response`](/docs/fr/headless#read-session-metadata), lorsque vous lancez avec `--output-format stream-json --verbose`.
1361 1360
1362Les hooks Setup ont accès à `CLAUDE_ENV_FILE`. Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes de la session, comme pour 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 dans [Champs des hooks d'outils MCP](#mcp-tool-hook-fields).1361Les hooks Setup ont accès à `CLAUDE_ENV_FILE`. Les variables écrites dans ce fichier persistent dans les commandes Bash suivantes de la session, comme pour 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 dans [Champs des hooks d'outil MCP](#mcp-tool-hook-fields).
1363 1362
1364<h3 id="instructionsloaded">1363<h3 id="instructionsloaded">
1365 InstructionsLoaded1364 InstructionsLoaded
1366</h3>1365</h3>
1367 1366
1368Se 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 immédiatement, puis plus tard lorsque des fichiers sont chargés à la demande, par exemple lorsque Claude accède à un sous-répertoire contenant un `CLAUDE.md` imbriqué ou lorsque des règles conditionnelles avec un frontmatter `paths:` correspondent. Le hook ne prend en charge ni le blocage ni le contrôle des décisions. Il s'exécute de manière asynchrone à des fins d'observabilité.1367Se 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 immédiatement, puis plus tard lorsque des fichiers sont chargés à la demande, par exemple lorsque Claude accède à un sous-répertoire contenant un `CLAUDE.md` imbriqué ou lorsque des règles conditionnelles avec un frontmatter `paths:` correspondent. Le hook ne prend en charge ni le blocage ni le contrôle de décision. Il s'exécute de manière asynchrone à des fins d'observabilité.
1369 1368
1370Cet événement ne se déclenche pas lorsque Claude [lit `AGENTS.md` directement](/docs/fr/memory#agents-md) via le paramètre **Project instructions**. Il se déclenche lorsqu'un `CLAUDE.md` importe votre `AGENTS.md`, avec `load_reason` défini sur `include` comme pour tout autre fichier importé, et lorsque `CLAUDE.md` est un lien symbolique vers celui-ci, comme un chargement normal de `CLAUDE.md`.1369Cet événement ne se déclenche pas lorsque Claude [lit `AGENTS.md` directement](/docs/fr/memory#agents-md) via le paramètre **Project instructions**. Il se déclenche en revanche lorsqu'un `CLAUDE.md` importe votre `AGENTS.md`, avec `load_reason` défini sur `include` comme pour tout autre fichier importé, et lorsque `CLAUDE.md` est un lien symbolique vers celui-ci, comme un chargement normal de `CLAUDE.md`.
1371 1370
1372Le matcher s'applique à `load_reason`. Par exemple, utilisez `"matcher": "session_start"` pour ne déclencher le hook que pour les fichiers chargés au démarrage de la session, ou `"matcher": "path_glob_match|nested_traversal"` pour ne le déclencher que pour les chargements à la demande.1371Le matcher s'applique à `load_reason`. Par exemple, utilisez `"matcher": "session_start"` pour ne déclencher le hook que pour les fichiers chargés au démarrage de la session, ou `"matcher": "path_glob_match|nested_traversal"` pour ne le déclencher que pour les chargements à la demande.
1373 1372
1379 1378
1380| Champ | Description |1379| Champ | Description |
1381| :- | :- |1380| :- | :- |
1382| `file_path` | Chemin absolu du fichier d'instructions chargé |1381| `file_path` | Chemin absolu du fichier d'instructions qui a été chargé |
1383| `memory_type` | Portée du fichier : `"User"`, `"Project"`, `"Local"` ou `"Managed"` |1382| `memory_type` | Portée du fichier : `"User"`, `"Project"`, `"Local"` ou `"Managed"` |
1384| `load_reason` | Raison du chargement du fichier : `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` ou `"compact"`. La valeur `"compact"` apparaît lorsque des fichiers d'instructions sont rechargés après un événement de compaction |1383| `load_reason` | Raison du chargement du fichier : `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` ou `"compact"`. La valeur `"compact"` est utilisée lorsque les fichiers d'instructions sont rechargés après un événement de compaction |
1385| `globs` | Motifs glob de chemin issus du frontmatter `paths:` du fichier, le cas échéant. Présent uniquement pour les chargements `path_glob_match` |1384| `globs` | Motifs glob de chemin issus du frontmatter `paths:` du fichier, le cas échéant. Présent uniquement pour les chargements `path_glob_match` |
1386| `trigger_file_path` | Chemin du fichier dont l'accès a déclenché ce chargement, pour les chargements à la demande |1385| `trigger_file_path` | Chemin du fichier dont l'accès a déclenché ce chargement, pour les chargements à la demande |
1387| `parent_file_path` | Chemin du fichier d'instructions parent qui a inclus celui-ci, pour les chargements `include` |1386| `parent_file_path` | Chemin du fichier d'instructions parent qui a inclus celui-ci, pour les chargements `include` |
1402 Contrôle de décision d'InstructionsLoaded1401 Contrôle de décision d'InstructionsLoaded
1403</h4>1402</h4>
1404 1403
1405Les hooks InstructionsLoaded n'ont pas de contrôle de décision. Ils ne peuvent ni bloquer ni modifier le chargement des instructions. Claude Code ignore 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é.1404Les hooks InstructionsLoaded n'ont aucun contrôle de décision. Ils ne peuvent ni bloquer ni modifier le chargement des instructions. Claude Code ignore leurs [champs de sortie JSON](#json-output), comme `systemMessage` et `continue`. Utilisez cet événement pour la journalisation d'audit, le suivi de conformité ou l'observabilité.
1406 1405
1407<h3 id="userpromptsubmit">1406<h3 id="userpromptsubmit">
1408 UserPromptSubmit1407 UserPromptSubmit
1412d'ajouter du contexte supplémentaire en fonction du prompt ou de la conversation, de valider des prompts ou1411d'ajouter du contexte supplémentaire en fonction du prompt ou de la conversation, de valider des prompts ou
1413de bloquer certains types de prompts.1412de bloquer certains types de prompts.
1414 1413
1415Les hooks `UserPromptSubmit` ne se déclenchent pas uniquement pour les prompts que vous tapez. Claude Code les exécute également lors :1414Les hooks `UserPromptSubmit` ne se déclenchent pas uniquement sur les prompts que vous saisissez. Claude Code les exécute également lors :
1416 1415
1417* du déclenchement d'une [tâche planifiée](/docs/fr/scheduled-tasks), y compris une itération de `/loop`1416* Du déclenchement d'une [tâche planifiée](/docs/fr/scheduled-tasks), y compris une itération de `/loop`
1418* du retour d'un [sous-agent en arrière-plan](/docs/fr/sub-agents#run-subagents-in-foreground-or-background) vers la session qui l'a lancé1417* Du compte rendu d'un [sous-agent en arrière-plan](/docs/fr/sub-agents#run-subagents-in-foreground-or-background) à la session qui l'a lancé
1419* de la réception dans votre conversation principale d'un [message envoyé par une autre session](/docs/fr/cross-session-messaging)1418* D'un [message qu'une autre session envoie](/docs/fr/cross-session-messaging) à votre conversation principale
1420 1419
1421Les 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 la valeur par défaut de 600 secondes pour ces types sur la plupart des autres événements. Comme ce hook s'exécute avant chaque prompt et bloque le traitement par le 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.1420Les 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 la valeur par défaut de 600 secondes pour ces types sur la plupart des autres événements. Comme ce hook s'exécute avant chaque prompt et bloque le traitement du modèle jusqu'à sa fin, 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.
1422 1421
1423À l'exception d'un hook de commande que vous exécutez avec [`async: true`](#run-hooks-in-the-background), un hook de commande, HTTP ou d'outil MCP `UserPromptSubmit` qui atteint son délai d'expiration est annulé et sa sortie, y compris tout `additionalContext`, est ignorée. Le prompt parvient tout de même à Claude sans ce contexte. La transcription affiche un avis indiquant le nom du hook, le délai d'expiration atteint et le fait que la sortie a été ignorée.1422Hormis un hook de commande que vous exécutez avec [`async: true`](#run-hooks-in-the-background), un hook de commande, HTTP ou d'outil MCP `UserPromptSubmit` qui atteint son délai d'expiration est annulé et sa sortie, y compris tout `additionalContext`, est ignorée. Le prompt parvient tout de même à Claude, sans ce contexte. La transcription affiche un avis qui indique le nom du hook, le délai d'expiration atteint et le fait que la sortie a été ignorée.
1424 1423
1425Un [hook callback de l'Agent SDK](/docs/fr/agent-sdk/hooks) sur `UserPromptSubmit` qui atteint son délai d'expiration bloque le prompt avec un message indiquant le nom du hook et le délai d'expiration, car un callback à cet endroit peut jouer le rôle de garde-fou de politique qui ne doit pas laisser passer en cas d'échec. La session continue. Avant la v2.1.208, l'expiration d'un callback sur cet événement terminait le tour avec une erreur d'exécution.1424Un [hook de callback de l'Agent SDK](/docs/fr/agent-sdk/hooks) sur `UserPromptSubmit` qui atteint son délai d'expiration bloque le prompt avec un message indiquant le nom du hook et le délai d'expiration, car un callback à cet endroit peut servir de garde-fou de politique qui ne doit pas échouer en mode ouvert. La session se poursuit. Avant la v2.1.208, l'expiration d'un callback sur cet événement mettait fin au tour avec une erreur d'exécution.
1426 1425
1427<h4 id="userpromptsubmit-input">1426<h4 id="userpromptsubmit-input">
1428 Entrée d'UserPromptSubmit1427 Entrée d'UserPromptSubmit
1429</h4>1428</h4>
1430 1429
1431En plus des [champs d'entrée communs](#common-input-fields), les hooks UserPromptSubmit reçoivent le champ `prompt` contenant le texte soumis. Le contenu collé qui a été réduit en un espace réservé `[Pasted text #N]` arrive développé à sa place. Dans les sessions où Claude Code [signale le texte collé à Claude](/docs/fr/terminal-config#how-claude-treats-pasted-text), ce contenu développé se trouve entre une ligne `<pasted_content id="…">` et une ligne `</pasted_content id="…">` ; tenez donc compte de ces lignes si votre hook analyse le prompt.1430En plus des [champs d'entrée communs](#common-input-fields), les hooks UserPromptSubmit reçoivent le champ `prompt` contenant le texte soumis. Le contenu collé qui a été réduit à un espace réservé `[Pasted text #N]` arrive développé à sa place. Dans les sessions où Claude Code [balise le texte collé pour Claude](/docs/fr/terminal-config#how-claude-treats-pasted-text), ce contenu développé se trouve entre une ligne `<pasted_content id="…">` et une ligne `</pasted_content id="…">` ; tenez-en compte si votre hook analyse le prompt.
1432 1431
1433Les hooks UserPromptSubmit reçoivent également `session_title` lorsque la session a un titre personnalisé, avec la même signification que le [champ `session_title` de SessionStart](#sessionstart-input).1432Les hooks UserPromptSubmit reçoivent également `session_title` lorsque la session a un titre personnalisé, avec la même signification que le [champ `session_title` de SessionStart](#sessionstart-input).
1434 1433
1452Il existe deux façons d'ajouter du contexte à la conversation avec le code de sortie 0 :1451Il existe deux façons d'ajouter du contexte à la conversation avec le code de sortie 0 :
1453 1452
1454* **Sortie stdout en texte brut** : Claude Code ajoute au contexte de Claude la sortie stdout qu'il [traite comme du texte brut](#exit-code-0)1453* **Sortie stdout en texte brut** : Claude Code ajoute au contexte de Claude la sortie stdout qu'il [traite comme du texte brut](#exit-code-0)
1455* **JSON avec `additionalContext`** : utilisez le format JSON ci-dessous pour plus de contrôle. Le champ `additionalContext` est ajouté comme contexte1454* **JSON avec `additionalContext`** : utilisez le format JSON ci-dessous pour davantage de contrôle. Le champ `additionalContext` est ajouté comme contexte
1456 1455
1457Aucun des deux canaux ne produit d'entrée visible dans la transcription. La sortie stdout brute et la valeur `additionalContext` sont chacune injectées sous forme de rappel système commençant par le nom du hook ; Claude lit les deux. Pour confirmer la transmission, consultez le [log de débogage](#debug-hooks).1456Aucun de ces canaux ne produit d'entrée visible dans la transcription. La sortie stdout brute et la valeur `additionalContext` sont chacune injectées sous forme de rappel système commençant par le nom du hook ; Claude lit les deux. Pour vérifier la transmission, consultez le [log de débogage](#debug-hooks).
1458 1457
1459Pour bloquer un prompt, renvoyez un objet JSON avec `decision` défini sur `"block"` :1458Pour bloquer un prompt, renvoyez un objet JSON dont `decision` est défini sur `"block"` :
1460 1459
1461| Champ | Description |1460| Champ | Description |
1462| :- | :- |1461| :- | :- |
1463| `decision` | `"block"` arrête le prompt avant qu'il n'atteigne Claude. Omettez-le pour laisser le prompt se poursuivre |1462| `decision` | `"block"` arrête le prompt avant qu'il ne parvienne à Claude. Omettez-le pour laisser le prompt poursuivre |
1464| `reason` | Affiché à l'utilisateur lorsque `decision` vaut `"block"`. Non ajouté au contexte |1463| `reason` | Affiché à l'utilisateur lorsque `decision` vaut `"block"`. N'est pas ajouté au contexte |
1465| `additionalContext` | Chaîne ajoutée au contexte de Claude en plus du prompt soumis. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |1464| `additionalContext` | Chaîne ajoutée au contexte de Claude avec le prompt soumis. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |
1466| `sessionTitle` | Définit le titre de la session. Utilisez-le pour nommer automatiquement les sessions en fonction du contenu du prompt |1465| `sessionTitle` | Définit le titre de la session. À utiliser pour nommer automatiquement les sessions en fonction du contenu du prompt |
1467| `suppressOriginalPrompt` | Si `true` lorsque le hook bloque le prompt, le texte du prompt est exclu du message de blocage. Consultez [Ce que laisse un prompt bloqué](#what-a-blocked-prompt-leaves-behind) |1466| `suppressOriginalPrompt` | Si `true` lorsque le hook bloque le prompt, omet le texte du prompt du message de blocage. Consultez [Ce que laisse derrière lui un prompt bloqué](#what-a-blocked-prompt-leaves-behind) |
1468 1467
1469Un hook qui bloque en se terminant avec le code 2 est traité de la même manière que `reason` : le message de blocage affiche le texte de stderr à l'utilisateur, et celui-ci n'est pas ajouté au contexte.1468Un hook qui bloque en se terminant avec le code 2 est traité de la même manière que `reason` : le message de blocage affiche le texte stderr à l'utilisateur, et celui-ci n'est pas ajouté au contexte.
1470 1469
1471```json theme={null}1470```json theme={null}
1472{1471{
1482```1481```
1483 1482
1484<h4 id="what-a-blocked-prompt-leaves-behind">1483<h4 id="what-a-blocked-prompt-leaves-behind">
1485 Ce que laisse un prompt bloqué1484 Ce que laisse derrière lui un prompt bloqué
1486</h4>1485</h4>
1487 1486
1488Un prompt bloqué n'atteint jamais Claude, mais son texte n'est pas supprimé partout. Par défaut, le message de blocage affiché à l'utilisateur se termine par `Original prompt:` suivi du texte soumis, et Claude Code écrit ce message dans le fichier de transcription de la session sur le disque. Pour exclure le texte du message, affichez un JSON avec `"suppressOriginalPrompt": true` dans `hookSpecificOutput`. Cela fonctionne que le hook bloque avec `decision: "block"` ou en se terminant avec le code 2.1487Un prompt bloqué ne parvient jamais à Claude, mais son texte n'est pas supprimé partout. Par défaut, le message de blocage affiché à l'utilisateur se termine par `Original prompt:` suivi du texte soumis, et Claude Code écrit ce message dans le fichier de transcription de la session sur le disque. Pour omettre le texte du message, affichez un JSON avec `"suppressOriginalPrompt": true` dans `hookSpecificOutput`. Cela fonctionne que le hook bloque avec `decision: "block"` ou en se terminant avec le code 2.
1489 1488
1490`suppressOriginalPrompt` ne modifie que le message de blocage. Le texte soumis peut toujours apparaître dans des fichiers locaux tels que la transcription de la session et votre historique de prompts ; un hook de blocage n'est donc pas un moyen d'empêcher qu'un secret soit écrit sur le disque. Pour limiter ou supprimer ces fichiers, consultez [Stockage en texte brut](/docs/fr/claude-directory#plaintext-storage) et [Effacer les données locales](/docs/fr/claude-directory#clear-local-data).1489`suppressOriginalPrompt` ne modifie que le message de blocage. Le texte soumis peut toujours apparaître dans des fichiers locaux comme la transcription de la session et votre historique de prompts ; un hook de blocage n'est donc pas un moyen d'empêcher qu'un secret soit écrit sur le disque. Pour limiter ou supprimer ces fichiers, consultez [Stockage en texte clair](/docs/fr/claude-directory#plaintext-storage) et [Effacer les données locales](/docs/fr/claude-directory#clear-local-data).
1491 1490
1492<h3 id="userpromptexpansion">1491<h3 id="userpromptexpansion">
1493 UserPromptExpansion1492 UserPromptExpansion
1494</h3>1493</h3>
1495 1494
1496S'exécute lorsqu'une commande saisie par l'utilisateur se développe en prompt avant d'atteindre Claude. Utilisez-le pour empêcher l'invocation directe de commandes spécifiques, injecter du contexte pour un skill particulier ou journaliser les commandes invoquées par les utilisateurs. Par exemple, un hook correspondant à `deploy` peut bloquer `/deploy` sauf si un fichier d'approbation est présent, ou un hook correspondant à un skill de revue peut ajouter la checklist de revue de l'équipe en tant qu'`additionalContext`.1495S'exécute lorsqu'une commande saisie par l'utilisateur est développée en prompt avant de parvenir à Claude. Utilisez-le pour empêcher l'invocation directe de commandes spécifiques, injecter du contexte pour un skill particulier ou journaliser les commandes invoquées par les utilisateurs. Par exemple, un hook correspondant à `deploy` peut bloquer `/deploy` à moins qu'un fichier d'approbation ne soit présent, ou un hook correspondant à un skill de revue peut ajouter la checklist de revue de l'équipe sous forme d'`additionalContext`.
1497 1496
1498Cet événement couvre le chemin que `PreToolUse` ne couvre pas : un hook `PreToolUse` correspondant à l'outil `Skill` ne se déclenche que lorsque Claude appelle l'outil, mais saisir `/skillname` directement contourne `PreToolUse`. `UserPromptExpansion` se déclenche sur ce chemin direct.1497Cet événement couvre le chemin que `PreToolUse` ne couvre pas : un hook `PreToolUse` correspondant à l'outil `Skill` ne se déclenche que lorsque Claude appelle l'outil, mais saisir `/skillname` directement contourne `PreToolUse`. `UserPromptExpansion` se déclenche sur ce chemin direct.
1499 1498
1500Correspond à `command_name`. Laissez le matcher vide pour le déclencher sur chaque commande de type prompt.1499Le matcher s'applique à `command_name`. Laissez le matcher vide pour déclencher le hook sur chaque commande de type prompt.
1501 1500
1502<h4 id="userpromptexpansion-input">1501<h4 id="userpromptexpansion-input">
1503 Entrée d'UserPromptExpansion1502 Entrée d'UserPromptExpansion
1528 1527
1529| Champ | Description |1528| Champ | Description |
1530| :- | :- |1529| :- | :- |
1531| `decision` | `"block"` empêche le développement de la commande. Omettez-le pour la laisser se poursuivre |1530| `decision` | `"block"` empêche le développement de la commande. Omettez-le pour la laisser poursuivre |
1532| `reason` | Affiché à l'utilisateur lorsque `decision` vaut `"block"` |1531| `reason` | Affiché à l'utilisateur lorsque `decision` vaut `"block"` |
1533| `additionalContext` | Chaîne ajoutée au contexte de Claude en plus du prompt développé. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |1532| `additionalContext` | Chaîne ajoutée au contexte de Claude avec le prompt développé. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |
1534 1533
1535Un hook qui bloque en se terminant avec le code 2 est traité de la même manière que `reason` : le message de blocage affiche le texte de stderr à l'utilisateur.1534Un hook qui bloque en se terminant avec le code 2 est traité de la même manière que `reason` : le message de blocage affiche le texte stderr à l'utilisateur.
1536 1535
1537```json theme={null}1536```json theme={null}
1538{1537{
1549 MessageDisplay1548 MessageDisplay
1550</h3>1549</h3>
1551 1550
1552S'exécute pendant qu'un message de l'assistant est diffusé à l'écran. Claude Code affiche le message par incréments : chaque fois qu'un lot de lignes nouvellement terminées est prêt à être affiché, le hook s'exécute une fois avec ces lignes et Claude Code affiche le texte de remplacement du hook à leur place. Un message long produit plusieurs appels ; un message court peut n'en produire qu'un seul.1551S'exécute pendant qu'un message de l'assistant s'affiche en streaming à 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 affiche à leur place le texte de remplacement du hook. Un message long produit plusieurs appels ; un message court peut n'en produire qu'un seul.
1553 1552
1554Utilisez MessageDisplay pour :1553Utilisez MessageDisplay pour :
1555 1554
1556* supprimer le markdown pour un affichage minimal1555* supprimer le markdown pour un affichage minimal
1557* transformer le texte qu'une application Agent SDK affiche à ses utilisateurs1556* transformer le texte qu'une application Agent SDK présente à ses utilisateurs
1558* masquer les clés API ou les noms d'hôtes internes dans les réponses de Claude1557* masquer des clés API ou des noms d'hôtes internes dans les réponses de Claude
1559 1558
1560Claude Code retient chaque lot jusqu'à ce que votre hook renvoie une réponse, gardez donc le hook rapide. Si le hook échoue ou expire, Claude Code affiche le texte d'origine. Le délai d'expiration par défaut pour cet événement est de 10 secondes ; si votre hook a besoin de plus de temps, définissez le champ `timeout` dans l'entrée du hook.1559Claude Code retient chaque lot jusqu'à ce que votre hook renvoie un résultat ; veillez donc à ce que le hook reste rapide. Si le hook échoue ou expire, Claude Code affiche le texte d'origine. Le délai d'expiration par défaut pour cet événement est de 10 secondes ; si votre hook a besoin de plus de temps, définissez le champ `timeout` dans l'entrée du hook.
1561 1560
1562MessageDisplay concerne uniquement l'affichage : le texte de remplacement ne modifie que ce qui est rendu à l'écran. La transcription et ce que voit Claude conservent le texte d'origine, de sorte que Claude ne voit jamais le remplacement, et le mode verbeux affiche l'original. Le hook ne reçoit que le texte des messages de l'assistant, donc les résultats d'outils et le texte que vous saisissez s'affichent sans modification.1561MessageDisplay ne concerne que l'affichage : le texte de remplacement ne modifie que ce qui est rendu à l'écran. La transcription et ce que voit Claude conservent le texte d'origine ; Claude ne voit donc jamais le remplacement, et le mode verbeux affiche l'original. Le hook ne reçoit que le texte des messages de l'assistant ; les résultats d'outils et le texte que vous saisissez s'affichent donc sans modification.
1563 1562
1564MessageDisplay ne prend pas en charge les matchers et se déclenche pour chaque message de l'assistant qui diffuse du texte ; les messages sans texte, comme les réponses ne contenant que des appels d'outils, ne le déclenchent pas.1563MessageDisplay ne prend pas en charge les matchers et se déclenche pour chaque message de l'assistant qui diffuse du texte en streaming ; les messages sans texte, comme les réponses ne contenant que des appels d'outils, ne le déclenchent pas.
1565 1564
1566Dans les exécutions non interactives, y compris les requêtes Agent SDK et `claude -p`, MessageDisplay s'exécute une fois par message de l'assistant au lieu d'une fois par lot de lignes. L'appel unique arrive une fois le message terminé et contient le texte complet du message : `index` vaut `0`, `final` vaut `true`, et `delta` contient l'intégralité du message. Un hook qui collecte le texte `delta` de chaque message reçoit le même texte total dans les deux modes.1565Dans les exécutions non interactives, y compris les requêtes de l'Agent SDK et `claude -p`, MessageDisplay s'exécute une fois par message de l'assistant au lieu d'une fois par lot de lignes. L'appel unique arrive une fois le message terminé et contient le texte complet du message : `index` vaut `0`, `final` vaut `true` et `delta` contient l'intégralité du message. Un hook qui collecte le texte `delta` de chaque message reçoit le même texte total dans les deux modes.
1567 1566
1568<h4 id="messagedisplay-input">1567<h4 id="messagedisplay-input">
1569 Entrée de MessageDisplay1568 Entrée de MessageDisplay
1570</h4>1569</h4>
1571 1570
1572En 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 des lots dépendent de la manière dont le texte est diffusé ; utilisez donc `index` et `final` pour suivre la progression dans un message plutôt que de vous attendre à ce que les lignes soient regroupées d'une manière particulière.1571En 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 au sein du message, et le nouveau texte dans `delta`. Les limites des lots dépendent de la manière dont le texte est diffusé ; utilisez donc `index` et `final` pour suivre la progression dans un message plutôt que de vous attendre à ce que les lignes soient regroupées d'une façon particulière.
1573 1572
1574| Champ | Description |1573| Champ | Description |
1575| :- | :- |1574| :- | :- |
1576| `turn_id` | UUID du tour en cours |1575| `turn_id` | UUID du tour en cours |
1577| `message_id` | UUID du message de l'assistant en cours d'affichage. Stable sur tous les lots d'un même message. Il ne s'agit pas de l'identifiant `msg_…` de l'API, il ne peut donc pas être mis en correspondance avec les identifiants de message de la transcription |1576| `message_id` | UUID du message de l'assistant en cours d'affichage. Stable sur tous les lots d'un même message. Il ne s'agit pas de l'identifiant `msg_…` de l'API ; il ne peut donc pas être mis en correspondance avec les identifiants de messages de la transcription |
1578| `index` | Index à partir de zéro de ce lot dans le message |1577| `index` | Index, en partant de zéro, de ce lot au sein du message |
1579| `final` | `true` sur le dernier lot du message. Chaque message a exactement un lot final |1578| `final` | `true` pour le dernier lot du message. Chaque message comporte exactement un lot final |
1580| `delta` | Les lignes nouvellement terminées depuis le lot précédent, retours à la ligne de fin inclus. Toujours des lignes entières, sauf pour le lot final qui peut se terminer en milieu de ligne. Dans les exécutions interactives, le delta du lot final est vide lorsque le message se termine par un retour à la ligne ; considérez donc `final`, et non un delta non vide, comme le signal de fin de message. Dans les exécutions Agent SDK et `claude -p`, l'appel unique contient l'intégralité du message |1579| `delta` | Les lignes nouvellement complétées depuis le lot précédent, retours à la ligne finaux inclus. Toujours des lignes entières, sauf pour le lot final, qui peut se terminer en milieu de ligne. Dans les exécutions interactives, le delta du lot final est vide lorsque le message se termine par un retour à la ligne ; considérez donc `final`, et non un delta non vide, comme le signal de fin de message. Dans les exécutions de l'Agent SDK et de `claude -p`, l'appel unique contient l'intégralité du message |
1581 1580
1582```json theme={null}1581```json theme={null}
1583{1582{
1603| :- | :- |1602| :- | :- |
1604| `displayContent` | Texte affiché à la place du delta. Omettez-le pour afficher l'original |1603| `displayContent` | Texte affiché à la place du delta. Omettez-le pour afficher l'original |
1605 1604
1606Les hooks MessageDisplay n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le message ni modifier ce qui est stocké dans la transcription ou envoyé à Claude. Claude Code tient compte de `displayContent` dans leur sortie JSON et ignore `systemMessage` et `continue`.1605Les hooks MessageDisplay n'ont aucun contrôle de décision. Ils ne peuvent ni bloquer le message ni modifier ce qui est stocké dans la transcription ou envoyé à Claude. Claude Code tient compte de `displayContent` dans leur sortie JSON et ignore `systemMessage` et `continue`.
1607 1606
1608Cet 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 de gras et les backticks de code en ligne de `delta`, et renvoie le résultat en tant que `displayContent`.1607Cet 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 de gras et les backticks de code inline de `delta`, et renvoie le résultat dans `displayContent`.
1609 1608
1610<Tabs>1609<Tabs>
1611 <Tab title="macOS/Linux">1610 <Tab title="macOS/Linux">
1664 }1663 }
1665 ```1664 ```
1666 1665
1667 Le flag `-NoProfile` évite 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.1666 Le flag `-NoProfile` évite de charger votre profil PowerShell afin que le hook démarre rapidement, et `-ExecutionPolicy Bypass` permet à PowerShell d'exécuter le fichier de script local.
1668 1667
1669 Enregistrez ce script dans `.claude/hooks/plain-display.ps1` dans votre projet :1668 Enregistrez ce script dans `.claude/hooks/plain-display.ps1` dans votre projet :
1670 1669
1681 </Tab>1680 </Tab>
1682</Tabs>1681</Tabs>
1683 1682
1684Les lots sans markdown passent sans modification. Si le script échoue, par exemple parce que `jq` est absent, Claude Code affiche le texte d'origine et ne signale l'échec que dans la [sortie de débogage](#debug-hooks), pas dans la session.1683Les lots sans markdown passent sans modification. Si le script échoue, par exemple parce que `jq` est absent, Claude Code affiche le texte d'origine et signale l'échec uniquement dans la [sortie de débogage](#debug-hooks), et non dans la session.
1685 1684
1686<h3 id="pretooluse">1685<h3 id="pretooluse">
1687 PreToolUse1686 PreToolUse
1688</h3>1687</h3>
1689 1688
1690S'exécute après que Claude a créé les paramètres de l'outil et avant le traitement de l'appel d'outil. Correspond à n'importe quel nom d'outil sauf `EndConversation` : les outils intégrés tels que `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` et `ExitPlanMode`, ainsi que tout [nom d'outil MCP](#match-mcp-tools).1689S'exécute après que Claude a créé les paramètres de l'outil et avant le traitement de 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`, ainsi que tous les [noms d'outils MCP](#match-mcp-tools).
1691 1690
1692Pour exécuter un hook lorsqu'un fichier spécifique change sur le disque, quel que soit ce qui l'a écrit, utilisez [FileChanged](#filechanged) plutôt que de faire correspondre les outils d'édition de fichiers par leur 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 ; ils ne peuvent donc pas bloquer l'écriture.1691Pour exécuter un hook lorsqu'un fichier spécifique change sur le disque, quel que soit ce qui l'a écrit, utilisez [FileChanged](#filechanged) plutôt que de faire correspondre les outils d'édition de fichiers par leur nom. Contrairement à PreToolUse, Claude Code exécute les hooks FileChanged après la modification, et ils n'ont aucun contrôle de décision ; ils ne peuvent donc pas bloquer l'écriture.
1693 1692
1694<Warning>1693<Warning>
1695 PreToolUse ne s'exécute que 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 leur contenu lors de la construction du prompt, donc aucun hook PreToolUse ne se déclenche pour eux, y compris les hooks correspondant à `Read`. Pour empêcher des chemins spécifiques d'être référencés avec `@`, utilisez plutôt une [règle de refus `Read`](/docs/fr/permissions#read-and-edit).1694 PreToolUse ne s'exécute que 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 leur contenu lors de la construction du prompt, donc aucun hook PreToolUse ne se déclenche pour eux, y compris les hooks correspondant à `Read`. Pour empêcher des chemins spécifiques d'être référencés avec `@`, utilisez plutôt une [règle de refus `Read`](/docs/fr/permissions#read-and-edit).
1699 1698
1700Utilisez le [contrôle de décision de PreToolUse](#pretooluse-decision-control) pour autoriser, refuser, demander ou différer l'appel d'outil.1699Utilisez le [contrôle de décision de PreToolUse](#pretooluse-decision-control) pour autoriser, refuser, demander ou différer l'appel d'outil.
1701 1700
1702Un [hook callback de l'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 indiquant le délai d'expiration. Un refus explicite renvoyé par un autre hook reste prioritaire.1701Un [hook de callback de l'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 indiquant le délai d'expiration. Un refus explicite renvoyé par un autre hook reste prioritaire.
1703 1702
1704<h4 id="pretooluse-input">1703<h4 id="pretooluse-input">
1705 Entrée de PreToolUse1704 Entrée de PreToolUse
1707 1706
1708En plus des [champs d'entrée communs](#common-input-fields), les hooks PreToolUse reçoivent `tool_name`, `tool_input` et `tool_use_id`.1707En plus des [champs d'entrée communs](#common-input-fields), les hooks PreToolUse reçoivent `tool_name`, `tool_input` et `tool_use_id`.
1709 1708
1710Pour un [outil MCP](#match-mcp-tools), l'entrée contient également `mcp_server`, un objet comportant le `name` du serveur et une `source` qui indique d'où provient la définition du serveur. Les valeurs de `source` incluent `plugin`, `sdk` et des portées de configuration telles que `user` et `project`. [`McpServerProvenance`](/docs/fr/agent-sdk/typescript#mcpserverprovenance) dans la référence de l'Agent SDK les liste toutes et indique comment traiter une valeur que vous ne reconnaissez pas. Fondez vos décisions de confiance sur `source` plutôt que sur `name` ou sur le préfixe de nom d'outil `mcp__<server>__`. Le champ `mcp_server` nécessite Claude Code v2.1.274 ou ultérieure.1709Pour un [outil MCP](#match-mcp-tools), l'entrée contient également `mcp_server`, un objet avec le `name` du serveur et une `source` qui indique d'où provient la définition du serveur. Les valeurs de `source` incluent `plugin`, `sdk` et des portées de configuration comme `user` et `project`. [`McpServerProvenance`](/docs/fr/agent-sdk/typescript#mcpserverprovenance) dans la référence de l'Agent SDK les répertorie toutes et explique comment traiter une valeur que vous ne reconnaissez pas. Fondez vos décisions de confiance sur `source` plutôt que sur `name` ou sur le préfixe de nom d'outil `mcp__<server>__`. Le champ `mcp_server` nécessite Claude Code v2.1.274 ou une version ultérieure.
1711 1710
1712Pour les outils de fichiers `Write`, `Edit` et `Read`, `tool_input.file_path` est toujours absolu :1711Pour les outils de fichiers `Write`, `Edit` et `Read`, `tool_input.file_path` est toujours absolu :
1713 1712
1714* Claude Code développe `~` et les chemins relatifs avant l'exécution des hooks, de sorte qu'un hook qui filtre sur les chemins ne peut pas être contourné via `~` ou une écriture relative du même chemin1713* Claude Code développe `~` et les chemins relatifs avant l'exécution des hooks ; un hook qui filtre sur les chemins ne peut donc pas être contourné via `~` ou une écriture relative du même chemin
1715* Sous Windows, le chemin arrive avec des barres obliques inverses comme séparateurs, même lorsque votre hook s'exécute sous Git Bash où `$PWD` ressemble à `/c/project`1714* Sous Windows, le chemin arrive avec des barres obliques inverses comme séparateurs, même lorsque votre hook s'exécute sous Git Bash, où `$PWD` ressemble à `/c/project`
1716* Une comparaison écrite avec des barres obliques, comme une vérification de `/src/`, ne correspond jamais à un chemin avec barres obliques inverses, et l'appel d'outil se poursuit comme si le hook n'avait rien à bloquer1715* Une comparaison écrite avec des barres obliques, comme une vérification de `/src/`, ne correspond jamais à un chemin avec des barres obliques inverses, et l'appel d'outil se poursuit comme si le hook n'avait rien à bloquer
1717* Normalisez les séparateurs avant de comparer : `FILE_PATH="${FILE_PATH//\\//}"` en Bash, ou `file_path.replace("\\", "/")` en Python, puis faites correspondre un segment de chemin tel que `/src/` plutôt que d'ancrer avec `^`, puisque le chemin est absolu1716* Normalisez les séparateurs avant de comparer : `FILE_PATH="${FILE_PATH//\\//}"` en Bash, ou `file_path.replace("\\", "/")` en Python, puis faites correspondre un segment de chemin comme `/src/` plutôt que d'ancrer avec `^`, puisque le chemin est absolu
1718 1717
1719Un appel `Write` sous Windows transmet :1718Un appel `Write` sous Windows transmet :
1720 1719
1747| `timeout` | number | `120000` | Délai d'expiration facultatif en millisecondes. Les valeurs supérieures au [maximum](/docs/fr/tools-reference#bash-tool-behavior) sont ramenées au maximum plutôt que rejetées |1746| `timeout` | number | `120000` | Délai d'expiration facultatif en millisecondes. Les valeurs supérieures au [maximum](/docs/fr/tools-reference#bash-tool-behavior) sont ramenées au maximum plutôt que rejetées |
1748| `run_in_background` | boolean | `false` | Indique s'il faut exécuter la commande en arrière-plan |1747| `run_in_background` | boolean | `false` | Indique s'il faut exécuter la commande en arrière-plan |
1749 1748
1750Lorsqu'une commande Bash modifie des fichiers dans un dépôt Git, Claude Code peut enregistrer ce qui a changé. Il enregistre les modifications dans tous les modes de permission lorsque le paramètre [`bashEditDiffEnabled`](/docs/fr/settings-reference#basheditdiffenabled) active l'enregistrement ; l'entrée de ce paramètre indique quels fichiers peuvent le définir. Sinon, il ne les enregistre qu'en mode auto et en mode `bypassPermissions`, et uniquement lorsque Claude Code demande à Claude de modifier des fichiers via Bash. Définissez `bashEditDiffEnabled` sur `false` pour désactiver l'enregistrement. Les commandes en arrière-plan et les commandes en lecture seule ne comportent pas de diff.1749Lorsqu'une commande Bash modifie des fichiers dans un dépôt Git, Claude Code peut enregistrer ce qui a changé. Il enregistre les modifications dans tous les modes de permission lorsque le paramètre [`bashEditDiffEnabled`](/docs/fr/settings-reference#basheditdiffenabled) active l'enregistrement ; l'entrée de ce paramètre indique quels fichiers peuvent le définir. Sinon, il ne les enregistre qu'en mode auto et en mode `bypassPermissions`, et uniquement lorsque Claude Code demande à Claude de modifier des fichiers via Bash. Définissez `bashEditDiffEnabled` sur `false` pour désactiver l'enregistrement. Les commandes en arrière-plan et les commandes en lecture seule ne comportent aucun diff.
1751 1750
1752Votre [hook PostToolUse](#posttooluse) reçoit alors les fichiers modifiés dans `tool_response.bashEditDiff`. La liste couvre ce qui a changé dans le dépôt pendant l'exécution de la commande. Les fichiers ignorés par Git et les fichiers des sous-modules ne sont pas listés. Nécessite Claude Code v2.1.269 ou ultérieure.1751Votre [hook PostToolUse](#posttooluse) reçoit alors les fichiers modifiés dans `tool_response.bashEditDiff`. La liste couvre ce qui a changé dans le dépôt pendant l'exécution de la commande. Les fichiers ignorés par Git et les fichiers des sous-modules ne sont pas répertoriés. Nécessite Claude Code v2.1.269 ou une version ultérieure.
1753 1752
1754<Note>1753<Note>
1755 La liste est fournie au mieux et est en bêta publique. Claude Code peut manquer une modification, inclure un fichier qu'un autre processus a modifié au même moment, ou s'arrêter à ses limites de taille. La structure du champ peut changer. Utilisez la liste pour savoir quoi examiner, pas pour appliquer une politique.1754 La liste est établie au mieux et est en bêta publique. Claude Code peut manquer une modification, inclure un fichier qu'un autre processus a modifié au même moment, ou s'arrêter à ses limites de taille. La structure du champ peut changer. Utilisez la liste pour identifier ce qu'il faut examiner, et non pour appliquer une politique.
1756</Note>1755</Note>
1757 1756
1758`changedFiles` et `files` listent ce que la commande a modifié ; les autres champs indiquent dans quelle mesure cette liste est complète et fiable.1757`changedFiles` et `files` répertorient ce que la commande a modifié ; les autres champs indiquent dans quelle mesure cette liste est complète et fiable.
1759 1758
1760| Champ | Type | Exemple | Description |1759| Champ | Type | Exemple | Description |
1761| :- | :- | :- | :- |1760| :- | :- | :- | :- |
1762| `changedFiles` | array | `["/path/to/src/app.ts"]` | Chemins absolus des fichiers modifiés par la commande, 200 au maximum. Présent dès que `files` contient un diff ou que `moreFiles` est supérieur à zéro |1761| `changedFiles` | array | `["/path/to/src/app.ts"]` | Chemins absolus des fichiers modifiés par la commande, 200 au maximum. Présent chaque fois que `files` contient un diff ou que `moreFiles` est supérieur à zéro |
1763| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs d'au plus 5 fichiers modifiés, pour l'affichage. `created` ou `deleted` vaut `true` pour un fichier que la commande a ajouté ou supprimé |1762| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs d'au plus 5 fichiers modifiés, pour l'affichage. `created` ou `deleted` vaut `true` pour un fichier que la commande a ajouté ou supprimé |
1764| `moreFiles` | number | `2` | Nombre de fichiers modifiés sans diff dans `files` |1763| `moreFiles` | number | `2` | Nombre de fichiers modifiés sans diff dans `files` |
1765| `unavailable` | boolean | `true` | Défini lorsque le diff est incomplet ou n'a pas pu être obtenu |1764| `unavailable` | boolean | `true` | Défini lorsque le diff est incomplet ou n'a pas pu être obtenu |
1766| `skipped` | boolean | `true` | Défini pour une commande Git qui déplace l'arbre de travail, comme `git checkout` ou `git stash`, de sorte que Claude Code ne calcule pas de diff |1765| `skipped` | boolean | `true` | Défini pour une commande Git qui déplace l'arbre de travail, comme `git checkout` ou `git stash` ; Claude Code ne calcule alors aucun diff |
1767| `shared` | boolean | `true` | Défini lorsqu'un autre appel d'outil Bash, comme celui d'un sous-agent, s'est exécuté dans le même dépôt au même moment, de sorte que certaines modifications listées peuvent provenir de cette commande |1766| `shared` | boolean | `true` | Défini lorsqu'un autre appel de l'outil Bash, comme celui d'un sous-agent, s'est exécuté dans le même dépôt au même moment ; certaines modifications répertoriées peuvent donc provenir de cette commande |
1768 1767
1769<a id="powershell" />1768<a id="powershell" />
1770 1769
1772 PowerShell1771 PowerShell
1773</h5>1772</h5>
1774 1773
1775Exécute des commandes PowerShell. Consultez l'[outil PowerShell](/docs/fr/tools-reference#powershell-tool) pour la disponibilité par plateforme.1774Exécute des commandes PowerShell. Consultez l'[outil PowerShell](/docs/fr/tools-reference#powershell-tool) pour connaître sa disponibilité selon la plateforme.
1776 1775
1777Les champs sont identiques à ceux de l'outil Bash, avec la chaîne de commande dans `command` :1776Les champs correspondent à ceux de l'outil Bash, avec la chaîne de commande dans `command` :
1778 1777
1779| Champ | Type | Exemple | Description |1778| Champ | Type | Exemple | Description |
1780| :- | :- | :- | :- |1779| :- | :- | :- | :- |
1785 1784
1786Utilisez le matcher `Bash|PowerShell` dans les hooks qui inspectent les commandes shell, afin qu'ils couvrent les deux outils :1785Utilisez le matcher `Bash|PowerShell` dans les hooks qui inspectent les commandes shell, afin qu'ils couvrent les deux outils :
1787 1786
1788* Sous Windows, partout où l'outil PowerShell est activé, Claude traite PowerShell comme le shell principal et y fait passer les commandes shell.1787* Sous Windows, partout où l'outil PowerShell est activé, Claude traite PowerShell comme le shell principal et y achemine les commandes shell.
1789* Sous Windows sans Git Bash, l'outil est activé automatiquement et Claude Code n'enregistre pas du tout l'outil Bash.1788* Sous Windows sans Git Bash, l'outil est activé automatiquement et Claude Code n'enregistre pas du tout l'outil Bash.
1790* Un hook qui ne correspond qu'à `Bash` ne s'y déclenche jamais.1789* Un hook qui ne correspond qu'à `Bash` ne s'y déclenche jamais.
1791 1790
1847| `pattern` | string | `"TODO.*fix"` | Motif d'expression régulière à rechercher |1846| `pattern` | string | `"TODO.*fix"` | Motif d'expression régulière à rechercher |
1848| `path` | string | `"/path/to/dir"` | Fichier ou répertoire facultatif dans lequel rechercher |1847| `path` | string | `"/path/to/dir"` | Fichier ou répertoire facultatif dans lequel rechercher |
1849| `glob` | string | `"*.ts"` | Motif glob facultatif pour filtrer les fichiers |1848| `glob` | string | `"*.ts"` | Motif glob facultatif pour filtrer les fichiers |
1850| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` ou `"count"`. Par défaut `"files_with_matches"` |1849| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` ou `"count"`. Par défaut, `"files_with_matches"` |
1851| `-i` | boolean | `true` | Recherche insensible à la casse |1850| `-i` | boolean | `true` | Recherche insensible à la casse |
1852| `multiline` | boolean | `false` | Active la correspondance multiligne |1851| `multiline` | boolean | `false` | Active la correspondance multiligne |
1853 1852
1859 1858
1860| Champ | Type | Exemple | Description |1859| Champ | Type | Exemple | Description |
1861| :- | :- | :- | :- |1860| :- | :- | :- | :- |
1862| `url` | string | `"https://example.com/api"` | URL dont récupérer le contenu |1861| `url` | string | `"https://example.com/api"` | URL à partir de laquelle récupérer le contenu |
1863| `prompt` | string | `"Extract the API endpoints"` | Prompt à exécuter sur le contenu récupéré |1862| `prompt` | string | `"Extract the API endpoints"` | Prompt à exécuter sur le contenu récupéré |
1864 1863
1865<h5 id="websearch">1864<h5 id="websearch">
1871| Champ | Type | Exemple | Description |1870| Champ | Type | Exemple | Description |
1872| :- | :- | :- | :- |1871| :- | :- | :- | :- |
1873| `query` | string | `"react hooks best practices"` | Requête de recherche |1872| `query` | string | `"react hooks best practices"` | Requête de recherche |
1874| `allowed_domains` | array | `["docs.example.com"]` | Facultatif : inclure uniquement les résultats de ces domaines |1873| `allowed_domains` | array | `["docs.example.com"]` | Facultatif : n'inclure que les résultats de ces domaines |
1875| `blocked_domains` | array | `["spam.example.com"]` | Facultatif : exclure les résultats de ces domaines |1874| `blocked_domains` | array | `["spam.example.com"]` | Facultatif : exclure les résultats de ces domaines |
1876 1875
1877<h5 id="agent">1876<h5 id="agent">
1885| `prompt` | string | `"Find all API endpoints"` | La tâche que l'agent doit effectuer |1884| `prompt` | string | `"Find all API endpoints"` | La tâche que l'agent doit effectuer |
1886| `description` | string | `"Find API endpoints"` | Brève description de la tâche |1885| `description` | string | `"Find API endpoints"` | Brève description de la tâche |
1887| `subagent_type` | string | `"Explore"` | Type d'agent spécialisé à utiliser |1886| `subagent_type` | string | `"Explore"` | Type d'agent spécialisé à utiliser |
1888| `model` | string | `"sonnet"` | Alias de modèle facultatif pour remplacer le modèle par défaut |1887| `model` | string | `"sonnet"` | Alias de modèle facultatif pour remplacer celui par défaut |
1889 1888
1890Lorsqu'un appel Agent au premier plan se termine, votre [hook PostToolUse](#posttooluse) reçoit le résultat du sous-agent et la télémétrie de l'exécution dans `tool_response`. Lisez ces champs pour inspecter l'exécution ; pour des agrégats de tokens et de coûts sur l'ensemble des sous-agents, utilisez les [compteurs de tokens et de coûts](/docs/fr/monitoring-usage#token-counter) filtrés sur `query_source` `"subagent"`, car `totalTokens` et `usage` ne couvrent que la requête finale :1889Lorsqu'un appel Agent au premier plan se termine, votre [hook PostToolUse](#posttooluse) reçoit le résultat du sous-agent et la télémétrie de l'exécution dans `tool_response`. Lisez ces champs pour inspecter l'exécution ; pour des cumuls de tokens et de coûts sur l'ensemble des sous-agents, utilisez les [compteurs de tokens et de coûts](/docs/fr/monitoring-usage#token-counter) filtrés sur `query_source` `"subagent"`, car `totalTokens` et `usage` ne couvrent que la requête finale :
1891 1890
1892| Champ | Type | Exemple | Description |1891| Champ | Type | Exemple | Description |
1893| :- | :- | :- | :- |1892| :- | :- | :- | :- |
1894| `status` | string | `"completed"` | `"completed"` pour les sous-agents au premier plan, `"async_launched"` pour les sous-agents en arrière-plan. Les sous-agents s'exécutent en arrière-plan par défaut, donc un appel Agent qui omet `run_in_background` produit également `"async_launched"` |1893| `status` | string | `"completed"` | `"completed"` pour les sous-agents au premier plan, `"async_launched"` pour les sous-agents en arrière-plan. Les sous-agents s'exécutent en arrière-plan par défaut ; un appel Agent qui omet `run_in_background` produit donc également `"async_launched"` |
1895| `agentId` | string | `"a4d2c8f1e0b3a297"` | Identifiant de l'exécution du sous-agent |1894| `agentId` | string | `"a4d2c8f1e0b3a297"` | Identifiant de l'exécution du sous-agent |
1896| `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 brève note sur cette remise à leur place |1895| `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 brève note sur cette transmission à leur place |
1897| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modèle sur lequel le sous-agent a démarré, qui peut différer du modèle demandé |1896| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modèle sur lequel le sous-agent a démarré, qui peut différer du modèle demandé |
1898| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Modèles utilisés dans l'ordre, les répétitions consécutives étant fusionnées ; défini uniquement lorsque le modèle a été changé en cours d'exécution. Nécessite Claude Code v2.1.212 ou ultérieure |1897| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Modèles utilisés dans l'ordre, les répétitions consécutives étant fusionnées ; défini uniquement lorsque le modèle a été changé en cours d'exécution. Nécessite Claude Code v2.1.212 ou une version ultérieure |
1899| `totalTokens` | number | `12450` | Nombre de tokens de la requête API finale du sous-agent : tokens d'entrée, de sortie et de cache combinés. Il ne s'agit pas d'un total sur l'ensemble de l'exécution |1898| `totalTokens` | number | `12450` | Nombre de tokens de la requête API finale du sous-agent : tokens d'entrée, de sortie et de cache combinés. Il ne s'agit pas d'un total sur l'ensemble de l'exécution |
1900| `totalDurationMs` | number | `48211` | Durée réelle de l'exécution du sous-agent |1899| `totalDurationMs` | number | `48211` | Durée réelle de l'exécution du sous-agent |
1901| `totalToolUseCount` | number | `7` | Nombre d'appels d'outils effectués par le sous-agent |1900| `totalToolUseCount` | number | `7` | Nombre d'appels d'outils effectués par le sous-agent |
1902| `usage` | object | `{"input_tokens": 8320, ...}` | Répartition des tokens par type pour la requête API finale : `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1901| `usage` | object | `{"input_tokens": 8320, ...}` | Répartition par type des tokens de la requête API finale : `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1903 1902
1904Avec Claude Code v2.1.271 ou ultérieure, 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), transmet son rapport via cet outil plutôt que de le renvoyer sous forme de texte. Le champ `content` de son résultat `completed` contient alors une brève note sur cette remise plutôt que le rapport lui-même. Pour lire le rapport, faites correspondre un hook `PreToolUse` ou `PostToolUse` à `SubagentHandback` et lisez `tool_input.message`.1903Sur Claude Code v2.1.271 ou une version ultérieure, 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), transmet son rapport via cet outil plutôt que de le renvoyer sous forme de texte. Le champ `content` de son résultat `completed` contient alors une brève note sur cette transmission plutôt que le rapport lui-même. Pour lire le rapport, faites correspondre un hook `PreToolUse` ou `PostToolUse` à `SubagentHandback` et lisez `tool_input.message`.
1905 1904
1906Pour les sous-agents en arrière-plan, l'outil rend la main lorsque la tâche passe en arrière-plan, donc `tool_response` ne contient aucun champ d'utilisation : un lancement en arrière-plan rend la main immédiatement, et une tâche au premier plan que Claude Code passe en arrière-plan en cours d'exécution rend la main lors de cette transition. Elle contient `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` et `resolvedModel`.1905Pour les sous-agents en arrière-plan, l'outil renvoie son résultat lorsque la tâche passe en arrière-plan ; `tool_response` ne contient donc aucun champ d'utilisation : un lancement en arrière-plan renvoie immédiatement, et une tâche au premier plan que Claude Code passe en arrière-plan en cours d'exécution renvoie au moment de cette transition. Il contient `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` et `resolvedModel`.
1907 1906
1908Dans une réponse `completed`, `resolvedModel` indique le modèle sur lequel le sous-agent a démarré, qui peut différer de la valeur `model` dans `tool_input`, par exemple lorsque `availableModels` ou un autre remplacement s'applique. Dans une réponse `async_launched`, `resolvedModel` indique le modèle utilisé au moment où l'agent est passé en arrière-plan, de sorte qu'un changement survenu avant le passage en arrière-plan y est reflété. `modelsUsed` et le comportement de `resolvedModel` au moment du passage en arrière-plan nécessitent Claude Code v2.1.212 ou ultérieure.1907Dans une réponse `completed`, `resolvedModel` indique le modèle sur lequel le sous-agent a démarré, qui peut différer de la valeur `model` de `tool_input`, par exemple lorsque `availableModels` ou un autre remplacement s'applique. Dans une réponse `async_launched`, `resolvedModel` indique le modèle utilisé au moment où l'agent est passé en arrière-plan ; un changement survenu avant le passage en arrière-plan y est donc reflété. `modelsUsed` et le comportement de `resolvedModel` au moment du passage en arrière-plan nécessitent Claude Code v2.1.212 ou une version ultérieure.
1909 1908
1910<a id="askuserquestion" />1909<a id="askuserquestion" />
1911 1910
1918| Champ | Type | Exemple | Description |1917| Champ | Type | Exemple | Description |
1919| :- | :- | :- | :- |1918| :- | :- | :- | :- |
1920| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React", "description": "Component library"}, {"label": "Vue", "description": "Progressive framework"}], "multiSelect": false}]` | Questions à présenter, chacune avec une chaîne `question`, un `header` court, un tableau `options` et un flag `multiSelect` facultatif |1919| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React", "description": "Component library"}, {"label": "Vue", "description": "Progressive framework"}], "multiSelect": false}]` | Questions à présenter, chacune avec une chaîne `question`, un `header` court, un tableau `options` et un flag `multiSelect` facultatif |
1921| `answers` | object | `{"Which framework?": "React"}` | Facultatif. Associe le texte de la question au libellé de l'option sélectionnée. Les réponses à sélection multiple joignent les libellés par des virgules. Claude ne définit pas ce champ ; fournissez-le via `updatedInput` pour répondre par programmation |1920| `answers` | object | `{"Which framework?": "React"}` | Facultatif. Associe le texte de la question au libellé de l'option sélectionnée. Les réponses à sélection multiple joignent les libellés par des virgules. Claude ne définit pas ce champ ; fournissez-le via `updatedInput` pour répondre de manière programmatique |
1922 1921
1923<h5 id="exitplanmode">1922<h5 id="exitplanmode">
1924 ExitPlanMode1923 ExitPlanMode
1925</h5>1924</h5>
1926 1925
1927Pré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 le `tool_input` littéral fourni par le 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.1926Pré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 ; le `tool_input` littéral provenant du modèle est donc généralement vide. Claude Code injecte le contenu du plan et le chemin du fichier avant de transmettre l'entrée aux hooks.
1928 1927
1929| Champ | Type | Exemple | Description |1928| Champ | Type | Exemple | Description |
1930| :- | :- | :- | :- |1929| :- | :- | :- | :- |
1931| `plan` | string | `"## Refactor auth\n1. Extract..."` | Contenu du plan en Markdown. Injecté depuis le fichier de plan sur le disque |1930| `plan` | string | `"## Refactor auth\n1. Extract..."` | Contenu du plan en Markdown. Injecté à partir du fichier de plan sur le disque |
1932| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Chemin du fichier de plan. Injecté |1931| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Chemin du fichier de plan. Injecté |
1933| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Déprécié. Claude Code accepte le champ mais l'ignore. Avant la v2.1.205, il contenait les permissions basées sur des prompts que Claude demandait pour mettre en œuvre le plan |1932| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Déprécié. Claude Code accepte le champ mais l'ignore. Avant la v2.1.205, il contenait les permissions basées sur des prompts que Claude demandait pour mettre en œuvre le plan |
1934 1933
1935Dans `PostToolUse`, `tool_response` est un objet avec des champs `plan` et `filePath` contenant le plan approuvé, ainsi que des indicateurs d'état internes. Lisez `tool_response.plan` pour obtenir le contenu du plan plutôt que de relire le fichier sur le disque.1934Dans `PostToolUse`, `tool_response` est un objet avec des champs `plan` et `filePath` contenant le plan approuvé, ainsi que des flags d'état internes. Lisez `tool_response.plan` pour obtenir le contenu du plan plutôt que de relire le fichier sur le disque.
1936 1935
1937<h4 id="pretooluse-decision-control">1936<h4 id="pretooluse-decision-control">
1938 Contrôle de décision de PreToolUse1937 Contrôle de décision de PreToolUse
1942 1941
1943| Champ | Description |1942| Champ | Description |
1944| :- | :- |1943| :- | :- |
1945| `permissionDecision` | `"allow"` ignore la demande de permission, sauf pour les [actions qu'aucun mode n'approuve automatiquement](/docs/fr/permission-modes#actions-no-mode-auto-approves) et pour `AskUserQuestion` et `ExitPlanMode`, qui nécessitent [`updatedInput` en complément](#allow-with-updatedinput). `"deny"` empêche l'appel d'outil. `"ask"` demande à l'utilisateur de confirmer. `"defer"` se termine proprement afin 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, quelle que soit la réponse du hook |1944| `permissionDecision` | `"allow"` ignore la demande de permission, sauf pour les [actions qu'aucun mode n'approuve automatiquement](/docs/fr/permission-modes#actions-no-mode-auto-approves) ainsi que pour `AskUserQuestion` et `ExitPlanMode`, qui nécessitent [d'être associés à `updatedInput`](#allow-with-updatedinput). `"deny"` empêche l'appel d'outil. `"ask"` demande confirmation à l'utilisateur. `"defer"` se termine proprement afin 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, quoi que renvoie le hook |
1946| `permissionDecisionReason` | Pour `"ask"`, affiché à l'utilisateur dans la demande de permission. Lorsque Claude Code [refuse l'appel](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs) dans une exécution `-p` où personne ne peut répondre à cette demande, Claude lit la raison dans le résultat de l'outil à la place. Pour `"deny"`, affiché à Claude. Pour `"allow"` et `"defer"`, écrit uniquement dans le [log de débogage](#debug-hooks) |1945| `permissionDecisionReason` | Pour `"ask"`, affiché à l'utilisateur dans la demande de permission. Lorsque Claude Code [refuse l'appel](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs) dans une exécution `-p` où personne ne peut répondre à cette demande, Claude lit plutôt la raison dans le résultat de l'outil. Pour `"deny"`, affiché à Claude. Pour `"allow"` et `"defer"`, écrit uniquement dans le [log de débogage](#debug-hooks) |
1947| `updatedInput` | Modifie les paramètres d'entrée de l'outil avant l'exécution. Remplace l'intégralité de l'objet d'entrée ; incluez donc les champs inchangés en plus des champs modifiés. Claude Code évalue les règles de permission et l'[éligibilité au passage automatique en arrière-plan](/docs/fr/tools-reference#foreground-commands-that-move-to-the-background) d'une commande Bash par rapport à l'entrée renvoyée par votre hook, et non à l'entrée envoyée par Claude. Combinez avec `"allow"` pour approuver automatiquement, ou avec `"ask"` pour montrer l'entrée modifiée à l'utilisateur. Ignoré pour `"defer"` |1946| `updatedInput` | Modifie les paramètres d'entrée de l'outil avant l'exécution. Remplace l'intégralité de l'objet d'entrée ; incluez donc les champs inchangés avec ceux modifiés. Claude Code évalue les règles de permission et l'[éligibilité au passage automatique en arrière-plan](/docs/fr/tools-reference#foreground-commands-that-move-to-the-background) d'une commande Bash par rapport à l'entrée renvoyée par votre hook, et non à l'entrée envoyée par Claude. Combinez-le avec `"allow"` pour approuver automatiquement, ou avec `"ask"` pour montrer l'entrée modifiée à l'utilisateur. Ignoré pour `"defer"` |
1948| `additionalContext` | Chaîne ajoutée au contexte de Claude en plus du résultat de l'outil. Ignorée lorsque `permissionDecision` vaut `"defer"`. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |1947| `additionalContext` | Chaîne ajoutée au contexte de Claude avec le résultat de l'outil. Ignorée lorsque `permissionDecision` vaut `"defer"`. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |
1949 1948
1950Lorsque plusieurs hooks PreToolUse renvoient des décisions différentes, l'ordre de priorité est `deny` > `defer` > `ask` > `allow`.1949Lorsque plusieurs hooks PreToolUse renvoient des décisions différentes, l'ordre de priorité est `deny` > `defer` > `ask` > `allow`.
1951 1950
1952Un hook qui bloque en se terminant avec le code 2 est traité de la même manière que `"deny"` : Claude voit le message stderr comme raison du refus.1951Un hook qui bloque en se terminant avec le code 2 est traité de la même manière que `"deny"` : Claude voit le message stderr comme raison du refus.
1953 1952
1954Lorsqu'un hook renvoie `"ask"`, la demande de permission affichée à l'utilisateur comporte une étiquette identifiant l'origine du hook : `[settings]` pour un hook provenant d'un fichier de paramètres ou du frontmatter d'un agent, `[plugin:<name>]` pour le hook d'un plugin, ou `[skill]` pour un hook provenant du frontmatter d'un skill. Cela aide les utilisateurs à comprendre quelle source de configuration demande une confirmation.1953Lorsqu'un hook renvoie `"ask"`, la demande de permission affichée à l'utilisateur comprend une étiquette identifiant l'origine du hook : `[settings]` pour un hook provenant d'un fichier de paramètres ou du frontmatter d'un agent, `[plugin:<name>]` pour le hook d'un plugin, ou `[skill]` pour un hook provenant du frontmatter d'un skill. Cela aide les utilisateurs à comprendre quelle source de configuration demande la confirmation.
1955 1954
1956Un `"ask"` renvoyé par un hook force également une demande de permission en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) : le classifieur peut toujours refuser l'appel d'outil, mais il ne peut pas l'approuver silencieusement. Avant la v2.1.211, le classifieur pouvait approuver une commande Bash s'exécutant hors du [sandbox](/docs/fr/sandboxing) sans afficher la demande réclamée par le hook ; le classifieur appliquait néanmoins ses propres règles de sécurité à cette commande, et un `"deny"` de hook était toujours respecté.1955Un `"ask"` de hook force également une demande de permission en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) : le classifieur peut toujours refuser l'appel d'outil, mais il ne peut pas approuver l'appel silencieusement. Avant la v2.1.211, le classifieur pouvait approuver une commande Bash s'exécutant en dehors du [sandbox](/docs/fr/sandboxing) sans afficher la demande requise par le hook ; le classifieur appliquait tout de même ses propres règles de sécurité à cette commande, et un `"deny"` de hook était toujours respecté.
1957 1956
1958```json theme={null}1957```json theme={null}
1959{1958{
2015 Différer un appel d'outil2014 Différer un appel d'outil
2016</h4>2015</h4>
2017 2016
2018`"defer"` est destiné aux intégrations qui exécutent `claude -p` comme sous-processus et lisent sa sortie JSON, comme une application Agent SDK ou une interface personnalisée construite sur Claude Code. Il permet à ce processus appelant de mettre Claude en pause sur un appel d'outil, de recueillir une saisie via sa propre interface, puis de reprendre là où il s'était arrêté. Claude Code ne respecte cette valeur qu'en [mode non interactif](/docs/fr/headless) avec le flag `-p`. Dans les sessions interactives, il consigne un avertissement et ignore le résultat du hook.2017`"defer"` est destiné aux 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 au-dessus de Claude Code. Il permet à ce processus appelant de mettre Claude en pause au niveau d'un appel d'outil, de recueillir une saisie via sa propre interface, puis de reprendre là où il s'était arrêté. Claude Code ne respecte cette valeur qu'en [mode non interactif](/docs/fr/headless) avec le flag `-p`. Dans les sessions interactives, il journalise un avertissement et ignore le résultat du hook.
2019 2018
2020L'outil `AskUserQuestion` est le cas typique : Claude veut poser une question à l'utilisateur, mais il n'y a pas de terminal pour y répondre. Une exécution `-p` ne propose `AskUserQuestion` que lorsqu'elle dispose d'un [hôte de permissions](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs), comme un outil MCP que vous transmettez avec `--permission-prompt-tool` ; démarrez donc l'exécution avec l'un d'eux. L'aller-retour fonctionne ainsi :2019L'outil `AskUserQuestion` est le cas typique : Claude veut poser une question à l'utilisateur, mais il n'y a aucun terminal où répondre. Une exécution `-p` ne propose `AskUserQuestion` que lorsqu'elle dispose d'un [hôte de permissions](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs), comme un outil MCP que vous transmettez avec `--permission-prompt-tool` ; démarrez donc l'exécution avec l'un d'eux. L'aller-retour fonctionne comme suit :
2021 2020
20221. Claude appelle `AskUserQuestion`. Le hook `PreToolUse` se déclenche.20211. Claude appelle `AskUserQuestion`. Le hook `PreToolUse` se déclenche.
20232. Le hook renvoie `permissionDecision: "defer"`. L'outil ne s'exécute pas. Le processus se termine avec `stop_reason: "tool_deferred"` et l'appel d'outil en attente est conservé dans la transcription.20222. Le hook renvoie `permissionDecision: "defer"`. L'outil ne s'exécute pas. Le processus se termine avec `stop_reason: "tool_deferred"` et l'appel d'outil en attente est conservé dans la transcription.
20243. Le processus appelant lit `deferred_tool_use` dans le résultat du SDK, affiche la question dans sa propre interface et attend une réponse.20233. Le processus appelant lit `deferred_tool_use` dans le résultat du SDK, présente la question dans sa propre interface utilisateur et attend une réponse.
20254. Le processus appelant exécute `claude -p --resume <session-id>` avec le même hôte de permissions. Le même appel d'outil déclenche à nouveau `PreToolUse`.20244. Le processus appelant exécute `claude -p --resume <session-id>` avec le même hôte de permissions. Le même appel d'outil déclenche à nouveau `PreToolUse`.
20265. Le hook renvoie `permissionDecision: "allow"` avec la réponse dans `updatedInput`. L'outil s'exécute et Claude continue.20255. Le hook renvoie `permissionDecision: "allow"` avec la réponse dans `updatedInput`. L'outil s'exécute et Claude poursuit.
2027 2026
2028Le champ `deferred_tool_use` contient l'`id`, le `name` et l'`input` de l'outil. L'`input` correspond aux paramètres que Claude a générés pour l'appel d'outil, capturés avant l'exécution :2027Le champ `deferred_tool_use` contient l'`id`, le `name` et l'`input` de l'outil. L'`input` correspond aux paramètres que Claude a générés pour l'appel d'outil, capturés avant l'exécution :
2029 2028
2041}2040}
2042```2041```
2043 2042
2044Il n'y a ni délai d'expiration ni limite de nouvelles tentatives. La session reste sur le disque jusqu'à ce que vous la repreniez, sous réserve du nettoyage de rétention [`cleanupPeriodDays`](/docs/fr/settings-reference#cleanupperioddays), qui supprime les fichiers de session après 30 jours par défaut, conformément aux [règles du nettoyage 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 renvoyer `"defer"` à nouveau et le processus se termine de la même manière. Le processus appelant décide quand sortir de la boucle en renvoyant finalement `"allow"` ou `"deny"` depuis le hook.2043Il n'existe ni délai d'expiration ni limite de nouvelles tentatives. La session reste sur le disque jusqu'à ce que vous la repreniez, sous réserve du nettoyage de rétention [`cleanupPeriodDays`](/docs/fr/settings-reference#cleanupperioddays), qui supprime les fichiers de session après 30 jours par défaut, conformément aux [règles du nettoyage de rétention](/docs/fr/claude-directory#cleaned-up-automatically). Si la réponse n'est pas prête au moment de la reprise, le hook peut renvoyer `"defer"` à nouveau et le processus se termine de la même manière. Le processus appelant décide quand sortir de la boucle en renvoyant finalement `"allow"` ou `"deny"` depuis le hook.
2045 2044
2046`"defer"` ne fonctionne que lorsque 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 suit le flux de permission normal. Cette contrainte existe parce que la reprise ne peut réexécuter 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.2045`"defer"` ne fonctionne que lorsque 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 suit le flux de permission normal. Cette contrainte existe parce que la reprise ne peut réexécuter qu'un seul outil : il n'existe aucun moyen de différer un appel d'un lot sans laisser les autres non résolus.
2047 2046
2048Si l'outil différé n'est plus disponible lorsque vous reprenez, le processus se termine 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 fournissait l'outil n'est pas connecté pour la session reprise. Le payload `deferred_tool_use` est tout de même inclus afin que vous puissiez identifier l'outil manquant.2047Si l'outil différé n'est plus disponible au moment de la reprise, le processus se termine 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 fournissait l'outil n'est pas connecté pour la session reprise. Le payload `deferred_tool_use` est tout de même inclus afin que vous puissiez identifier l'outil manquant.
2049 2048
2050<Note>2049<Note>
2051 Pour reprendre une session différée en mode plan, transmettez [`--permission-prompt-tool`](/docs/fr/cli-reference#cli-flags) avec `--resume` afin que Claude Code puisse présenter le plan pour approbation. Si vous transmettez certains autres flags de lancement, l'exécution reprise ne revient pas en mode plan ; consultez [Reprendre en mode plan avec `-p`](/docs/fr/sessions#resume-in-plan-mode-with-p). Nécessite Claude Code v2.1.246 ou ultérieure.2050 Pour reprendre une session différée en mode plan, transmettez [`--permission-prompt-tool`](/docs/fr/cli-reference#cli-flags) avec `--resume` afin que Claude Code puisse présenter le plan pour approbation. Si vous transmettez certains autres flags de lancement, l'exécution reprise ne revient pas en mode plan ; consultez [Reprendre en mode plan avec `-p`](/docs/fr/sessions#resume-in-plan-mode-with-p). Nécessite Claude Code v2.1.246 ou une version ultérieure.
2052 2051
2053 Lorsque vous reprenez avec `-p`, Claude Code ne restaure aucun autre mode de permission enregistré. Il démarre l'exécution dans le mode de permission dans lequel démarrerait une nouvelle exécution `claude -p` ; transmettez donc à nouveau `--permission-mode` ou `--dangerously-skip-permissions` 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 enregistré, avec les exceptions listées dans [mode de permission lors de la reprise](/docs/fr/sessions#permission-mode-on-resume).2052 Lorsque vous reprenez avec `-p`, Claude Code ne restaure aucun autre mode de permission enregistré. Il démarre l'exécution dans le mode de permission dans lequel démarrerait une nouvelle exécution `claude -p` ; transmettez donc à nouveau `--permission-mode` ou `--dangerously-skip-permissions` 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 enregistré, à l'exception des cas répertoriés dans [mode de permission lors de la reprise](/docs/fr/sessions#permission-mode-on-resume).
2054</Note>2053</Note>
2055 2054
2056<h3 id="permissionrequest">2055<h3 id="permissionrequest">
2057 PermissionRequest2056 PermissionRequest
2058</h3>2057</h3>
2059 2058
2060S'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 de demande, comme les sous-agents en arrière-plan en [mode non interactif](/docs/fr/headless), Claude Code exécute tout de même ces hooks, et si aucun hook ne renvoie de décision, il refuse l'appel d'outil. Pour un appel qui atteint un `--permission-prompt-tool` ou le [callback `canUseTool`](/docs/fr/agent-sdk/permissions) de l'Agent SDK, les hooks s'exécutent en parallèle de votre hôte, et la première décision prise s'applique.2059S'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 de demande, comme les sous-agents en arrière-plan en [mode non interactif](/docs/fr/headless), Claude Code exécute tout de même ces hooks et, si aucun hook ne renvoie de décision, il refuse l'appel d'outil. Pour un appel qui atteint un `--permission-prompt-tool` ou le [callback `canUseTool`](/docs/fr/agent-sdk/permissions) de l'Agent SDK, les hooks s'exécutent en parallèle de votre hôte, et c'est la première décision prise qui s'applique.
2061Utilisez le [contrôle de décision de PermissionRequest](#permissionrequest-decision-control) pour autoriser ou refuser au nom de l'utilisateur.2060Utilisez le [contrôle de décision de PermissionRequest](#permissionrequest-decision-control) pour autoriser ou refuser au nom de l'utilisateur.
2062 2061
2063Utilisez cet événement lorsque vous avez besoin d'un signal au moment où Claude demande la permission d'utiliser un outil. Claude Code n'exécute un hook [Notification](#notification) de type `permission_prompt` qu'après que la demande a attendu environ six secondes.2062Utilisez cet événement lorsque vous avez besoin d'un signal dès que Claude demande la permission d'utiliser un outil. Claude Code n'exécute un hook [Notification](#notification) de type `permission_prompt` qu'après que la demande a attendu environ six secondes.
2064 2063
2065Claude Code n'exécute pas les hooks PermissionRequest pour la [requête réseau](/docs/fr/sandboxing#network-isolation) d'une commande exécutée dans le sandbox. Pour obtenir un signal pour cette demande, utilisez le type de notification `permission_prompt`.2064Claude Code n'exécute pas les hooks PermissionRequest pour la [requête réseau](/docs/fr/sandboxing#network-isolation) d'une commande exécutée dans le sandbox. Pour obtenir un signal pour cette demande, utilisez le type de notification `permission_prompt`.
2066 2065
2067Correspond au nom de l'outil, avec les mêmes valeurs que PreToolUse.2066Le matcher s'applique au nom de l'outil, avec les mêmes valeurs que PreToolUse.
2068 2067
2069<h4 id="permissionrequest-input">2068<h4 id="permissionrequest-input">
2070 Entrée de PermissionRequest2069 Entrée de PermissionRequest
2072 2071
2073Les 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 facultatif `permission_suggestions` contient les [mises à jour de permissions](#permission-update-entries) que Claude Code suggère pour cette demande, comme l'ajout d'une règle d'autorisation ou le changement du mode de permission.2072Les 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 facultatif `permission_suggestions` contient les [mises à jour de permissions](#permission-update-entries) que Claude Code suggère pour cette demande, comme l'ajout d'une règle d'autorisation ou le changement du mode de permission.
2074 2073
2075Le tableau `permission_suggestions` n'est pas une liste exacte des options que vous voyez, car chaque boîte de dialogue de permission construit ses propres options. Certaines boîtes de dialogue, comme celle des modifications de fichiers, ne lisent pas du tout le tableau et dérivent leurs options de la demande elle-même. Une boîte de dialogue qui le lit peut tout de même masquer 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. Elle peut également proposer des options sans entrée de suggestion, comme [**Yes, and switch to auto mode**](/docs/fr/permission-modes#switch-permission-modes), qui change directement le mode de permission plutôt que de passer par une mise à jour de permissions.2074Le tableau `permission_suggestions` n'est pas une liste exacte des options que vous voyez, car chaque boîte de dialogue de permission construit ses propres options. Certaines boîtes de dialogue, comme celle des modifications de fichiers, ne lisent pas du tout le tableau et dérivent leurs options de la demande elle-même. Une boîte de dialogue qui le lit peut tout de même masquer 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. Elle peut également proposer des options sans entrée de suggestion, comme [**Yes, and switch to auto mode**](/docs/fr/permission-modes#switch-permission-modes), qui change directement le mode de permission plutôt que via une mise à jour de permissions.
2076 2075
2077Les hooks PreToolUse s'exécutent avant chaque appel d'outil, qu'il nécessite une permission ou non. Les hooks PermissionRequest ne s'exécutent que lorsque Claude Code est sur le point de vous demander la permission, ou lorsqu'il refuserait autrement automatiquement un appel qui ne peut pas afficher de demande. Aucun des deux événements ne se déclenche pour [`EndConversation`](/docs/fr/tools-reference#endconversation-tool-behavior).2076Les hooks PreToolUse s'exécutent avant chaque appel d'outil, qu'il nécessite une permission ou non. Les hooks PermissionRequest ne s'exécutent que lorsque Claude Code est sur le point de vous demander la permission, ou lorsqu'il refuserait sinon automatiquement un appel qui ne peut pas afficher de demande. Aucun de ces événements ne se déclenche pour [`EndConversation`](/docs/fr/tools-reference#endconversation-tool-behavior).
2078 2077
2079```json theme={null}2078```json theme={null}
2080{2079{
2103 Contrôle de décision de PermissionRequest2102 Contrôle de décision de PermissionRequest
2104</h4>2103</h4>
2105 2104
2106Les hooks `PermissionRequest` peuvent autoriser ou refuser des demandes de permission. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, votre script de hook peut renvoyer un objet `decision` avec ces champs propres à l'événement :2105Les 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 renvoyer un objet `decision` avec ces champs propres à l'événement :
2107 2106
2108| Champ | Description |2107| Champ | Description |
2109| :- | :- |2108| :- | :- |
2110| `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 renvoyant `"allow"` ne remplace pas une règle de refus correspondante |2109| `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 ; un hook qui renvoie `"allow"` ne remplace donc pas une règle de refus correspondante |
2111| `updatedInput` | Pour `"allow"` uniquement : modifie les paramètres d'entrée de l'outil avant l'exécution. Remplace l'intégralité de l'objet d'entrée ; incluez donc les champs inchangés en plus des champs modifiés. L'entrée modifiée est réévaluée par rapport aux règles de refus et de demande |2110| `updatedInput` | Pour `"allow"` uniquement : modifie les paramètres d'entrée de l'outil avant l'exécution. Remplace l'intégralité de l'objet d'entrée ; incluez donc les champs inchangés avec ceux modifiés. L'entrée modifiée est réévaluée par rapport aux règles de refus et de demande |
2112| `updatedPermissions` | Pour `"allow"` uniquement : tableau d'[entrées de mise à jour de permissions](#permission-update-entries) à appliquer, comme l'ajout d'une règle d'autorisation ou le changement du mode de permission de la session |2111| `updatedPermissions` | Pour `"allow"` uniquement : tableau d'[entrées de mise à jour de permissions](#permission-update-entries) à appliquer, comme l'ajout d'une règle d'autorisation ou le changement du mode de permission de la session |
2113| `message` | Pour `"deny"` uniquement : indique à Claude pourquoi la permission a été refusée |2112| `message` | Pour `"deny"` uniquement : indique à Claude pourquoi la permission a été refusée |
2114| `interrupt` | Pour `"deny"` uniquement : si `true`, arrête Claude |2113| `interrupt` | Pour `"deny"` uniquement : si `true`, arrête Claude |
2130```2129```
2131 2130
2132<h4 id="permission-update-entries">2131<h4 id="permission-update-entries">
2133 Entrées de mise à jour de permissions2132 Entrées de mise à jour des permissions
2134</h4>2133</h4>
2135 2134
2136Le 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 possède un `type` qui détermine ses autres champs, et une `destination` qui contrôle où la modification est écrite.2135Le 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 possède un `type` qui détermine ses autres champs, ainsi qu'une `destination` qui contrôle l'emplacement où la modification est écrite.
2137 2136
2138| `type` | Champs | Effet |2137| `type` | Champs | Effet |
2139| :- | :- | :- |2138| :- | :- | :- |
2140| `addRules` | `rules`, `behavior`, `destination` | Ajoute des règles de permission. `rules` est un tableau d'objets `{toolName, ruleContent?}`. Omettez `ruleContent` pour faire correspondre l'outil entier. `behavior` vaut `"allow"`, `"deny"` ou `"ask"` |2139| `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` vaut `"allow"`, `"deny"` ou `"ask"` |
2141| `replaceRules` | `rules`, `behavior`, `destination` | Remplace toutes les règles du `behavior` donné à la `destination` par les `rules` fournies |2140| `replaceRules` | `rules`, `behavior`, `destination` | Remplace toutes les règles du `behavior` donné à la `destination` par les `rules` fournies |
2142| `removeRules` | `rules`, `behavior`, `destination` | Supprime les règles correspondantes du `behavior` donné |2141| `removeRules` | `rules`, `behavior`, `destination` | Supprime les règles correspondantes du `behavior` donné |
2143| `setMode` | `mode`, `destination` | Modifie le mode de permission. Les modes valides sont `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan`, et `manual` comme alias de `default` |2142| `setMode` | `mode`, `destination` | Modifie le mode de permission. Les modes valides sont `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan`, ainsi que `manual` comme alias de `default` |
2144| `addDirectories` | `directories`, `destination` | Ajoute des répertoires de travail. `directories` est un tableau de chaînes de chemins |2143| `addDirectories` | `directories`, `destination` | Ajoute des répertoires de travail. `directories` est un tableau de chaînes de chemins |
2145| `removeDirectories` | `directories`, `destination` | Supprime des répertoires de travail |2144| `removeDirectories` | `directories`, `destination` | Supprime des répertoires de travail |
2146 2145
2147<Note>2146<Note>
2148 `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 les paramètres gérés](/docs/fr/settings-reference#permissions-defaultmode). Sinon, la mise à jour n'a aucun effet. La mise à jour n'a également aucun effet 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).2147 `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 les paramètres gérés](/docs/fr/settings-reference#permissions-defaultmode). Sinon, la mise à jour n'a aucun effet. La mise à jour n'a également aucun effet 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).
2149 2148
2150 `bypassPermissions` n'est jamais conservé comme `defaultMode`, quelle que soit la valeur de `destination`.2149 `bypassPermissions` n'est jamais persisté comme `defaultMode`, quelle que soit la `destination`.
2151</Note>2150</Note>
2152 2151
2153Le champ `destination` de chaque entrée détermine si la modification reste en mémoire ou est conservée dans un fichier de paramètres.2152Le champ `destination` de chaque entrée détermine si la modification reste en mémoire ou est persistée dans un fichier de paramètres.
2154 2153
2155| `destination` | Écrit dans |2154| `destination` | Écrit dans |
2156| :- | :- |2155| :- | :- |
2169 2168
2170Correspond au nom de l'outil, avec les mêmes valeurs que PreToolUse.2169Correspond au nom de l'outil, avec les mêmes valeurs que PreToolUse.
2171 2170
2172Élargissez la correspondance lorsque le nom de l'outil n'est pas le bon filtre :2171Utilisez une correspondance plus large lorsque le nom de l'outil n'est pas le bon filtre :
2173 2172
2174* Pour exécuter un hook après la réussite de n'importe quel outil, omettez le `matcher` ou définissez-le sur `"*"`. Votre hook peut alors découvrir lui-même ce qui a changé, par exemple en exécutant `git status --porcelain`, qui liste aussi les fichiers non suivis que `git diff` ignore. Pour les appels d'outils qui échouent, ajoutez le même hook sous [PostToolUseFailure](#posttoolusefailure).2173* Pour exécuter un hook après la réussite de n'importe quel outil, omettez le `matcher` ou définissez-le sur `"*"`. Votre hook peut alors découvrir lui-même ce qui a changé, par exemple en exécutant `git status --porcelain`, qui liste également les fichiers non suivis que `git diff` ne voit pas. Pour les appels d'outils qui échouent, ajoutez le même hook sous [PostToolUseFailure](#posttoolusefailure).
2175* 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 extérieur à Claude Code réécrit le même fichier.2174* 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 extérieur à Claude Code réécrit le même fichier.
2176 2175
2177<h4 id="posttooluse-input">2176<h4 id="posttooluse-input">
2178 Entrée PostToolUse2177 Entrée PostToolUse
2179</h4>2178</h4>
2180 2179
2181Les 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 renvoyé. Le schéma exact de ces deux champs dépend de l'outil. Les chemins `tool_input` des outils de fichiers arrivent dans le même format que pour [PreToolUse](#pretooluse-input) : toujours absolus, avec les séparateurs natifs de la plateforme, donc des barres obliques inverses sous Windows. Pour un outil MCP, l'entrée contient également l'objet [`mcp_server`](#pretooluse-input).2180Les 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 renvoyé. Le schéma exact des deux dépend de l'outil. Les chemins `tool_input` des outils de fichiers arrivent dans le même format que pour [PreToolUse](#pretooluse-input) : toujours absolus, avec les séparateurs natifs de la plateforme, donc des barres obliques inverses sous Windows. Pour un outil MCP, l'entrée contient également l'objet [`mcp_server`](#pretooluse-input).
2182 2181
2183```json theme={null}2182```json theme={null}
2184{2183{
2209 Contrôle de décision PostToolUse2208 Contrôle de décision PostToolUse
2210</h4>2209</h4>
2211 2210
2212Les hooks `PostToolUse` peuvent fournir un retour à 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 renvoyer ces champs propres à l'événement :2211Les hooks `PostToolUse` peuvent fournir un retour à 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 renvoyer ces champs spécifiques à l'événement :
2213 2212
2214| Champ | Description |2213| Champ | Description |
2215| :- | :- |2214| :- | :- |
2216| `decision` | `"block"` ajoute la `reason` à côté du résultat de l'outil. Claude voit toujours la sortie d'origine ; pour la remplacer, utilisez `updatedToolOutput` |2215| `decision` | `"block"` ajoute la `reason` à côté du résultat de l'outil. Claude voit toujours la sortie d'origine ; pour la remplacer, utilisez `updatedToolOutput` |
2217| `reason` | Explication affichée à Claude lorsque `decision` vaut `"block"` |2216| `reason` | Explication affichée à Claude lorsque `decision` vaut `"block"` |
2218| `additionalContext` | Chaîne ajoutée au contexte de Claude avec le résultat de l'outil. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |2217| `additionalContext` | Chaîne ajoutée au contexte de Claude avec le résultat de l'outil. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |
2219| `classifierContext` | Courte note sur le résultat de cet appel destinée au classifieur du [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) plutôt qu'à Claude. Voir [Annoter un résultat pour le classifieur du mode auto](#annotate-a-result-for-the-auto-mode-classifier). Nécessite Claude Code v2.1.236 ou ultérieur |2218| `classifierContext` | Courte note sur le résultat de cet appel, destinée au classifieur du [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) plutôt qu'à Claude. Voir [Annoter un résultat pour le classifieur du mode auto](#annotate-a-result-for-the-auto-mode-classifier). Nécessite Claude Code v2.1.236 ou ultérieur |
2220| `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 |2219| `updatedToolOutput` | Remplace la sortie de l'outil par la valeur fournie avant son envoi à Claude. La valeur doit correspondre à la forme de sortie de l'outil |
2221| `updatedMCPToolOutput` | Remplace la sortie des [outils MCP](#match-mcp-tools) uniquement. Préférez `updatedToolOutput`, qui fonctionne pour tous les outils |2220| `updatedMCPToolOutput` | Remplace la sortie uniquement pour les [outils MCP](#match-mcp-tools). Préférez `updatedToolOutput`, qui fonctionne pour tous les outils |
2222 2221
2223L'exemple ci-dessous remplace la sortie d'un appel `Bash`. La valeur de remplacement correspond à la forme de sortie de l'outil `Bash` :2222L'exemple ci-dessous remplace la sortie d'un appel `Bash`. La valeur de remplacement correspond à la forme de sortie de l'outil `Bash` :
2224 2223
2238```2237```
2239 2238
2240<Warning>2239<Warning>
2241 `updatedToolOutput` ne modifie que ce que voit Claude. L'outil s'est déjà exécuté au moment où le hook se déclenche, donc les fichiers écrits, les commandes exécutées ou les requêtes 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, capture également la sortie d'origine avant l'exécution du hook. Pour empêcher ou modifier un appel d'outil avant son exécution, utilisez plutôt un hook [PreToolUse](#pretooluse).2240 `updatedToolOutput` ne modifie que ce que voit Claude. 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 requêtes 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'analytique, capture également la sortie d'origine avant l'exécution du hook. Pour empêcher ou modifier un appel d'outil avant son exécution, utilisez plutôt un hook [PreToolUse](#pretooluse).
2242 2241
2243 La valeur de remplacement doit correspondre à la forme de sortie de l'outil. Les outils intégrés renvoient des objets structurés plutôt que de simples chaînes. Par exemple, `Bash` renvoie 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 d'origine est utilisée. La sortie des outils MCP est transmise sans validation de schéma. Supprimer des détails d'erreur dont Claude a besoin peut l'amener à poursuivre sur une hypothèse erronée.2242 La valeur de remplacement doit correspondre à la forme de sortie de l'outil. Les outils intégrés renvoient des objets structurés plutôt que de simples chaînes. Par exemple, `Bash` renvoie 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 d'origine est utilisée. La sortie des outils MCP est transmise sans validation de schéma. Supprimer des détails d'erreur dont Claude a besoin peut l'amener à poursuivre sur une hypothèse erronée.
2244</Warning>2243</Warning>
2247 Annoter un résultat pour le classifieur du mode auto2246 Annoter un résultat pour le classifieur du mode auto
2248</h4>2247</h4>
2249 2248
2250Renvoyez `classifierContext` pour envoyer une courte note sur le résultat de l'appel d'outil au classifieur du [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) plutôt qu'à Claude. Le classifieur [ne reçoit jamais les résultats des outils eux-mêmes](/docs/fr/permission-modes#how-the-classifier-evaluates-actions), ce champ est donc le moyen prévu pour lui indiquer quelque chose sur ce qu'un appel a renvoyé avant qu'il n'examine les actions suivantes. Ce champ nécessite Claude Code v2.1.236 ou ultérieur.2249Renvoyez `classifierContext` pour envoyer une courte note sur le résultat de l'appel d'outil au classifieur du [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) plutôt qu'à Claude. Le classifieur [ne reçoit jamais les résultats des outils eux-mêmes](/docs/fr/permission-modes#how-the-classifier-evaluates-actions) ; ce champ est donc le moyen pris en charge de lui indiquer quelque chose sur ce qu'un appel a renvoyé avant qu'il n'examine les actions suivantes. Le champ nécessite Claude Code v2.1.236 ou ultérieur.
2251 2250
2252L'exemple ci-dessous indique au classifieur d'où provient la sortie d'une requête :2251L'exemple ci-dessous indique au classifieur d'où provient la sortie d'une requête :
2253 2252
2262 2261
2263Le poids que le classifieur accorde à la note dépend de l'endroit où vous avez configuré le hook :2262Le poids que le classifieur accorde à la note dépend de l'endroit où vous avez configuré le hook :
2264 2263
2265* **Hooks configurés dans Claude Code** : pour les hooks provenant des fichiers de paramètres, des plugins, des skills et du frontmatter des agents, le classifieur traite la note comme un contexte non vérifié fourni par l'application. La note n'établit jamais l'intention de l'utilisateur, et si elle affirme que vous avez approuvé ou demandé quelque chose, le classifieur vérifie cette affirmation par rapport à vos propres messages dans la conversation2264* **Hooks configurés dans Claude Code** : pour les hooks issus des fichiers de paramètres, des plugins, des skills et du frontmatter des agents, le classifieur traite la note comme un contexte non vérifié fourni par l'application. La note n'établit jamais l'intention de l'utilisateur, et si elle affirme que vous avez approuvé ou demandé quelque chose, le classifieur vérifie cette affirmation par rapport à vos propres messages dans la conversation
2266* **Callbacks Agent SDK en processus** : lorsqu'une application intégrant Claude Code enregistre le hook comme [callback du SDK TypeScript](/docs/fr/agent-sdk/hooks) et renvoie la note pendant la session en cours, le classifieur peut considérer une déclaration de l'utilisateur relayée dans la note comme une intention de l'utilisateur. Une telle déclaration peut satisfaire une exigence de consentement que le classifieur 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 la reprise d'une session, Claude Code traite les notes restaurées comme un contexte non vérifié. Lorsque des hooks des deux groupes annotent le même appel, le classifieur traite la note combinée comme non vérifiée2265* **Callbacks in-process de l'Agent SDK** : lorsqu'une application intégrant Claude Code enregistre le hook comme [callback du SDK TypeScript](/docs/fr/agent-sdk/hooks) et renvoie la note pendant la session en cours, le classifieur peut considérer une déclaration de l'utilisateur relayée dans la note comme une intention de l'utilisateur. Une telle déclaration peut satisfaire une exigence de consentement que le classifieur 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 la reprise d'une session, Claude Code traite les notes restaurées comme un contexte non vérifié. Lorsque des hooks des deux groupes annotent le même appel, le classifieur traite la note combinée comme non vérifiée
2267 2266
2268Claude Code applique ces limites lors de la transmission de la note :2267Claude Code applique ces limites lors de la transmission de la note :
2269 2268
2270* **Longueur** : Claude Code plafonne les notes d'un appel d'outil à 2 000 caractères et tronque le reste. Ce plafond est partagé entre tous les hooks qui répondent à cet appel2269* **Longueur** : Claude Code plafonne les notes d'un même appel d'outil à 2 000 caractères et tronque le reste. Ce plafond est partagé entre tous les hooks qui répondent à cet appel
2271* **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 a enregistré le résultat de l'outil2270* **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 a enregistré le résultat de l'outil
2272* **Appels que le classifieur n'enregistre pas** : la transcription du classifieur omet les consultations en lecture seule comme les lectures de fichiers et les recherches. Claude Code supprime une note attachée à l'un de ces appels2271* **Appels que le classifieur n'enregistre pas** : la transcription du classifieur omet les consultations en lecture seule, comme les lectures de fichiers et les recherches. Claude Code supprime une note attachée à l'un de ces appels
2273* **Interaction avec les réécritures** : lorsque la note décrit une sortie que vous remplacez avec `updatedToolOutput`, renvoyez les deux champs dans la même réponse de hook. Claude Code abandonne la note si cette réécriture est rejetée ou si la réécriture d'un autre hook la remplace. Claude Code transmet une note que vous renvoyez sans réécriture même lorsqu'un autre hook réécrit la sortie2272* **Interaction avec les réécritures** : lorsque la note décrit une sortie que vous remplacez par `updatedToolOutput`, renvoyez les deux champs dans la même réponse de hook. Claude Code abandonne la note si cette réécriture est rejetée ou si la réécriture d'un autre hook la remplace. Claude Code transmet une note que vous renvoyez sans réécriture même lorsqu'un autre hook réécrit la sortie
2274 2273
2275<Warning>2274<Warning>
2276 Le classifieur lit le contenu que vous placez dans `classifierContext` comme une information provenant de l'application qui héberge la session ; n'y copiez donc pas de sortie d'outil non fiable ni de texte tiers. Limitez la note à une courte affirmation concernant cet appel précis, comme un fait sur son origine ou une déclaration de l'utilisateur à son sujet ; n'utilisez pas ce champ pour transmettre des messages sans rapport ou un flux d'événements.2275 Le classifieur lit le contenu que vous placez dans `classifierContext` comme une information provenant de l'application qui héberge la session ; n'y copiez donc pas de sortie d'outil non fiable ni de texte tiers. Limitez la note à une courte assertion sur cet appel précis, comme un fait concernant son origine ou une déclaration de l'utilisateur à son sujet ; n'utilisez pas ce champ pour transmettre des messages sans rapport ou un flux d'événements.
2277</Warning>2276</Warning>
2278 2277
2279<h3 id="posttoolusefailure">2278<h3 id="posttoolusefailure">
2285Correspond au nom de l'outil, avec les mêmes valeurs que PreToolUse.2284Correspond au nom de l'outil, avec les mêmes valeurs que PreToolUse.
2286 2285
2287<Note>2286<Note>
2288 Cet événement ne se déclenche pas pour les appels d'outils rejetés avant l'exécution : un nom d'outil inconnu, une entrée qui échoue à la validation du schéma ou à une validation propre à l'outil, ou un refus de permission. Les rejets de validation sont renvoyés sous forme de résultats `tool_use_error` et se produisent avant l'exécution des hooks, ils ne déclenchent donc ni `PreToolUse` ni `PostToolUseFailure`. Les refus de permission déclenchent `PreToolUse` mais pas cet événement ; voir [PermissionDenied](#permissiondenied).2287 Cet événement ne se déclenche pas pour les appels d'outils rejetés avant l'exécution : un nom d'outil inconnu, une entrée qui échoue à la validation de schéma ou à la validation propre à l'outil, ou un refus de permission. Les rejets de validation sont renvoyés sous forme de résultats `tool_use_error` et surviennent avant l'exécution des hooks ; ils ne déclenchent donc ni `PreToolUse` ni `PostToolUseFailure`. Les refus de permission déclenchent `PreToolUse` mais pas cet événement ; voir [PermissionDenied](#permissiondenied).
2289</Note>2288</Note>
2290 2289
2291<h4 id="posttoolusefailure-input">2290<h4 id="posttoolusefailure-input">
2292 Entrée PostToolUseFailure2291 Entrée PostToolUseFailure
2293</h4>2292</h4>
2294 2293
2295Les hooks PostToolUseFailure reçoivent les mêmes champs `tool_name` et `tool_input` que PostToolUse, ainsi que des informations sur l'erreur sous forme de champs de premier niveau. Pour un outil MCP, ils reçoivent également l'objet [`mcp_server`](#pretooluse-input). Par exemple, une commande `npm test` en échec pourrait transmettre :2294Les hooks PostToolUseFailure reçoivent les mêmes champs `tool_name` et `tool_input` que PostToolUse, ainsi que des informations d'erreur sous forme de champs de premier niveau. Pour un outil MCP, ils reçoivent également l'objet [`mcp_server`](#pretooluse-input). Par exemple, une commande `npm test` en échec pourrait fournir :
2296 2295
2297```json theme={null}2296```json theme={null}
2298{2297{
2316| Champ | Description |2315| Champ | Description |
2317| :- | :- |2316| :- | :- |
2318| `error` | Chaîne décrivant ce qui s'est mal passé. Le format dépend de l'outil qui a échoué |2317| `error` | Chaîne décrivant ce qui s'est mal passé. Le format dépend de l'outil qui a échoué |
2319| `is_interrupt` | Booléen facultatif. Vrai lorsque l'échec est parvenu à Claude Code sous forme d'abandon plutôt que d'erreur signalée par l'outil. L'annulation d'un outil en cours d'exécution ne déclenche pas ce hook ; le résultat de l'outil contient alors le message d'interruption |2318| `is_interrupt` | Booléen facultatif. Vrai lorsque l'échec a atteint Claude Code sous forme d'abandon plutôt que d'erreur signalée par l'outil. L'annulation d'un outil en cours d'exécution ne déclenche pas ce hook ; le résultat de l'outil contient plutôt le message d'interruption |
2320| `duration_ms` | Facultatif. Durée d'exécution de l'outil en millisecondes. Exclut le temps passé dans les demandes de permission et les hooks PreToolUse |2319| `duration_ms` | Facultatif. Durée d'exécution de l'outil en millisecondes. Exclut le temps passé dans les demandes de permission et les hooks PreToolUse |
2321 2320
2322La chaîne `error` est généralement le même texte que Claude reçoit comme résultat de l'outil en échec. Son format varie selon l'outil et le type d'é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, et non comme un format stable.2321La chaîne `error` est généralement le même texte que Claude reçoit comme résultat de l'outil en échec. 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, et non comme un format stable.
2323 2322
2324* Pour Bash et PowerShell, une commande qui s'est exécutée puis terminée produit une première ligne `Exit code N`, suivie de toute la sortie produite par la commande en un seul bloc, avec stdout et stderr entremêlés2323* Pour Bash et PowerShell, une commande qui s'est exécutée et terminée produit une première ligne `Exit code N`, suivie de toute sortie produite par la commande sous forme d'un seul bloc où stdout et stderr sont entrelacés
2325* Un payload peut aussi contenir un simple message d'échec sans ligne de code de sortie, lorsque Claude Code n'a pas pu démarrer le processus shell lui-même2324* Un payload peut aussi contenir un simple message d'échec sans ligne de code de sortie, lorsque Claude Code n'a pas pu démarrer le processus shell lui-même
2326* Claude Code tronque le milieu des longues chaînes autour d'un marqueur `... [N characters truncated] ...`, et peut insérer ses propres lignes, comme `Command timed out after 2m 0s`2325* Claude Code tronque les longues chaînes en leur milieu autour d'un marqueur `... [N characters truncated] ...`, et peut insérer ses propres lignes, comme `Command timed out after 2m 0s`
2327 2326
2328<h4 id="posttoolusefailure-decision-control">2327<h4 id="posttoolusefailure-decision-control">
2329 Contrôle de décision PostToolUseFailure2328 Contrôle de décision PostToolUseFailure
2330</h4>2329</h4>
2331 2330
2332Les 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 renvoyer ces champs propres à l'événement :2331Les 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 renvoyer ces champs spécifiques à l'événement :
2333 2332
2334| Champ | Description |2333| Champ | Description |
2335| :- | :- |2334| :- | :- |
2348 PostToolBatch2347 PostToolBatch
2349</h3>2348</h3>
2350 2349
2351S'exécute une fois après la résolution de tous les appels d'outils d'un lot, avant que Claude Code n'envoie la requête suivante au modèle. `PostToolUse` se déclenche une fois par outil, ce qui signifie qu'il se déclenche de manière concurrente lorsque Claude effectue des appels d'outils parallèles. `PostToolBatch` se déclenche exactement une fois avec le lot complet ; c'est donc le bon endroit pour injecter un contexte qui dépend de l'ensemble des outils exécutés plutôt que d'un seul outil. Il n'y a pas de matcher pour cet événement.2350S'exécute une fois après la résolution de chaque appel d'outil d'un lot, avant que Claude Code n'envoie la requête suivante au modèle. `PostToolUse` se déclenche une fois par outil, ce qui signifie qu'il se déclenche de manière concurrente lorsque Claude effectue des appels d'outils en parallèle. `PostToolBatch` se déclenche exactement une fois avec le lot complet ; c'est donc le bon endroit pour injecter du contexte qui dépend de l'ensemble des outils exécutés plutôt que d'un outil en particulier. Il n'y a pas de matcher pour cet événement.
2352 2351
2353<h4 id="posttoolbatch-input">2352<h4 id="posttoolbatch-input">
2354 Entrée PostToolBatch2353 Entrée PostToolBatch
2380}2379}
2381```2380```
2382 2381
2383`tool_response` contient le même contenu que celui 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 tel que l'outil l'a émis. Pour `Read`, cela signifie du texte préfixé par des numéros de ligne plutôt que le contenu brut du fichier. Les réponses peuvent être volumineuses ; n'analysez donc que les champs dont vous avez besoin.2382`tool_response` contient le même contenu que celui 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 tel que l'outil l'a émis. Pour `Read`, cela signifie du texte préfixé par les numéros de ligne plutôt que le contenu brut du fichier. Les réponses peuvent être volumineuses ; analysez donc uniquement les champs dont vous avez besoin.
2384 2383
2385<Note>2384<Note>
2386 La forme de `tool_response` diffère de celle de `PostToolUse`. `PostToolUse` transmet l'objet `Output` structuré de l'outil, comme `{filePath: "...", type: "create"}` pour `Write` ; `PostToolBatch` transmet le contenu `tool_result` sérialisé que voit le modèle.2385 La forme de `tool_response` diffère de celle de `PostToolUse`. `PostToolUse` transmet l'objet `Output` structuré de l'outil, comme `{filePath: "...", type: "create"}` pour `Write` ; `PostToolBatch` transmet le contenu `tool_result` sérialisé que voit le modèle.
2390 Contrôle de décision PostToolBatch2389 Contrôle de décision PostToolBatch
2391</h4>2390</h4>
2392 2391
2393Les 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 renvoyer ces champs propres à l'événement :2392Les 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 renvoyer ces champs spécifiques à l'événement :
2394 2393
2395| Champ | Description |2394| Champ | Description |
2396| :- | :- |2395| :- | :- |
2405}2404}
2406```2405```
2407 2406
2408Renvoyer `decision: "block"` ou `continue: false` arrête la boucle agentique avant le prochain appel au modèle. Le message de blocage provient de la `reason` ou du `stopReason` JSON, ou de stderr avec le code de sortie 2. Vous le voyez comme un avertissement dans la transcription, et il reste dans la conversation, de sorte que Claude le voit lorsque la conversation reprend.2407Renvoyer `decision: "block"` ou `continue: false` arrête la boucle agentique avant le prochain appel au modèle. Le message de blocage provient de la `reason` ou du `stopReason` JSON, ou de stderr en cas de sortie avec le code 2. Vous le voyez comme un avertissement dans la transcription, et il reste dans la conversation ; Claude le voit donc lorsque la conversation se poursuit.
2409 2408
2410<h3 id="permissiondenied">2409<h3 id="permissiondenied">
2411 PermissionDenied2410 PermissionDenied
2412</h3>2411</h3>
2413 2412
2414S'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 verdict du classifieur parce qu'[un contrôle de sécurité distinct du mode auto a refusé la requête du classifieur lui-même](/docs/fr/errors#auto-mode-cannot-determine-the-safety-of-an-action) ou que sa réponse n'a pas pu être analysée. Ce hook ne se déclenche qu'en mode auto : il ne s'exécute pas lorsque vous refusez manuellement une boîte de dialogue de permission, lorsqu'un hook `PreToolUse` bloque un appel, ou lorsqu'une règle `deny` correspond. Utilisez-le pour journaliser les refus, ajuster la configuration ou indiquer au modèle qu'il peut réessayer l'appel d'outil.2413S'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 verdict du classifieur parce qu'[une vérification de sécurité distincte du mode auto a refusé la propre requête du classifieur](/docs/fr/errors#auto-mode-cannot-determine-the-safety-of-an-action) ou que sa réponse n'a pas pu être analysée. Ce hook ne se déclenche qu'en mode auto : il ne s'exécute pas lorsque vous refusez manuellement une boîte de dialogue de permission, lorsqu'un hook `PreToolUse` bloque un appel, ou lorsqu'une règle `deny` correspond. Utilisez-le pour journaliser les refus, ajuster la configuration ou indiquer au modèle qu'il peut réessayer l'appel d'outil.
2415 2414
2416Correspond au nom de l'outil, avec les mêmes valeurs que PreToolUse.2415Correspond au nom de l'outil, avec les mêmes valeurs que PreToolUse.
2417 2416
2440 2439
2441| Champ | Description |2440| Champ | Description |
2442| :- | :- |2441| :- | :- |
2443| `reason` | Le motif du refus. Pour un verdict du classifieur, 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 dû à l'indisponibilité du modèle du classifieur, il s'agit du texte fixe `Classifier unavailable` |2442| `reason` | La raison du refus. Pour un verdict du classifieur, dans la plupart des sessions, elle 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), elle commence par `Auto mode could not evaluate this action and is blocking it for safety`. Pour un refus dû à l'indisponibilité du modèle classifieur, il s'agit du texte fixe `Classifier unavailable` |
2444 2443
2445<h4 id="permissiondenied-decision-control">2444<h4 id="permissiondenied-decision-control">
2446 Contrôle de décision PermissionDenied2445 Contrôle de décision PermissionDenied
2459 2458
2460Lorsque `retry` vaut `true`, Claude Code ajoute un message à la conversation indiquant au modèle qu'il peut réessayer l'appel d'outil. Claude Code n'annule pas le refus lui-même. Si votre hook ne renvoie pas de JSON, ou renvoie `retry: false`, le refus est maintenu et le modèle reçoit le message de rejet d'origine.2459Lorsque `retry` vaut `true`, Claude Code ajoute un message à la conversation indiquant au modèle qu'il peut réessayer l'appel d'outil. Claude Code n'annule pas le refus lui-même. Si votre hook ne renvoie pas de JSON, ou renvoie `retry: false`, le refus est maintenu et le modèle reçoit le message de rejet d'origine.
2461 2460
2462Claude Code ignore `retry: true` lorsque le classifieur 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 pu être analysée, ou un contrôle de sécurité distinct du mode auto a refusé la requête du classifieur lui-même. Pour ces refus, Claude Code indique déjà au modèle, dans le message de rejet, s'il doit réessayer plus tard ou passer à autre chose.2461Claude Code ignore `retry: true` lorsque le classifieur 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 pu être analysée, ou une vérification de sécurité distincte du mode auto a refusé la propre requête du classifieur. Pour ces refus, Claude Code indique déjà au modèle, dans le message de rejet, s'il doit réessayer plus tard ou passer à autre chose.
2463 2462
2464<h3 id="notification">2463<h3 id="notification">
2465 Notification2464 Notification
2467 2466
2468S'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.2467S'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.
2469 2468
2470Vous recevez ces événements de hook même lorsque les notifications de bureau sont désactivées : le paramètre `preferredNotifChannel`, y compris `notifications_disabled`, ne modifie que la manière dont vous êtes alerté, et non l'exécution de votre hook.2469Vous recevez ces événements de hook même lorsque les notifications de bureau sont désactivées : le paramètre `preferredNotifChannel`, y compris `notifications_disabled`, ne modifie que la façon dont vous êtes alerté, et non le fait que votre hook s'exécute.
2471 2470
2472| Matcher | Quand il se déclenche |2471| Matcher | Quand il se déclenche |
2473| :- | :- |2472| :- | :- |
2474| `permission_prompt` | Claude a besoin que vous approuviez l'utilisation d'un outil ou la [requête réseau](/docs/fr/sandboxing#network-isolation) d'une commande en sandbox, et la demande attend depuis environ six secondes |2473| `permission_prompt` | Claude a besoin que vous approuviez une utilisation d'outil ou la [requête réseau](/docs/fr/sandboxing#network-isolation) d'une commande en sandbox, et la demande attend depuis environ six secondes |
2475| `idle_prompt` | Claude a fini de répondre il y a environ 60 secondes et vous n'avez rien saisi depuis |2474| `idle_prompt` | Claude a fini de répondre il y a environ 60 secondes et vous n'avez rien tapé depuis |
2476| `auth_success` | L'authentification se termine |2475| `auth_success` | L'authentification est terminée |
2477| `elicitation_dialog` | Un serveur MCP ouvre un formulaire d'élicitation et vous n'avez rien saisi depuis environ six secondes |2476| `elicitation_dialog` | Un serveur MCP ouvre un formulaire d'élicitation et vous n'avez rien tapé depuis environ six secondes |
2478| `elicitation_url_dialog` | Un serveur MCP vous demande d'ouvrir une URL dans le navigateur et vous n'avez rien saisi depuis environ six secondes |2477| `elicitation_url_dialog` | Un serveur MCP vous demande d'ouvrir une URL dans le navigateur et vous n'avez rien tapé depuis environ six secondes |
2479| `elicitation_complete` | Un serveur MCP signale qu'une [élicitation en mode URL](#elicitation-input) est terminée |2478| `elicitation_complete` | Un serveur MCP signale qu'une [élicitation en mode URL](#elicitation-input) est terminée |
2480| `elicitation_response` | Une réponse d'élicitation MCP est renvoyée au serveur |2479| `elicitation_response` | Une réponse d'élicitation MCP est renvoyée au serveur |
2481| `agent_needs_input` | Une session en arrière-plan commence à attendre votre saisie alors que la [vue des agents](/docs/fr/agent-view) est ouverte dans un terminal. Se déclenche également lorsqu'une session de terminal vous présente une [question de configuration du terminal d'un coéquipier d'une équipe d'agents](/docs/fr/agent-teams#choose-a-display-mode) ou l'avis du mode auto concernant les [frais de requêtes du classifieur](/docs/fr/auto-mode-classifier-billing) et que vous n'avez rien saisi depuis environ six secondes |2480| `agent_needs_input` | Une session en arrière-plan commence à attendre votre saisie alors que la [vue des agents](/docs/fr/agent-view) est ouverte dans un terminal. Se déclenche également lorsqu'une session de terminal vous affiche la [question de configuration du terminal d'un coéquipier d'une équipe d'agents](/docs/fr/agent-teams#choose-a-display-mode) ou l'avis du mode auto concernant les [frais de requêtes du classifieur](/docs/fr/auto-mode-classifier-billing) et que vous n'avez rien tapé depuis environ six secondes |
2482| `agent_completed` | Une session en arrière-plan se termine ou échoue. Se déclenche uniquement lorsque la [vue des agents](/docs/fr/agent-view) est ouverte dans un terminal |2481| `agent_completed` | Une session en arrière-plan se termine ou échoue. Se déclenche uniquement lorsque la [vue des agents](/docs/fr/agent-view) est ouverte dans un terminal |
2483| `quota_auto_resume_fired` | Claude Code poursuit votre tâche après qu'une limite d'utilisation de claude.ai l'a mise en pause : à la réinitialisation, ou plus tôt lorsqu'une action que vous effectuez dans Claude Code pendant l'attente, comme l'ajout de crédits d'utilisation, la mise à niveau de votre forfait ou le changement de modèle, rend l'utilisation à nouveau disponible, avec l'[exception du paramètre de modèle](/docs/fr/interactive-mode#wait-for-a-usage-limit-to-reset) |2482| `quota_auto_resume_fired` | Claude Code poursuit votre tâche après qu'une limite d'utilisation claude.ai l'a mise en pause : à la réinitialisation, ou plus tôt lorsqu'une action que vous effectuez dans Claude Code pendant l'attente, comme l'ajout de crédits d'utilisation, la mise à niveau de votre forfait ou le changement de modèle, rend à nouveau l'utilisation disponible, avec l'[exception liée au paramètre de modèle](/docs/fr/interactive-mode#wait-for-a-usage-limit-to-reset) |
2484| `quota_auto_resume_stale` | Une limite d'utilisation de claude.ai s'est réinitialisée pendant que votre ordinateur était en veille pendant plus d'environ 30 minutes. Claude Code attend que vous appuyiez sur `Enter` au lieu de poursuivre. Après une veille plus courte, il poursuit et déclenche `quota_auto_resume_fired` à la place |2483| `quota_auto_resume_stale` | Une limite d'utilisation claude.ai a été réinitialisée pendant que votre ordinateur était en veille depuis plus d'environ 30 minutes. Claude Code attend que vous appuyiez sur `Enter` au lieu de poursuivre. Après une veille plus courte, il poursuit et déclenche plutôt `quota_auto_resume_fired` |
2485| `quota_auto_resume_disabled` | Claude Code met fin à son attente d'une limite d'utilisation de claude.ai sans poursuivre votre tâche : [`autoContinueAtUsageLimit`](/docs/fr/settings-reference#autocontinueatusagelimit) a été désactivé ou la réinitialisation a été repoussée de plus de 24 heures pendant une attente que Claude Code a lancée de lui-même, la tâche poursuivie a continué d'atteindre la limite, ou la poursuite a été bloquée avant d'atteindre le modèle. Ne se déclenche pas lorsque vous appuyez sur `Esc` ou `Ctrl+C`, ou que vous choisissez **Don't continue automatically** |2484| `quota_auto_resume_disabled` | Claude Code met fin à son attente d'une limite d'utilisation claude.ai sans poursuivre votre tâche : [`autoContinueAtUsageLimit`](/docs/fr/settings-reference#autocontinueatusagelimit) a été désactivé ou la réinitialisation a été repoussée de plus de 24 heures pendant une attente que Claude Code avait lancée de lui-même, la tâche poursuivie a continué d'atteindre la limite, ou la poursuite 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 **Don't continue automatically** |
2486 2485
2487Les types `quota_auto_resume_fired`, `quota_auto_resume_stale` et `quota_auto_resume_disabled` nécessitent Claude Code v2.1.234 ou ultérieur.2486Les types `quota_auto_resume_fired`, `quota_auto_resume_stale` et `quota_auto_resume_disabled` nécessitent Claude Code v2.1.234 ou ultérieur.
2488 2487
2491`agent_needs_input` pour la question de configuration du terminal d'un coéquipier nécessite Claude Code v2.1.248 ou ultérieur.2490`agent_needs_input` pour la question de configuration du terminal d'un coéquipier nécessite Claude Code v2.1.248 ou ultérieur.
2492 2491
2493<Note>2492<Note>
2494 Les types `permission_prompt`, `idle_prompt`, `elicitation_dialog` et `elicitation_url_dialog` partagent leur minutage avec les notifications de bureau ; dans les sessions de terminal, vous ne les voyez donc que lorsque vous semblez être éloigné du terminal :2493 Les types `permission_prompt`, `idle_prompt`, `elicitation_dialog` et `elicitation_url_dialog` partagent leur temporisation avec les notifications de bureau ; dans les sessions de terminal, vous ne les voyez donc que lorsque vous semblez être absent du terminal :
2495 2494
2496 * Attendez-vous à `permission_prompt` lorsque vous n'avez rien saisi depuis environ six secondes. Le minuteur démarre lorsque la demande 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 plutôt [PermissionRequest](#permissionrequest).2495 * Attendez-vous à `permission_prompt` une fois que vous n'avez rien tapé depuis environ six secondes. Le minuteur démarre lorsque la demande 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 plutôt [PermissionRequest](#permissionrequest).
2497 * Attendez-vous à `idle_prompt` environ 60 secondes après que Claude a fini de répondre, et uniquement si vous n'avez rien saisi depuis et qu'aucun agent en arrière-plan, comme un [sous-agent](/docs/fr/sub-agents) en arrière-plan, n'est encore en cours d'exécution. Claude Code n'envoie pas `idle_prompt` pendant qu'il attend la réinitialisation d'une limite d'utilisation de claude.ai. Lorsque l'attente se termine d'elle-même, l'un des types `quota_auto_resume_*` se déclenche à la place.2496 * Attendez-vous à `idle_prompt` environ 60 secondes après que Claude a fini de répondre, et uniquement si vous n'avez rien tapé depuis et qu'aucun agent en arrière-plan, comme un [sous-agent](/docs/fr/sub-agents) en arrière-plan, n'est encore en cours d'exécution. Claude Code n'envoie pas `idle_prompt` pendant qu'il attend la réinitialisation d'une limite d'utilisation claude.ai. Lorsque l'attente se termine d'elle-même, l'un des types `quota_auto_resume_*` se déclenche à la place.
2498 * Attendez-vous à `elicitation_dialog` pour un formulaire d'élicitation, ou à `elicitation_url_dialog` pour une demande d'URL dans le navigateur, lorsque vous n'avez rien saisi depuis environ six secondes. Les deux partagent le même seuil de six secondes que `permission_prompt` : le minuteur démarre lorsque la boîte de dialogue apparaît, et chaque frappe le reporte.2497 * Attendez-vous à `elicitation_dialog` pour un formulaire d'élicitation, ou à `elicitation_url_dialog` pour une demande d'URL de navigateur, une fois que vous n'avez rien tapé depuis environ six secondes. Tous deux partagent le même seuil de six secondes que `permission_prompt` : le minuteur démarre lorsque la boîte de dialogue apparaît, et chaque frappe le reporte.
2499 2498
2500 Une demande de permission ou une élicitation qui arrive alors qu'une autre boîte de dialogue est affichée conserve le même seuil de six secondes, calculé à partir de l'arrivée de la demande. Sa notification peut vous parvenir alors que la demande attend encore derrière la boîte de dialogue ouverte.2499 Une demande de permission ou une élicitation qui arrive alors qu'une autre boîte de dialogue est affichée conserve le même seuil de six secondes, mesuré à partir de l'arrivée de la demande. Sa notification peut vous parvenir alors que la demande attend encore derrière la boîte de dialogue ouverte.
2501</Note>2500</Note>
2502 2501
2503Claude Code minute `permission_prompt` différemment dans les sessions où il envoie les demandes de permission au [callback `canUseTool`](/docs/fr/agent-sdk/user-input) de l'Agent SDK, ce qui est la façon dont Claude Desktop et l'extension VS Code hébergent Claude Code :2502Claude Code temporise `permission_prompt` différemment dans les sessions où il envoie les demandes de permission au [callback `canUseTool`](/docs/fr/agent-sdk/user-input) de l'Agent SDK, ce qui correspond à la façon dont Claude Desktop et l'extension VS Code hébergent Claude Code :
2504 2503
2505* Attendez-vous à `permission_prompt` environ six secondes après que Claude a demandé la permission. Claude Code ne le reporte pas pendant que vous tapez.2504* Attendez-vous à `permission_prompt` environ six secondes après que Claude a demandé la permission. Claude Code ne le reporte pas pendant que vous tapez.
2506* Si vous ou un hook [PermissionRequest](#permissionrequest) répondez plus tôt, Claude Code n'exécute pas `permission_prompt`.2505* Si vous ou un hook [PermissionRequest](#permissionrequest) répondez plus tôt, Claude Code n'exécute pas `permission_prompt`.
2508 2507
2509Avant la v2.1.233, `permission_prompt` ne se déclenchait pas dans ces sessions.2508Avant la v2.1.233, `permission_prompt` ne se déclenchait pas dans ces sessions.
2510 2509
2511Utilisez des matchers distincts pour exécuter différents gestionnaires selon le type de notification. Cette configuration déclenche un script d'alerte propre aux permissions lorsque Claude a besoin d'une approbation de permission, et une notification différente lorsque Claude est inactif :2510Utilisez des matchers distincts pour exécuter des gestionnaires différents selon le type de notification. Cette configuration déclenche un script d'alerte spécifique aux permissions lorsque Claude a besoin d'une approbation de permission et une notification différente lorsque Claude est inactif :
2512 2511
2513```json theme={null}2512```json theme={null}
2514{2513{
2555}2554}
2556```2555```
2557 2556
2558Les hooks Notification ne peuvent ni bloquer ni modifier les notifications. Claude Code supprime leurs champs `systemMessage` et `continue`, mais émet toujours [`terminalSequence`](#emit-terminal-notifications), sur lequel repose l'exemple de notification de bureau. Les hooks Notification sont destinés aux effets de bord, comme la transmission de la notification à un service externe.2557Les hooks Notification ne peuvent ni bloquer ni modifier les notifications. Claude Code supprime leurs champs `systemMessage` et `continue`, mais émet tout de même [`terminalSequence`](#emit-terminal-notifications), sur lequel repose l'exemple de notification de bureau. Les hooks Notification sont destinés à des effets de bord, comme le transfert de la notification vers un service externe.
2559 2558
2560<h3 id="subagentstart">2559<h3 id="subagentstart">
2561 SubagentStart2560 SubagentStart
2562</h3>2561</h3>
2563 2562
2564S'exécute lorsque Claude lance un sous-agent avec l'outil Agent, lorsque Claude [reprend un sous-agent](/docs/fr/sub-agents#resume-subagents), et chaque fois qu'un coéquipier en processus d'une [équipe d'agents](/docs/fr/agent-teams) traite un nouveau message. Prend en charge les matchers pour filtrer par nom de type d'agent. Pour les agents intégrés, il s'agit du nom de l'agent, comme `general-purpose`, `Explore` ou `Plan`. Pour les [sous-agents personnalisés](/docs/fr/sub-agents), il s'agit du champ `name` du frontmatter de l'agent, et non du nom de fichier.2563S'exécute lorsque Claude lance un sous-agent avec l'outil Agent, lorsque Claude [reprend un sous-agent](/docs/fr/sub-agents#resume-subagents), et chaque fois qu'un coéquipier in-process d'une [équipe d'agents](/docs/fr/agent-teams) traite un nouveau message. Prend en charge les matchers pour filtrer par nom de type d'agent. Pour les agents intégrés, il s'agit du nom de l'agent, comme `general-purpose`, `Explore` ou `Plan`. Pour les [sous-agents personnalisés](/docs/fr/sub-agents), il s'agit du champ `name` du frontmatter de l'agent, et non du nom de fichier.
2565 2564
2566Pour les sous-agents fournis par un [plugin](/docs/fr/plugins/overview), le type d'agent est l'identifiant propre au plugin, comme `my-plugin:reviewer`, et non le simple nom du frontmatter. Les deux-points font passer un nom propre au plugin par le traitement des expressions régulières ; ancrez donc le matcher avec `^` et `$` pour une correspondance exacte : `^my-plugin:reviewer$`.2565Pour les sous-agents fournis par un [plugin](/docs/fr/plugins/overview), le type d'agent est l'identifiant propre au plugin, comme `my-plugin:reviewer`, et non le simple nom du frontmatter. Les deux-points font passer un nom propre à un plugin par le chemin des expressions régulières ; ancrez donc le matcher avec `^` et `$` pour une correspondance exacte : `^my-plugin:reviewer$`.
2567 2566
2568<h4 id="subagentstart-input">2567<h4 id="subagentstart-input">
2569 Entrée SubagentStart2568 Entrée SubagentStart
2582}2581}
2583```2582```
2584 2583
2585Les hooks SubagentStart ne peuvent pas bloquer la création d'un 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 renvoyer :2584Les hooks SubagentStart ne peuvent pas bloquer la création du 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 renvoyer :
2586 2585
2587| Champ | Description |2586| Champ | Description |
2588| :- | :- |2587| :- | :- |
2597}2596}
2598```2597```
2599 2598
2600Lorsque le hook s'exécute à nouveau pour le même sous-agent, Claude Code n'injecte le contexte renvoyé que si le contexte du sous-agent ne contient pas déjà la copie d'une exécution précédente. La copie injectée au lancement reste en place, ce qui préserve le [cache de prompt](/docs/fr/prompt-caching#subagents-and-the-cache) du sous-agent. Après que la [compaction automatique](/docs/fr/sub-agents#auto-compaction) a supprimé cette copie, Claude Code injecte à nouveau le contexte de l'exécution suivante.2599Lorsque le hook s'exécute à nouveau pour le même sous-agent, Claude Code n'injecte le contexte renvoyé que si le contexte du sous-agent ne contient pas déjà la copie issue d'une exécution précédente. La copie injectée au lancement reste en place, ce qui préserve le [cache de prompts](/docs/fr/prompt-caching#subagents-and-the-cache) du sous-agent. Après que la [compaction automatique](/docs/fr/sub-agents#auto-compaction) a supprimé cette copie, Claude Code injecte à nouveau le contexte de l'exécution suivante.
2601 2600
2602<h3 id="subagentstop">2601<h3 id="subagentstop">
2603 SubagentStop2602 SubagentStop
2609 Entrée SubagentStop2608 Entrée SubagentStop
2610</h4>2609</h4>
2611 2610
2612En 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 par 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, afin que les hooks puissent y accéder sans analyser le fichier de transcription.2611En 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 par 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 imbriqué `subagents/`. Le champ `last_assistant_message` contient le contenu textuel de la réponse finale du sous-agent, ce qui permet aux hooks d'y accéder sans analyser le fichier de transcription.
2613 2612
2614Tous les événements SubagentStop ne proviennent pas d'un sous-agent lancé par Claude. Claude Code exécute également des agents internes pour certaines de ses propres fonctionnalités, comme les [suggestions de prompt](/docs/fr/interactive-mode#prompt-suggestions) et les [questions annexes `/btw`](/docs/fr/interactive-mode#side-questions-with-%2Fbtw), et SubagentStop se déclenche aussi lorsque l'un d'eux se termine. Pour ces événements, `agent_type` est le nom de l'agent sous lequel la session elle-même s'exécute, tel que défini avec [`--agent`](/docs/fr/cli-reference#cli-flags) ou le [paramètre `agent`](/docs/fr/settings-reference#agent), et une chaîne vide lorsque la session s'exécute sans agent.2613Tous les événements SubagentStop ne proviennent pas d'un sous-agent lancé par Claude. Claude Code exécute aussi des agents internes pour certaines de ses propres fonctionnalités, comme les [suggestions de prompts](/docs/fr/interactive-mode#prompt-suggestions) et les [questions annexes `/btw`](/docs/fr/interactive-mode#side-questions-with-%2Fbtw), et SubagentStop se déclenche également lorsque l'un d'eux se termine. Pour ces événements, `agent_type` est le nom de l'agent sous lequel la session elle-même s'exécute, tel que défini avec [`--agent`](/docs/fr/cli-reference#cli-flags) ou le [paramètre `agent`](/docs/fr/settings-reference#agent), et une chaîne vide lorsque la session s'exécute sans agent.
2615 2614
2616Un `matcher` qui nomme des types d'agents ne correspond pas à un `agent_type` vide. Un hook dont le matcher est omis, vaut `""` ou `"*"`, ou est une expression régulière correspondant à une chaîne vide, s'exécute également pour les événements dont l'`agent_type` est vide.2615Un `matcher` qui nomme des types d'agents ne correspond pas à un `agent_type` vide. Un hook dont le matcher est omis, vaut `""` ou `"*"`, ou est une expression régulière qui correspond à une chaîne vide, s'exécute également pour les événements avec un `agent_type` vide.
2617 2616
2618Sur Claude Code v2.1.271 ou ultérieur, un sous-agent qui s'exécute avec l'outil [`SubagentHandback`](/docs/fr/tools-reference) transmet son rapport via cet outil avant de s'arrêter. Le champ `last_assistant_message` contient alors le texte de clôture du sous-agent, le cas échéant, qui n'est pas le rapport transmis. Le rapport est l'entrée `message` de cet appel, qu'un hook `PreToolUse` ou `PostToolUse` correspondant à `SubagentHandback` reçoit sous la forme `tool_input.message`.2617Sur Claude Code v2.1.271 ou ultérieur, un sous-agent qui s'exécute avec l'outil [`SubagentHandback`](/docs/fr/tools-reference) transmet son rapport via cet outil avant de s'arrêter. Le champ `last_assistant_message` contient alors le texte de clôture du sous-agent, le cas échéant, qui n'est pas le rapport transmis. Le rapport est l'entrée `message` de cet appel, qu'un hook `PreToolUse` ou `PostToolUse` correspondant à `SubagentHandback` reçoit sous la forme `tool_input.message`.
2619 2618
2620Les hooks SubagentStop reçoivent également les tableaux `background_tasks` et `session_crons` décrits dans [Entrée Stop](#stop-input). Ces deux tableaux portent sur la session parente, et non sur le sous-agent.2619Les hooks SubagentStop reçoivent également les tableaux `background_tasks` et `session_crons` décrits dans [Entrée Stop](#stop-input). Les deux tableaux sont limités à la session parente, et non au sous-agent.
2621 2620
2622```json theme={null}2621```json theme={null}
2623{2622{
2636}2635}
2637```2636```
2638 2637
2639Les 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 sur `"SubagentStop"`, pour un retour non lié à une erreur qui maintient le sous-agent en cours d'exécution. Renvoyer `decision: "block"` avec une `reason` maintient le sous-agent en cours d'exécution et lui transmet `reason` comme instruction suivante. Un hook qui bloque en se terminant avec le code 2 transmet son message stderr de la même manière. Pour injecter du contexte dans la session parente après le retour d'un sous-agent, utilisez plutôt un hook [`PostToolUse`](#posttooluse) sur l'outil `Agent`.2638Les 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 sur `"SubagentStop"`, pour un retour sans erreur qui maintient le sous-agent en cours d'exécution. Renvoyer `decision: "block"` avec une `reason` maintient le sous-agent en cours d'exécution et lui transmet `reason` comme prochaine instruction. Un hook qui bloque en sortant avec le code 2 transmet son message stderr de la même manière. Pour injecter du contexte dans la session parente après le retour d'un sous-agent, utilisez plutôt un hook [`PostToolUse`](#posttooluse) sur l'outil `Agent`.
2640 2639
2641<h3 id="taskcreated">2640<h3 id="taskcreated">
2642 TaskCreated2641 TaskCreated
2650 Entrée TaskCreated2649 Entrée TaskCreated
2651</h4>2650</h4>
2652 2651
2653En plus des [champs d'entrée communs](#common-input-fields), les hooks TaskCreated reçoivent `task_id`, `task_subject` et, de manière facultative, `task_description`, `teammate_name` et `team_name`.2652En plus des [champs d'entrée communs](#common-input-fields), les hooks TaskCreated reçoivent `task_id`, `task_subject` et, facultativement, `task_description`, `teammate_name` et `team_name`.
2654 2653
2655```json theme={null}2654```json theme={null}
2656{2655{
2673| `task_description` | Description détaillée de la tâche. Peut être absent |2672| `task_description` | Description détaillée de la tâche. Peut être absent |
2674| `teammate_name` | Nom du coéquipier qui crée la tâche. Peut être absent |2673| `teammate_name` | Nom du coéquipier qui crée la tâche. Peut être absent |
2675| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |2674| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |
2675| `agent_id` | Pour cet événement, le [champ d'entrée commun](#common-input-fields) identifie le sous-agent ou le [coéquipier in-process](/docs/fr/agent-teams#choose-a-display-mode) qui crée la tâche. Peut être absent. Nécessite Claude Code v2.1.290 ou ultérieur |
2676 2676
2677<h4 id="taskcreated-decision-control">2677<h4 id="taskcreated-decision-control">
2678 Contrôle de décision TaskCreated2678 Contrôle de décision TaskCreated
2679</h4>2679</h4>
2680 2680
2681Un hook TaskCreated peut bloquer la création de deux manières. Dans les deux cas, Claude Code supprime la tâche et renvoie votre message à Claude comme erreur de l'outil. Claude Code ignore `continue: false` pour cet événement et Claude continue de travailler.2681Un hook TaskCreated peut bloquer la création de deux façons. Dans les deux cas, Claude Code supprime la tâche et renvoie votre message à Claude comme erreur de l'outil. Claude Code ignore `continue: false` pour cet événement et Claude continue de travailler.
2682 2682
2683* **Code de sortie 2** : Claude Code renvoie le texte de stderr comme message.2683* **Code de sortie 2** : Claude Code renvoie le texte de stderr comme message.
2684* **JSON `{"decision": "block", "reason": "..."}`** : Claude Code renvoie `reason` comme message.2684* **JSON `{"decision": "block", "reason": "..."}`** : Claude Code renvoie `reason` comme message.
2702 TaskCompleted2702 TaskCompleted
2703</h3>2703</h3>
2704 2704
2705S'exécute lorsqu'une tâche est en cours de marquage comme terminée. Cela se déclenche dans deux situations : lorsqu'un agent marque explicitement une tâche comme terminé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-le pour imposer des critères d'achèvement, comme la réussite des tests ou des vérifications de lint, avant qu'une tâche puisse être clôturée.2705S'exécute lorsqu'une tâche est en cours de marquage comme terminée. Cela se produit dans deux situations : lorsqu'un agent marque explicitement une tâche comme terminé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-le pour imposer des critères d'achèvement, comme la réussite des tests ou des vérifications de lint, avant qu'une tâche puisse être clôturée.
2706 2706
2707Les hooks TaskCompleted ne prennent pas en charge les matchers et se déclenchent à chaque occurrence.2707Les hooks TaskCompleted ne prennent pas en charge les matchers et se déclenchent à chaque occurrence.
2708 2708
2710 Entrée TaskCompleted2710 Entrée TaskCompleted
2711</h4>2711</h4>
2712 2712
2713En plus des [champs d'entrée communs](#common-input-fields), les hooks TaskCompleted reçoivent `task_id`, `task_subject` et, de manière facultative, `task_description`, `teammate_name` et `team_name`.2713En plus des [champs d'entrée communs](#common-input-fields), les hooks TaskCompleted reçoivent `task_id`, `task_subject` et, facultativement, `task_description`, `teammate_name` et `team_name`.
2714 2714
2715```json theme={null}2715```json theme={null}
2716{2716{
2734| `task_description` | Description détaillée de la tâche. Peut être absent |2734| `task_description` | Description détaillée de la tâche. Peut être absent |
2735| `teammate_name` | Nom du coéquipier qui termine la tâche. Peut être absent |2735| `teammate_name` | Nom du coéquipier qui termine la tâche. Peut être absent |
2736| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |2736| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |
2737| `agent_id` | Pour cet événement, le [champ d'entrée commun](#common-input-fields) identifie le sous-agent ou le [coéquipier in-process](/docs/fr/agent-teams#choose-a-display-mode) qui termine la tâche. Peut être absent. Nécessite Claude Code v2.1.290 ou ultérieur |
2737 2738
2738<h4 id="taskcompleted-decision-control">2739<h4 id="taskcompleted-decision-control">
2739 Contrôle de décision TaskCompleted2740 Contrôle de décision TaskCompleted
2740</h4>2741</h4>
2741 2742
2742Les hooks TaskCompleted offrent deux manières de contrôler l'achèvement des tâches :2743Les hooks TaskCompleted prennent en charge deux façons de contrôler l'achèvement des tâches :
2743 2744
2744* **Code de sortie 2** : la tâche n'est pas marquée comme terminée et le message stderr est renvoyé au modèle comme retour.2745* **Code de sortie 2** : la tâche n'est pas marquée comme terminée et le message stderr est renvoyé au modèle comme retour.
2745* **JSON `{"continue": false, "stopReason": "..."}`** : lorsque l'événement a été déclenché par un coéquipier terminant son tour, arrête complètement le coéquipier, comme le comportement du hook `Stop`. Le `stopReason` est affiché à l'utilisateur. Lorsque l'événement a été déclenché par l'outil `TaskUpdate`, Claude Code ignore `continue: false` ; le code de sortie 2 bloque toujours l'achèvement.2746* **JSON `{"continue": false, "stopReason": "..."}`** : lorsque c'est un coéquipier terminant son tour qui a déclenché l'événement, arrête complètement le coéquipier, comme le comportement du hook `Stop`. Le `stopReason` est affiché à l'utilisateur. Lorsque c'est l'outil `TaskUpdate` qui a déclenché l'événement, Claude Code ignore `continue: false` ; le code de sortie 2 bloque toujours l'achèvement.
2746 2747
2747Cet exemple exécute les tests et bloque l'achèvement de la tâche s'ils échouent :2748Cet exemple exécute les tests et bloque l'achèvement de la tâche s'ils échouent :
2748 2749
2764 Stop2765 Stop
2765</h3>2766</h3>
2766 2767
2767S'exécute lorsque l'agent principal de Claude Code a fini de répondre. Ne s'exécute pas2768S'exécute lorsque l'agent principal de Claude Code a fini de répondre. Ne s'exécute pas si
2768si l'arrêt est dû à une interruption de l'utilisateur. Les erreurs d'API déclenchent2769l'arrêt est dû à une interruption par l'utilisateur. Les erreurs d'API déclenchent
2769[StopFailure](#stopfailure) à la place.2770plutôt [StopFailure](#stopfailure).
2770 2771
2771<Tip>2772<Tip>
2772 La commande [`/goal`](/docs/fr/goal) est un raccourci intégré pour un hook Stop basé sur un prompt et limité à la session. Utilisez-la lorsque vous voulez que Claude continue de travailler vers une condition sans écrire de configuration de hook.2773 La commande [`/goal`](/docs/fr/goal) est un raccourci intégré pour un hook Stop basé sur un prompt et limité à la session. Utilisez-la lorsque vous voulez que Claude continue de travailler vers une condition sans écrire de configuration de hook.
2776 Entrée Stop2777 Entrée Stop
2777</h4>2778</h4>
2778 2779
2779En 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` vaut `true` lorsque Claude Code poursuit déjà à la suite 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.2780En 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` vaut `true` lorsque Claude Code poursuit 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.
2780 2781
2781Claude Code applique un plafond de 8 poursuites consécutives : après que les hooks Stop ont prolongé le tour huit fois d'affilée, Claude Code remplace le blocage suivant et met fin au tour. Le décompte des poursuites consécutives est réinitialisé chaque fois que Claude appelle un outil. Pour relever ce plafond, définissez [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/fr/env-vars).2782Claude Code applique un plafond de 8 poursuites consécutives : après que les hooks stop ont fait poursuivre le tour huit fois de suite, Claude Code remplace le blocage suivant et met fin au tour. Le compteur de poursuites consécutives est réinitialisé chaque fois que Claude appelle un outil. Pour relever ce plafond, définissez [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/fr/env-vars).
2782 2783
2783Le champ `last_assistant_message` contient le contenu textuel de la réponse finale de Claude, afin que les hooks puissent 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 à voix haute ou de notification, utilisez ce champ plutôt que de lire `transcript_path` : il n'est pas garanti, sur toutes les versions, que le fichier de transcription contienne le message final au moment de Stop.2784Le champ `last_assistant_message` contient le contenu textuel de la réponse finale de Claude, ce qui permet aux hooks d'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 à voix haute ou de notification, utilisez ce champ plutôt que de lire `transcript_path` : il n'est pas garanti, sur toutes les versions, que le fichier de transcription inclue le message final au moment de Stop.
2784 2785
2785Les tableaux `background_tasks` et `session_crons` permettent aux hooks de distinguer « la session est terminée » de « la session est en pause en attendant qu'un travail en arrière-plan la réveille ». Les deux tableaux sont présents lorsque le registre des tâches est accessible et sont vides lorsque rien n'est en cours ni planifié.2786Les tableaux `background_tasks` et `session_crons` permettent aux hooks de distinguer « la session est terminée » de « la session est en pause en attendant qu'un travail en arrière-plan la réveille ». Les deux tableaux sont présents lorsque le registre des tâches est accessible et sont vides lorsque rien n'est en cours ni planifié.
2786 2787
2789| Champ | Description |2790| Champ | Description |
2790| :- | :- |2791| :- | :- |
2791| `id` | Identifiant de la tâche |2792| `id` | Identifiant de la tâche |
2792| `type` | Libellé lisible du type de tâche, comme `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` ou `MCP task`. Chaque libellé identifie la fonctionnalité de Claude Code qui a créé la tâche. Revient au discriminant brut pour les types non reconnus |2793| `type` | Libellé lisible du type de tâche, comme `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` ou `MCP task`. Chaque libellé identifie la fonctionnalité de Claude Code qui a créé la tâche. Se rabat sur le discriminant brut pour les types non reconnus |
2793| `status` | Statut actuel de la tâche |2794| `status` | Statut actuel de la tâche |
2794| `description` | Description en texte libre, plafonnée à 1000 caractères avec un marqueur `… [+N chars]` dans la chaîne en cas de troncature |2795| `description` | Description en texte libre, plafonnée à 1000 caractères avec un marqueur `… [+N chars]` dans la chaîne en cas de troncature |
2795| `command` | Ligne de commande shell, plafonnée à 1000 caractères. Présent uniquement pour les tâches `shell` |2796| `command` | Ligne de commande shell, plafonnée à 1000 caractères. Présent uniquement pour les tâches `shell` |
2798| `tool` | Nom de l'outil MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |2799| `tool` | Nom de l'outil MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |
2799| `name` | Nom du workflow. Présent uniquement pour les tâches `workflow` |2800| `name` | Nom du workflow. Présent uniquement pour les tâches `workflow` |
2800 2801
2801Chaque entrée de `session_crons` décrit un réveil planifié limité à la session, provenant de `CronCreate`, `ScheduleWakeup` et `/loop` :2802Chaque entrée de `session_crons` décrit un réveil planifié limité à la session, issu de `CronCreate`, `ScheduleWakeup` et `/loop` :
2802 2803
2803| Champ | Description |2804| Champ | Description |
2804| :- | :- |2805| :- | :- |
2842 Contrôle de décision Stop2843 Contrôle de décision Stop
2843</h4>2844</h4>
2844 2845
2845Les 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 renvoyer ces champs propres à l'événement :2846Les 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 renvoyer ces champs spécifiques à l'événement :
2846 2847
2847| Champ | Description |2848| Champ | Description |
2848| :- | :- |2849| :- | :- |
2849| `decision` | `"block"` empêche Claude de s'arrêter. Omettez-le pour permettre à Claude de s'arrêter |2850| `decision` | `"block"` empêche Claude de s'arrêter. Omettez-le pour permettre à Claude de s'arrêter |
2850| `reason` | Obligatoire lorsque `decision` vaut `"block"`. Indique à Claude pourquoi il doit continuer |2851| `reason` | Obligatoire lorsque `decision` vaut `"block"`. Indique à Claude pourquoi il doit continuer |
2851| `hookSpecificOutput.additionalContext` | Retour non lié à une erreur pour Claude. La conversation continue afin que Claude puisse agir en conséquence, mais contrairement à `decision: "block"`, il est affiché dans la transcription comme un retour de hook plutôt que comme une erreur de hook |2852| `hookSpecificOutput.additionalContext` | Retour sans erreur pour Claude. La conversation se poursuit pour que Claude puisse y donner suite, mais contrairement à `decision: "block"`, il est affiché dans la transcription comme un retour de hook plutôt que comme une erreur de hook |
2852 2853
2853Un hook qui bloque en se terminant avec le code 2 est traité de la même manière que `reason` : Claude reçoit le message stderr comme explication de la raison pour laquelle il doit continuer.2854Un hook qui bloque en sortant avec le code 2 est acheminé de la même manière que `reason` : Claude reçoit le message stderr comme explication de la raison pour laquelle il doit continuer.
2854 2855
2855```json theme={null}2856```json theme={null}
2856{2857{
2859}2860}
2860```2861```
2861 2862
2862Utilisez `additionalContext` lorsque le hook fonctionne comme prévu et donne des indications à Claude, comme « exécuter la suite de tests avant de terminer ». Il fait continuer la conversation avec les mêmes protections contre les boucles que `decision: "block"`, à savoir l'entrée `stop_hook_active` et le plafond de 8 poursuites consécutives, mais la transcription l'étiquette `Stop hook feedback` et aucune notification d'erreur de hook n'est affichée :2863Utilisez `additionalContext` lorsque le hook fonctionne comme prévu et donne des indications à Claude, comme « exécuter la suite de tests avant de terminer ». Il fait se poursuivre la conversation avec les mêmes protections contre les boucles que `decision: "block"`, à savoir l'entrée `stop_hook_active` et le plafond de 8 poursuites consécutives, mais la transcription l'étiquette `Stop hook feedback` et aucune notification d'erreur de hook n'est affichée :
2863 2864
2864```json theme={null}2865```json theme={null}
2865{2866{
2880 Entrée StopFailure2881 Entrée StopFailure
2881</h4>2882</h4>
2882 2883
2883En plus des [champs d'entrée communs](#common-input-fields), les hooks StopFailure reçoivent `error`, un `error_details` facultatif et un `last_assistant_message` facultatif. Le champ `error` identifie le type d'erreur et est utilisé pour le filtrage par matcher.2884En plus des [champs d'entrée communs](#common-input-fields), les hooks StopFailure reçoivent `error`, `error_details` facultatif et `last_assistant_message` facultatif. Le champ `error` identifie le type d'erreur et est utilisé pour le filtrage par matcher.
2884 2885
2885| Champ | Description |2886| Champ | Description |
2886| :- | :- |2887| :- | :- |
2887| `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` |2888| `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` |
2888| `error_details` | Détails supplémentaires sur l'erreur, lorsqu'ils sont disponibles |2889| `error_details` | Détails supplémentaires sur l'erreur, lorsqu'ils sont disponibles |
2889| `last_assistant_message` | Le texte d'erreur 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 de l'API elle-même, comme `"API Error: Rate limit reached"` |2890| `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 d'API elle-même, comme `"API Error: Rate limit reached"` |
2890 2891
2891```json theme={null}2892```json theme={null}
2892{2893{
2906 TeammateIdle2907 TeammateIdle
2907</h3>2908</h3>
2908 2909
2909S'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-le pour imposer des contrôles qualité avant qu'un coéquipier n'arrête de travailler, par exemple en exigeant la réussite des vérifications de lint ou en vérifiant l'existence des fichiers de sortie.2910S'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-le pour imposer des contrôles qualité avant qu'un coéquipier arrête de travailler, par exemple en exigeant la réussite des vérifications de lint ou en vérifiant que les fichiers de sortie existent.
2910 2911
2911Les hooks TeammateIdle ne prennent pas en charge les matchers et se déclenchent à chaque occurrence.2912Les hooks TeammateIdle ne prennent pas en charge les matchers et se déclenchent à chaque occurrence.
2912 2913
2930 2931
2931| Champ | Description |2932| Champ | Description |
2932| :- | :- |2933| :- | :- |
2933| `teammate_name` | Nom du coéquipier qui est sur le point de devenir inactif |2934| `teammate_name` | Nom du coéquipier sur le point de devenir inactif |
2934| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |2935| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |
2936| `agent_id` | Pour cet événement, le [champ d'entrée commun](#common-input-fields) identifie le [coéquipier in-process](/docs/fr/agent-teams#choose-a-display-mode) sur le point de devenir inactif. Peut être absent. Nécessite Claude Code v2.1.290 ou ultérieur |
2935 2937
2936<h4 id="teammateidle-decision-control">2938<h4 id="teammateidle-decision-control">
2937 Contrôle de décision TeammateIdle2939 Contrôle de décision TeammateIdle
2938</h4>2940</h4>
2939 2941
2940Les hooks TeammateIdle offrent deux manières de contrôler le comportement du coéquipier :2942Les hooks TeammateIdle prennent en charge deux façons de contrôler le comportement des coéquipiers :
2941 2943
2942* **Code de sortie 2** : le coéquipier reçoit le message stderr comme retour et continue de travailler au lieu de devenir inactif.2944* **Code de sortie 2** : le coéquipier reçoit le message stderr comme retour et continue de travailler au lieu de devenir inactif.
2943* **JSON `{"continue": false, "stopReason": "..."}`** : arrête complètement le coéquipier, comme le comportement du hook `Stop`. Le `stopReason` est affiché à l'utilisateur.2945* **JSON `{"continue": false, "stopReason": "..."}`** : arrête complètement le coéquipier, comme le comportement du hook `Stop`. Le `stopReason` est affiché à l'utilisateur.
2959 ConfigChange2961 ConfigChange
2960</h3>2962</h3>
2961 2963
2962S'exécute lorsqu'un fichier de configuration change pendant une session. Utilisez-le pour auditer les modifications de paramètres, appliquer des politiques de sécurité ou bloquer les modifications non autorisées des fichiers de configuration.2964S'exécute lorsqu'un fichier de configuration change au cours d'une session. Utilisez-le pour auditer les modifications de paramètres, appliquer des politiques de sécurité ou bloquer les modifications non autorisées des fichiers de configuration.
2963 2965
2964Claude 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 ne les exécute que lorsque `managed-settings.json` ou un fichier de `managed-settings.d/` change. Il applique les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) et les modifications des préférences gérées macOS ou de la politique du registre Windows sans les exécuter. Sous WSL avec [`wslInheritsWindowsSettings`](/docs/fr/settings-reference#wslinheritswindowssettings), il applique également un fichier de paramètres gérés modifié côté Windows lors de son interrogation de politique, sans les exécuter.2966Claude 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 ne les exécute que lorsque `managed-settings.json` ou un fichier de `managed-settings.d/` change. Il applique les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) et les modifications des préférences gérées macOS ou de la politique du registre Windows sans les exécuter. Sous WSL avec [`wslInheritsWindowsSettings`](/docs/fr/settings-reference#wslinheritswindowssettings), il applique également un fichier de paramètres gérés modifié côté Windows lors de son interrogation de la politique, sans les exécuter.
2965 2967
2966Le matcher filtre sur la source de configuration :2968Le matcher filtre sur la source de la configuration :
2967 2969
2968| Matcher | Quand il se déclenche |2970| Matcher | Quand il se déclenche |
2969| :- | :- |2971| :- | :- |
2997 Entrée ConfigChange2999 Entrée ConfigChange
2998</h4>3000</h4>
2999 3001
3000En plus des [champs d'entrée communs](#common-input-fields), les hooks ConfigChange reçoivent `source` et, de manière facultative, `file_path`. Le champ `source` indique quel type de configuration a changé, et `file_path` fournit le chemin du fichier précis qui a été modifié.3002En plus des [champs d'entrée communs](#common-input-fields), les hooks ConfigChange reçoivent `source` et, facultativement, `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é.
3001 3003
3002```json theme={null}3004```json theme={null}
3003{3005{
3014 Contrôle de décision ConfigChange3016 Contrôle de décision ConfigChange
3015</h4>3017</h4>
3016 3018
3017Les hooks ConfigChange peuvent empêcher des modifications de configuration de prendre effet. Utilisez le code de sortie 2 ou une `decision` JSON pour empêcher la modification. En cas de blocage, les nouveaux paramètres ne sont pas appliqués à la session en cours.3019Les hooks ConfigChange peuvent empêcher les modifications de configuration de prendre effet. Utilisez le code de sortie 2 ou une `decision` JSON pour empêcher la modification. En cas de blocage, les nouveaux paramètres ne sont pas appliqués à la session en cours.
3018 3020
3019| Champ | Description |3021| Champ | Description |
3020| :- | :- |3022| :- | :- |
3030 3032
3031Les modifications `policy_settings` ne peuvent pas être bloquées. Les hooks se déclenchent toujours pour les sources `policy_settings` lorsqu'un fichier de paramètres gérés sur la machine change, ce qui vous permet de les utiliser pour journaliser ces modifications, 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 des [paramètres gérés par le serveur](/docs/fr/server-managed-settings) arrivent ou sont actualisés.3033Les modifications `policy_settings` ne peuvent pas être bloquées. Les hooks se déclenchent toujours pour les sources `policy_settings` lorsqu'un fichier de paramètres gérés sur la machine change, ce qui vous permet de les utiliser pour journaliser ces modifications, 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 des [paramètres gérés par le serveur](/docs/fr/server-managed-settings) arrivent ou sont actualisés.
3032 3034
3033Claude Code applique la décision de blocage issue de la sortie JSON d'un hook ConfigChange et supprime `systemMessage` et `continue`. Une modification bloquée n'affiche aucun message, ni à vous ni à Claude, que vous bloquiez avec `reason` ou avec stderr et le code de sortie 2. Claude Code écrit seulement une ligne dans le log de débogage.3035Claude Code applique la décision de blocage issue de la sortie JSON d'un hook ConfigChange et supprime `systemMessage` et `continue`. Une modification bloquée ne fait remonter aucun message, ni à vous ni à Claude, que vous bloquiez avec `reason` ou avec stderr en sortant avec le code 2. Claude Code se contente d'écrire une ligne dans le log de débogage.
3034 3036
3035<h3 id="cwdchanged">3037<h3 id="cwdchanged">
3036 CwdChanged3038 CwdChanged
3037</h3>3039</h3>
3038 3040
3039S'exécute lorsqu'une commande shell dans la conversation principale change le répertoire de travail, par exemple lorsque Claude exécute une commande `cd`. Utilisez-le pour réagir aux changements de répertoire : recharger des variables d'environnement, activer des chaînes d'outils propres au projet ou exécuter automatiquement des scripts de configuration. Se combine avec [FileChanged](#filechanged) pour des outils comme [direnv](https://direnv.net/) qui gèrent l'environnement par répertoire.3041S'exécute lorsqu'une commande shell de la conversation principale change le répertoire de travail, par exemple lorsque Claude exécute une commande `cd`. Utilisez-le pour réagir aux changements de répertoire : recharger les variables d'environnement, activer des chaînes d'outils propres au projet ou exécuter automatiquement des scripts de configuration. Se combine avec [FileChanged](#filechanged) pour des outils comme [direnv](https://direnv.net/) qui gèrent un environnement par répertoire.
3040 3042
3041Les 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, moment où Claude Code les efface.3043Les 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, lorsque Claude Code les efface.
3042 3044
3043CwdChanged ne prend pas en charge les matchers et se déclenche à chaque occurrence.3045CwdChanged ne prend pas en charge les matchers et se déclenche à chaque occurrence.
3044 3046
3063 Sortie CwdChanged3065 Sortie CwdChanged
3064</h4>3066</h4>
3065 3067
3066En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, les hooks CwdChanged peuvent renvoyer `watchPaths` pour définir dynamiquement les chemins de fichiers surveillés par [FileChanged](#filechanged) :3068En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, les hooks CwdChanged peuvent renvoyer `watchPaths` pour définir dynamiquement les chemins de fichiers que [FileChanged](#filechanged) surveille :
3067 3069
3068| Champ | Description |3070| Champ | Description |
3069| :- | :- |3071| :- | :- |
3070| `watchPaths` | Tableau de chemins absolus. Remplace la liste de surveillance dynamique actuelle. Les chemins issus de votre configuration `matcher` sont toujours surveillés. Renvoyer un tableau vide efface la liste dynamique, ce qui est typique lors de l'entrée dans un nouveau répertoire |3072| `watchPaths` | Tableau de chemins absolus. Remplace la liste de surveillance dynamique actuelle. Les chemins de votre configuration `matcher` sont toujours surveillés. Renvoyer un tableau vide efface la liste dynamique, ce qui est typique lors de l'entrée dans un nouveau répertoire |
3071 3073
3072Les hooks CwdChanged n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le changement de répertoire.3074Les hooks CwdChanged n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le changement de répertoire.
3073 3075
3085* Vous ajoutez un répertoire dans l'onglet Workspace de `/permissions`3087* Vous ajoutez un répertoire dans l'onglet Workspace de `/permissions`
3086* Vous ajoutez un répertoire qui est déjà un répertoire de travail ou qui se trouve à l'intérieur de l'un d'eux3088* Vous ajoutez un répertoire qui est déjà un répertoire de travail ou qui se trouve à l'intérieur de l'un d'eux
3087 3089
3088Claude Code déclenche DirectoryAdded après avoir actualisé l'état du sandbox et des permissions, de sorte que les outils en sandbox voient déjà le nouveau répertoire lorsque votre hook s'exécute. Les commandes des hooks elles-mêmes s'exécutent hors sandbox.3090Claude Code déclenche DirectoryAdded après avoir actualisé l'état du sandbox et des permissions ; les outils en sandbox voient donc déjà le nouveau répertoire lorsque votre hook s'exécute. Les commandes de hook elles-mêmes s'exécutent hors sandbox.
3089 3091
3090Claude 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.3092Claude 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.
3091 3093
3092Le matcher filtre sur la manière dont le répertoire a été ajouté :3094Le matcher filtre sur la façon dont le répertoire a été ajouté :
3093 3095
3094| Matcher | Quand il se déclenche |3096| Matcher | Quand il se déclenche |
3095| :- | :- |3097| :- | :- |
3105| Champ | Description |3107| Champ | Description |
3106| :- | :- |3108| :- | :- |
3107| `directory` | Chemin absolu du répertoire qui a été ajouté |3109| `directory` | Chemin absolu du répertoire qui a été ajouté |
3108| `source` | La manière dont le répertoire a été ajouté : `"slash_command"` pour `/add-dir` ou `"register_repo_root"` pour la requête de contrôle du SDK |3110| `source` | Façon dont le répertoire a été ajouté : `"slash_command"` pour `/add-dir` ou `"register_repo_root"` pour la requête de contrôle du SDK |
3109 3111
3110```json theme={null}3112```json theme={null}
3111{3113{
3118}3120}
3119```3121```
3120 3122
3121Les hooks DirectoryAdded n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer l'ajout, qui est déjà terminé lorsque le hook s'exécute. Claude Code supprime le champ `continue` de leur sortie JSON et présente le reste différemment selon la source :3123Les hooks DirectoryAdded n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer l'ajout, qui est déjà terminé lorsque le hook s'exécute. Claude Code supprime le champ `continue` de leur sortie JSON et fait remonter le reste différemment selon la source :
3122 3124
3123* `slash_command` : Claude Code transmet le `systemMessage` du hook à Claude comme contexte au tour suivant de la conversation, plutôt que de vous l'afficher. Le nombre de hooks en échec apparaît dans la transcription. La sortie complète des échecs est envoyée dans le log de débogage3125* `slash_command` : Claude Code transmet le `systemMessage` du hook à Claude comme contexte au tour de conversation suivant, au lieu de vous l'afficher. Un décompte des hooks en échec apparaît dans la transcription. La sortie complète des échecs va dans le log de débogage
3124* `register_repo_root` : Claude Code écrit la sortie `systemMessage` et la sortie des échecs uniquement dans le log de débogage3126* `register_repo_root` : Claude Code écrit la sortie `systemMessage` et la sortie des échecs uniquement dans le log de débogage
3125 3127
3126<h3 id="filechanged">3128<h3 id="filechanged">
3127 FileChanged3129 FileChanged
3128</h3>3130</h3>
3129 3131
3130S'exécute lorsqu'un fichier surveillé change sur le disque. Claude Code détecte les modifications avec un observateur du système de fichiers, et non en inspectant les appels d'outils ; il exécute donc le hook quelle que soit l'origine de la modification : un appel d'outil `Edit` ou `Write`, un script que Claude exécute avec `Bash`, ou un processus entièrement extérieur à Claude Code. Un usage courant consiste à recharger des variables d'environnement lorsque des fichiers de configuration du projet changent.3132S'exécute lorsqu'un fichier surveillé change sur le disque. Claude Code détecte les modifications avec un observateur du système de fichiers, et non en inspectant les appels d'outils ; il exécute donc le hook quelle que soit l'origine de la modification du fichier : un appel d'outil `Edit` ou `Write`, un script que Claude exécute avec `Bash`, ou un processus entièrement extérieur à Claude Code. Un usage courant consiste à recharger les variables d'environnement lorsque les fichiers de configuration du projet changent.
3131 3133
3132Le `matcher` de cet événement joue deux rôles :3134Le `matcher` de cet événement joue deux rôles :
3133 3135
3134* **Construire la liste de surveillance** : la valeur est découpée sur `|` et chaque segment est enregistré comme un nom de fichier littéral dans le répertoire de travail ; ainsi `".envrc|.env"` surveille exactement ces deux fichiers. Les expressions régulières ne sont pas utiles ici : une valeur comme `^\.env` surveillerait un fichier littéralement nommé `^\.env`.3136* **Construire la liste de surveillance** : la valeur est découpée sur `|` et chaque segment est enregistré comme un nom de fichier littéral dans le répertoire de travail ; ainsi `".envrc|.env"` surveille exactement ces deux fichiers. Les motifs regex ne sont pas utiles ici : une valeur comme `^\.env` surveillerait un fichier littéralement nommé `^\.env`.
3135* **Filtrer les hooks qui s'exécutent** : lorsqu'un fichier surveillé change, la même valeur filtre les groupes de hooks qui s'exécutent selon les [règles standard des matchers](#matcher-patterns), appliquées au nom de base du fichier modifié.3137* **Filtrer les hooks qui s'exécutent** : lorsqu'un fichier surveillé change, la même valeur filtre les groupes de hooks qui s'exécutent, en appliquant les [règles de matcher](#matcher-patterns) standard au nom de base du fichier modifié.
3136 3138
3137Cet exemple normalise les fins de ligne de `data.csv` après toute modification, y compris lorsqu'une commande `Bash` ou un script externe réécrit le fichier :3139Cet exemple normalise les fins de ligne de `data.csv` après toute modification, y compris lorsqu'une commande `Bash` ou un script externe réécrit le fichier :
3138 3140
3154}3156}
3155```3157```
3156 3158
3157Le hook lit le chemin absolu du fichier modifié dans le champ `file_path` de l'[entrée JSON](#filechanged-input) sur stdin. Sa garde `grep` teste la même chose que ce que `perl` supprime, un CR en fin de ligne, de sorte que l'exécution qui suit une normalisation se termine sans toucher au fichier. Une garde plus permissive boucle indéfiniment, car `perl -i` réécrit le fichier même lorsqu'il ne substitue rien et Claude Code réexécute le hook après chaque réécriture. Enregistrez ce script sous `/path/to/normalize-line-endings.sh` et rendez-le exécutable :3159Le hook lit le chemin absolu du fichier modifié dans le champ `file_path` de l'[entrée JSON](#filechanged-input) sur stdin. Sa garde `grep` teste la même chose que ce que `perl` supprime, un CR en fin de ligne ; ainsi, l'exécution qui suit une normalisation se termine sans toucher au fichier. Une garde plus permissive boucle indéfiniment, car `perl -i` réécrit le fichier même lorsqu'il ne substitue rien, et Claude Code exécute à nouveau le hook après chaque réécriture. Enregistrez ce script sous `/path/to/normalize-line-endings.sh` et rendez-le exécutable :
3158 3160
3159```bash theme={null}3161```bash theme={null}
3160#!/bin/bash3162#!/bin/bash
3166 3168
3167Pour vérifier 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 retrouve avec des fins de ligne LF.3169Pour vérifier 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 retrouve avec des fins de ligne LF.
3168 3170
3169Pour surveiller des fichiers que vous ne pouvez pas nommer à l'avance, renvoyez [`watchPaths`](#filechanged-output) depuis un hook afin de mettre à jour dynamiquement la liste de surveillance. Claude Code ne démarre l'observateur que lorsqu'un élément nomme un fichier à surveiller ; amorcez donc 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 renvoie `watchPaths`. Le matcher filtre toujours les groupes de hooks qui s'exécutent lorsqu'un fichier surveillé change ; donnez donc au groupe qui gère les chemins dynamiques un matcher omis, qui correspond à tous les fichiers surveillés et n'ajoute rien à la liste de surveillance. Un matcher `"*"` correspond également à tous les fichiers, mais Claude Code l'enregistre dans la liste de surveillance comme n'importe quelle autre valeur, en tant que fichier littéral nommé `*`.3171Pour surveiller des fichiers que vous ne pouvez pas nommer à l'avance, renvoyez [`watchPaths`](#filechanged-output) depuis un hook afin de mettre à jour dynamiquement la liste de surveillance. Claude Code ne démarre l'observateur que lorsque quelque chose nomme un fichier à surveiller ; amorcez donc 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 renvoie `watchPaths`. Le matcher filtre toujours les groupes de hooks qui s'exécutent lorsqu'un fichier surveillé change ; donnez donc au groupe qui gère les chemins dynamiques un matcher omis, qui correspond à tous les fichiers surveillés et n'ajoute rien à la liste de surveillance. Un matcher `"*"` correspond également à tous les fichiers, mais Claude Code l'enregistre dans la liste de surveillance comme n'importe quelle autre valeur, sous la forme d'un fichier littéral nommé `*`.
3170 3172
3171Les 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), moment où Claude Code les efface.3173Les 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), lorsque Claude Code les efface.
3172 3174
3173<h4 id="filechanged-input">3175<h4 id="filechanged-input">
3174 Entrée FileChanged3176 Entrée FileChanged
3179| Champ | Description |3181| Champ | Description |
3180| :- | :- |3182| :- | :- |
3181| `file_path` | Chemin absolu du fichier qui a changé |3183| `file_path` | Chemin absolu du fichier qui a changé |
3182| `event` | Ce qui s'est produit : `"change"` pour un fichier modifié, `"add"` pour un fichier créé ou `"unlink"` pour un fichier supprimé |3184| `event` | Ce qui s'est passé : `"change"` pour un fichier modifié, `"add"` pour un fichier créé, ou `"unlink"` pour un fichier supprimé |
3183 3185
3184```json theme={null}3186```json theme={null}
3185{3187{
3200 3202
3201| Champ | Description |3203| Champ | Description |
3202| :- | :- |3204| :- | :- |
3203| `watchPaths` | Tableau de chemins absolus. Remplace la liste de surveillance dynamique actuelle. Les chemins issus de votre configuration `matcher` sont toujours surveillés. Utilisez-le lorsque votre script de hook découvre des fichiers supplémentaires à surveiller en fonction du fichier modifié |3205| `watchPaths` | Tableau de chemins absolus. Remplace la liste de surveillance dynamique actuelle. Les chemins de votre configuration `matcher` sont toujours surveillés. Utilisez-le lorsque votre script de hook découvre des fichiers supplémentaires à surveiller en fonction du fichier modifié |
3204 3206
3205Les hooks FileChanged n'ont pas de contrôle de décision. Ils ne peuvent pas empêcher la modification du fichier.3207Les hooks FileChanged n'ont pas de contrôle de décision. Ils ne peuvent pas empêcher la modification du fichier de se produire.
3206 3208
3207Claude Code lit `watchPaths` et `systemMessage` dans leur sortie JSON et supprime `continue`. Dans les sessions interactives, il affiche le `systemMessage` sous forme de brève notification dans le terminal. Le message n'atteint pas le flux de messages du SDK.3209Claude Code lit `watchPaths` et `systemMessage` dans leur sortie JSON et supprime `continue`. Dans les sessions interactives, il affiche le `systemMessage` sous forme de brève notification dans le terminal. Le message n'atteint pas le flux de messages du SDK.
3208 3210
3210 WorktreeCreate3212 WorktreeCreate
3211</h3>3213</h3>
3212 3214
3213S'exécute lorsqu'un worktree est en cours de création, que ce soit depuis `claude --worktree`, depuis 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, ce qui vous permet d'utiliser un autre système de gestion de versions comme SVN, Perforce ou Mercurial.3215S'exécute lors de la création d'un worktree, que ce soit depuis `claude --worktree`, depuis 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, ce qui vous permet d'utiliser un autre système de gestion de versions comme SVN, Perforce ou Mercurial.
3214 3216
3215Comme le hook remplace entièrement le comportement par défaut, [`.worktreeinclude`](/docs/fr/worktrees#copy-gitignored-files-into-worktrees) n'est pas traité. Si vous devez copier des fichiers de configuration locaux comme `.env` dans le nouveau worktree, faites-le dans votre script de hook.3217Comme le hook remplace entièrement le comportement par défaut, [`.worktreeinclude`](/docs/fr/worktrees#copy-gitignored-files-into-worktrees) n'est pas traité. Si vous devez copier des fichiers de configuration locaux comme `.env` dans le nouveau worktree, faites-le dans votre script de hook.
3216 3218
3217Le hook doit renvoyer le chemin du répertoire du worktree créé. Claude Code utilise ce chemin comme répertoire de travail pour la session isolée. Voir [Sortie WorktreeCreate](#worktreecreate-output) pour savoir comment chaque type de hook renvoie le chemin.3219Le hook doit renvoyer 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 de WorktreeCreate](#worktreecreate-output) pour savoir comment chaque type de hook renvoie le chemin.
3218 3220
3219Claude Code tient compte de la réussite du hook et du chemin renvoyé, et supprime `systemMessage` et `continue`.3221Claude Code tient compte de la réussite du hook et du chemin renvoyé, et ignore `systemMessage` et `continue`.
3220 3222
3221Cet exemple crée une copie de travail SVN et affiche le chemin que Claude Code doit utiliser. Remplacez l'URL du dépôt par la vôtre :3223Cet exemple crée une copie de travail SVN et affiche le chemin que Claude Code doit utiliser. Remplacez l'URL du dépôt par la vôtre :
3222 3224
3237}3239}
3238```3240```
3239 3241
3240Le hook lit le `name` du worktree dans l'entrée JSON sur stdin, extrait une nouvelle copie dans un nouveau répertoire et affiche le chemin du répertoire. L'`echo` de la dernière ligne est ce que Claude Code lit comme chemin du worktree. Redirigez toute autre sortie vers stderr afin qu'elle n'interfère pas avec le chemin.3242Le hook lit le `name` du worktree depuis l'entrée JSON sur stdin, extrait une nouvelle copie dans un nouveau répertoire et affiche le chemin du répertoire. C'est le `echo` de la dernière ligne que Claude Code lit comme chemin du worktree. Redirigez toute autre sortie vers stderr afin qu'elle n'interfère pas avec le chemin.
3241 3243
3242<h4 id="worktreecreate-input">3244<h4 id="worktreecreate-input">
3243 Entrée WorktreeCreate3245 Entrée de WorktreeCreate
3244</h4>3246</h4>
3245 3247
3246En plus des [champs d'entrée communs](#common-input-fields), les hooks WorktreeCreate reçoivent le champ `name`. Il s'agit d'un identifiant de type slug pour le nouveau worktree, soit spécifié par l'utilisateur, soit généré automatiquement, par exemple `bold-oak-a3f2`.3248En plus des [champs d'entrée communs](#common-input-fields), les hooks WorktreeCreate reçoivent le champ `name`. Il s'agit d'un identifiant de type slug pour le nouveau worktree, spécifié par l'utilisateur ou généré automatiquement, par exemple `bold-oak-a3f2`.
3247 3249
3248```json theme={null}3250```json theme={null}
3249{3251{
3259 Sortie de WorktreeCreate3261 Sortie de WorktreeCreate
3260</h4>3262</h4>
3261 3263
3262Les hooks WorktreeCreate n'utilisent pas le modèle de décision standard autoriser/bloquer. C'est plutôt la réussite ou l'échec du hook qui détermine le résultat. Le hook doit renvoyer le chemin vers le répertoire du worktree créé :3264Les hooks WorktreeCreate n'utilisent pas le modèle de décision standard autoriser/bloquer. C'est la réussite ou l'échec du hook qui détermine le résultat. Le hook doit renvoyer le chemin du répertoire du worktree créé :
3263 3265
3264* **Hooks de commande** (`type: "command"`) : affichez le chemin sur la dernière ligne non vide de stdout. Claude Code supprime les codes d'échappement ANSI avant de lire cette ligne, de sorte que les bannières de démarrage du shell affichées avant votre `echo` sont ignorées. Redirigez toute autre sortie du hook vers stderr.3266* **Hooks de commande** (`type: "command"`) : affichez le chemin sur la dernière ligne non vide de stdout. Claude Code supprime les séquences d'échappement ANSI avant de lire cette ligne, de sorte que les bannières de démarrage du shell affichées avant votre `echo` sont ignorées. Redirigez toute autre sortie du hook vers stderr.
3265* **Hooks HTTP** (`type: "http"`) : renvoyez `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` dans le corps de la réponse.3267* **Hooks HTTP** (`type: "http"`) : renvoyez `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` dans le corps de la réponse.
3266 3268
3267Si le hook échoue ou ne produit aucun chemin, la création du worktree échoue avec une erreur.3269Si le hook échoue ou ne produit aucun chemin, la création du worktree échoue avec une erreur.
3268 3270
3269Claude Code résout un chemin relatif par rapport au répertoire dans lequel le hook s'est exécuté, en réduisant les éventuels segments `.` ou `..` qu'il contient. Si le chemin obtenu n'est pas un répertoire dans lequel Claude Code peut entrer, la session affiche une erreur indiquant le chemin et se termine avec le code 1.3271Claude Code résout un chemin relatif par rapport au répertoire dans lequel le hook s'est exécuté, en réduisant tout segment `.` ou `..` qu'il contient. Si le chemin obtenu n'est pas un répertoire dans lequel Claude Code peut entrer, la session affiche une erreur indiquant le chemin et se termine avec le code 1.
3270 3272
3271Claude Code refuse un chemin absolu contenant des segments `.` ou `..`, ainsi que tout chemin passant par un lien symbolique situé sous la racine du dépôt, car un lien symbolique commité dans le dépôt pourrait rediriger le worktree en dehors de celui-ci. L'erreur indique le composant rejeté. Renvoyez un chemin normalisé qui ne passe pas par un lien symbolique à l'intérieur du dépôt. Avant la v2.1.216, la création du worktree suivait le chemin du hook sans ce contrôle.3273Claude Code refuse un chemin absolu contenant des segments `.` ou `..`, ainsi que tout chemin passant par un lien symbolique situé sous la racine du dépôt, car un lien symbolique commité dans le dépôt pourrait rediriger le worktree en dehors de celui-ci. L'erreur indique le composant rejeté. Renvoyez un chemin normalisé qui ne passe pas par un lien symbolique à l'intérieur du dépôt. Avant la v2.1.216, la création du worktree suivait le chemin du hook sans cette vérification.
3272 3274
3273<h3 id="worktreeremove">3275<h3 id="worktreeremove">
3274 WorktreeRemove3276 WorktreeRemove
3277S'exécute lorsque Claude Code nettoie un worktree créé par votre hook [`WorktreeCreate`](#worktreecreate). L'événement se déclenche lorsque :3279S'exécute lorsque Claude Code nettoie un worktree créé par votre hook [`WorktreeCreate`](#worktreecreate). L'événement se déclenche lorsque :
3278 3280
3279* Vous quittez une [session de worktree](/docs/fr/worktrees#start-claude-in-a-worktree) interactive et choisissez de supprimer le worktree lorsque Claude Code vous le demande3281* Vous quittez une [session de worktree](/docs/fr/worktrees#start-claude-in-a-worktree) interactive et choisissez de supprimer le worktree lorsque Claude Code vous le demande
3280* Vous quittez une session de worktree interactive que vous n'avez pas [nommée](/docs/fr/sessions#name-your-sessions), Claude Code ne trouve aucun fichier modifié ou non suivi, et il supprime le worktree sans vous le demander3282* Vous quittez une session de worktree interactive que vous n'avez pas [nommée](/docs/fr/sessions#name-your-sessions), Claude Code ne trouve aucun fichier modifié ou non suivi, et supprime le worktree sans vous le demander
3281* Vous supprimez une [session en arrière-plan](/docs/fr/agent-view#what-deleting-a-session-removes) qui s'exécute dans le worktree3283* Vous supprimez une [session en arrière-plan](/docs/fr/agent-view#what-deleting-a-session-removes) qui s'exécute dans le worktree
3282 3284
3283Claude Code utilise git pour rechercher les fichiers modifiés ou non suivis ; il n'en trouve donc aucun dans un worktree qui n'est pas un checkout git ni situé à l'intérieur de l'un d'eux, même lorsque le répertoire contient du travail non commité. Vérifiez la présence de ce travail dans votre hook WorktreeRemove avant qu'il ne supprime quoi que ce soit.3285Claude Code utilise git pour rechercher les fichiers modifiés ou non suivis ; il n'en trouve donc aucun dans un worktree qui n'est pas un checkout git ni situé dans l'un d'eux, même lorsque le répertoire contient du travail non commité. Vérifiez la présence de ce travail dans votre hook WorktreeRemove avant qu'il ne supprime quoi que ce soit.
3284 3286
3285Pour les worktrees basés sur git, Claude Code gère automatiquement le nettoyage avec `git worktree remove`. Si vous avez configuré un hook WorktreeCreate, associez-le à un hook WorktreeRemove pour contrôler le nettoyage des worktrees qu'il crée :3287Pour les worktrees basés sur git, Claude Code gère automatiquement le nettoyage avec `git worktree remove`. Si vous avez configuré un hook WorktreeCreate, associez-le à un hook WorktreeRemove pour contrôler le nettoyage des worktrees qu'il crée :
3286 3288
3287* **Aucun hook WorktreeRemove** : lorsque Claude Code supprime le worktree au moment où vous quittez une session de worktree, il se rabat sur `git worktree remove --force` sur le chemin renvoyé par votre hook WorktreeCreate, de sorte qu'un worktree reconnu par git est supprimé. Un worktree que git ne reconnaît pas, par exemple un worktree créé par votre hook avec un système de gestion de versions autre que git, reste sur le disque. Pour savoir ce que fait la suppression d'une [session en arrière-plan](/docs/fr/agent-view#what-deleting-a-session-removes) avec un worktree créé par un hook, consultez les règles de suppression de la vue agent.3289* **Aucun hook WorktreeRemove** : lorsque Claude Code supprime le worktree au moment où vous quittez une session de worktree, il se rabat sur `git worktree remove --force` sur le chemin renvoyé par votre hook WorktreeCreate, de sorte qu'un worktree reconnu par git est supprimé. Un worktree que git ne reconnaît pas, par exemple un worktree créé par votre hook avec un système de gestion de versions autre que git, reste sur le disque. Pour savoir ce que fait la suppression d'une [session en arrière-plan](/docs/fr/agent-view#what-deleting-a-session-removes) avec un worktree créé par un hook, consultez les règles de suppression de la vue des agents.
3288* **Le hook se termine avec le code 0** : le worktree est considéré comme supprimé. Claude Code ne lit rien d'autre du hook ; assurez-vous donc que votre hook a bien supprimé le répertoire.3290* **Le hook se termine avec 0** : le worktree est considéré comme supprimé. Claude Code ne lit rien d'autre du hook, assurez-vous donc que votre hook a bien supprimé le répertoire.
3289* **Le hook se termine avec un code non nul** : la suppression échoue si le répertoire situé à `worktree_path` existe toujours ensuite, et le worktree reste sur le disque sans solution de repli git. Un hook qui a supprimé le répertoire avant de se terminer avec un code non nul est considéré comme ayant supprimé le worktree. Pour savoir comment l'échec est signalé, consultez [Entrée de WorktreeRemove](#worktreeremove-input).3291* **Le hook se termine avec un code non nul** : la suppression échoue si le répertoire situé à `worktree_path` existe toujours ensuite, et le worktree reste sur le disque sans solution de repli git. Un hook qui a supprimé le répertoire avant de se terminer avec un code non nul est considéré comme ayant supprimé le worktree. Pour savoir comment l'échec est signalé, consultez [Entrée de WorktreeRemove](#worktreeremove-input).
3290 3292
3291Claude Code ne supprime jamais une branche appartenant à un worktree créé par un hook, car il ne connaît que le chemin renvoyé par votre hook WorktreeCreate. Si votre hook WorktreeCreate crée une branche, supprimez-la dans votre hook WorktreeRemove.3293Claude Code ne supprime jamais une branche appartenant à un worktree créé par un hook, car il ne connaît que le chemin renvoyé par votre hook WorktreeCreate. Si votre hook WorktreeCreate crée une branche, supprimez-la dans votre hook WorktreeRemove.
3292 3294
3293Claude Code ignore les [champs de sortie JSON](#json-output) d'un hook WorktreeRemove, tels que `systemMessage` et `continue`.3295Claude Code ignore les [champs de sortie JSON](#json-output) d'un hook WorktreeRemove, tels que `systemMessage` et `continue`.
3294 3296
3295Lors de la suppression d'une session en arrière-plan, Claude Code vérifie le chemin du worktree enregistré avant d'exécuter le hook et refuse un chemin qui est un lien symbolique ou qui passe par un lien symbolique sous la racine du dépôt. Le hook s'exécute pour un worktree contenant encore 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) conserve plutôt la session et le worktree. Avant la v2.1.216, le hook s'exécutait sur le chemin enregistré sans ces vérifications.3297Pour la suppression d'une session en arrière-plan, Claude Code vérifie le chemin de worktree enregistré avant d'exécuter le hook et refuse un chemin qui est un lien symbolique ou qui passe par un lien symbolique sous la racine du dépôt. Le hook s'exécute pour un worktree qui contient encore des fichiers uniquement lorsque vous confirmez la suppression dans la [vue des agents](/docs/fr/agent-view#what-deleting-a-session-removes) ; pour un tel worktree, [`claude rm`](/docs/fr/agent-view#manage-sessions-from-the-shell) conserve au contraire la session et le worktree. Avant la v2.1.216, le hook s'exécutait sur le chemin enregistré sans ces vérifications.
3296 3298
3297Claude Code transmet le chemin renvoyé par WorktreeCreate sous la forme `worktree_path` dans l'entrée du hook. Cet exemple lit ce chemin et supprime le répertoire :3299Claude Code transmet le chemin renvoyé par WorktreeCreate en tant que `worktree_path` dans l'entrée du hook. Cet exemple lit ce chemin et supprime le répertoire :
3298 3300
3299```json theme={null}3301```json theme={null}
3300{3302{
3317 Entrée de WorktreeRemove3319 Entrée de WorktreeRemove
3318</h4>3320</h4>
3319 3321
3320En plus des [champs d'entrée communs](#common-input-fields), les hooks WorktreeRemove reçoivent le champ `worktree_path`, qui est le chemin absolu vers le worktree en cours de suppression.3322En plus des [champs d'entrée communs](#common-input-fields), les hooks WorktreeRemove reçoivent le champ `worktree_path`, qui est le chemin absolu du worktree en cours de suppression.
3321 3323
3322```json theme={null}3324```json theme={null}
3323{3325{
3332Le code de sortie d'un hook WorktreeRemove détermine le résultat. Lorsqu'un hook se termine avec un code non nul et que le répertoire situé à `worktree_path` existe toujours ensuite, la suppression échoue :3334Le code de sortie d'un hook WorktreeRemove détermine le résultat. Lorsqu'un hook se termine avec un code non nul et que le répertoire situé à `worktree_path` existe toujours ensuite, la suppression échoue :
3333 3335
3334* Le worktree reste sur le disque, et la commande et le stderr du hook sont envoyés au [log de débogage](#debug-hooks).3336* Le worktree reste sur le disque, et la commande et le stderr du hook sont envoyés au [log de débogage](#debug-hooks).
3335* Si vous supprimiez une session en arrière-plan, la session est également conservée. Le message de refus dans la [vue agent](/docs/fr/agent-view#what-deleting-a-session-removes) indique comment le hook s'est terminé, par exemple `exited 1`, cite le début de son stderr et précise si une nouvelle suppression de la session supprime malgré tout le répertoire.3337* Si vous supprimiez une session en arrière-plan, la session est également conservée. Le message de refus dans la [vue des agents](/docs/fr/agent-view#what-deleting-a-session-removes) indique comment le hook s'est terminé, par exemple `exited 1`, cite le début de son stderr et précise si une nouvelle suppression de la session supprime quand même le répertoire.
3336 3338
3337<h3 id="precompact">3339<h3 id="precompact">
3338 PreCompact3340 PreCompact
3349 3351
3350Terminez avec le code 2 pour bloquer la compaction. Pour un `/compact` manuel, le message stderr est affiché à l'utilisateur. Vous pouvez également bloquer en renvoyant du JSON avec `"decision": "block"`.3352Terminez avec le code 2 pour bloquer la compaction. Pour un `/compact` manuel, le message stderr est affiché à l'utilisateur. Vous pouvez également bloquer en renvoyant du JSON avec `"decision": "block"`.
3351 3353
3352Le blocage de la compaction automatique a des effets différents selon le moment où elle se déclenche. Si la compaction a été déclenchée de manière proactive avant la limite de contexte, Claude Code l'ignore et la conversation se poursuit sans être compactée. Si la compaction a été déclenchée pour récupérer d'une erreur de limite de contexte déjà renvoyée par l'API, l'erreur sous-jacente remonte et la requête en cours échoue.3354Bloquer la compaction automatique a des effets différents selon le moment où elle se déclenche. Si la compaction a été déclenchée de manière proactive avant la limite de contexte, Claude Code l'ignore et la conversation continue sans être compactée. Si la compaction a été déclenchée pour récupérer d'une erreur de limite de contexte déjà renvoyée par l'API, l'erreur sous-jacente remonte et la requête en cours échoue.
3353 3355
3354Claude Code ignore les champs `systemMessage` et `continue` d'un hook PreCompact.3356Claude Code ignore les champs `systemMessage` et `continue` d'un hook PreCompact.
3355 3357
3357 Entrée de PreCompact3359 Entrée de PreCompact
3358</h4>3360</h4>
3359 3361
3360En 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 à `/compact` et vaut `null` lorsqu'il ne transmet rien. Pour `auto`, `custom_instructions` vaut `null`.3362En 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 à `/compact` et vaut `null` s'il ne transmet rien. Pour `auto`, `custom_instructions` vaut `null`.
3361 3363
3362```json theme={null}3364```json theme={null}
3363{3365{
3376 3378
3377S'exécute après que Claude Code a terminé une opération de compaction. Utilisez cet événement pour réagir au nouvel état compacté, par exemple pour journaliser le résumé généré ou mettre à jour un état externe. Claude Code ignore les champs `systemMessage` et `continue` d'un hook PostCompact.3379S'exécute après que Claude Code a terminé une opération de compaction. Utilisez cet événement pour réagir au nouvel état compacté, par exemple pour journaliser le résumé généré ou mettre à jour un état externe. Claude Code ignore les champs `systemMessage` et `continue` d'un hook PostCompact.
3378 3380
3379Les mêmes valeurs de matcher s'appliquent que pour `PreCompact` :3381Les mêmes valeurs de matcher que pour `PreCompact` s'appliquent :
3380 3382
3381| Matcher | Quand il se déclenche |3383| Matcher | Quand il se déclenche |
3382| :- | :- |3384| :- | :- |
3400}3402}
3401```3403```
3402 3404
3403Les hooks PostCompact n'ont aucun contrôle de décision. Ils ne peuvent pas influer sur le résultat de la compaction, mais peuvent effectuer des tâches de suivi.3405Les hooks PostCompact n'ont pas de contrôle de décision. Ils ne peuvent pas influer sur le résultat de la compaction, mais peuvent effectuer des tâches de suivi.
3404 3406
3405<h3 id="premodelswitch">3407<h3 id="premodelswitch">
3406 PreModelSwitch3408 PreModelSwitch
3407</h3>3409</h3>
3408 3410
3409S'exécute avant que Claude Code n'applique un changement de modèle demandé par vous ou par un client. Utilisez-le pour bloquer un changement, exiger une confirmation ou afficher ce que le changement coûtera avant qu'il n'ait lieu.3411S'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 indiquer le coût du changement avant qu'il ait lieu.
3410 3412
3411PreModelSwitch nécessite Claude Code v2.1.251 ou une version ultérieure. Claude Code l'exécute pour ces demandes :3413PreModelSwitch nécessite Claude Code v2.1.251 ou ultérieur. Claude Code l'exécute pour les demandes suivantes :
3412 3414
3413* `/model <name>` et le sélecteur `/model`3415* `/model <name>` et le sélecteur `/model`
3414* Le sélecteur de modèle `Option+P` ou `Alt+P`3416* Le sélecteur de modèle `Option+P` ou `Alt+P`
3415* Le paramètre Model dans `/config`3417* Le paramètre Model dans `/config`
3416* L'activation du [mode rapide](/docs/fr/fast-mode) lorsque celle-ci change le modèle de la session3418* L'activation du [mode rapide](/docs/fr/fast-mode) lorsque cela change le modèle de la session
3417* Une requête `set_model`, ou un changement de modèle dans une requête `apply_flag_settings`, provenant d'un hôte [Agent SDK](/docs/fr/agent-sdk/typescript#query-object) ou de [Remote Control](/docs/fr/remote-control)3419* Une requête `set_model`, ou un changement de modèle dans une requête `apply_flag_settings`, provenant d'un hôte [Agent SDK](/docs/fr/agent-sdk/typescript#query-object) ou de [Remote Control](/docs/fr/remote-control)
3418 3420
3419Claude Code n'exécute pas les hooks PreModelSwitch pour les changements qu'il effectue de lui-même, comme un [basculement automatique vers un modèle de secours](/docs/fr/model-config#automatic-model-fallback) ou la restauration du modèle lorsque vous reprenez une session. Ces changements atteignent uniquement [PostModelSwitch](#postmodelswitch).3421Claude Code n'exécute pas les hooks PreModelSwitch pour les changements qu'il effectue de lui-même, comme un [basculement automatique vers un modèle de secours](/docs/fr/model-config#automatic-model-fallback) ou la restauration du modèle lorsque vous reprenez une session. Ces changements n'atteignent que [PostModelSwitch](#postmodelswitch).
3420 3422
3421Claude Code compare le matcher au nom canonique du modèle vers lequel la session bascule, en ignorant tout suffixe `[1m]`. Un alias tel que `opus`, un identifiant de modèle daté et un identifiant propre à un fournisseur, comme un identifiant de modèle Amazon Bedrock, correspondent tous au même nom canonique vers lequel ils se résolvent ; ainsi, `claude-opus-5` couvre toutes les écritures d'Opus 5.3423Claude Code compare le matcher au nom canonique du modèle vers lequel la session bascule, en ignorant tout suffixe `[1m]`. Un alias tel que `opus`, un ID de modèle daté et un ID propre à un fournisseur, comme un ID de modèle Amazon Bedrock, correspondent tous au nom canonique unique vers lequel ils se résolvent, de sorte que `claude-opus-5` couvre toutes les graphies d'Opus 5.
3422 3424
3423Lorsque Claude Code ne peut pas déterminer un nom canonique pour la cible, par exemple un identifiant de modèle personnalisé que seule votre [passerelle LLM](/docs/fr/llm-gateway) connaît, il exécute tous les hooks PreModelSwitch quel que soit le matcher. Un hook qui bloque doit donc vérifier `to_model` dans son entrée plutôt que de se fier uniquement au matcher.3425Lorsque 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 quel que soit le matcher. Un hook qui bloque doit donc vérifier `to_model` dans son entrée plutôt que de se fier uniquement au matcher.
3424 3426
3425Écrivez le matcher sous la forme d'un nom exact, d'une liste séparée par des `|` telle que `claude-opus-4-6|claude-opus-5`, ou d'une expression régulière telle que `.*opus.*`. Cet exemple utilise un matcher à nom exact et vérifie également `to_model` dans l'entrée du hook ; il refuse ainsi un changement vers Opus 4.6 en se terminant avec le code 2 et laisse passer toute autre cible :3427Écrivez le matcher sous la forme d'un nom exact, d'une liste séparée par `|` telle que `claude-opus-4-6|claude-opus-5`, ou d'une expression régulière telle que `.*opus.*`. Cet exemple utilise un matcher à nom exact et vérifie également `to_model` dans l'entrée du hook ; il refuse ainsi un passage à Opus 4.6 en se terminant avec le code 2 et laisse passer toute autre cible :
3426 3428
3427<Tabs>3429<Tabs>
3428 <Tab title="macOS/Linux">3430 <Tab title="macOS/Linux">
3494 Entrée de PreModelSwitch3496 Entrée de PreModelSwitch
3495</h4>3497</h4>
3496 3498
3497En plus des [champs d'entrée communs](#common-input-fields), les hooks PreModelSwitch reçoivent les champs de ce tableau. Les cinq derniers décrivent ce que coûte le renvoi de la conversation au nouveau modèle, afin qu'un hook puisse afficher ce montant avant que le changement n'ait lieu.3499En plus des [champs d'entrée communs](#common-input-fields), les hooks PreModelSwitch reçoivent les champs de ce tableau. Les cinq derniers décrivent le coût du renvoi de la conversation au nouveau modèle, afin qu'un hook puisse afficher ce montant avant le changement.
3498 3500
3499| Champ | Type | Description |3501| Champ | Type | Description |
3500| :- | :- | :- |3502| :- | :- | :- |
3501| `from_model` | string | Identifiant du modèle que le changement quitte |3503| `from_model` | string | ID du modèle de départ du changement |
3502| `to_model` | string | Identifiant du modèle vers lequel le changement s'effectue. Le matcher est comparé au nom canonique de ce modèle |3504| `to_model` | string | ID du modèle d'arrivée du changement. Le matcher est comparé au nom canonique de ce modèle |
3503| `requested_model` | string ou `null` | Le modèle indiqué dans la demande : un alias tel que `opus`, un identifiant de modèle complet, ou `null` lorsque la demande portait sur le modèle par défaut |3505| `requested_model` | string ou `null` | Le modèle indiqué par la requête : un alias tel que `opus`, un ID de modèle complet, ou `null` lorsque la requête portait sur le modèle par défaut |
3504| `source` | string | Origine de 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 requête `set_model`, ou un changement de modèle dans une requête `apply_flag_settings`, provenant d'un hôte Agent SDK ou de Remote Control |3506| `source` | string | Origine de 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 requête `set_model`, ou un changement de modèle dans une requête `apply_flag_settings`, provenant d'un hôte Agent SDK ou de Remote Control |
3505| `context_tokens` | number | Tokens que la prochaine requête renvoie comme prompt : la somme des tokens d'entrée, de lecture du cache, de création du cache et de sortie de la dernière réponse de la conversation principale. `0` avant la première réponse |3507| `context_tokens` | number | Tokens que la prochaine requête renvoie comme prompt : la somme des tokens d'entrée, de lecture du cache, de création du cache et de sortie de la dernière réponse de la conversation principale. `0` avant la première réponse |
3506| `prompt_cache_warm` | boolean | Indique si le cache de prompt du modèle actuel est probablement encore chaud, ce qui signifie que le changement le perd |3508| `prompt_cache_warm` | boolean | Indique si le cache de prompt du modèle actuel est probablement encore chaud, ce qui signifie que le changement le fait perdre |
3507| `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"` |3509| `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"` |
3508| `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 tarif `cache_ttl`, hors réponse suivante. Le serveur n'a pas forcément besoin de remettre en cache tout le contexte ; considérez donc cette valeur comme une estimation |3510| `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 tarif `cache_ttl`, hors réponse suivante. Le serveur n'a pas forcément besoin de remettre en cache l'intégralité du contexte, considérez donc ce montant comme une estimation |
3509| `pricing` | string | Façon dont Claude Code a calculé le prix de `estimated_cache_write_usd` : `"configured"` aux tarifs propres à votre organisation lorsqu'elle les a configurés, `"catalog"` au prix catalogue, ou `"default"` lorsque `to_model` n'a pas de prix connu et que Claude Code a supposé un tarif par défaut |3511| `pricing` | string | Comment Claude Code a calculé `estimated_cache_write_usd` : `"configured"` aux tarifs propres à votre organisation lorsqu'elle les a configurés, `"catalog"` au prix catalogue, ou `"default"` lorsque `to_model` n'a pas de prix connu et que Claude Code a supposé un tarif par défaut |
3510 3512
3511Cet exemple montre l'entrée pour `/model opus` dans une session utilisant Sonnet 5 :3513Cet exemple montre l'entrée pour `/model opus` dans une session utilisant Sonnet 5 :
3512 3514
3557 3559
3558Lorsque plusieurs hooks PreModelSwitch renvoient des décisions différentes, l'ordre de priorité est `deny` > `ask` > `allow`.3560Lorsque plusieurs hooks PreModelSwitch renvoient des décisions différentes, l'ordre de priorité est `deny` > `ask` > `allow`.
3559 3561
3560Claude Code affiche à l'utilisateur tout `systemMessage` renvoyé par votre hook, quelle que soit la décision ; un hook de rapport de coût peut donc renvoyer `{"systemMessage": "..."}` et se terminer avec le code 0.3562Claude Code affiche à l'utilisateur tout `systemMessage` renvoyé par votre hook, quelle que soit la décision ; un hook de rapport de coût peut donc renvoyer `{"systemMessage": "..."}` et se terminer avec 0.
3561 3563
3562Un hook PreModelSwitch qui ne répond pas avant l'expiration de son délai bloque le changement. Pour [PreToolUse](#timeouts), à l'inverse, un hook de commande ayant expiré laisse l'appel d'outil se poursuivre. Le délai d'expiration par défaut pour cet événement est de 30 secondes. `PreModelSwitch` exécute uniquement les hooks `command`, `http` et `mcp_tool` ; les valeurs par défaut de `prompt` et `agent` ne s'appliquent donc pas.3564Un hook PreModelSwitch qui ne répond pas avant son délai d'expiration bloque le changement. Pour [PreToolUse](#timeouts), en revanche, un hook de commande qui expire laisse l'appel d'outil se poursuivre. Le délai d'expiration par défaut pour cet événement est de 30 secondes. `PreModelSwitch` n'exécute que les hooks `command`, `http` et `mcp_tool` ; les valeurs par défaut de `prompt` et `agent` ne s'appliquent donc pas.
3563 3565
3564Un hook qui se termine avec un code autre que 0 ou 2 et n'affiche aucune décision JSON ne bloque pas : Claude Code affiche son stderr et applique le changement, comme décrit dans [Autres codes de sortie](#other-exit-codes).3566Un hook qui se termine avec un code autre que 0 ou 2 et n'affiche aucune décision JSON ne bloque pas : Claude Code affiche son stderr et applique le changement, comme décrit dans [Autres codes de sortie](#other-exit-codes).
3565 3567
3569 3571
3570S'exécute après le changement du modèle de la session. Utilisez-le pour donner à Claude des consignes propres à un modèle sans modifier chaque CLAUDE.md, par exemple une instruction à l'échelle de l'organisation qui s'applique à certains modèles.3572S'exécute après le changement du modèle de la session. Utilisez-le pour donner à Claude des consignes propres à un modèle sans modifier chaque CLAUDE.md, par exemple une instruction à l'échelle de l'organisation qui s'applique à certains modèles.
3571 3573
3572PostModelSwitch nécessite Claude Code v2.1.251 ou une version ultérieure. Il ne peut pas bloquer, car le modèle a déjà changé. Claude Code exécute les hooks PostModelSwitch après l'un de ces changements :3574PostModelSwitch nécessite Claude Code v2.1.251 ou ultérieur. Il ne peut pas bloquer, car le modèle a déjà changé. Claude Code exécute les hooks PostModelSwitch après l'un des changements suivants :
3573 3575
3574* Un changement demandé par vous ou par un client3576* Un changement que vous ou un client avez demandé
3575* Un [basculement automatique vers un modèle de secours](/docs/fr/model-config#automatic-model-fallback), qui change le modèle de la session3577* Un [basculement automatique vers un modèle de secours](/docs/fr/model-config#automatic-model-fallback), qui change le modèle de la session
3576* Un paramètre tel que [`opusplan`](/docs/fr/model-config#opusplan-model-setting) entrant dans le mode plan ou en sortant3578* Un paramètre tel que [`opusplan`](/docs/fr/model-config#opusplan-model-setting) qui entre dans le mode plan ou en sort
3577* La restauration du modèle par Claude Code lorsque vous reprenez une session3579* La restauration du modèle par Claude Code lorsque vous reprenez une session
3578 3580
3579Claude Code n'exécute pas les hooks PostModelSwitch lorsqu'un modèle d'une [chaîne de modèles de secours](/docs/fr/model-config#fallback-model-chains) traite un tour, car cette substitution dure un seul tour et ne modifie pas le modèle de la session.3581Claude Code n'exécute pas les hooks PostModelSwitch lorsqu'un modèle d'une [chaîne de modèles de secours](/docs/fr/model-config#fallback-model-chains) traite un tour, car cette substitution dure un seul tour et laisse le modèle de la session inchangé.
3580 3582
3581Le matcher suit les mêmes règles que pour [PreModelSwitch](#premodelswitch) : Claude Code le compare au nom canonique du modèle vers lequel la session a basculé.3583Le matcher suit les mêmes règles que pour [PreModelSwitch](#premodelswitch) : Claude Code le compare au nom canonique du modèle vers lequel la session a basculé.
3582 3584
3606 Entrée de PostModelSwitch3608 Entrée de PostModelSwitch
3607</h4>3609</h4>
3608 3610
3609Les hooks PostModelSwitch reçoivent les mêmes champs que [PreModelSwitch](#premodelswitch-input), avec `hook_event_name` défini sur `"PostModelSwitch"` et deux valeurs supplémentaires pour `source` : `"auto"` pour un basculement automatique vers un modèle de secours ou tout autre changement effectué par Claude Code de lui-même, et `"resume"` pour le modèle restauré lorsque vous reprenez une session.3611Les hooks PostModelSwitch reçoivent les mêmes champs que [PreModelSwitch](#premodelswitch-input), avec `hook_event_name` défini sur `"PostModelSwitch"` et deux valeurs supplémentaires de `source` : `"auto"` pour un basculement automatique vers un modèle de secours ou tout autre changement effectué par Claude Code de lui-même, et `"resume"` pour le modèle restauré lorsque vous reprenez une session.
3610 3612
3611`requested_model` vaut `null` lorsque `source` vaut `"auto"`. Lorsque `source` vaut `"resume"`, il s'agit du paramètre de modèle enregistré que Claude Code a restauré.3613`requested_model` vaut `null` lorsque `source` vaut `"auto"`. Lorsque `source` vaut `"resume"`, il s'agit du paramètre de modèle enregistré que Claude Code a restauré.
3612 3614
3614 Contrôle de décision de PostModelSwitch3616 Contrôle de décision de PostModelSwitch
3615</h4>3617</h4>
3616 3618
3617Claude Code récupère le [stdout en texte brut](#exit-code-0) de votre hook lors d'une sortie avec le code 0, ou `additionalContext` depuis la sortie JSON, et le transmet à Claude avec la prochaine requête après le changement. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez renvoyer :3619Claude Code prend la [sortie stdout en texte brut](#exit-code-0) de votre hook en cas de sortie avec 0, ou `additionalContext` depuis la sortie JSON, et la transmet à Claude avec la prochaine requête après le changement. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez renvoyer :
3618 3620
3619| Champ | Description |3621| Champ | Description |
3620| :- | :- |3622| :- | :- |
3621| `additionalContext` | Chaîne ajoutée au contexte de Claude avec la prochaine requête. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |3623| `additionalContext` | Chaîne ajoutée au contexte de Claude avec la prochaine requête. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |
3622 3624
3623Si le hook n'a pas terminé dans les cinq secondes suivant l'envoi de votre prochain prompt, Claude Code envoie cette requête sans la sortie et la joint plutôt à la requête suivante. Si le modèle change plusieurs fois avant la prochaine requête, Claude Code transmet uniquement la sortie correspondant au modèle cible du dernier changement.3625Si le hook n'a pas terminé dans les cinq secondes suivant l'envoi de votre prochain prompt, Claude Code envoie cette requête sans la sortie et l'attache à la requête suivante. Si le modèle change plusieurs fois avant la prochaine requête, Claude Code ne transmet que la sortie correspondant au modèle cible du dernier changement.
3624 3626
3625<h3 id="sessionend">3627<h3 id="sessionend">
3626 SessionEnd3628 SessionEnd
3627</h3>3629</h3>
3628 3630
3629S'exécute lorsqu'une session Claude Code se termine. Utile pour les tâches de nettoyage, la journalisation des3631S'exécute à la fin d'une session Claude Code. Utile pour les tâches de nettoyage, la journalisation des
3630statistiques de session ou l'enregistrement de l'état de la session. Prend en charge les matchers pour filtrer selon le motif de sortie.3632statistiques de session ou l'enregistrement de l'état de la session. Prend en charge les matchers pour filtrer par motif de sortie.
3631 3633
3632Le champ `reason` dans l'entrée du hook indique pourquoi la session s'est terminée :3634Le champ `reason` de l'entrée du hook indique pourquoi la session s'est terminée :
3633 3635
3634| Motif | Description |3636| Motif | Description |
3635| :- | :- |3637| :- | :- |
3638| `logout` | L'utilisateur s'est déconnecté |3640| `logout` | L'utilisateur s'est déconnecté |
3639| `prompt_input_exit` | L'utilisateur a quitté alors que la saisie du prompt était visible |3641| `prompt_input_exit` | L'utilisateur a quitté alors que la saisie du prompt était visible |
3640| `other` | Autres motifs de sortie |3642| `other` | Autres motifs de sortie |
3641| `bypass_permissions_disabled` | Supprimé dans la v2.1.234 ; Claude Code ne l'envoie pas. Retirez-le de vos matchers `SessionEnd` |3643| `bypass_permissions_disabled` | Supprimé dans la v2.1.234 ; Claude Code ne l'envoie plus. Retirez-le de vos matchers `SessionEnd` |
3642 3644
3643<h4 id="sessionend-input">3645<h4 id="sessionend-input">
3644 Entrée de SessionEnd3646 Entrée de SessionEnd
3656}3658}
3657```3659```
3658 3660
3659Les hooks SessionEnd n'ont aucun contrôle de décision. Ils ne peuvent pas bloquer la fin de la session, mais peuvent effectuer des tâches de nettoyage. Claude Code ignore leurs [champs de sortie JSON](#json-output), tels que `systemMessage`.3661Les hooks SessionEnd n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer la fin de la session, mais peuvent effectuer des tâches de nettoyage. Claude Code ignore leurs [champs de sortie JSON](#json-output), tels que `systemMessage`.
3660 3662
3661Les hooks SessionEnd ont un délai d'expiration par défaut de 1,5 seconde. Il s'applique lorsque vous quittez, exécutez `/clear` ou changez de session avec `/resume` en mode interactif. Vous pouvez accorder plus de temps à un hook de deux façons :3663Les hooks SessionEnd ont un délai d'expiration par défaut de 1,5 seconde. Il s'applique lorsque vous quittez, exécutez `/clear` ou changez de session avec `/resume` en mode interactif. Vous pouvez accorder plus de temps à un hook de deux façons :
3662 3664
3663* **`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é de vos fichiers de paramètres, jusqu'à 60 secondes. Si vous augmentez le budget de cette façon, un hook sans son propre `timeout` conserve tout de même la valeur par défaut. Les délais d'expiration définis sur des hooks fournis par des plugins n'augmentent pas le budget.3665* **`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é de vos fichiers de paramètres, jusqu'à 60 secondes. Si vous augmentez le budget de cette façon, un hook sans son propre `timeout` conserve tout de même la valeur par défaut. Les délais d'expiration définis sur les hooks fournis par des plugins n'augmentent pas le budget.
3664* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`** : définissez cette variable d'environnement en millisecondes pour remplacer explicitement le budget. La valeur que vous définissez devient également le délai d'expiration de chaque hook sans son propre `timeout`.3666* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`** : définissez cette variable d'environnement en millisecondes pour remplacer explicitement le budget. La valeur que vous définissez devient également le délai d'expiration de chaque hook sans son propre `timeout`.
3665 3667
3666Cet exemple définit le budget à 5 secondes :3668Cet exemple définit le budget à 5 secondes :
3669CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude3671CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
3670```3672```
3671 3673
3672Avant la v2.1.268, `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` augmentait uniquement le budget global, et un hook sans son propre `timeout` était tout de même annulé au bout de 1,5 seconde.3674Avant la v2.1.268, `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` n'augmentait que le budget global, et un hook sans son propre `timeout` était toujours annulé au bout de 1,5 seconde.
3673 3675
3674<h3 id="elicitation">3676<h3 id="elicitation">
3675 Elicitation3677 Elicitation
3676</h3>3678</h3>
3677 3679
3678S'exécute lorsqu'un serveur MCP demande une saisie de l'utilisateur en cours de tâche. Par défaut, Claude Code affiche une boîte de dialogue interactive pour que l'utilisateur réponde. Les hooks peuvent intercepter cette demande et y répondre de manière programmatique, en ignorant entièrement la boîte de dialogue.3680S'exécute lorsqu'un serveur MCP demande une saisie de l'utilisateur en cours de tâche. Par défaut, Claude Code affiche une boîte de dialogue interactive pour que l'utilisateur réponde. Les hooks peuvent intercepter cette demande et y répondre de manière programmatique, en ignorant complètement la boîte de dialogue.
3681
3682Pour un hook complet avec son entrée de paramètres et son script, consultez [Répondre à une demande de formulaire depuis un script](#answer-a-form-request-from-a-script).
3679 3683
3680Le champ matcher est comparé au nom du serveur MCP.3684Le champ matcher est comparé au nom du serveur MCP.
3681 3685
3683 Entrée d'Elicitation3687 Entrée d'Elicitation
3684</h4>3688</h4>
3685 3689
3686En plus des [champs d'entrée communs](#common-input-fields), les hooks Elicitation reçoivent `mcp_server_name`, `message` et les champs facultatifs `mode`, `url`, `elicitation_id` et `requested_schema`.3690En plus des [champs d'entrée communs](#common-input-fields), les hooks Elicitation reçoivent `mcp_server_name`, `message`, ainsi que les champs facultatifs `mode`, `url`, `elicitation_id` et `requested_schema`.
3687 3691
3688Pour l'élicitation en mode formulaire, le cas le plus courant :3692Pour une élicitation en mode formulaire, le cas le plus courant :
3689 3693
3690```json theme={null}3694```json theme={null}
3691{3695{
3705}3709}
3706```3710```
3707 3711
3708Pour l'élicitation en mode URL, utilisée pour l'authentification via le navigateur :3712Pour une élicitation en mode URL, utilisée pour l'authentification via le navigateur :
3709 3713
3710```json theme={null}3714```json theme={null}
3711{3715{
3724 Sortie d'Elicitation3728 Sortie d'Elicitation
3725</h4>3729</h4>
3726 3730
3727Pour répondre de manière programmatique sans afficher la boîte de dialogue, renvoyez un objet JSON avec `hookSpecificOutput` :3731Un hook Elicitation peut répondre à la demande à la place de l'utilisateur, la refuser ou l'annuler, ou la laisser à la boîte de dialogue. Pour répondre, refuser ou annuler, terminez avec 0 et affichez un objet `hookSpecificOutput` avec une `action`. Le serveur reçoit votre réponse et aucune boîte de dialogue n'apparaît. Chaque ligne de ce tableau indique ce qu'il faut renvoyer pour un résultat donné et ce que reçoit le serveur MCP :
3732
3733| Pour | Renvoyer | Le serveur reçoit |
3734| :- | :- | :- |
3735| Répondre à la place de l'utilisateur | `"action": "accept"`, avec les valeurs des champs du formulaire dans `content` | `accept` avec votre `content` |
3736| Refuser la demande | `"action": "decline"` | `decline` |
3737| Annuler la demande | `"action": "cancel"` | `cancel` |
3738| Laisser la demande à l'utilisateur | Aucune sortie, avec le code de sortie 0 | La réponse de l'utilisateur depuis la [boîte de dialogue](/docs/fr/mcp#respond-to-mcp-elicitation-requests) |
3739
3740Cette sortie répond à la demande en mode formulaire présentée dans [Entrée d'Elicitation](#elicitation-input). Les clés de `content` sont les noms de propriétés issus du `requested_schema` de cette demande :
3728 3741
3729```json theme={null}3742```json theme={null}
3730{3743{
3738}3751}
3739```3752```
3740 3753
3741| Champ | Valeurs | Description |3754Cette sortie refuse une demande :
3742| :- | :- | :- |3755
3743| `action` | `accept`, `decline`, `cancel` | Indique s'il faut accepter, refuser ou annuler la demande |3756```json theme={null}
3744| `content` | object | Valeurs des champs du formulaire à soumettre. Utilisé uniquement lorsque `action` vaut `accept` |3757{
3758 "hookSpecificOutput": {
3759 "hookEventName": "Elicitation",
3760 "action": "decline"
3761 }
3762}
3763```
3764
3765Dans la boîte de dialogue, sélectionner **Decline** envoie `decline` et appuyer sur `Esc` envoie `cancel` ; renvoyez donc celui que vous souhaitez que le serveur voie.
3766
3767Pour une demande en mode URL, un hook qui renvoie `accept` ignore la boîte de dialogue, de sorte que l'URL ne s'ouvre jamais.
3768
3769Claude Code ignore `reason`, `systemMessage` et `continue` dans la sortie JSON d'un hook Elicitation, quelle que soit l'`action` que vous renvoyez.
3770
3771<h4 id="other-ways-to-decline-an-elicitation">
3772 Autres façons de refuser une élicitation
3773</h4>
3774
3775Votre hook peut également refuser de ces façons. Le serveur reçoit le même `decline` que pour `"action": "decline"` :
3776
3777* **Se terminer avec le code 2** : Claude Code ignore un `hookSpecificOutput` affiché par le même hook
3778* **Afficher un `"decision": "block"` de premier niveau** : le blocage remplace une `action` dans la même sortie
3779
3780Lorsque plusieurs hooks correspondent à la même demande, un refus de l'un d'eux l'emporte sur un `accept` ou un `cancel` d'un autre.
3781
3782Ce script refuse les demandes en mode URL et laisse les demandes de formulaire à la boîte de dialogue :
3783
3784```bash theme={null}
3785#!/bin/bash
3786if [ "$(jq -r '.mode')" = "url" ]; then
3787 exit 2
3788fi
3789```
3790
3791Ni l'utilisateur ni le serveur ne voient pourquoi votre hook a refusé, car Claude Code n'affiche ni votre stderr ni votre `reason`.
3792
3793Claude Code ignorait un `decision` de premier niveau provenant des hooks `Elicitation` et `ElicitationResult` de la v2.1.105 jusqu'à la correction dans la v2.1.284.
3794
3795<h4 id="answer-a-form-request-from-a-script">
3796 Répondre à une demande de formulaire depuis un script
3797</h4>
3798
3799Cet exemple répond à une question récurrente à la place de l'utilisateur. Un serveur MCP nommé `issue-tracker` demande une clé de projet dans un formulaire, et le hook renseigne `DOCS`. Le script accepte lorsque `project_key` est l'unique champ du formulaire. Pour toute autre demande, il n'affiche rien, et la boîte de dialogue apparaît.
3800
3801<Tabs>
3802 <Tab title="macOS/Linux">
3803 Enregistrez un hook de commande pour l'événement dans votre fichier de paramètres, avec le nom du serveur comme matcher :
3804
3805 ```json theme={null}
3806 {
3807 "hooks": {
3808 "Elicitation": [
3809 {
3810 "matcher": "issue-tracker",
3811 "hooks": [
3812 {
3813 "type": "command",
3814 "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/answer-project-key.sh",
3815 "args": []
3816 }
3817 ]
3818 }
3819 ]
3820 }
3821 }
3822 ```
3823
3824 Enregistrez ce script dans `.claude/hooks/answer-project-key.sh` dans votre projet et rendez-le exécutable avec `chmod +x` :
3825
3826 ```bash theme={null}
3827 #!/bin/bash
3828 input=$(cat)
3829 fields=$(jq -c '.requested_schema.properties // {} | keys' <<<"$input")
3830
3831 if [ "$fields" = '["project_key"]' ]; then
3832 jq -n '{hookSpecificOutput: {hookEventName: "Elicitation", action: "accept", content: {project_key: "DOCS"}}}'
3833 fi
3834 ```
3835 </Tab>
3745 3836
3746Le code de sortie 2 refuse l'élicitation. Claude Code n'affiche votre message stderr nulle part.3837 <Tab title="Windows (PowerShell)">
3838 Enregistrez un hook de commande qui exécute le script via PowerShell, avec le nom du serveur comme matcher :
3747 3839
3748Claude Code tient compte de `hookSpecificOutput` dans la sortie JSON d'un hook Elicitation et ignore `systemMessage` et `continue`.3840 ```json theme={null}
3841 {
3842 "hooks": {
3843 "Elicitation": [
3844 {
3845 "matcher": "issue-tracker",
3846 "hooks": [
3847 {
3848 "type": "command",
3849 "command": "powershell.exe",
3850 "args": [
3851 "-NoProfile",
3852 "-ExecutionPolicy",
3853 "Bypass",
3854 "-File",
3855 "${CLAUDE_PROJECT_DIR}/.claude/hooks/answer-project-key.ps1"
3856 ]
3857 }
3858 ]
3859 }
3860 ]
3861 }
3862 }
3863 ```
3864
3865 Enregistrez ce script dans `.claude/hooks/answer-project-key.ps1` dans votre projet :
3866
3867 ```powershell theme={null}
3868 $request = [Console]::In.ReadToEnd() | ConvertFrom-Json
3869 $fields = @($request.requested_schema.properties.PSObject.Properties.Name)
3870
3871 if ($fields.Count -eq 1 -and $fields[0] -eq 'project_key') {
3872 @{
3873 hookSpecificOutput = @{
3874 hookEventName = "Elicitation"
3875 action = "accept"
3876 content = @{ project_key = "DOCS" }
3877 }
3878 } | ConvertTo-Json -Depth 3
3879 }
3880 ```
3881 </Tab>
3882</Tabs>
3883
3884Pour vérifier que le hook fonctionne, démarrez Claude Code avec `claude --debug` et donnez à Claude une tâche qui amène le serveur à demander la clé de projet. Aucune boîte de dialogue n'apparaît, et le [log de débogage](#debug-hooks) contient une ligne qui se termine par `Elicitation resolved by hook: {"action":"accept","content":{"project_key":"DOCS"}}`.
3749 3885
3750<h3 id="elicitationresult">3886<h3 id="elicitationresult">
3751 ElicitationResult3887 ElicitationResult
3753 3889
3754S'exécute après qu'un utilisateur a répondu à une élicitation MCP. Les hooks peuvent observer, modifier ou bloquer la réponse avant qu'elle ne soit renvoyée au serveur MCP.3890S'exécute après qu'un utilisateur a répondu à une élicitation MCP. Les hooks peuvent observer, modifier ou bloquer la réponse avant qu'elle ne soit renvoyée au serveur MCP.
3755 3891
3892Lorsqu'un hook [Elicitation](#elicitation) répond à une demande, Claude Code envoie cette réponse au serveur sans exécuter les hooks ElicitationResult.
3893
3756Le champ matcher est comparé au nom du serveur MCP.3894Le champ matcher est comparé au nom du serveur MCP.
3757 3895
3758<h4 id="elicitationresult-input">3896<h4 id="elicitationresult-input">
3759 Entrée d'ElicitationResult3897 Entrée d'ElicitationResult
3760</h4>3898</h4>
3761 3899
3762En plus des [champs d'entrée communs](#common-input-fields), les hooks ElicitationResult reçoivent `mcp_server_name`, `action` et les champs facultatifs `mode`, `elicitation_id` et `content`.3900En plus des [champs d'entrée communs](#common-input-fields), les hooks ElicitationResult reçoivent `mcp_server_name`, `action`, ainsi que les champs facultatifs `mode`, `elicitation_id` et `content`.
3763 3901
3764```json theme={null}3902```json theme={null}
3765{3903{
3770 "mcp_server_name": "my-mcp-server",3908 "mcp_server_name": "my-mcp-server",
3771 "action": "accept",3909 "action": "accept",
3772 "content": { "username": "alice" },3910 "content": { "username": "alice" },
3773 "mode": "form",3911 "mode": "form"
3774 "elicitation_id": "elicit-123"
3775}3912}
3776```3913```
3777 3914
3779 Sortie d'ElicitationResult3916 Sortie d'ElicitationResult
3780</h4>3917</h4>
3781 3918
3782Pour remplacer la réponse de l'utilisateur, renvoyez un objet JSON avec `hookSpecificOutput` :3919Un hook ElicitationResult peut laisser passer la réponse de l'utilisateur, en modifier les valeurs ou la bloquer. Pour modifier ou bloquer la réponse, terminez avec 0 et affichez un objet `hookSpecificOutput` avec une `action`. Chaque ligne de ce tableau indique ce qu'il faut renvoyer pour un résultat donné et ce que reçoit le serveur MCP :
3920
3921| Pour | Renvoyer | Le serveur reçoit |
3922| :- | :- | :- |
3923| Laisser passer la réponse | Aucune sortie, avec le code de sortie 0 | La réponse de l'utilisateur, inchangée |
3924| Modifier les valeurs soumises | `"action": "accept"`, avec les nouvelles valeurs dans `content` | `accept` avec votre `content` à la place des valeurs de l'utilisateur |
3925| Bloquer la réponse | `"action": "decline"` | `decline`, sans les valeurs de l'utilisateur |
3926| Annuler la demande | `"action": "cancel"` | `cancel`, accompagné des valeurs soumises par l'utilisateur. Pour les retenir, renvoyez `"decline"` |
3927
3928Cette sortie modifie la réponse présentée dans [Entrée d'ElicitationResult](#elicitationresult-input), de sorte que le serveur reçoit `alice@example.com` là où l'utilisateur a soumis `alice` :
3783 3929
3784```json theme={null}3930```json theme={null}
3785{3931{
3786 "hookSpecificOutput": {3932 "hookSpecificOutput": {
3787 "hookEventName": "ElicitationResult",3933 "hookEventName": "ElicitationResult",
3788 "action": "decline",3934 "action": "accept",
3789 "content": {}3935 "content": {
3936 "username": "alice@example.com"
3937 }
3790 }3938 }
3791}3939}
3792```3940```
3793 3941
3794| Champ | Valeurs | Description |3942Votre `content` remplace l'intégralité de l'objet `content` de l'utilisateur ; incluez donc les champs que vous ne modifiez pas. Renvoyez `action` en même temps, car Claude Code ignore un `hookSpecificOutput` dépourvu d'`action`.
3795| :- | :- | :- |3943
3796| `action` | `accept`, `decline`, `cancel` | Remplace l'action de l'utilisateur |3944Les hooks ElicitationResult s'exécutent également lorsque l'utilisateur refuse ou annule, et votre `action` remplace la sienne. Vérifiez que l'`action` de l'entrée vaut `accept` avant de renvoyer `accept`, sinon votre hook transforme une demande refusée en demande acceptée. Ce script effectue la même modification lorsque l'utilisateur a accepté, conserve les autres champs et n'affiche rien dans les autres cas :
3797| `content` | object | Remplace les valeurs des champs du formulaire. N'a de sens que lorsque `action` vaut `accept` |3945
3946```bash theme={null}
3947#!/bin/bash
3948input=$(cat)
3798 3949
3799Le code de sortie 2 bloque la réponse, en changeant l'action effective en `decline`. Claude Code n'affiche votre message stderr nulle part.3950if [ "$(jq -r '.action' <<<"$input")" = "accept" ]; then
3951 jq '{hookSpecificOutput: {hookEventName: "ElicitationResult", action: "accept", content: (.content + {username: (.content.username + "@example.com")})}}' <<<"$input"
3952fi
3953```
3800 3954
3801Claude Code tient compte de `hookSpecificOutput` dans la sortie JSON d'un hook ElicitationResult et ignore `systemMessage` et `continue`.3955Cette sortie bloque la réponse :
3956
3957```json theme={null}
3958{
3959 "hookSpecificOutput": {
3960 "hookEventName": "ElicitationResult",
3961 "action": "decline"
3962 }
3963}
3964```
3965
3966Le code de sortie 2 et un `"decision": "block"` de premier niveau bloquent également la réponse. [Autres façons de refuser une élicitation](#other-ways-to-decline-an-elicitation) explique lequel prend effet lorsqu'un hook les combine, ce que voit l'utilisateur et quelles versions ignoraient `decision`.
3967
3968Claude Code ignore `reason`, `systemMessage` et `continue` dans la sortie JSON d'un hook ElicitationResult, quelle que soit l'`action` que vous renvoyez.
3802 3969
3803<h2 id="prompt-based-hooks">3970<h2 id="prompt-based-hooks">
3804 Hooks basés sur des prompts3971 Hooks basés sur des prompts
3862 4029
3863Définissez `type` à `"prompt"` et fournissez une chaîne `prompt` au lieu d'une `command`. Utilisez le placeholder `$ARGUMENTS` pour injecter les données d'entrée JSON du hook dans votre texte de prompt.4030Définissez `type` à `"prompt"` et fournissez une chaîne `prompt` au lieu d'une `command`. Utilisez le placeholder `$ARGUMENTS` pour injecter les données d'entrée JSON du hook dans votre texte de prompt.
3864 4031
4032Dans un hook de prompt ou un [hook d'agent](#agent-based-hooks), vous pouvez rédiger le `prompt` sous la forme d'une règle indiquant ce qu'il faut bloquer ou autoriser, par exemple « Bloquer toute commande Bash qui lit des fichiers `.env` », ou sous la forme d'une condition qui doit être remplie, par exemple « Tous les tests unitaires passent ».
4033
3865Ce hook `Stop` demande au LLM d'évaluer si toutes les tâches sont complètes avant d'autoriser Claude à terminer :4034Ce hook `Stop` demande au LLM d'évaluer si toutes les tâches sont complètes avant d'autoriser Claude à terminer :
3866 4035
3867```json theme={null}4036```json theme={null}