476| `async` | non | Si `true`, s'exécute en arrière-plan sans bloquer. Consultez [Exécuter les hooks en arrière-plan](#run-hooks-in-the-background) |476| `async` | non | Si `true`, s'exécute en arrière-plan sans bloquer. Consultez [Exécuter les hooks en arrière-plan](#run-hooks-in-the-background) |
477| `asyncRewake` | non | Si `true`, s'exécute en arrière-plan et réveille Claude au code de sortie 2. Le stderr du hook, ou stdout s'il est vide, est affiché à Claude comme un [rappel système](/docs/fr/glossary#system-reminder) afin qu'il puisse réagir à un échec en arrière-plan de longue durée |477| `asyncRewake` | non | Si `true`, s'exécute en arrière-plan et réveille Claude au code de sortie 2. Le stderr du hook, ou stdout s'il est vide, est affiché à Claude comme un [rappel système](/docs/fr/glossary#system-reminder) afin qu'il puisse réagir à un échec en arrière-plan de longue durée |
478| `shell` | non | Shell à utiliser pour ce hook. Accepte `"bash"` ou `"powershell"`. Par défaut `"bash"`, ou `"powershell"` sur Windows lorsque Git Bash n'est pas installé. Définir `"powershell"` exécute la commande via PowerShell sur Windows. Ne nécessite pas `CLAUDE_CODE_USE_POWERSHELL_TOOL` puisque les hooks lancent PowerShell directement. Ignoré lorsque `args` est défini |478| `shell` | non | Shell à utiliser pour ce hook. Accepte `"bash"` ou `"powershell"`. Par défaut `"bash"`, ou `"powershell"` sur Windows lorsque Git Bash n'est pas installé. Définir `"powershell"` exécute la commande via PowerShell sur Windows. Ne nécessite pas `CLAUDE_CODE_USE_POWERSHELL_TOOL` puisque les hooks lancent PowerShell directement. Ignoré lorsque `args` est défini |
479| `onFailure` | non | Ce qu'il advient de l'action lorsque le hook échoue : `"continue"`, la valeur par défaut, ou `"block"`. Consultez [Bloquer l'action lorsqu'un hook échoue](#block-the-action-when-a-hook-fails). Nécessite Claude Code v2.1.295 ou ultérieur |479| `onFailure` | non | Indique si l'action qui a déclenché le hook se poursuit lorsque le hook échoue : `"continue"` ou `"block"`. Consultez [Bloquer l'action lorsqu'un hook échoue](#block-the-action-when-a-hook-fails) pour `"block"` et pour le cas où le champ n'est pas défini. Nécessite Claude Code v2.1.295 ou ultérieur |
480 480
481<a id="exec-form-and-shell-form" />481<a id="exec-form-and-shell-form" />
482 482
829 829
830* **Succès** : votre hook quitte avec 0. Claude Code applique tous les champs de [sortie JSON](#json-output) que votre hook a imprimés, et l'action se poursuit sauf si ces champs la bloquent ou la refusent. [Hooks qui démarrent un processus en arrière-plan](#hooks-that-start-a-background-process) couvre l'exception.830* **Succès** : votre hook quitte avec 0. Claude Code applique tous les champs de [sortie JSON](#json-output) que votre hook a imprimés, et l'action se poursuit sauf si ces champs la bloquent ou la refusent. [Hooks qui démarrent un processus en arrière-plan](#hooks-that-start-a-background-process) couvre l'exception.
831* **Erreur bloquante** : votre hook quitte avec 2. Sur [les événements qui peuvent bloquer](#exit-code-2-behavior-per-event), Claude Code arrête l'action.831* **Erreur bloquante** : votre hook quitte avec 2. Sur [les événements qui peuvent bloquer](#exit-code-2-behavior-per-event), Claude Code arrête l'action.
832* **Erreur non-bloquante** : votre hook quitte avec tout autre code, ou échoue d'une autre manière, par exemple en ne démarrant pas ou en imprimant du JSON invalide. L'action se poursuit, et sur des événements tels que `PreToolUse`, vous voyez un avis `<hook name> hook error` dans la transcription. Si vous souhaitez qu'un hook en échec bloque l'action, définissez [`onFailure: "block"`](#block-the-action-when-a-hook-fails).832* **Erreur non-bloquante** : votre hook quitte avec tout autre code, ou échoue d'une autre manière, par exemple en ne démarrant pas ou en imprimant du JSON invalide. L'action se poursuit, sauf pour les hooks [dont l'échec bloque l'action](#block-the-action-when-a-hook-fails), par exemple un hook avec `onFailure` défini sur `"block"`. Sur des événements tels que `PreToolUse`, vous voyez un avis `<hook name> hook error` dans la transcription.
833 833
834Ce que votre hook imprime sur stdout peut changer le résultat. Par exemple, si un hook `PreToolUse` quitte avec 1 mais imprime du JSON qui passe la validation, l'exécution est un succès et les champs JSON décident de ce qui se passe. Pour trouver le résultat de votre hook sur un événement tel que `PreToolUse`, faites correspondre ce qu'il a imprimé sur stdout dans la première colonne avec son code de sortie en haut :834Ce que votre hook imprime sur stdout peut changer le résultat. Par exemple, lorsqu'un hook `PreToolUse` quitte avec 1 mais imprime du JSON qui passe la validation, ce JSON peut quand même décider de ce qui se passe. Pour trouver le résultat de votre hook sur un événement tel que `PreToolUse`, faites correspondre ce qu'il a imprimé sur stdout dans la première colonne avec son code de sortie en haut :
835 835
836| Stdout | Exit 0 | Exit 2 | Tout autre code de sortie |836| Stdout | Exit 0 | Exit 2 | Tout autre code de sortie |
837| :- | :- | :- | :- |837| :- | :- | :- | :- |
838| Objet JSON qui passe la [validation du schéma](#json-output) | Succès. Les champs s'appliquent | Erreur bloquante. Claude Code lit toujours les champs, mais ils ne peuvent pas remplacer le blocage | Succès. Claude Code ignore le code de sortie, et les champs seuls décident. Avec [`onFailure: "block"`](#block-the-action-when-a-hook-fails), cela compte comme un échec |838| Objet JSON qui passe la [validation du schéma](#json-output) | Succès. Les champs s'appliquent | Erreur bloquante. Claude Code lit toujours les champs, mais ils ne peuvent pas remplacer le blocage | Succès. Claude Code ignore le code de sortie, et les champs seuls décident. Pour les hooks [dont l'échec bloque l'action](#block-the-action-when-a-hook-fails), l'exécution compte plutôt comme un échec |
839| JSON qui [ne peut pas être analysé](#exit-code-0) ou échoue la validation du schéma | Erreur non-bloquante. L'avis porte le message d'analyse ou de validation | Erreur bloquante. Votre stderr est la raison | Erreur non-bloquante. L'avis porte le message d'analyse ou de validation |839| JSON qui [ne peut pas être analysé](#exit-code-0) ou échoue la validation du schéma | Erreur non-bloquante. L'avis porte le message d'analyse ou de validation | Erreur bloquante. Votre stderr est la raison | Erreur non-bloquante. L'avis porte le message d'analyse ou de validation |
840| [Texte brut](#exit-code-0), ou rien | Succès | Erreur bloquante. Votre stderr est la raison | Erreur non-bloquante. L'avis porte la première ligne de votre stderr |840| [Texte brut](#exit-code-0), ou rien | Succès | Erreur bloquante. Votre stderr est la raison | Erreur non-bloquante. L'avis porte la première ligne de votre stderr |
841 841
864* **Deux lignes ou plus qui s'analysent chacune comme JSON seules, la première commençant par `{` et la dernière se terminant par `}`** : texte brut lorsqu'aucune ligne n'est un objet de sortie JSON qui définit un champ, et échec d'analyse lorsque l'une d'elles l'est.864* **Deux lignes ou plus qui s'analysent chacune comme JSON seules, la première commençant par `{` et la dernière se terminant par `}`** : texte brut lorsqu'aucune ligne n'est un objet de sortie JSON qui définit un champ, et échec d'analyse lorsque l'une d'elles l'est.
865* **Tout autre contenu qui commence par `{` et se termine par `}` mais n'est pas du JSON valide** : un échec d'analyse.865* **Tout autre contenu qui commence par `{` et se termine par `}` mais n'est pas du JSON valide** : un échec d'analyse.
866 866
867Lorsque Claude Code essaie d'analyser votre stdout comme JSON et ne peut pas, ou que l'objet analysé échoue la [validation du schéma](#json-output), l'exécution est une [erreur non-bloquante](#exit-code-output). L'avis `<hook name> hook error` porte le message d'analyse ou de validation. Sur les événements qui ajoutent stdout en texte brut comme contexte, Claude Code n'ajoute pas le stdout qu'il n'a pas pu analyser.867Sauf si le hook est l'un de ceux [dont l'échec bloque l'action](#block-the-action-when-a-hook-fails), un échec d'analyse ou un objet analysé qui échoue la [validation du schéma](#json-output) est une [erreur non-bloquante](#exit-code-output). L'avis `<hook name> hook error` porte le message d'analyse ou de validation. Sur les événements qui ajoutent stdout en texte brut comme contexte, Claude Code n'ajoute pas le stdout qu'il n'a pas pu analyser.
868 868
869Claude ne voit jamais le stderr d'un hook qui quitte avec 0. Pour le lire vous-même sur des événements tels que `PreToolUse`, 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é.869Claude ne voit jamais le stderr d'un hook qui quitte avec 0. Pour le lire vous-même sur des événements tels que `PreToolUse`, 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é.
870 870
907 Autres codes de sortie907 Autres codes de sortie
908</h4>908</h4>
909 909
910Lorsque votre hook quitte avec un code autre que 0 ou 2 et imprime du texte brut ou rien sur stdout, l'exécution est une [erreur non-bloquante](#exit-code-output). Vous voyez un avis `<hook name> hook error` dans la transcription avec `Failed with non-blocking status code:` et la première ligne du stderr de votre hook. Par exemple, lorsqu'un hook `PreToolUse` sur `Bash` imprime `something broke` sur stderr et quitte avec 1, l'avis `PreToolUse:Bash hook error` porte cette ligne :910Sauf si le hook est l'un de ceux [dont l'échec bloque l'action](#block-the-action-when-a-hook-fails), un code de sortie autre que 0 ou 2 avec du texte brut ou rien sur stdout est une [erreur non-bloquante](#exit-code-output). Si l'action se poursuit, vous voyez un avis `<hook name> hook error` dans la transcription avec `Failed with non-blocking status code:` et la première ligne du stderr de votre hook.
911
912Par exemple, lorsqu'un hook `PreToolUse` sur `Bash` imprime `something broke` sur stderr et quitte avec 1, l'avis `PreToolUse:Bash hook error` porte cette ligne :
911 913
912```text theme={null}914```text theme={null}
913Failed with non-blocking status code: something broke915Failed with non-blocking status code: something broke
915 917
916Pour capturer le stderr complet plutôt que sa première ligne, activez [la journalisation de débogage](#debug-hooks).918Pour capturer le stderr complet plutôt que sa première ligne, activez [la journalisation de débogage](#debug-hooks).
917 919
918Un hook qui ne peut pas démarrer est également une erreur non-bloquante. Sous forme shell, lorsque le chemin du script n'existe pas ou n'est pas exécutable, le shell quitte avec un code comme 127 et l'avis porte 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`. Lorsque vous configurez un hook de politique, surveillez cet avis à sa première exécution, car un chemin mal orthographié dans `settings.json` signifie que le hook ne s'exécute jamais. Pour bloquer l'action à la place, définissez [`onFailure: "block"`](#block-the-action-when-a-hook-fails).920Sauf si le hook est l'un de ceux [dont l'échec bloque l'action](#block-the-action-when-a-hook-fails), un hook qui ne peut pas démarrer est également une erreur non-bloquante. Sous forme shell, lorsque le chemin du script n'existe pas ou n'est pas exécutable, le shell quitte avec un code comme 127 et l'avis porte le message de l'interpréteur. Par exemple, lorsque le chemin du script n'existe pas, l'avis porte une ligne comme celle-ci :
921
922```text theme={null}
923Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory
924```
925
926Lorsque vous configurez un hook de politique, surveillez cet avis à sa première exécution, car un chemin mal orthographié dans `settings.json` signifie que le hook ne s'exécute jamais. Pour bloquer l'action lorsque le hook ne peut pas démarrer, définissez [`onFailure: "block"`](#block-the-action-when-a-hook-fails).
919 927
920<Warning>928<Warning>
921 Sans JSON valide sur stdout, Claude Code traite exit code 1 comme une erreur non-bloquante, même si 1 est le code d'échec Unix conventionnel. Si votre hook est destiné à appliquer une politique, utilisez `exit 2`.929 Exit code 1 sans sortie JSON valide est une erreur non-bloquante sauf si le hook est l'un de ceux [dont l'échec bloque l'action](#block-the-action-when-a-hook-fails), même si 1 est le code d'échec Unix conventionnel. Si votre hook est destiné à appliquer une politique, utilisez `exit 2`.
922</Warning>930</Warning>
923 931
924<h4 id="timeouts">932<h4 id="timeouts">
929 937
930Sur [`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 :938Sur [`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 :
931 939
932* 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. Pour bloquer l'appel lorsqu'un hook `command` ou `http` expire, définissez [`onFailure: "block"`](#block-the-action-when-a-hook-fails).940* Un hook `command`, `http` ou `mcp_tool` expiré ne bloque pas l'appel d'outil, sauf pour les hooks [dont l'échec bloque l'action](#block-the-action-when-a-hook-fails). 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. Pour bloquer l'appel lorsqu'un hook `command` ou `http` expire, définissez [`onFailure: "block"`](#block-the-action-when-a-hook-fails).
933* 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).941* 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).
934 942
935<h4 id="hooks-that-start-a-background-process">943<h4 id="hooks-that-start-a-background-process">
959 Bloquer l'action lorsqu'un hook échoue967 Bloquer l'action lorsqu'un hook échoue
960</h4>968</h4>
961 969
962Sur la plupart des événements, lorsqu'un hook échoue ou expire, Claude Code exécute quand même l'action, de sorte qu'un hook de politique avec un chemin erroné ou un script qui plante laisse tout passer. Pour bloquer l'action à la place, définissez `"onFailure": "block"` sur un hook `command` ou `http`. La valeur par défaut est `"continue"`. Nécessite Claude Code v2.1.295 ou ultérieur.970Sur la plupart des événements, lorsqu'un hook échoue ou expire, Claude Code exécute quand même l'action. Un hook de politique avec un chemin erroné ou un script qui plante laisse alors tout passer. Pour bloquer l'action à la place, définissez `"onFailure": "block"` sur un hook `command` ou `http`. Nécessite Claude Code v2.1.295 ou ultérieur.
971
972<Note>
973 Sur Windows sans Git Bash, un hook de commande `PreToolUse` ou `PermissionRequest` sous forme shell qui échoue sans `onFailure` défini peut au contraire [bloquer l'appel d'outil](#failed-hooks-on-windows-without-git-bash).
974</Note>
963 975
964Ce hook `PreToolUse` dans `.claude/settings.json` exécute un script de projet avant chaque commande Bash, et bloque la commande si le script échoue :976Ce hook `PreToolUse` dans `.claude/settings.json` exécute un script de projet avant chaque commande Bash, et bloque la commande si le script échoue :
965 977
1007* **Hooks `Stop`, `SubagentStop`, `TaskCompleted` et `TeammateIdle`** : le code de sortie 2 sur ces événements renvoie Claude au travail, et Claude ne peut pas réparer un hook qui ne s'exécute pas1019* **Hooks `Stop`, `SubagentStop`, `TaskCompleted` et `TeammateIdle`** : le code de sortie 2 sur ces événements renvoie Claude au travail, et Claude ne peut pas réparer un hook qui ne s'exécute pas
1008* **Hooks de commande en arrière-plan** : les hooks de commande qui définissent [`async` ou `asyncRewake`](#run-hooks-in-the-background)1020* **Hooks de commande en arrière-plan** : les hooks de commande qui définissent [`async` ou `asyncRewake`](#run-hooks-in-the-background)
1009 1021
1022<h4 id="failed-hooks-on-windows-without-git-bash">
1023 Échecs de hooks sur Windows sans Git Bash
1024</h4>
1025
1026Si l'erreur d'un appel d'outil bloqué inclut ce texte, un hook de commande `PreToolUse` ou `PermissionRequest` a échoué ou expiré et a bloqué l'appel :
1027
1028```text theme={null}
1029blocking because Git Bash wasn't found and this hook doesn't set "shell" to "powershell", so only exit code 0 or 2 counts as its verdict.
1030```
1031
1032Un hook sous forme shell sans `shell` défini s'exécute dans PowerShell lorsque Git Bash n'est pas installé, et un script écrit pour Bash peut ne pas s'y exécuter tel quel. Choisissez la correction qui correspond à votre hook :
1033
1034* **Le hook est écrit pour Bash** : installez [Git for Windows](https://git-scm.com/downloads/win), ou définissez [`CLAUDE_CODE_GIT_BASH_PATH`](/docs/fr/env-vars) si Git Bash est installé à un endroit où Claude Code ne le trouve pas, puis démarrez une nouvelle session
1035* **Le hook exécute un seul `.exe`, pas un fichier `.cmd` ou `.bat`** : placez le programme dans `command` et ses arguments dans `args` pour utiliser la [forme exec](#exec-form-and-shell-form), et ajoutez [`"onFailure": "block"`](#block-the-action-when-a-hook-fails). Claude Code démarre alors le programme sans shell. Sans `"onFailure": "block"`, l'appel peut se poursuivre lorsque le programme échoue, est absent ou expire
1036* **Le hook est écrit pour PowerShell** : ajoutez `"shell": "powershell"` et [`"onFailure": "block"`](#block-the-action-when-a-hook-fails) au hook. Sans `"onFailure": "block"`, l'appel peut se poursuivre lorsque le hook échoue encore ou expire. Pour savoir pourquoi le hook a échoué, consultez le [journal de débogage](#debug-hooks)
1037* **L'action doit se poursuivre lorsque le hook échoue** : ajoutez `"onFailure": "continue"` au hook
1038
1039Pour un hook qui affiche cette erreur, tout code de sortie autre que 0 ou 2 compte comme un [échec](#block-the-action-when-a-hook-fails), même lorsque le hook imprime du JSON qui ne refuse pas l'appel.
1040
1010<h4 id="exit-code-2-behavior-per-event">1041<h4 id="exit-code-2-behavior-per-event">
1011 Comportement du code de sortie 2 par événement1042 Comportement du code de sortie 2 par événement
1012</h4>1043</h4>
1060* **2xx avec un corps vide** : succès, équivalent à exit code 0 sans sortie1091* **2xx avec un corps vide** : succès, équivalent à exit code 0 sans sortie
1061* **2xx avec un corps d'objet JSON** : analysé en utilisant le même schéma [sortie JSON](#json-output) que les hooks de commande. Un corps qui échoue la validation du schéma est une erreur non-bloquante1092* **2xx avec un corps d'objet JSON** : analysé en utilisant le même schéma [sortie JSON](#json-output) que les hooks de commande. Un corps qui échoue la validation du schéma est une erreur non-bloquante
1062* **2xx avec n'importe quel autre corps, comme du texte brut** : erreur non-bloquante, gérée de la même manière qu'un statut non-2xx. Claude Code n'ajoute pas le texte au contexte de Claude1093* **2xx avec n'importe quel autre corps, comme du texte brut** : erreur non-bloquante, gérée de la même manière qu'un statut non-2xx. Claude Code n'ajoute pas le texte au contexte de Claude
1063* **Statut non-2xx** : erreur non-bloquante, l'exécution continue1094* **Statut non-2xx** : erreur non-bloquante
1064* **Défaillance de connexion** : erreur non-bloquante, l'exécution continue1095* **Défaillance de connexion** : erreur non-bloquante
1065* **Délai d'expiration** : le hook est annulé, comme décrit sous [Délais d'expiration](#timeouts)1096* **Délai d'expiration** : le hook est annulé, comme décrit sous [Délais d'expiration](#timeouts)
1066 1097
1067Les hooks HTTP ne peuvent pas signaler une erreur bloquante uniquement via le code de statut : un statut non-2xx ou une connexion échouée est une [erreur non-bloquante](#exit-code-output). Pour bloquer un appel d'outil ou refuser une permission, retournez une réponse 2xx avec un corps JSON contenant les champs de décision appropriés. Pour bloquer l'action lorsque la requête échoue ou retourne un statut non-2xx, définissez [`onFailure: "block"`](#block-the-action-when-a-hook-fails).1098Après une [erreur non-bloquante](#exit-code-output), l'action se poursuit sauf si le hook est l'un de ceux [dont l'échec bloque l'action](#block-the-action-when-a-hook-fails). Pour bloquer un appel d'outil ou refuser une permission, retournez une réponse 2xx avec un corps JSON contenant les [champs de décision](#decision-control) appropriés. Pour bloquer l'action lorsque la requête échoue ou retourne un statut non-2xx, définissez [`onFailure: "block"`](#block-the-action-when-a-hook-fails).
1068 1099
1069<h3 id="json-output">1100<h3 id="json-output">
1070 Sortie JSON1101 Sortie JSON
1573}1604}
1574```1605```
1575 1606
1607Lorsque le prompt est un [skill](/docs/fr/skills) ou une commande personnalisée que vous avez saisi, comme `/deploy staging`, le hook reçoit cette ligne telle que vous l'avez saisie, et non le contenu développé du skill. Si le hook bloque le prompt, la commande ne s'exécute pas, et les commandes shell que le skill [injecte avec `` !`<command>` ``](/docs/fr/skills#inject-dynamic-context) ne s'exécutent donc pas non plus. Pour effectuer la correspondance sur le nom ou les arguments de la commande, utilisez plutôt [UserPromptExpansion](#userpromptexpansion).
1608
1576<h4 id="userpromptsubmit-decision-control">1609<h4 id="userpromptsubmit-decision-control">
1577 Contrôle de décision d'UserPromptSubmit1610 Contrôle de décision d'UserPromptSubmit
1578</h4>1611</h4>
2076 2109
2077| Champ | Description |2110| Champ | Description |
2078| :- | :- |2111| :- | :- |
2079| `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), pour les [lectures depuis des chemins réseau](/docs/fr/permissions#network-paths), et pour `AskUserQuestion` et `ExitPlanMode`, qui nécessitent d'y [associer `updatedInput`](#allow-with-updatedinput). `"deny"` empêche l'appel d'outil. `"ask"` demande confirmation à l'utilisateur. `"defer"` sort proprement afin que l'outil puisse être repris ultérieurement. Les [règles de refus et de demande](/docs/fr/permissions#manage-permissions) sont toujours évaluées, quoi que renvoie le hook |2112| `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 les [lectures depuis des chemins réseau](/docs/fr/permissions#network-paths). `AskUserQuestion` et `ExitPlanMode` nécessitent [`updatedInput` associé à `"allow"`](#allow-with-updatedinput). Pour le mode plan, consultez [Approbations par hook en mode plan](/docs/fr/permissions#hook-approvals-in-plan-mode). `"deny"` empêche l'appel d'outil. `"ask"` demande à l'utilisateur de confirmer. `"defer"` quitte 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 valeur renvoyée par le hook |
2080| `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) lors d'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) |2113| `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) lors d'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) |
2081| `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 à celle 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"` |2114| `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 à celle 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"` |
2082| `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) |2115| `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) |
3718 3751
3719Claude 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.3752Claude 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.
3720 3753
3721Un hook PreModelSwitch qui ne répond pas avant son délai d'expiration bloque le changement. Pour l'effet d'un délai d'expiration sur les autres événements, consultez [Délais d'expiration](#timeouts). 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.3754<h4 id="premodelswitch-timeouts-and-other-exit-codes">
3755 Délais d'expiration et autres codes de sortie de PreModelSwitch
3756</h4>
3757
3758Un hook PreModelSwitch qui ne répond pas avant son délai d'expiration bloque le changement. Le délai d'expiration par défaut pour cet événement est de 30 secondes.
3722 3759
3723Un hook qui se termine avec un code autre que 0 ou 2 et n'affiche aucune décision JSON constitue une erreur non bloquante, comme décrit dans [Autres codes de sortie](#other-exit-codes).3760Pour savoir ce que produit un code de sortie autre que 0 ou 2, consultez [Autres codes de sortie](#other-exit-codes).
3724 3761
3725<h3 id="postmodelswitch">3762<h3 id="postmodelswitch">
3726 PostModelSwitch3763 PostModelSwitch