827 827
828Le code de sortie de votre hook indique à Claude Code s'il doit poursuivre l'action qui a déclenché le hook, comme un appel d'outil ou un prompt. Une exécution qui se termine aboutit à l'un de ces trois résultats :828Le code de sortie de votre hook indique à Claude Code s'il doit poursuivre l'action qui a déclenché le hook, comme un appel d'outil ou un prompt. Une exécution qui se termine aboutit à l'un de ces trois résultats :
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.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, 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).
833 833
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).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).
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).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).
934 934
935<h4 id="hooks-that-start-a-background-process">
936 Hooks qui démarrent un processus en arrière-plan
937</h4>
938
939Si votre hook de commande prend sa décision dans un processus en arrière-plan puis se termine, un refus que ce processus imprime après que Claude Code a cessé de lire ne bloque pas l'appel d'outil. Pour un hook qui n'est pas [async](#run-hooks-in-the-background), Claude Code termine la lecture de la sortie du hook peu après la fin du propre processus du hook.
940
941Imprimez la décision avant de démarrer un processus en arrière-plan, et redirigez le stdout et le stderr de ce processus. Si votre script imprime une autorisation, puis démarre un processus en arrière-plan sans rediriger le stdout et le stderr de ce processus, Claude Code bloque l'appel d'outil. L'erreur du hook inclut `refusing to honor the suspect capture`.
942
943Ce script de hook `PreToolUse` imprime la décision avec `policy-check.sh`, puis envoie des métriques en arrière-plan :
944
945```bash theme={null}
946#!/bin/bash
947"$CLAUDE_PROJECT_DIR"/.claude/hooks/policy-check.sh || exit $?
948"$CLAUDE_PROJECT_DIR"/.claude/hooks/upload-metrics.sh >/dev/null 2>&1 &
949```
950
951Le reste du script fait ceci :
952
953* **`|| exit $?`** : fait du code de sortie de la vérification celui du hook, de sorte qu'une vérification qui quitte avec 2 pour refuser bloque toujours. Sinon, le hook quitte avec le code de la dernière ligne, qui est 0.
954* **`>/dev/null 2>&1 &`** : exécute `upload-metrics.sh` en arrière-plan avec sa sortie redirigée, afin qu'il ne garde pas la sortie du hook ouverte.
955
956Pour tester le script, faites en sorte que `policy-check.sh` quitte avec 2, puis déclenchez un appel d'outil auquel le hook correspond. L'appel d'outil est bloqué.
957
935<h4 id="block-the-action-when-a-hook-fails">958<h4 id="block-the-action-when-a-hook-fails">
936 Bloquer l'action lorsqu'un hook échoue959 Bloquer l'action lorsqu'un hook échoue
937</h4>960</h4>
1245 Événements de hook1268 Événements de hook
1246</h2>1269</h2>
1247 1270
1248Chaque é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.1271Chaque é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 de ce 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.
1249 1272
1250<h3 id="sessionstart">1273<h3 id="sessionstart">
1251 SessionStart1274 SessionStart
1253 1276
1254S'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).1277S'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).
1255 1278
1256SessionStart 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.1279SessionStart s'exécute à chaque session : veillez donc à ce que ces hooks soient 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.
1257 1280
1258La valeur du matcher correspond à la manière dont la session a été lancée :1281La valeur du matcher correspond à la manière dont la session a été lancée :
1259 1282
1265| `compact` | Compaction automatique ou manuelle |1288| `compact` | Compaction automatique ou manuelle |
1266| `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) |1289| `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) |
1267 1290
1268Avant la v2.1.214, les sessions dérivées signalaient la source `"resume"`.1291Avant la v2.1.214, les sessions dérivées indiquaient la source `"resume"`.
1269 1292
1270Lorsque 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.1293Lorsque 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.
1271 1294
1272Lorsque 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.1295Lorsque 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.
1273 1296
1274La 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.1297La même attente s'applique au lancement, y compris pour une session reprise : un prompt que vous envoyez pendant que des hooks SessionStart sont encore en cours d'exécution ne parvient à Claude qu'une fois ceux-ci terminés.
1275 1298
1276Pendant 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.1299Pendant l'une ou l'autre de ces attentes, appuyez sur `Esc` pour récupérer le prompt dans la zone de saisie sans l'envoyer. Les hooks continuent de s'exécuter.
1277 1300
1278<h4 id="sessionstart-input">1301<h4 id="sessionstart-input">
1279 Entrée de SessionStart1302 Entrée de SessionStart
1280</h4>1303</h4>
1281 1304
1282En 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` :1305En plus des [champs d'entrée communs](#common-input-fields), les hooks SessionStart reçoivent `source` et, éventuellement, `model`, `agent_type` et `session_title` :
1283 1306
1284| Champ | Description |1307| Champ | Description |
1285| :- | :- |1308| :- | :- |
1286| `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 |1309| `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 |
1287| `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 |1310| `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 |
1288| `agent_type` | Le nom de l'agent, présent lorsque vous démarrez Claude Code avec `claude --agent <name>` |1311| `agent_type` | Le nom de l'agent, présent lorsque vous démarrez Claude Code avec `claude --agent <name>` |
1289| `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 |1312| `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 |
1290 1313
1291Une 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`.1314Une 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`.
1292 1315
1293Lorsque `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.1316Lorsque `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 s'en servir 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.
1294 1317
1295| Champ | Description |1318| Champ | Description |
1296| :- | :- |1319| :- | :- |
1297| `seconds_since_last_response` | Secondes réelles écoulées depuis la dernière réponse de la transcription reprise |1320| `seconds_since_last_response` | Secondes réelles écoulées depuis la dernière réponse dans la transcription reprise |
1298| `context_tokens` | Tokens que la première requête de la session reprise renvoie comme prompt |1321| `context_tokens` | Tokens que la première requête de la session reprise renvoie comme prompt |
1299| `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 |1322| `prompt_cache_likely_expired` | `true` lorsque la dernière réponse est plus ancienne que la [durée de vie du prompt cache](/docs/fr/prompt-caching#cache-lifetime) de la session ou qu'une compaction ultérieure a remplacé la conversation mise en cache |
1300| `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 |1323| `estimated_cache_write_usd` | Coût estimé en dollars américains de l'écriture de `context_tokens` dans le prompt cache sur le modèle de la session, hors réponse |
1301 1324
1302Cet exemple montre l'entrée pour une session reprise 90 minutes après sa dernière réponse :1325Cet exemple montre l'entrée d'une session reprise 90 minutes après sa dernière réponse :
1303 1326
1304```json theme={null}1327```json theme={null}
1305{1328{
1325| Champ | Description |1348| Champ | Description |
1326| :- | :- |1349| :- | :- |
1327| `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 |1350| `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 |
1328| `initialUserMessage` | Chaîne utilisée comme premier message utilisateur de la session, en [mode non interactif](/docs/fr/headless) avec le flag `-p`. Elle devient le premier tour même si vous ne passez aucun prompt. Un prompt que vous passez suit comme tour suivant |1351| `initialUserMessage` | Chaîne utilisée comme premier message utilisateur de la session, en [mode non interactif](/docs/fr/headless) avec le flag `-p`. Elle devient le premier tour même si vous ne transmettez aucun prompt. Un prompt que vous transmettez suit comme tour suivant |
1329| `sessionTitle` | Définit le titre de la session, avec le même effet que `/rename`. S'applique lorsque `source` vaut `"startup"`, `"resume"` ou `"fork"` |1352| `sessionTitle` | Définit le titre de la session, avec le même effet que `/rename`. S'applique lorsque `source` vaut `"startup"`, `"resume"` ou `"fork"` |
1330| `watchPaths` | Tableau de chemins absolus à surveiller pour les événements [FileChanged](#filechanged) pendant cette session |1353| `watchPaths` | Tableau de chemins absolus à surveiller pour les événements [FileChanged](#filechanged) pendant cette session |
1331| `reloadSkills` | Booléen. Lorsqu'il vaut `true`, Claude Code analyse de nouveau les répertoires de [skills](/docs/fr/skills) et de commandes une fois les hooks SessionStart terminés. Consultez [Recharger les skills installés par un hook](#reload-skills-that-a-hook-installs) |1354| `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. Consultez [Recharger les skills installés par un hook](#reload-skills-that-a-hook-installs) |
1332 1355
1333Cette sortie ajoute du contexte et nomme la session :1356Cette sortie ajoute du contexte et nomme la session :
1334 1357
1344 1367
1345Un hook qui se contente d'ajouter du contexte peut l'afficher sans construire de JSON, car Claude Code ajoute la [sortie stdout en texte brut](#exit-code-0) d'un hook SessionStart au contexte de Claude.1368Un hook qui se contente d'ajouter du contexte peut l'afficher sans construire de JSON, car Claude Code ajoute la [sortie stdout en texte brut](#exit-code-0) d'un hook SessionStart au contexte de Claude.
1346 1369
1347Si le hook SessionStart de votre plugin fournit `initialUserMessage` ou `sessionTitle`, installez le plugin avant le démarrage de la session. Claude Code ignore ces deux champs provenant d'un plugin dont l'installation se termine après l'exécution des hooks SessionStart.1370Si le hook SessionStart de votre plugin fournit `initialUserMessage` ou `sessionTitle`, installez le plugin avant le démarrage de la session. Claude Code ignore ces deux champs lorsqu'ils proviennent d'un plugin dont l'installation se termine après l'exécution des hooks SessionStart.
1348 1371
1349<h4 id="reload-skills-that-a-hook-installs">1372<h4 id="reload-skills-that-a-hook-installs">
1350 Recharger les skills installés par un hook1373 Recharger les skills installés par un hook
1351</h4>1374</h4>
1352 1375
1353Pour rendre les skills installés par un hook SessionStart disponibles dans la même session, renvoyez `reloadSkills`. La découverte des skills s'exécute normalement avant la fin des hooks SessionStart ; sans ce champ, les fichiers qu'un hook écrit dans `~/.claude/skills/` ou `.claude/skills/` peuvent être absents lors de l'exécution du premier prompt.1376Pour rendre disponibles dans la même session les skills qu'un hook SessionStart installe, renvoyez `reloadSkills`. La découverte des skills s'exécute normalement avant la fin des hooks SessionStart ; sans ce champ, les fichiers qu'un hook écrit dans `~/.claude/skills/` ou `.claude/skills/` peuvent donc être absents lors de l'exécution du premier prompt.
1354 1377
1355Cet exemple synchronise un dépôt de skills partagé et demande une nouvelle analyse :1378Cet exemple synchronise un dépôt de skills partagé et demande une nouvelle analyse :
1356 1379
1363echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1386echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1364```1387```
1365 1388
1366L'URL du dépôt est un exemple fictif. Remplacez-la par votre propre dépôt de skills.1389L'URL du dépôt est fictive. Remplacez-la par celle de votre propre dépôt de skills.
1367 1390
1368<h4 id="persist-environment-variables">1391<h4 id="persist-environment-variables">
1369 Conserver les variables d'environnement1392 Conserver les variables d'environnement
1370</h4>1393</h4>
1371 1394
1372Les hooks SessionStart ont accès à la variable d'environnement `CLAUDE_ENV_FILE`, qui fournit un chemin de fichier où vous pouvez conserver des variables d'environnement pour les commandes shell que Claude exécute plus tard dans la session.1395Les hooks SessionStart ont accès à la variable d'environnement `CLAUDE_ENV_FILE`, qui fournit un chemin de fichier dans lequel vous pouvez conserver des variables d'environnement pour les commandes shell que Claude exécute plus tard dans la session.
1373 1396
1374Pour définir des variables d'environnement individuelles, écrivez des instructions `export` dans `CLAUDE_ENV_FILE`. Utilisez l'ajout (`>>`) pour préserver les variables définies par d'autres hooks :1397Pour définir des variables d'environnement individuelles, écrivez des instructions `export` dans `CLAUDE_ENV_FILE`. Utilisez l'ajout (`>>`) pour préserver les variables définies par d'autres hooks :
1375 1398
1404exit 01427exit 0
1405```1428```
1406 1429
1407Chaque commande Bash exécute le contenu du fichier comme code shell avant la commande elle-même ; une ligne de ce fichier peut donc utiliser tout ce que Bash évalue, comme la référence `$PATH` dans `export PATH="$PATH:./node_modules/.bin"`.1430Chaque commande Bash exécute le contenu du fichier en tant que code shell avant la commande elle-même ; une ligne de ce fichier peut donc utiliser tout ce que Bash évalue, comme la référence `$PATH` dans `export PATH="$PATH:./node_modules/.bin"`.
1408 1431
1409<a id="persisted-variables-in-powershell-commands" />1432<a id="persisted-variables-in-powershell-commands" />
1410 1433
1412 Variables conservées dans les commandes PowerShell1435 Variables conservées dans les commandes PowerShell
1413</h5>1436</h5>
1414 1437
1415Les commandes [PowerShell](/docs/fr/tools-reference#powershell-tool) reçoivent elles aussi les variables de `CLAUDE_ENV_FILE`, dans Claude Code v2.1.296 ou version ultérieure, mais PowerShell n'exécute jamais le fichier. Claude Code en extrait plutôt les affectations et les copie dans l'environnement de la commande PowerShell. Il ne le fait que lorsque chaque ligne relève de l'un des cas suivants, sur l'ensemble de ce que chaque hook de cette session a écrit et de tout script vers lequel vous avez [défini `CLAUDE_ENV_FILE`](/docs/fr/env-vars) avant le lancement :1438Les commandes [PowerShell](/docs/fr/tools-reference#powershell-tool) reçoivent également les variables de `CLAUDE_ENV_FILE`, dans Claude Code v2.1.296 ou une version ultérieure, mais PowerShell n'exécute jamais le fichier. Claude Code en extrait plutôt les affectations et les copie dans l'environnement de la commande PowerShell. Il ne le fait que lorsque chaque ligne correspond à l'un des cas suivants, pour l'ensemble de ce que chaque hook de cette session a écrit et de tout script sur lequel vous avez [défini `CLAUDE_ENV_FILE`](/docs/fr/env-vars) avant le lancement :
1416 1439
1417* Une ligne vide ou un commentaire `#`1440* Une ligne vide ou un commentaire `#`
1418* Une affectation unique en début de ligne, écrite `export NAME=value`, `declare -x NAME=value` ou `NAME=value`, avec une valeur que Bash utiliserait exactement telle qu'elle est écrite, composée de n'importe quelle combinaison des éléments suivants : du texte sans guillemets n'utilisant que des lettres, des chiffres et les caractères `_ @ % + = : , . / -`, du texte entre guillemets simples, et du texte entre guillemets doubles où tout `$`, accent grave ou `"` à l'intérieur est échappé par une barre oblique inverse1441* Une affectation unique en début de ligne, écrite `export NAME=value`, `declare -x NAME=value` ou `NAME=value`, avec une valeur que Bash utiliserait exactement telle qu'elle est écrite, composée de n'importe quelle combinaison des éléments suivants : du texte sans guillemets n'utilisant que des lettres, des chiffres et les caractères `_ @ % + = : , . / -`, du texte entre guillemets simples, et du texte entre guillemets doubles dans lequel chaque `$`, backtick ou `"` est échappé par une barre oblique inverse
1419 1442
1420Si une ligne est d'un autre type, comme `export PATH="$PATH:./node_modules/.bin"` avec son `$PATH` non échappé, une commande `source` ou les chaînes `$'...'` qu'affiche `direnv export bash`, les commandes PowerShell ne reçoivent aucune des variables, et `claude --debug` journalise `Session environment is not all plain assignments`. Les commandes Bash les reçoivent toujours toutes. Sous Windows, les commandes PowerShell ne reçoivent pas non plus une variable dont la valeur contient `/` ou `\`, car Git Bash et Windows écrivent les chemins différemment. Une commande PowerShell [en sandbox](/docs/fr/sandboxing) ne reçoit aucune des variables.1443Si une ligne est d'un autre type, comme `export PATH="$PATH:./node_modules/.bin"` avec son `$PATH` non échappé, une commande `source` ou les chaînes `$'...'` qu'affiche `direnv export bash`, les commandes PowerShell ne reçoivent aucune des variables, et `claude --debug` consigne `Session environment is not all plain assignments`. Les commandes Bash les reçoivent toujours toutes. Sous Windows, les commandes PowerShell ne reçoivent pas non plus une variable dont la valeur contient `/` ou `\`, car Git Bash et Windows écrivent les chemins différemment. Une commande PowerShell exécutée dans un [sandbox](/docs/fr/sandboxing) ne reçoit aucune des variables.
1421 1444
1422<Note>1445<Note>
1423 `CLAUDE_ENV_FILE` est disponible pour les hooks SessionStart, [Setup](#setup), [CwdChanged](#cwdchanged) et [FileChanged](#filechanged). Les autres événements de hook n'ont pas accès à cette variable, pas plus qu'un hook exécuté dans PowerShell, que ce soit via [`"shell": "powershell"`](#command-hook-fields) ou par défaut sous Windows sans Git Bash.1446 `CLAUDE_ENV_FILE` est disponible pour les hooks SessionStart, [Setup](#setup), [CwdChanged](#cwdchanged) et [FileChanged](#filechanged). Les autres événements de hook n'ont pas accès à cette variable, pas plus qu'un hook qui s'exécute dans PowerShell, que ce soit via [`"shell": "powershell"`](#command-hook-fields) ou par défaut sous Windows sans Git Bash.
1424</Note>1447</Note>
1425 1448
1426<h3 id="setup">1449<h3 id="setup">
1436| `init` | `claude --init-only` ou `claude -p --init` |1459| `init` | `claude --init-only` ou `claude -p --init` |
1437| `maintenance` | `claude -p --maintenance` |1460| `maintenance` | `claude -p --maintenance` |
1438 1461
1439Lorsque vous exécutez `claude --init-only`, Claude Code exécute les hooks Setup et les hooks `SessionStart` avec le matcher `startup`, puis se termine sans démarrer de conversation.1462Lorsque vous exécutez `claude --init-only`, Claude Code exécute les hooks Setup et les hooks `SessionStart` avec le matcher `startup`, puis se ferme sans démarrer de conversation.
1440 1463
1441Lorsque 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).1464Lorsque 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).
1442 1465
1443En 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.1466En cas de succès, `--init-only` n'affiche rien dans le terminal. Pour vérifier que les hooks se sont exécutés, démarrez avec `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.
1444 1467
1445Comme 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.1468Comme 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. La 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 `${CLAUDE_PLUGIN_DATA}/node_modules` et exécute `npm install` en cas d'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, ce modèle n'est peut-être pas nécessaire : 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.
1446 1469
1447<h4 id="setup-input">1470<h4 id="setup-input">
1448 Entrée de Setup1471 Entrée de Setup
1464 Contrôle de décision de Setup1487 Contrôle de décision de Setup
1465</h4>1488</h4>
1466 1489
1467Les 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`.1490Les 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, 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`.
1468 1491
1469Les 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).1492Les 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).
1470 1493
1476 1499
1477Cet é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`.1500Cet é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`.
1478 1501
1479Le 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.1502Le matcher s'applique à `load_reason`. Par exemple, utilisez `"matcher": "session_start"` pour ne le déclencher 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.
1480 1503
1481<h4 id="instructionsloaded-input">1504<h4 id="instructionsloaded-input">
1482 Entrée d'InstructionsLoaded1505 Entrée d'InstructionsLoaded
1488| :- | :- |1511| :- | :- |
1489| `file_path` | Chemin absolu du fichier d'instructions qui a été chargé |1512| `file_path` | Chemin absolu du fichier d'instructions qui a été chargé |
1490| `memory_type` | Portée du fichier : `"User"`, `"Project"`, `"Local"` ou `"Managed"` |1513| `memory_type` | Portée du fichier : `"User"`, `"Project"`, `"Local"` ou `"Managed"` |
1491| `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 |1514| `load_reason` | Raison du chargement du fichier : `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` ou `"compact"`. La valeur `"compact"` se déclenche lorsque des fichiers d'instructions sont rechargés après un événement de compaction |
1492| `globs` | Motifs glob de chemin issus du frontmatter `paths:` du fichier, le cas échéant. Présent uniquement pour les chargements `path_glob_match` |1515| `globs` | Motifs glob de chemins issus du frontmatter `paths:` du fichier, le cas échéant. Présent uniquement pour les chargements `path_glob_match` |
1493| `trigger_file_path` | Chemin du fichier dont l'accès a déclenché ce chargement, pour les chargements à la demande |1516| `trigger_file_path` | Chemin du fichier dont l'accès a déclenché ce chargement, pour les chargements à la demande |
1494| `parent_file_path` | Chemin du fichier d'instructions parent qui a inclus celui-ci, pour les chargements `include` |1517| `parent_file_path` | Chemin du fichier d'instructions parent qui a inclus celui-ci, pour les chargements `include` |
1495 1518
1509 Contrôle de décision d'InstructionsLoaded1532 Contrôle de décision d'InstructionsLoaded
1510</h4>1533</h4>
1511 1534
1512Les 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é.1535Les 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é.
1513 1536
1514<h3 id="userpromptsubmit">1537<h3 id="userpromptsubmit">
1515 UserPromptSubmit1538 UserPromptSubmit
1519d'ajouter du contexte supplémentaire en fonction du prompt ou de la conversation, de valider des prompts ou1542d'ajouter du contexte supplémentaire en fonction du prompt ou de la conversation, de valider des prompts ou
1520de bloquer certains types de prompts.1543de bloquer certains types de prompts.
1521 1544
1522Les hooks `UserPromptSubmit` ne se déclenchent pas uniquement sur les prompts que vous saisissez. Claude Code les exécute également lors :1545Les hooks `UserPromptSubmit` ne se déclenchent pas uniquement sur les prompts que vous saisissez. Claude Code les exécute également lors de :
1523 1546
1524* Du déclenchement d'une [tâche planifiée](/docs/fr/scheduled-tasks), y compris une itération de `/loop`1547* Le déclenchement d'une [tâche planifiée](/docs/fr/scheduled-tasks), y compris une itération de `/loop`
1525* 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é1548* Le 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é
1526* D'un [message qu'une autre session envoie](/docs/fr/cross-session-messaging) à votre conversation principale1549* Un [message envoyé par une autre session](/docs/fr/cross-session-messaging) à votre conversation principale
1527 1550
1528Les 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.1551Les 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'à 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.
1529 1552
1530Hormis pour un hook de commande exécuté avec [`async: true`](#run-hooks-in-the-background), un hook `UserPromptSubmit` de type commande, HTTP ou outil MCP 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. Pour bloquer plutôt le prompt, définissez [`onFailure: "block"`](#block-the-action-when-a-hook-fails) sur un hook de commande ou HTTP. 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.1553Hormis 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. Pour bloquer plutôt le prompt, définissez [`onFailure: "block"`](#block-the-action-when-a-hook-fails) sur un hook de commande ou HTTP. La transcription affiche un avis indiquant le nom du hook, le délai d'expiration qui s'est déclenché et le fait que la sortie a été ignorée.
1531 1554
1532Un [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.1555Un [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 hook et le délai d'expiration, car un callback à cet endroit peut servir de contrôle de politique qui ne doit pas échouer en mode ouvert. La session continue. Avant la v2.1.208, l'expiration d'un callback sur cet événement mettait fin au tour avec une erreur d'exécution.
1533 1556
1534<h4 id="userpromptsubmit-input">1557<h4 id="userpromptsubmit-input">
1535 Entrée d'UserPromptSubmit1558 Entrée d'UserPromptSubmit
1536</h4>1559</h4>
1537 1560
1538En 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.1561En 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.
1539 1562
1540Les 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).1563Les 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).
1541 1564
1558 1581
1559Il existe deux façons d'ajouter du contexte à la conversation avec le code de sortie 0 :1582Il existe deux façons d'ajouter du contexte à la conversation avec le code de sortie 0 :
1560 1583
1561* **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)1584* **Stdout en texte brut** : Claude Code ajoute au contexte de Claude la sortie stdout qu'il [traite comme du texte brut](#exit-code-0)
1562* **JSON avec `additionalContext`** : utilisez le format JSON ci-dessous pour davantage de contrôle. Le champ `additionalContext` est ajouté comme contexte1585* **JSON avec `additionalContext`** : utilisez le format JSON ci-dessous pour plus de contrôle. Le champ `additionalContext` est ajouté en tant que contexte
1563 1586
1564Aucun 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).1587Aucun de ces 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).
1565 1588
1566Pour bloquer un prompt, renvoyez un objet JSON dont `decision` est défini sur `"block"` :1589Pour bloquer un prompt, renvoyez un objet JSON avec `decision` défini sur `"block"` :
1567 1590
1568| Champ | Description |1591| Champ | Description |
1569| :- | :- |1592| :- | :- |
1570| `decision` | `"block"` arrête le prompt avant qu'il ne parvienne à Claude. Omettez-le pour laisser le prompt poursuivre |1593| `decision` | `"block"` arrête le prompt avant qu'il n'atteigne Claude. Omettez-le pour laisser le prompt se poursuivre |
1571| `reason` | Affiché à l'utilisateur lorsque `decision` vaut `"block"`. N'est pas ajouté au contexte |1594| `reason` | Affiché à l'utilisateur lorsque `decision` vaut `"block"`. Non ajouté au contexte |
1572| `additionalContext` | Chaîne ajoutée au contexte de Claude avec le prompt soumis. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |1595| `additionalContext` | Chaîne ajoutée au contexte de Claude en plus du prompt soumis. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |
1573| `sessionTitle` | Définit le titre de la session. À utiliser pour nommer automatiquement les sessions en fonction du contenu du prompt |1596| `sessionTitle` | Définit le titre de la session. Utilisez-le pour nommer automatiquement les sessions en fonction du contenu du prompt |
1574| `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) |1597| `suppressOriginalPrompt` | S'il vaut `true` lorsque le hook bloque le prompt, exclut le texte du prompt du message de blocage. Consultez [Ce que laisse derrière lui un prompt bloqué](#what-a-blocked-prompt-leaves-behind) |
1575 1598
1576Un 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.1599Un hook qui bloque en se terminant avec le code 2 suit le même acheminement que `reason` : le message de blocage affiche le texte stderr à l'utilisateur, et celui-ci n'est pas ajouté au contexte.
1577 1600
1578```json theme={null}1601```json theme={null}
1579{1602{
1592 Ce que laisse derrière lui un prompt bloqué1615 Ce que laisse derrière lui un prompt bloqué
1593</h4>1616</h4>
1594 1617
1595Un 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.1618Un 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.
1596 1619
1597`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).1620`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 un secret d'être é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).
1598 1621
1599<h3 id="userpromptexpansion">1622<h3 id="userpromptexpansion">
1600 UserPromptExpansion1623 UserPromptExpansion
1601</h3>1624</h3>
1602 1625
1603S'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`.1626S'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 que `additionalContext`.
1604 1627
1605Cet é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.1628Cet é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 directement `/skillname` contourne `PreToolUse`. `UserPromptExpansion` se déclenche sur ce chemin direct.
1606 1629
1607Le matcher s'applique à `command_name`. Laissez le matcher vide pour déclencher le hook sur chaque commande de type prompt.1630Le matcher s'applique à `command_name`. Laissez le matcher vide pour le déclencher sur chaque commande de type prompt.
1608 1631
1609<h4 id="userpromptexpansion-input">1632<h4 id="userpromptexpansion-input">
1610 Entrée d'UserPromptExpansion1633 Entrée d'UserPromptExpansion
1635 1658
1636| Champ | Description |1659| Champ | Description |
1637| :- | :- |1660| :- | :- |
1638| `decision` | `"block"` empêche le développement de la commande. Omettez-le pour la laisser poursuivre |1661| `decision` | `"block"` empêche le développement de la commande. Omettez-le pour la laisser se poursuivre |
1639| `reason` | Affiché à l'utilisateur lorsque `decision` vaut `"block"` |1662| `reason` | Affiché à l'utilisateur lorsque `decision` vaut `"block"` |
1640| `additionalContext` | Chaîne ajoutée au contexte de Claude avec le prompt développé. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |1663| `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) |
1641 1664
1642Un 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.1665Un hook qui bloque en se terminant avec le code 2 suit le même acheminement que `reason` : le message de blocage affiche le texte stderr à l'utilisateur.
1643 1666
1644```json theme={null}1667```json theme={null}
1645{1668{
1656 MessageDisplay1679 MessageDisplay
1657</h3>1680</h3>
1658 1681
1659S'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.1682S'exécute pendant qu'un message de l'assistant s'affiche progressivement à l'écran. Claude Code affiche le message par incréments : chaque fois qu'un lot de lignes nouvellement terminées est prêt à être rendu, 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 génère plusieurs appels ; un message court peut n'en générer qu'un seul.
1660 1683
1661Utilisez MessageDisplay pour :1684Utilisez MessageDisplay pour :
1662 1685
1663* supprimer le markdown pour un affichage minimal1686* supprimer le markdown pour un affichage minimal
1664* transformer le texte qu'une application Agent SDK présente à ses utilisateurs1687* transformer le texte qu'une application Agent SDK affiche à ses utilisateurs
1665* masquer des clés API ou des noms d'hôtes internes dans les réponses de Claude1688* masquer des clés API ou des noms d'hôtes internes dans les réponses de Claude
1666 1689
1667Claude 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.1690Claude Code retient chaque lot jusqu'à ce que votre hook réponde : veillez donc à ce que le hook soit 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.
1668 1691
1669MessageDisplay 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.1692MessageDisplay 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.
1670 1693
1671MessageDisplay 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.1694MessageDisplay 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 composées uniquement d'appels d'outils, ne le déclenchent pas.
1672 1695
1673Dans 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.1696Dans 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.
1674 1697
1675<h4 id="messagedisplay-input">1698<h4 id="messagedisplay-input">
1676 Entrée de MessageDisplay1699 Entrée de MessageDisplay
1677</h4>1700</h4>
1678 1701
1679En 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.1702En 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.
1680 1703
1681| Champ | Description |1704| Champ | Description |
1682| :- | :- |1705| :- | :- |
1683| `turn_id` | UUID du tour en cours |1706| `turn_id` | UUID du tour en cours |
1684| `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 |1707| `message_id` | UUID du message de l'assistant en cours d'affichage. Stable pour 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 |
1685| `index` | Index, en partant de zéro, de ce lot au sein du message |1708| `index` | Index, en partant de zéro, de ce lot dans le message |
1686| `final` | `true` pour le dernier lot du message. Chaque message comporte exactement un lot final |1709| `final` | `true` sur le dernier lot du message. Chaque message a exactement un lot final |
1687| `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 |1710| `delta` | Les lignes nouvellement terminées depuis le lot précédent, retours à la ligne finaux inclus. Toujours des lignes complètes, 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 |
1688 1711
1689```json theme={null}1712```json theme={null}
1690{1713{
1710| :- | :- |1733| :- | :- |
1711| `displayContent` | Texte affiché à la place du delta. Omettez-le pour afficher l'original |1734| `displayContent` | Texte affiché à la place du delta. Omettez-le pour afficher l'original |
1712 1735
1713Les 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`.1736Les hooks MessageDisplay n'ont pas de 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`.
1714 1737
1715Cet 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`.1738Cet 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`.
1716 1739
1717<Tabs>1740<Tabs>
1718 <Tab title="macOS/Linux">1741 <Tab title="macOS/Linux">
1788 </Tab>1811 </Tab>
1789</Tabs>1812</Tabs>
1790 1813
1791Les 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.1814Les 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), et non dans la session.
1792 1815
1793<h3 id="pretooluse">1816<h3 id="pretooluse">
1794 PreToolUse1817 PreToolUse
1795</h3>1818</h3>
1796 1819
1797S'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).1820S'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 tous les [noms d'outils MCP](#match-mcp-tools).
1798 1821
1799Pour 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.1822Pour 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 ceux-ci n'ont pas de contrôle de décision : ils ne peuvent donc pas bloquer l'écriture.
1800 1823
1801<Warning>1824<Warning>
1802 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).1825 PreToolUse ne s'exécute que lorsque Claude appelle un outil. Par défaut, 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 : aucun hook PreToolUse ne se déclenche donc pour eux, y compris les hooks correspondant à `Read`. PreToolUse ne se déclenche pas non plus pour [`EndConversation`](/docs/fr/tools-reference#endconversation-tool-behavior).
1803 1826
1804 PreToolUse ne se déclenche pas non plus pour [`EndConversation`](/docs/fr/tools-reference#endconversation-tool-behavior).1827 Vous pouvez bloquer des chemins spécifiques dans les références `@`, ou désactiver l'insertion :
1828
1829 * **Bloquer des chemins spécifiques** : ajoutez une [règle de refus `Read`](/docs/fr/permissions#read-and-edit) pour ces chemins
1830 * **Désactiver l'insertion** : définissez [`CLAUDE_CODE_DISABLE_FILE_MENTIONS=1`](/docs/fr/env-vars#variables) dans votre shell, vos paramètres utilisateur ou vos paramètres gérés. Claude reçoit alors les chemins mentionnés avec une note l'invitant à les lire à l'aide de ses outils de fichiers. S'il le fait, vos hooks PreToolUse correspondants s'exécutent. La variable nécessite Claude Code v2.1.299 ou une version ultérieure, et Claude Code l'ignore dans les paramètres de projet et locaux.
1805</Warning>1831</Warning>
1806 1832
1807Utilisez le [contrôle de décision de PreToolUse](#pretooluse-decision-control) pour autoriser, refuser, demander ou différer l'appel d'outil.1833Utilisez le [contrôle de décision de PreToolUse](#pretooluse-decision-control) pour autoriser, refuser, demander confirmation ou différer l'appel d'outil.
1808 1834
1809Un [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.1835Un [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.
1810 1836
1814 1840
1815En plus des [champs d'entrée communs](#common-input-fields), les hooks PreToolUse reçoivent `tool_name`, `tool_input` et `tool_use_id`.1841En plus des [champs d'entrée communs](#common-input-fields), les hooks PreToolUse reçoivent `tool_name`, `tool_input` et `tool_use_id`.
1816 1842
1817Pour 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.1843Pour 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 répertorie 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 une version ultérieure.
1818 1844
1819Pour les outils de fichiers `Write`, `Edit` et `Read`, `tool_input.file_path` est toujours absolu :1845Pour les outils de fichiers `Write`, `Edit` et `Read`, `tool_input.file_path` est toujours absolu :
1820 1846
1821* 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 chemin1847* 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
1822* 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`1848* 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`
1823* 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 à bloquer1849* 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
1824* 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 absolu1850* 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 absolu
1825 1851
1826Un appel `Write` sous Windows transmet :1852Un appel `Write` sous Windows transmet :
1827 1853
1859Votre [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.1885Votre [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.
1860 1886
1861<Note>1887<Note>
1862 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.1888 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 savoir quoi examiner, pas pour appliquer une politique.
1863</Note>1889</Note>
1864 1890
1865`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.1891`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.
1866 1892
1867| Champ | Type | Exemple | Description |1893| Champ | Type | Exemple | Description |
1868| :- | :- | :- | :- |1894| :- | :- | :- | :- |
1869| `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 |1895| `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 |
1870| `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é |1896| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs d'au plus 5 fichiers modifiés, destinés à l'affichage. `created` ou `deleted` vaut `true` pour un fichier que la commande a ajouté ou supprimé |
1871| `moreFiles` | number | `2` | Nombre de fichiers modifiés sans diff dans `files` |1897| `moreFiles` | number | `2` | Nombre de fichiers modifiés sans diff dans `files` |
1872| `unavailable` | boolean | `true` | Défini lorsque le diff est incomplet ou n'a pas pu être obtenu |1898| `unavailable` | boolean | `true` | Défini lorsque le diff est incomplet ou n'a pas pu être obtenu |
1873| `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 |1899| `skipped` | boolean | `true` | Défini pour une commande Git qui déplace l'arbre de travail, telle que `git checkout` ou `git stash`, de sorte que Claude Code ne calcule aucun diff |
1874| `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 |1900| `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 |
1875 1901
1876<a id="powershell" />1902<a id="powershell" />
1881 1907
1882Exécute des commandes PowerShell. Consultez l'[outil PowerShell](/docs/fr/tools-reference#powershell-tool) pour connaître sa disponibilité selon la plateforme.1908Exécute des commandes PowerShell. Consultez l'[outil PowerShell](/docs/fr/tools-reference#powershell-tool) pour connaître sa disponibilité selon la plateforme.
1883 1909
1884Les champs correspondent à ceux de l'outil Bash, avec la chaîne de commande dans `command` :1910Les champs sont les mêmes que pour l'outil Bash, avec la chaîne de commande dans `command` :
1885 1911
1886| Champ | Type | Exemple | Description |1912| Champ | Type | Exemple | Description |
1887| :- | :- | :- | :- |1913| :- | :- | :- | :- |
1936 Glob1962 Glob
1937</h5>1963</h5>
1938 1964
1939Trouve les fichiers correspondant à un motif glob.1965Recherche les fichiers correspondant à un motif glob.
1940 1966
1941| Champ | Type | Exemple | Description |1967| Champ | Type | Exemple | Description |
1942| :- | :- | :- | :- |1968| :- | :- | :- | :- |
1947 Grep1973 Grep
1948</h5>1974</h5>
1949 1975
1950Recherche dans le contenu des fichiers avec des expressions régulières.1976Recherche dans le contenu des fichiers à l'aide d'expressions régulières.
1951 1977
1952| Champ | Type | Exemple | Description |1978| Champ | Type | Exemple | Description |
1953| :- | :- | :- | :- |1979| :- | :- | :- | :- |
1966 1992
1967| Champ | Type | Exemple | Description |1993| Champ | Type | Exemple | Description |
1968| :- | :- | :- | :- |1994| :- | :- | :- | :- |
1969| `url` | string | `"https://example.com/api"` | URL à partir de laquelle récupérer le contenu |1995| `url` | string | `"https://example.com/api"` | URL dont récupérer le contenu |
1970| `prompt` | string | `"Extract the API endpoints"` | Prompt à exécuter sur le contenu récupéré |1996| `prompt` | string | `"Extract the API endpoints"` | Prompt à exécuter sur le contenu récupéré |
1971| `offset` | number | `100000` | Nombre facultatif de caractères à ignorer depuis le début de la page. Claude le définit pour poursuivre la lecture d'une page longue. Nécessite Claude Code v2.1.290 ou ultérieure |1997| `offset` | number | `100000` | Nombre facultatif de caractères à ignorer depuis le début de la page. Claude le définit pour poursuivre la lecture d'une longue page. Nécessite Claude Code v2.1.290 ou une version ultérieure |
1972 1998
1973<h5 id="websearch">1999<h5 id="websearch">
1974 WebSearch2000 WebSearch
1979| Champ | Type | Exemple | Description |2005| Champ | Type | Exemple | Description |
1980| :- | :- | :- | :- |2006| :- | :- | :- | :- |
1981| `query` | string | `"react hooks best practices"` | Requête de recherche |2007| `query` | string | `"react hooks best practices"` | Requête de recherche |
1982| `allowed_domains` | array | `["docs.example.com"]` | Facultatif : n'inclure que les résultats de ces domaines |2008| `allowed_domains` | array | `["docs.example.com"]` | Facultatif : inclure uniquement les résultats de ces domaines |
1983| `blocked_domains` | array | `["spam.example.com"]` | Facultatif : exclure les résultats de ces domaines |2009| `blocked_domains` | array | `["spam.example.com"]` | Facultatif : exclure les résultats de ces domaines |
1984 2010
1985<h5 id="agent">2011<h5 id="agent">
1993| `prompt` | string | `"Find all API endpoints"` | La tâche que l'agent doit effectuer |2019| `prompt` | string | `"Find all API endpoints"` | La tâche que l'agent doit effectuer |
1994| `description` | string | `"Find API endpoints"` | Brève description de la tâche |2020| `description` | string | `"Find API endpoints"` | Brève description de la tâche |
1995| `subagent_type` | string | `"Explore"` | Type d'agent spécialisé à utiliser |2021| `subagent_type` | string | `"Explore"` | Type d'agent spécialisé à utiliser |
1996| `model` | string | `"sonnet"` | Alias de modèle facultatif pour remplacer celui par défaut |2022| `model` | string | `"sonnet"` | Alias de modèle facultatif pour remplacer le modèle par défaut |
1997 2023
1998Lorsqu'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 :2024Lorsqu'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 examiner l'exécution ; pour des totaux 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 :
1999 2025
2000| Champ | Type | Exemple | Description |2026| Champ | Type | Exemple | Description |
2001| :- | :- | :- | :- |2027| :- | :- | :- | :- |
2002| `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"` |2028| `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"` |
2003| `agentId` | string | `"a4d2c8f1e0b3a297"` | Identifiant de l'exécution du sous-agent |2029| `agentId` | string | `"a4d2c8f1e0b3a297"` | Identifiant de l'exécution du sous-agent |
2004| `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 |2030| `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 |
2005| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modèle sur lequel le sous-agent a démarré, qui peut différer du modèle demandé |2031| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modèle sur lequel le sous-agent a démarré, qui peut différer du modèle demandé |
2009| `totalToolUseCount` | number | `7` | Nombre d'appels d'outils effectués par le sous-agent |2035| `totalToolUseCount` | number | `7` | Nombre d'appels d'outils effectués par le sous-agent |
2010| `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` |2036| `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` |
2011 2037
2012Sur 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`.2038Dans 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`.
2013 2039
2014Pour 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`.2040Pour les sous-agents en arrière-plan, l'outil rend la main lorsque la tâche passe en arrière-plan ; `tool_response` ne contient donc 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. Il contient `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` et `resolvedModel`.
2015 2041
2016Dans 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.2042Dans 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.
2017 2043
2026| Champ | Type | Exemple | Description |2052| Champ | Type | Exemple | Description |
2027| :- | :- | :- | :- |2053| :- | :- | :- | :- |
2028| `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 |2054| `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 |
2029| `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 |2055| `answers` | object | `{"Which framework?": "React"}` | Facultatif. Associe le texte de chaque 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 |
2030 2056
2031<h5 id="exitplanmode">2057<h5 id="exitplanmode">
2032 ExitPlanMode2058 ExitPlanMode
2036 2062
2037| Champ | Type | Exemple | Description |2063| Champ | Type | Exemple | Description |
2038| :- | :- | :- | :- |2064| :- | :- | :- | :- |
2039| `plan` | string | `"## Refactor auth\n1. Extract..."` | Contenu du plan en Markdown. Injecté à partir du fichier de plan sur le disque |2065| `plan` | string | `"## Refactor auth\n1. Extract..."` | Contenu du plan en Markdown. Injecté depuis le fichier de plan sur le disque |
2040| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Chemin du fichier de plan. Injecté |2066| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Chemin du fichier de plan. Injecté |
2041| `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 |2067| `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 |
2042 2068
2043Dans `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.2069Dans `PostToolUse`, `tool_response` est un objet comportant les champs `plan` et `filePath` qui contiennent 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.
2044 2070
2045<h4 id="pretooluse-decision-control">2071<h4 id="pretooluse-decision-control">
2046 Contrôle de décision de PreToolUse2072 Contrôle de décision de PreToolUse
2047</h4>2073</h4>
2048 2074
2049Les hooks `PreToolUse` peuvent contrôler si un appel d'outil se poursuit. Contrairement aux autres hooks qui utilisent un champ `decision` de premier niveau, PreToolUse renvoie sa décision dans un objet `hookSpecificOutput`. Cela lui donne un contrôle plus riche : quatre issues possibles (autoriser, refuser, demander ou différer) ainsi que la possibilité de modifier l'entrée de l'outil avant l'exécution.2075Les hooks `PreToolUse` peuvent contrôler si un appel d'outil se poursuit. Contrairement aux autres hooks qui utilisent un champ `decision` de premier niveau, PreToolUse renvoie sa décision dans un objet `hookSpecificOutput`. Cela lui offre un contrôle plus riche : quatre issues (autoriser, refuser, demander ou différer) ainsi que la possibilité de modifier l'entrée de l'outil avant l'exécution.
2050 2076
2051| Champ | Description |2077| Champ | Description |
2052| :- | :- |2078| :- | :- |
2053| `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 à 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, quoi que renvoie le hook |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 |
2054| `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) |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) |
2055| `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"` |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"` |
2056| `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) |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) |
2057 2083
2058Lorsque plusieurs hooks PreToolUse renvoient des décisions différentes, l'ordre de priorité est `deny` > `defer` > `ask` > `allow`.2084Lorsque plusieurs hooks PreToolUse renvoient des décisions différentes, l'ordre de priorité est `deny` > `defer` > `ask` > `allow`.
2059 2085
2060Un 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.2086Un hook qui bloque en se terminant avec le code 2 suit le même acheminement que `"deny"` : Claude voit le message stderr comme raison du refus.
2061 2087
2062Lorsqu'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.2088Lorsqu'un hook renvoie `"ask"`, la demande de permission affichée à l'utilisateur comprend une étiquette indiquant 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.
2063 2089
2064Un `"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é.2090Le `"ask"` d'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 en dehors du [sandbox](/docs/fr/sandboxing) sans afficher la demande requise 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é.
2065 2091
2066```json theme={null}2092```json theme={null}
2067{2093{
2078```2104```
2079 2105
2080<Note>2106<Note>
2081 PreToolUse utilisait auparavant des champs `decision` et `reason` de premier niveau, mais ceux-ci sont dépréciés pour cet événement. Utilisez plutôt `hookSpecificOutput.permissionDecision` et `hookSpecificOutput.permissionDecisionReason`. Les valeurs dépréciées `"approve"` et `"block"` correspondent respectivement à `"allow"` et `"deny"`. D'autres événements comme PostToolUse et Stop continuent d'utiliser `decision` et `reason` de premier niveau comme format actuel.2107 PreToolUse utilisait auparavant les champs `decision` et `reason` de premier niveau, mais ceux-ci sont dépréciés pour cet événement. Utilisez plutôt `hookSpecificOutput.permissionDecision` et `hookSpecificOutput.permissionDecisionReason`. Les valeurs dépréciées `"approve"` et `"block"` correspondent respectivement à `"allow"` et `"deny"`. D'autres événements comme PostToolUse et Stop continuent d'utiliser `decision` et `reason` de premier niveau comme format actuel.
2082</Note>2108</Note>
2083 2109
2084<h4 id="allow-with-updatedinput">2110<h4 id="allow-with-updatedinput">
2085 Outils nécessitant une interaction de l'utilisateur2111 Outils nécessitant une interaction utilisateur
2086</h4>2112</h4>
2087 2113
2088`AskUserQuestion` et `ExitPlanMode` nécessitent une interaction de l'utilisateur. En [mode non interactif](/docs/fr/headless) avec le flag `-p`, Claude Code ne les propose que lorsque l'exécution dispose d'un [hôte de permissions](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs) pour recevoir la demande, comme un callback `canUseTool` de l'Agent SDK.2114`AskUserQuestion` et `ExitPlanMode` nécessitent une interaction utilisateur. En [mode non interactif](/docs/fr/headless) avec le flag `-p`, Claude Code ne les propose que lorsque l'exécution dispose d'un [hôte de permissions](/docs/fr/headless#turn-off-permission-prompts-in-unattended-runs) pour recevoir la demande, comme un callback `canUseTool` de l'Agent SDK.
2089 2115
2090Un hook `PreToolUse` satisfait cette exigence lorsqu'il effectue les opérations suivantes :2116Un hook `PreToolUse` satisfait cette exigence lorsqu'il effectue les opérations suivantes :
2091 2117
20921. Lit l'entrée de l'outil depuis stdin21181. Il lit l'entrée de l'outil depuis stdin
20932. Recueille la réponse via votre propre interface utilisateur21192. Il recueille la réponse via votre propre interface utilisateur
20943. Renvoie `permissionDecision: "allow"` accompagné d'un `updatedInput` contenant la réponse, afin que l'outil s'exécute sans demande21203. Il renvoie `permissionDecision: "allow"` accompagné d'un `updatedInput` contenant la réponse, afin que l'outil s'exécute sans demande
2095 2121
2096Renvoyer `"allow"` seul ne suffit pas pour ces outils.2122Renvoyer `"allow"` seul ne suffit pas pour ces outils.
2097 2123
2117}2143}
2118```2144```
2119 2145
2120Un outil MCP que son serveur marque avec [`_meta["anthropic/requiresUserInteraction"]`](/docs/fr/mcp#require-approval-for-a-specific-tool) est plus strict : un hook ne peut pas ignorer sa demande d'approbation avec `"allow"`, avec ou sans `updatedInput`, car Claude Code ne peut pas confirmer que le hook a recueilli l'interaction dont l'outil a besoin.2146Un outil MCP que son serveur marque avec [`_meta["anthropic/requiresUserInteraction"]`](/docs/fr/mcp#require-approval-for-a-specific-tool) est plus strict : un hook ne peut pas ignorer sa demande d'approbation avec `"allow"`, avec ou sans `updatedInput`, car Claude Code ne peut pas vérifier que le hook a recueilli l'interaction dont l'outil a besoin.
2121 2147
2122<h4 id="defer-a-tool-call-for-later">2148<h4 id="defer-a-tool-call-for-later">
2123 Différer un appel d'outil2149 Différer un appel d'outil
2124</h4>2150</h4>
2125 2151
2126`"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.2152`"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 sur Claude Code. Il permet à ce processus appelant de mettre Claude en pause lors d'un appel d'outil, de recueillir une saisie via sa propre interface et 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.
2127 2153
2128L'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 :2154L'outil `AskUserQuestion` en est le cas typique : Claude veut poser une question à l'utilisateur, mais aucun terminal ne permet d'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 :
2129 2155
21301. Claude appelle `AskUserQuestion`. Le hook `PreToolUse` se déclenche.21561. Claude appelle `AskUserQuestion`. Le hook `PreToolUse` se déclenche.
21312. 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.21572. 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.
21323. 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.21583. Le processus appelant lit `deferred_tool_use` dans le résultat du SDK, affiche la question dans sa propre interface utilisateur et attend une réponse.
21334. 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`.21594. 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`.
21345. Le hook renvoie `permissionDecision: "allow"` avec la réponse dans `updatedInput`. L'outil s'exécute et Claude poursuit.21605. Le hook renvoie `permissionDecision: "allow"` avec la réponse dans `updatedInput`. L'outil s'exécute et Claude continue.
2135 2161
2136Le 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 :2162Le 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 :
2137 2163
2149}2175}
2150```2176```
2151 2177
2152Il 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.2178Il 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, selon les [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 la session, le hook peut renvoyer à nouveau `"defer"` 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.
2153 2179
2154`"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.2180`"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.
2155 2181
2156Si 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.2182Si l'outil différé n'est plus disponible lors 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.
2157 2183
2158<Note>2184<Note>
2159 Pour reprendre une session différée en mode plan, passez [`--permission-prompt-tool`](/docs/fr/cli-reference#cli-flags) avec `--resume` afin que Claude Code puisse présenter le plan pour approbation. Pour les autres conditions, consultez [Reprendre en mode plan avec `-p`](/docs/fr/sessions#resume-in-plan-mode-with-p). Nécessite Claude Code v2.1.246 ou version ultérieure.2185 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. Pour les autres conditions, 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.
2160 2186
2161 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).2187 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 répertoriées dans [Mode de permission lors de la reprise](/docs/fr/sessions#permission-mode-on-resume).
2162</Note>2188</Note>
2163 2189
2164<h3 id="permissionrequest">2190<h3 id="permissionrequest">
2168S'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.2194S'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.
2169Utilisez le [contrôle de décision de PermissionRequest](#permissionrequest-decision-control) pour autoriser ou refuser au nom de l'utilisateur.2195Utilisez le [contrôle de décision de PermissionRequest](#permissionrequest-decision-control) pour autoriser ou refuser au nom de l'utilisateur.
2170 2196
2171Utilisez 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.2197Utilisez cet événement lorsque vous avez besoin d'un signal au moment même où Claude demande la permission d'utiliser un outil. Claude Code n'exécute un hook [Notification](#notification) avec le type `permission_prompt` qu'après que la demande a attendu environ six secondes.
2172 2198
2173Claude 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`.2199Claude 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 un sandbox. Pour obtenir un signal pour cette demande, utilisez le type de notification `permission_prompt`.
2174 2200
2175Le matcher s'applique au nom de l'outil, avec les mêmes valeurs que PreToolUse.2201Le matcher s'applique au nom de l'outil, avec les mêmes valeurs que pour PreToolUse.
2176 2202
2177<h4 id="permissionrequest-input">2203<h4 id="permissionrequest-input">
2178 Entrée de PermissionRequest2204 Entrée PermissionRequest
2179</h4>2205</h4>
2180 2206
2181Les 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.2207Les 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 `permission_suggestions` facultatif 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.
2182 2208
2183Le 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.2209Le 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éduisent 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 aussi proposer des options sans entrée de suggestion correspondante, 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.
2184 2210
2185Les 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).2211Les hooks PreToolUse s'exécutent avant chaque appel d'outil, qu'il nécessite ou non une permission. Les hooks PermissionRequest ne s'exécutent que lorsque Claude Code s'apprête à vous demander une 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).
2186 2212
2187```json theme={null}2213```json theme={null}
2188{2214{
2208```2234```
2209 2235
2210<h4 id="permissionrequest-decision-control">2236<h4 id="permissionrequest-decision-control">
2211 Contrôle de décision de PermissionRequest2237 Contrôle de décision PermissionRequest
2212</h4>2238</h4>
2213 2239
2214Les 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 :2240Les 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 :
2215 2241
2216| Champ | Description |2242| Champ | Description |
2217| :- | :- |2243| :- | :- |
2218| `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 |2244| `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 |
2219| `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 |2245| `updatedInput` | Pour `"allow"` uniquement : modifie les paramètres d'entrée de l'outil avant l'exécution. Remplace l'objet d'entrée entier, incluez donc les champs inchangés avec les champs modifiés. L'entrée modifiée est réévaluée par rapport aux règles de refus et de demande |
2220| `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 |2246| `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 |
2221| `message` | Pour `"deny"` uniquement : indique à Claude pourquoi la permission a été refusée |2247| `message` | Pour `"deny"` uniquement : indique à Claude pourquoi la permission a été refusée |
2222| `interrupt` | Pour `"deny"` uniquement : si `true`, arrête Claude |2248| `interrupt` | Pour `"deny"` uniquement : si `true`, arrête Claude |
2223 2249
2224Un hook qui se termine avec le code 2 sans objet `decision` laisse le flux de permissions inchangé, et sa sortie stderr est ignorée. Pour accorder ou refuser la demande, renvoyez l'objet `decision`.2250Un hook qui se termine avec le code 2 sans objet `decision` laisse le flux de permission inchangé, et sa sortie stderr est ignorée. Pour accorder ou refuser la demande, renvoyez l'objet `decision`.
2225 2251
2226```json theme={null}2252```json theme={null}
2227{2253{
2238```2264```
2239 2265
2240<h4 id="permission-update-entries">2266<h4 id="permission-update-entries">
2241 Entrées de mise à jour des permissions2267 Entrées de mise à jour de permissions
2242</h4>2268</h4>
2243 2269
2244Le 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.2270Le 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 l'endroit où la modification est écrite.
2245 2271
2246| `type` | Champs | Effet |2272| `type` | Champs | Effet |
2247| :- | :- | :- |2273| :- | :- | :- |
2248| `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"` |2274| `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"` |
2249| `replaceRules` | `rules`, `behavior`, `destination` | Remplace toutes les règles du `behavior` donné à la `destination` par les `rules` fournies |2275| `replaceRules` | `rules`, `behavior`, `destination` | Remplace toutes les règles du `behavior` donné à la `destination` par les `rules` fournies |
2250| `removeRules` | `rules`, `behavior`, `destination` | Supprime les règles correspondantes du `behavior` donné |2276| `removeRules` | `rules`, `behavior`, `destination` | Supprime les règles correspondantes du `behavior` donné |
2251| `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` |2277| `setMode` | `mode`, `destination` | Change le mode de permission. Les modes valides sont `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan`, et `manual` comme alias de `default` |
2252| `addDirectories` | `directories`, `destination` | Ajoute des répertoires de travail. `directories` est un tableau de chaînes de chemins |2278| `addDirectories` | `directories`, `destination` | Ajoute des répertoires de travail. `directories` est un tableau de chaînes de chemins |
2253| `removeDirectories` | `directories`, `destination` | Supprime des répertoires de travail |2279| `removeDirectories` | `directories`, `destination` | Supprime des répertoires de travail |
2254 2280
2255<Note>2281<Note>
2256 `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).2282 `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).
2257 2283
2258 `bypassPermissions` n'est jamais persisté comme `defaultMode`, quelle que soit la `destination`.2284 `bypassPermissions` n'est jamais conservé comme `defaultMode`, quelle que soit la `destination`.
2259</Note>2285</Note>
2260 2286
2261Le 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.2287Le 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.
2262 2288
2263| `destination` | Écrit dans |2289| `destination` | Écrit dans |
2264| :- | :- |2290| :- | :- |
2273 PostToolUse2299 PostToolUse
2274</h3>2300</h3>
2275 2301
2276S'exécute immédiatement après qu'un outil s'est terminé avec succès.2302S'exécute immédiatement après la réussite d'un outil.
2277 2303
2278Correspond au nom de l'outil, avec les mêmes valeurs que PreToolUse.2304Correspond au nom de l'outil, avec les mêmes valeurs que PreToolUse.
2279 2305
2280Utilisez une correspondance plus large lorsque le nom de l'outil n'est pas le bon filtre :2306Utilisez une correspondance plus large lorsque le nom de l'outil n'est pas le bon filtre :
2281 2307
2282* 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).2308* 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` ignore. Pour les appels d'outils qui échouent, ajoutez le même hook sous [PostToolUseFailure](#posttoolusefailure).
2283* 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.2309* 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.
2284 2310
2285<h4 id="posttooluse-input">2311<h4 id="posttooluse-input">
2317 Contrôle de décision PostToolUse2343 Contrôle de décision PostToolUse
2318</h4>2344</h4>
2319 2345
2320Les 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 :2346Les 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 :
2321 2347
2322| Champ | Description |2348| Champ | Description |
2323| :- | :- |2349| :- | :- |
2324| `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` |2350| `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` |
2325| `reason` | Explication affichée à Claude lorsque `decision` vaut `"block"` |2351| `reason` | Explication montrée à Claude lorsque `decision` vaut `"block"` |
2326| `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) |2352| `additionalContext` | Chaîne ajoutée au contexte de Claude avec le résultat de l'outil. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |
2327| `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 |2353| `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. Consultez [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 une version ultérieure |
2328| `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 |2354| `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 |
2329| `updatedMCPToolOutput` | Remplace la sortie uniquement pour les [outils MCP](#match-mcp-tools). Préférez `updatedToolOutput`, qui fonctionne pour tous les outils |2355| `updatedMCPToolOutput` | Remplace la sortie pour les [outils MCP](#match-mcp-tools) uniquement. Préférez `updatedToolOutput`, qui fonctionne pour tous les outils |
2330 2356
2331L'exemple ci-dessous remplace la sortie d'un appel `Bash`. La valeur de remplacement correspond à la forme de sortie de l'outil `Bash` :2357L'exemple ci-dessous remplace la sortie d'un appel `Bash`. La valeur de remplacement correspond à la forme de sortie de l'outil `Bash` :
2332 2358
2346```2372```
2347 2373
2348<Warning>2374<Warning>
2349 `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).2375 `updatedToolOutput` ne modifie que ce que Claude voit. L'outil s'est déjà exécuté au moment où le hook se déclenche, donc tous les fichiers écrits, 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).
2350 2376
2351 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.2377 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.
2352</Warning>2378</Warning>
2355 Annoter un résultat pour le classifieur du mode auto2381 Annoter un résultat pour le classifieur du mode auto
2356</h4>2382</h4>
2357 2383
2358Renvoyez `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.2384Renvoyez `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 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 une version ultérieure.
2359 2385
2360L'exemple ci-dessous indique au classifieur d'où provient la sortie d'une requête :2386L'exemple ci-dessous indique au classifieur d'où provient la sortie d'une requête :
2361 2387
2370 2396
2371Le poids que le classifieur accorde à la note dépend de l'endroit où vous avez configuré le hook :2397Le poids que le classifieur accorde à la note dépend de l'endroit où vous avez configuré le hook :
2372 2398
2373* **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 conversation2399* **Hooks configurés dans Claude Code** : pour les hooks provenant de fichiers de paramètres, de plugins, de skills et du frontmatter d'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
2374* **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ée2400* **Callbacks Agent SDK en processus** : lorsqu'une application intégrant Claude Code enregistre le hook en tant que [callback du SDK TypeScript](/docs/fr/agent-sdk/hooks) et renvoie la note pendant la session active, 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
2375 2401
2376Claude Code applique ces limites lors de la transmission de la note :2402Claude Code applique ces limites lors de la transmission de la note :
2377 2403
2378* **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 appel2404* **Longueur** : Claude Code plafonne les notes d'un appel d'outil à 2 000 caractères et tronque le reste. Le plafond est partagé entre tous les hooks qui répondent à cet appel
2379* **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'outil2405* **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
2380* **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 appels2406* **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 ignore une note attachée à l'un de ces appels
2381* **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 sortie2407* **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 sortie
2382 2408
2383<Warning>2409<Warning>
2384 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.2410 Le classifieur lit le contenu que vous placez dans `classifierContext` comme une information provenant de l'application qui héberge la session, ne copiez donc pas de sortie d'outil non fiable ou de texte tiers dans ce champ. Limitez la note à une courte affirmation sur cet unique appel, 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.
2385</Warning>2411</Warning>
2386 2412
2387<h3 id="posttoolusefailure">2413<h3 id="posttoolusefailure">
2388 PostToolUseFailure2414 PostToolUseFailure
2389</h3>2415</h3>
2390 2416
2391S'exécute lorsqu'un outil dont l'exécution a commencé échoue : l'outil a levé une erreur, ou un outil MCP a renvoyé un résultat d'erreur. Utilisez-le pour journaliser les échecs, envoyer des alertes ou fournir un retour correctif à Claude.2417S'exécute lorsqu'un outil qui a commencé à s'exécuter échoue : l'outil a levé une erreur, ou un outil MCP a renvoyé un résultat d'erreur. Utilisez-le pour journaliser les échecs, envoyer des alertes ou fournir un retour correctif à Claude.
2392 2418
2393Correspond au nom de l'outil, avec les mêmes valeurs que PreToolUse.2419Correspond au nom de l'outil, avec les mêmes valeurs que PreToolUse.
2394 2420
2395<Note>2421<Note>
2396 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).2422 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 à 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 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 ; consultez [PermissionDenied](#permissiondenied).
2397</Note>2423</Note>
2398 2424
2399<h4 id="posttoolusefailure-input">2425<h4 id="posttoolusefailure-input">
2400 Entrée PostToolUseFailure2426 Entrée PostToolUseFailure
2401</h4>2427</h4>
2402 2428
2403Les 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 :2429Les 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 transmettre :
2404 2430
2405```json theme={null}2431```json theme={null}
2406{2432{
2429 2455
2430La 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.2456La 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.
2431 2457
2432* 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és2458* Pour Bash et PowerShell, une commande qui s'est exécutée et terminée produit une première ligne `Exit code N`, puis toute sortie produite par la commande sous la forme d'un seul bloc où stdout et stderr sont entrelacés
2433* 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ême2459* 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
2434* 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`2460* 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`
2435 2461
2437 Contrôle de décision PostToolUseFailure2463 Contrôle de décision PostToolUseFailure
2438</h4>2464</h4>
2439 2465
2440Les 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 :2466Les 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 :
2441 2467
2442| Champ | Description |2468| Champ | Description |
2443| :- | :- |2469| :- | :- |
2444| `additionalContext` | Chaîne ajoutée au contexte de Claude avec l'erreur. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |2470| `additionalContext` | Chaîne ajoutée au contexte de Claude avec l'erreur. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |
2445 2471
2446```json theme={null}2472```json theme={null}
2447{2473{
2456 PostToolBatch2482 PostToolBatch
2457</h3>2483</h3>
2458 2484
2459S'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.2485S'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 en parallèle. `PostToolBatch` se déclenche exactement une fois avec le lot complet, c'est donc l'endroit idéal 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.
2460 2486
2461<h4 id="posttoolbatch-input">2487<h4 id="posttoolbatch-input">
2462 Entrée PostToolBatch2488 Entrée PostToolBatch
2488}2514}
2489```2515```
2490 2516
2491`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.2517`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, analysez donc uniquement les champs dont vous avez besoin.
2492 2518
2493<Note>2519<Note>
2494 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.2520 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.
2498 Contrôle de décision PostToolBatch2524 Contrôle de décision PostToolBatch
2499</h4>2525</h4>
2500 2526
2501Les 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 :2527Les 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 :
2502 2528
2503| Champ | Description |2529| Champ | Description |
2504| :- | :- |2530| :- | :- |
2505| `additionalContext` | Chaîne de contexte injectée une fois avant le prochain appel au modèle. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) pour les détails de transmission, ce qu'il faut y mettre et la façon dont les sessions reprises gèrent les valeurs passées |2531| `additionalContext` | Chaîne de contexte injectée une fois avant l'appel suivant au modèle. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) pour les détails de transmission, ce qu'il faut y mettre et la façon dont les sessions reprises gèrent les valeurs passées |
2506 2532
2507```json theme={null}2533```json theme={null}
2508{2534{
2513}2539}
2514```2540```
2515 2541
2516Renvoyer `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.2542Renvoyer `decision: "block"` ou `continue: false` arrête la boucle agentique avant l'appel suivant 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, donc Claude le voit lorsque la conversation se poursuit.
2517 2543
2518<h3 id="permissiondenied">2544<h3 id="permissiondenied">
2519 PermissionDenied2545 PermissionDenied
2548 2574
2549| Champ | Description |2575| Champ | Description |
2550| :- | :- |2576| :- | :- |
2551| `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` |2577| `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]` ; consultez [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 du classifieur, il s'agit du texte fixe `Classifier unavailable` |
2552 2578
2553<h4 id="permissiondenied-decision-control">2579<h4 id="permissiondenied-decision-control">
2554 Contrôle de décision PermissionDenied2580 Contrôle de décision PermissionDenied
2565}2591}
2566```2592```
2567 2593
2568Lorsque `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.2594Lorsque `retry` vaut `true`, Claude Code ajoute à la conversation un message 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.
2569 2595
2570Claude 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.2596Claude 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.
2571 2597
2572<h3 id="notification">2598<h3 id="notification">
2573 Notification2599 Notification
2575 2601
2576S'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.2602S'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.
2577 2603
2578Vous 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.2604Vous 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 l'exécution de votre hook.
2579 2605
2580| Matcher | Quand il se déclenche |2606| Matcher | Moment du déclenchement |
2581| :- | :- |2607| :- | :- |
2582| `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 |2608| `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 |
2583| `idle_prompt` | Claude a fini de répondre il y a environ 60 secondes et vous n'avez rien tapé depuis |2609| `idle_prompt` | Claude a fini de répondre il y a environ 60 secondes et vous n'avez rien saisi depuis |
2584| `auth_success` | L'authentification est terminée |2610| `auth_success` | L'authentification est terminée |
2585| `elicitation_dialog` | Un serveur MCP ouvre un formulaire d'élicitation et vous n'avez rien tapé depuis environ six secondes |2611| `elicitation_dialog` | Un serveur MCP ouvre un formulaire d'élicitation et vous n'avez rien saisi depuis environ six secondes |
2586| `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 |2612| `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 |
2587| `elicitation_complete` | Un serveur MCP signale qu'une [élicitation en mode URL](#elicitation-input) est terminée |2613| `elicitation_complete` | Un serveur MCP signale qu'une [élicitation en mode URL](#elicitation-input) est terminée |
2588| `elicitation_response` | Une réponse d'élicitation MCP est renvoyée au serveur |2614| `elicitation_response` | Une réponse d'élicitation MCP est renvoyée au serveur |
2589| `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 |2615| `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 montre 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 des requêtes du classifieur](/docs/fr/auto-mode-classifier-billing) et que vous n'avez rien saisi depuis environ six secondes |
2590| `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 |2616| `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 |
2591| `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) |2617| `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 : lors de 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 relative au paramètre de modèle](/docs/fr/interactive-mode#wait-for-a-usage-limit-to-reset) |
2592| `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` |2618| `quota_auto_resume_stale` | Une limite d'utilisation de claude.ai a été réinitialisée alors que votre ordinateur était en veille depuis plus d'environ 30 minutes. Claude Code attend que vous appuyiez sur `Enter` au lieu de continuer. Après une veille plus courte, il continue et déclenche plutôt `quota_auto_resume_fired` |
2593| `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** |2619| `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 à 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 choisissez **Don't continue automatically** |
2594 2620
2595Les types `quota_auto_resume_fired`, `quota_auto_resume_stale` et `quota_auto_resume_disabled` nécessitent Claude Code v2.1.234 ou ultérieur.2621Les types `quota_auto_resume_fired`, `quota_auto_resume_stale` et `quota_auto_resume_disabled` nécessitent Claude Code v2.1.234 ou une version ultérieure.
2596 2622
2597Dans les sessions de terminal, `permission_prompt` pour la requête réseau d'une commande en sandbox nécessite Claude Code v2.1.246 ou ultérieur.2623Dans les sessions de terminal, `permission_prompt` pour la requête réseau d'une commande en sandbox nécessite Claude Code v2.1.246 ou une version ultérieure.
2598 2624
2599`agent_needs_input` pour la question de configuration du terminal d'un coéquipier nécessite Claude Code v2.1.248 ou ultérieur.2625`agent_needs_input` pour la question de configuration du terminal d'un coéquipier nécessite Claude Code v2.1.248 ou une version ultérieure.
2600 2626
2601<Note>2627<Note>
2602 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 :2628 Les types `permission_prompt`, `idle_prompt`, `elicitation_dialog` et `elicitation_url_dialog` partagent leur temporisation avec les notifications de bureau, donc dans les sessions de terminal, vous ne les voyez que lorsque vous semblez être éloigné du terminal :
2603 2629
2604 * 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).2630 * Attendez-vous à `permission_prompt` une fois que vous n'avez rien saisi depuis environ six secondes. Le minuteur démarre lorsque la demande de permission apparaît, et chaque frappe le repousse. Pour exécuter un hook immédiatement lorsque Claude demande la permission d'utiliser un outil, utilisez plutôt [PermissionRequest](#permissionrequest).
2605 * 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.2631 * Attendez-vous à `idle_prompt` environ 60 secondes après que Claude a fini de répondre, et seulement 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.
2606 * 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.2632 * Attendez-vous à `elicitation_dialog` pour un formulaire d'élicitation, ou à `elicitation_url_dialog` pour une demande d'URL dans le navigateur, une fois que vous n'avez rien saisi 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 repousse.
2607 2633
2608 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.2634 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.
2609</Note>2635</Note>
2610 2636
2611Claude 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 :2637Claude 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, c'est-à-dire la façon dont Claude Desktop et l'extension VS Code hébergent Claude Code :
2612 2638
2613* 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.2639* Attendez-vous à `permission_prompt` environ six secondes après que Claude a demandé la permission. Claude Code ne le repousse pas pendant que vous saisissez.
2614* Si vous ou un hook [PermissionRequest](#permissionrequest) répondez plus tôt, Claude Code n'exécute pas `permission_prompt`.2640* Si vous ou un hook [PermissionRequest](#permissionrequest) répondez plus tôt, Claude Code n'exécute pas `permission_prompt`.
2615* Définissez [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/fr/env-vars) sur `1` pour désactiver `permission_prompt` dans ces sessions.2641* Définissez [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/fr/env-vars) sur `1` pour désactiver `permission_prompt` dans ces sessions.
2616 2642
2617Avant la v2.1.233, `permission_prompt` ne se déclenchait pas dans ces sessions.2643Avant la v2.1.233, `permission_prompt` ne se déclenchait pas dans ces sessions.
2618 2644
2619Utilisez 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 :2645Utilisez des matchers distincts pour exécuter des gestionnaires différents 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 :
2620 2646
2621```json theme={null}2647```json theme={null}
2622{2648{
2649 Entrée Notification2675 Entrée Notification
2650</h4>2676</h4>
2651 2677
2652En plus des [champs d'entrée communs](#common-input-fields), les hooks Notification reçoivent `message` avec le texte de la notification, un `title` facultatif et `notification_type` indiquant quel type s'est déclenché.2678En plus des [champs d'entrée communs](#common-input-fields), les hooks Notification reçoivent `message` avec le texte de la notification, un `title` facultatif, et `notification_type` indiquant quel type s'est déclenché.
2653 2679
2654```json theme={null}2680```json theme={null}
2655{2681{
2663}2689}
2664```2690```
2665 2691
2666Les 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.2692Les hooks Notification ne peuvent ni bloquer ni modifier les notifications. Claude Code ignore 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 la transmission de la notification à un service externe.
2667 2693
2668<h3 id="subagentstart">2694<h3 id="subagentstart">
2669 SubagentStart2695 SubagentStart
2670</h3>2696</h3>
2671 2697
2672S'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.2698S'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.
2673 2699
2674Pour 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$`.2700Pour les sous-agents fournis par un [plugin](/docs/fr/plugins/overview), le type d'agent est l'identifiant à portée de plugin, comme `my-plugin:reviewer`, et non le simple nom du frontmatter. Les deux-points font passer un nom à portée de plugin par le chemin des expressions régulières, ancrez donc le matcher avec `^` et `$` pour une correspondance exacte : `^my-plugin:reviewer$`.
2675 2701
2676<h4 id="subagentstart-input">2702<h4 id="subagentstart-input">
2677 Entrée SubagentStart2703 Entrée SubagentStart
2694 2720
2695| Champ | Description |2721| Champ | Description |
2696| :- | :- |2722| :- | :- |
2697| `additionalContext` | Chaîne ajoutée au contexte du sous-agent au début de sa conversation, avant son premier prompt. Voir [Ajouter du contexte pour Claude](#add-context-for-claude) |2723| `additionalContext` | Chaîne ajoutée au contexte du sous-agent au début de sa conversation, avant son premier prompt. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |
2698 2724
2699```json theme={null}2725```json theme={null}
2700{2726{
2705}2731}
2706```2732```
2707 2733
2708Lorsque 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.2734Lorsque 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 laisse intact 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.
2709 2735
2710<h3 id="subagentstop">2736<h3 id="subagentstop">
2711 SubagentStop2737 SubagentStop
2717 Entrée SubagentStop2743 Entrée SubagentStop
2718</h4>2744</h4>
2719 2745
2720En 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.2746En 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. `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.
2721 2747
2722Tous 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.2748Tous 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 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 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, comme celui 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.
2723 2749
2724Un `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.2750Un `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.
2725 2751
2726Sur 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`.2752Avec 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) 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 correspond à l'entrée `message` de cet appel, qu'un hook `PreToolUse` ou `PostToolUse` correspondant à `SubagentHandback` reçoit sous la forme `tool_input.message`.
2727 2753
2728Les 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.2754Les 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.
2729 2755
2744}2770}
2745```2771```
2746 2772
2747Les 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`.2773Les 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 hors 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`.
2748 2774
2749<h3 id="taskcreated">2775<h3 id="taskcreated">
2750 TaskCreated2776 TaskCreated
2781| `task_description` | Description détaillée de la tâche. Peut être absent |2807| `task_description` | Description détaillée de la tâche. Peut être absent |
2782| `teammate_name` | Nom du coéquipier qui crée la tâche. Peut être absent |2808| `teammate_name` | Nom du coéquipier qui crée la tâche. Peut être absent |
2783| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |2809| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |
2784| `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 |2810| `agent_id` | Pour cet événement, le [champ d'entrée commun](#common-input-fields) identifie le sous-agent ou le [coéquipier en processus](/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 une version ultérieure |
2785 2811
2786<h4 id="taskcreated-decision-control">2812<h4 id="taskcreated-decision-control">
2787 Contrôle de décision TaskCreated2813 Contrôle de décision TaskCreated
2789 2815
2790Un hook TaskCreated peut bloquer la création avec le code de sortie 2 ou avec une décision JSON. 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.2816Un hook TaskCreated peut bloquer la création avec le code de sortie 2 ou avec une décision JSON. 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.
2791 2817
2792* **Code de sortie 2** : Claude Code renvoie le texte de stderr comme message.2818* **Code de sortie 2** : Claude Code renvoie le texte stderr comme message.
2793* **JSON `{"decision": "block", "reason": "..."}`** : Claude Code renvoie `reason` comme message.2819* **JSON `{"decision": "block", "reason": "..."}`** : Claude Code renvoie `reason` comme message.
2794 2820
2795Cet exemple bloque les tâches dont le sujet ne respecte pas le format requis :2821Cet exemple bloque les tâches dont les sujets ne respectent pas le format requis :
2796 2822
2797```bash theme={null}2823```bash theme={null}
2798#!/bin/bash2824#!/bin/bash
2811 TaskCompleted2837 TaskCompleted
2812</h3>2838</h3>
2813 2839
2814S'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.2840S'exécute lorsqu'une tâche est en train d'être marquée 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 lint, avant qu'une tâche puisse être clôturée.
2815 2841
2816Les hooks TaskCompleted ne prennent pas en charge les matchers et se déclenchent à chaque occurrence.2842Les hooks TaskCompleted ne prennent pas en charge les matchers et se déclenchent à chaque occurrence.
2817 2843
2843| `task_description` | Description détaillée de la tâche. Peut être absent |2869| `task_description` | Description détaillée de la tâche. Peut être absent |
2844| `teammate_name` | Nom du coéquipier qui termine la tâche. Peut être absent |2870| `teammate_name` | Nom du coéquipier qui termine la tâche. Peut être absent |
2845| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |2871| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |
2846| `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 |2872| `agent_id` | Pour cet événement, le [champ d'entrée commun](#common-input-fields) identifie le sous-agent ou le [coéquipier en processus](/docs/fr/agent-teams#choose-a-display-mode) qui termine la tâche. Peut être absent. Nécessite Claude Code v2.1.290 ou une version ultérieure |
2847 2873
2848<h4 id="taskcompleted-decision-control">2874<h4 id="taskcompleted-decision-control">
2849 Contrôle de décision TaskCompleted2875 Contrôle de décision TaskCompleted
2852Les hooks TaskCompleted prennent en charge deux façons de contrôler l'achèvement des tâches :2878Les hooks TaskCompleted prennent en charge deux façons de contrôler l'achèvement des tâches :
2853 2879
2854* **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.2880* **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.
2855* **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.2881* **JSON `{"continue": false, "stopReason": "..."}`** : lorsqu'un coéquipier terminant son tour a déclenché l'événement, arrête complètement le coéquipier, conformément au comportement du hook `Stop`. Le `stopReason` est affiché à l'utilisateur. Lorsque l'outil `TaskUpdate` a déclenché l'événement, Claude Code ignore `continue: false` ; le code de sortie 2 bloque toujours l'achèvement.
2856 2882
2857Cet exemple exécute les tests et bloque l'achèvement de la tâche s'ils échouent :2883Cet exemple exécute les tests et bloque l'achèvement de la tâche s'ils échouent :
2858 2884
2874 Stop2900 Stop
2875</h3>2901</h3>
2876 2902
2877S'exécute lorsque l'agent principal de Claude Code a fini de répondre. Ne s'exécute pas si2903S'exécute lorsque l'agent principal de Claude Code a fini de répondre. Ne s'exécute pas
2878l'arrêt est dû à une interruption par l'utilisateur. Les erreurs d'API déclenchent2904si l'arrêt est dû à une interruption de l'utilisateur. Les erreurs d'API déclenchent
2879plutôt [StopFailure](#stopfailure).2905plutôt [StopFailure](#stopfailure).
2880 2906
2881<Tip>2907<Tip>
2882 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.2908 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 souhaitez que Claude continue de travailler vers une condition sans écrire de configuration de hook.
2883</Tip>2909</Tip>
2884 2910
2885<h4 id="stop-input">2911<h4 id="stop-input">
2886 Entrée Stop2912 Entrée Stop
2887</h4>2913</h4>
2888 2914
2889En 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.2915En 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 continue 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.
2890 2916
2891Claude 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).2917Claude Code applique un plafond de 8 poursuites consécutives : après que des hooks Stop ont fait continuer le tour huit fois de suite, Claude Code passe outre le blocage suivant et termine le tour. Le compteur de poursuites consécutives est réinitialisé chaque fois que Claude appelle un outil. Pour relever le plafond, définissez [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/fr/env-vars).
2892 2918
2893Le 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.2919Le 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 inclue le message final au moment de Stop.
2894 2920
2895Les 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é.2921Les 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 ou planifié.
2896 2922
2897Chaque entrée de `background_tasks` décrit une tâche en cours et utilise ces champs :2923Chaque entrée de `background_tasks` décrit une tâche en cours et utilise ces champs :
2898 2924
2901| `id` | Identifiant de la tâche |2927| `id` | Identifiant de la tâche |
2902| `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 |2928| `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 |
2903| `status` | Statut actuel de la tâche |2929| `status` | Statut actuel de la tâche |
2904| `description` | Description en texte libre, plafonnée à 1000 caractères avec un marqueur `… [+N chars]` dans la chaîne en cas de troncature |2930| `description` | Description en texte libre, plafonnée à 1 000 caractères avec un marqueur `… [+N chars]` dans la chaîne lorsqu'elle est tronquée |
2905| `command` | Ligne de commande shell, plafonnée à 1000 caractères. Présent uniquement pour les tâches `shell` |2931| `command` | Ligne de commande shell, plafonnée à 1 000 caractères. Présent uniquement pour les tâches `shell` |
2906| `agent_type` | Nom du type de sous-agent. Présent uniquement pour les tâches `subagent` |2932| `agent_type` | Nom du type de sous-agent. Présent uniquement pour les tâches `subagent` |
2907| `server` | Nom du serveur MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |2933| `server` | Nom du serveur MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |
2908| `tool` | Nom de l'outil MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |2934| `tool` | Nom de l'outil MCP. Présent uniquement pour les tâches `monitor` et `MCP task` |
2909| `name` | Nom du workflow. Présent uniquement pour les tâches `workflow` |2935| `name` | Nom du workflow. Présent uniquement pour les tâches `workflow` |
2910 2936
2911Chaque entrée de `session_crons` décrit un réveil planifié limité à la session, issu de `CronCreate`, `ScheduleWakeup` et `/loop` :2937Chaque entrée de `session_crons` décrit un réveil planifié limité à la session, provenant de `CronCreate`, `ScheduleWakeup` et `/loop` :
2912 2938
2913| Champ | Description |2939| Champ | Description |
2914| :- | :- |2940| :- | :- |
2915| `id` | Identifiant de la tâche cron |2941| `id` | Identifiant de la tâche cron |
2916| `schedule` | Expression cron, par exemple `0 9 * * 1-5` |2942| `schedule` | Expression cron, par exemple `0 9 * * 1-5` |
2917| `recurring` | `false` pour les réveils ponctuels dont la planification encode une seule heure de déclenchement, `true` pour les tâches qui se redéclenchent à chaque correspondance |2943| `recurring` | `false` pour les réveils ponctuels dont la planification encode un unique moment de déclenchement, `true` pour les tâches qui se redéclenchent à chaque correspondance |
2918| `prompt` | Prompt soumis lorsque le cron se déclenche, plafonné à 1000 caractères avec le même marqueur `… [+N chars]` |2944| `prompt` | Prompt soumis lorsque le cron se déclenche, plafonné à 1 000 caractères avec le même marqueur `… [+N chars]` |
2919 2945
2920Cet exemple montre une entrée Stop avec une tâche shell en cours et un cron récurrent :2946Cet exemple montre une entrée Stop avec une tâche shell en cours et un cron récurrent :
2921 2947
2952 Contrôle de décision Stop2978 Contrôle de décision Stop
2953</h4>2979</h4>
2954 2980
2955Les 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 :2981Les 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 :
2956 2982
2957| Champ | Description |2983| Champ | Description |
2958| :- | :- |2984| :- | :- |
2959| `decision` | `"block"` empêche Claude de s'arrêter. Omettez-le pour permettre à Claude de s'arrêter |2985| `decision` | `"block"` empêche Claude de s'arrêter. Omettez-le pour permettre à Claude de s'arrêter |
2960| `reason` | Obligatoire lorsque `decision` vaut `"block"`. Indique à Claude pourquoi il doit continuer |2986| `reason` | Obligatoire lorsque `decision` vaut `"block"`. Indique à Claude pourquoi il doit continuer |
2961| `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 |2987| `hookSpecificOutput.additionalContext` | Retour hors erreur pour Claude. La conversation continue afin que Claude puisse y donner suite, mais contrairement à `decision: "block"`, il apparaît dans la transcription comme un retour de hook plutôt que comme une erreur de hook |
2962 2988
2963Un 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.2989Un 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.
2964 2990
2965```json theme={null}2991```json theme={null}
2966{2992{
2969}2995}
2970```2996```
2971 2997
2972Utilisez `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 :2998Utilisez `additionalContext` lorsque le hook fonctionne comme prévu et donne des indications à Claude, comme « exécuter la suite de tests avant de terminer ». Il maintient 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 le libelle `Stop hook feedback` et aucune notification d'erreur de hook n'est affichée :
2973 2999
2974```json theme={null}3000```json theme={null}
2975{3001{
2984 StopFailure3010 StopFailure
2985</h3>3011</h3>
2986 3012
2987S'exécute à la place de [Stop](#stop) lorsque le tour se termine en raison d'une erreur d'API. Claude Code ignore la sortie et le code de sortie du hook, à l'exception de [`terminalSequence`](#emit-terminal-notifications). Utilisez-le pour journaliser les échecs, envoyer des alertes ou prendre des mesures de récupération lorsque Claude ne peut pas terminer une réponse en raison de limites de débit, de problèmes d'authentification ou d'autres erreurs d'API.3013S'exécute à la place de [Stop](#stop) lorsque le tour se termine en raison d'une erreur d'API. Claude Code ignore la sortie et le code de sortie du hook, à l'exception de [`terminalSequence`](#emit-terminal-notifications). Utilisez-le pour journaliser les échecs, envoyer des alertes ou entreprendre des actions de récupération lorsque Claude ne peut pas terminer une réponse en raison de limites de débit, de problèmes d'authentification ou d'autres erreurs d'API.
2988 3014
2989<h4 id="stopfailure-input">3015<h4 id="stopfailure-input">
2990 Entrée StopFailure3016 Entrée StopFailure
2996| :- | :- |3022| :- | :- |
2997| `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` |3023| `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` |
2998| `error_details` | Détails supplémentaires sur l'erreur, lorsqu'ils sont disponibles |3024| `error_details` | Détails supplémentaires sur l'erreur, lorsqu'ils sont disponibles |
2999| `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"` |3025| `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"` |
3000 3026
3001```json theme={null}3027```json theme={null}
3002{3028{
3016 TeammateIdle3042 TeammateIdle
3017</h3>3043</h3>
3018 3044
3019S'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.3045S'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 de qualité avant qu'un coéquipier n'arrête de travailler, comme exiger la réussite des vérifications lint ou vérifier que les fichiers de sortie existent.
3020 3046
3021Les hooks TeammateIdle ne prennent pas en charge les matchers et se déclenchent à chaque occurrence.3047Les hooks TeammateIdle ne prennent pas en charge les matchers et se déclenchent à chaque occurrence.
3022 3048
3040 3066
3041| Champ | Description |3067| Champ | Description |
3042| :- | :- |3068| :- | :- |
3043| `teammate_name` | Nom du coéquipier sur le point de devenir inactif |3069| `teammate_name` | Nom du coéquipier qui est sur le point de devenir inactif |
3044| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |3070| `team_name` | Déprécié. Nom d'équipe dérivé de la session ; sera supprimé dans une version future |
3045| `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 |3071| `agent_id` | Pour cet événement, le [champ d'entrée commun](#common-input-fields) identifie le [coéquipier en processus](/docs/fr/agent-teams#choose-a-display-mode) qui est sur le point de devenir inactif. Peut être absent. Nécessite Claude Code v2.1.290 ou une version ultérieure |
3046 3072
3047<h4 id="teammateidle-decision-control">3073<h4 id="teammateidle-decision-control">
3048 Contrôle de décision TeammateIdle3074 Contrôle de décision TeammateIdle
3051Les hooks TeammateIdle prennent en charge deux façons de contrôler le comportement des coéquipiers :3077Les hooks TeammateIdle prennent en charge deux façons de contrôler le comportement des coéquipiers :
3052 3078
3053* **Code de sortie 2** : le coéquipier reçoit le message stderr comme retour et continue de travailler au lieu de devenir inactif.3079* **Code de sortie 2** : le coéquipier reçoit le message stderr comme retour et continue de travailler au lieu de devenir inactif.
3054* **JSON `{"continue": false, "stopReason": "..."}`** : arrête complètement le coéquipier, comme le comportement du hook `Stop`. Le `stopReason` est affiché à l'utilisateur.3080* **JSON `{"continue": false, "stopReason": "..."}`** : arrête complètement le coéquipier, conformément au comportement du hook `Stop`. Le `stopReason` est affiché à l'utilisateur.
3055 3081
3056Cet exemple vérifie qu'un artefact de build existe avant de permettre à un coéquipier de devenir inactif :3082Cet exemple vérifie qu'un artefact de build existe avant de permettre à un coéquipier de devenir inactif :
3057 3083
3070 ConfigChange3096 ConfigChange
3071</h3>3097</h3>
3072 3098
3073S'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.3099S'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.
3074 3100
3075Claude 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.3101Claude 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, lors de son interrogation de la politique, un fichier de paramètres gérés côté Windows modifié sans les exécuter.
3076 3102
3077Le matcher filtre sur la source de la configuration :3103Le matcher filtre sur la source de configuration :
3078 3104
3079| Matcher | Quand il se déclenche |3105| Matcher | Moment du déclenchement |
3080| :- | :- |3106| :- | :- |
3081| `user_settings` | `~/.claude/settings.json` change |3107| `user_settings` | `~/.claude/settings.json` change |
3082| `project_settings` | `.claude/settings.json` change |3108| `project_settings` | `.claude/settings.json` change |
3084| `policy_settings` | `managed-settings.json` ou un fichier de `managed-settings.d/` change |3110| `policy_settings` | `managed-settings.json` ou un fichier de `managed-settings.d/` change |
3085| `skills` | Un fichier de skill dans `.claude/skills/` change |3111| `skills` | Un fichier de skill dans `.claude/skills/` change |
3086 3112
3087Cet exemple journalise toutes les modifications de configuration à des fins d'audit de sécurité :3113Cet exemple journalise toutes les modifications de configuration pour un audit de sécurité :
3088 3114
3089```json theme={null}3115```json theme={null}
3090{3116{
3125 Contrôle de décision ConfigChange3151 Contrôle de décision ConfigChange
3126</h4>3152</h4>
3127 3153
3128Les 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.3154Les 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. Lorsqu'elle est bloquée, les nouveaux paramètres ne sont pas appliqués à la session en cours.
3129 3155
3130| Champ | Description |3156| Champ | Description |
3131| :- | :- |3157| :- | :- |
3139}3165}
3140```3166```
3141 3167
3142Les 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.3168Les 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, vous pouvez donc 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.
3143 3169
3144Claude 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.3170Claude Code applique la décision de blocage provenant de la sortie JSON d'un hook ConfigChange et ignore `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.
3145 3171
3146<h3 id="cwdchanged">3172<h3 id="cwdchanged">
3147 CwdChanged3173 CwdChanged
3148</h3>3174</h3>
3149 3175
3150S'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.3176S'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 les variables d'environnement, activer des chaînes d'outils propres au projet ou exécuter automatiquement des scripts de configuration. S'associe à [FileChanged](#filechanged) pour des outils comme [direnv](https://direnv.net/) qui gèrent l'environnement par répertoire.
3151 3177
3152Les 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.3178Les 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.
3153 3179
3178 3204
3179| Champ | Description |3205| Champ | Description |
3180| :- | :- |3206| :- | :- |
3181| `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 |3207| `watchPaths` | Tableau de chemins absolus. Remplace la liste de surveillance dynamique actuelle. Les chemins issus de la configuration de votre `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 |
3182 3208
3183Les hooks CwdChanged n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le changement de répertoire.3209Les hooks CwdChanged n'ont pas de contrôle de décision. Ils ne peuvent pas bloquer le changement de répertoire.
3184 3210
3185Claude 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.3211Claude Code lit `watchPaths` et `systemMessage` depuis leur sortie JSON et ignore `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.
3186 3212
3187<h3 id="directoryadded">3213<h3 id="directoryadded">
3188 DirectoryAdded3214 DirectoryAdded
3192 3218
3193Claude Code ne déclenche pas cet événement lorsque :3219Claude Code ne déclenche pas cet événement lorsque :
3194 3220
3195* Vous passez un répertoire avec le flag de démarrage `--add-dir` ; [SessionStart](#sessionstart) couvre ces répertoires3221* Vous transmettez un répertoire avec le flag de démarrage `--add-dir` ; [SessionStart](#sessionstart) couvre ces répertoires
3196* Vous ajoutez un répertoire dans l'onglet Workspace de `/permissions`3222* Vous ajoutez un répertoire dans l'onglet Workspace de `/permissions`
3197* 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'eux3223* 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
3198 3224
3199Claude 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.3225Claude 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 de hook elles-mêmes s'exécutent hors sandbox.
3200 3226
3201Claude 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.3227Claude 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.
3202 3228
3203Le matcher filtre sur la façon dont le répertoire a été ajouté :3229Le matcher filtre sur la façon dont le répertoire a été ajouté :
3204 3230
3205| Matcher | Quand il se déclenche |3231| Matcher | Moment du déclenchement |
3206| :- | :- |3232| :- | :- |
3207| `slash_command` | Vous ajoutez un répertoire avec `/add-dir` |3233| `slash_command` | Vous ajoutez un répertoire avec `/add-dir` |
3208| `register_repo_root` | Un client SDK ajoute un répertoire avec la requête de contrôle `register_repo_root` |3234| `register_repo_root` | Un client SDK ajoute un répertoire avec la requête de contrôle `register_repo_root` |
3216| Champ | Description |3242| Champ | Description |
3217| :- | :- |3243| :- | :- |
3218| `directory` | Chemin absolu du répertoire qui a été ajouté |3244| `directory` | Chemin absolu du répertoire qui a été ajouté |
3219| `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 |3245| `source` | La 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 |
3220 3246
3221```json theme={null}3247```json theme={null}
3222{3248{
3229}3255}
3230```3256```
3231 3257
3232Les 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 :3258Les 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 ignore le champ `continue` de leur sortie JSON et traite le reste différemment selon la source :
3233 3259
3234* `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ébogage3260* `slash_command` : Claude Code transmet le `systemMessage` du hook à Claude comme contexte au tour de conversation suivant, plutôt que de vous l'afficher. Un décompte des hooks en échec apparaît dans la transcription. La sortie d'échec complète est envoyée dans le log de débogage
3235* `register_repo_root` : Claude Code écrit la sortie `systemMessage` et la sortie des échecs uniquement dans le log de débogage3261* `register_repo_root` : Claude Code écrit la sortie `systemMessage` et la sortie d'échec uniquement dans le log de débogage
3236 3262
3237<h3 id="filechanged">3263<h3 id="filechanged">
3238 FileChanged3264 FileChanged
3239</h3>3265</h3>
3240 3266
3241S'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.3267S'exécute lorsqu'un fichier surveillé change sur le disque. Claude Code détecte les modifications à l'aide d'un observateur du système de fichiers, et non en inspectant les appels d'outils, de sorte qu'il exécute 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.
3242 3268
3243Le `matcher` de cet événement joue deux rôles :3269Le `matcher` de cet événement remplit deux rôles :
3244 3270
3245* **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`.3271* **Construire la liste de surveillance** : la valeur est découpée selon `|` et chaque segment est enregistré comme un nom de fichier littéral dans le répertoire de travail, de sorte que `".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`.
3246* **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é.3272* **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é.
3247 3273
3248Cet 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 :3274Cet exemple normalise les fins de ligne dans `data.csv` après toute modification, y compris lorsqu'une commande `Bash` ou un script externe réécrit le fichier :
3249 3275
3250```json theme={null}3276```json theme={null}
3251{3277{
3265}3291}
3266```3292```
3267 3293
3268Le 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 :3294Le hook lit le chemin absolu du fichier modifié depuis le champ `file_path` de l'[entrée JSON](#filechanged-input) sur stdin. Sa garde `grep` teste exactement 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 moins stricte 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 :
3269 3295
3270```bash theme={null}3296```bash theme={null}
3271#!/bin/bash3297#!/bin/bash
3277 3303
3278Pour 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.3304Pour 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.
3279 3305
3280Pour 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é `*`.3306Pour surveiller des fichiers que vous ne pouvez pas nommer à l'avance, renvoyez [`watchPaths`](#filechanged-output) depuis un hook afin de mettre à jour la liste de surveillance dynamiquement. Claude Code ne démarre l'observateur que lorsque quelque chose nomme un fichier à surveiller ; initialisez 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 ; omettez donc le matcher du groupe qui gère les chemins dynamiques : il correspond alors à 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éralement nommé `*`.
3281 3307
3282Les 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.3308Les 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.
3283 3309
3289 3315
3290| Champ | Description |3316| Champ | Description |
3291| :- | :- |3317| :- | :- |
3292| `file_path` | Chemin absolu du fichier qui a changé |3318| `file_path` | Chemin absolu du fichier modifié |
3293| `event` | Ce qui s'est passé : `"change"` pour un fichier modifié, `"add"` pour un fichier créé, ou `"unlink"` pour un fichier supprimé |3319| `event` | Ce qui s'est produit : `"change"` pour un fichier modifié, `"add"` pour un fichier créé ou `"unlink"` pour un fichier supprimé |
3294 3320
3295```json theme={null}3321```json theme={null}
3296{3322{
3311 3337
3312| Champ | Description |3338| Champ | Description |
3313| :- | :- |3339| :- | :- |
3314| `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é |3340| `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é |
3315 3341
3316Les hooks FileChanged n'ont pas de contrôle de décision. Ils ne peuvent pas empêcher la modification du fichier de se produire.3342Les hooks FileChanged n'ont pas de contrôle de décision. Ils ne peuvent pas empêcher la modification du fichier.
3317 3343
3318Claude 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.3344Claude Code lit `watchPaths` et `systemMessage` dans leur sortie JSON et ignore `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.
3319 3345
3320<h3 id="worktreecreate">3346<h3 id="worktreecreate">
3321 WorktreeCreate3347 WorktreeCreate
3332 3358
3333Lorsque Claude exécute `git worktree add` via l'outil Bash au lieu d'appeler `EnterWorktree`, votre hook WorktreeCreate ne s'exécute pas. Pour inspecter ou bloquer cette commande, ajoutez un hook [`PreToolUse`](#pretooluse) avec le matcher `Bash`.3359Lorsque Claude exécute `git worktree add` via l'outil Bash au lieu d'appeler `EnterWorktree`, votre hook WorktreeCreate ne s'exécute pas. Pour inspecter ou bloquer cette commande, ajoutez un hook [`PreToolUse`](#pretooluse) avec le matcher `Bash`.
3334 3360
3335Par défaut, Claude Code crée la copie de travail isolée avec `git worktree`. La configuration d'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.3361Par 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.
3336 3362
3337Comme 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.3363Comme 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.
3338 3364
3339Le 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.3365Le 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 WorktreeCreate](#worktreecreate-output) pour savoir comment chaque type de hook renvoie le chemin.
3340 3366
3341Claude Code tient compte de la réussite du hook et du chemin renvoyé, et ignore `systemMessage` et `continue`.3367Claude Code agit en fonction de la réussite du hook et du chemin renvoyé, et ignore `systemMessage` et `continue`.
3342 3368
3343Cet 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 :3369Cet 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 :
3344 3370
3359}3385}
3360```3386```
3361 3387
3362Le 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.3388Le 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. Le `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.
3363 3389
3364<h4 id="worktreecreate-input">3390<h4 id="worktreecreate-input">
3365 Entrée de WorktreeCreate3391 Entrée WorktreeCreate
3366</h4>3392</h4>
3367 3393
3368En 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`.3394En 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`.
3378```3404```
3379 3405
3380<h4 id="worktreecreate-output">3406<h4 id="worktreecreate-output">
3381 Sortie de WorktreeCreate3407 Sortie WorktreeCreate
3382</h4>3408</h4>
3383 3409
3384Les 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éé :3410Les 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éé :
3385 3411
3386* **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.3412* **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.
3387* **Hooks HTTP** (`type: "http"`) : renvoyez `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` dans le corps de la réponse.3413* **Hooks HTTP** (`type: "http"`) : renvoyez `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` dans le corps de la réponse.
3388 3414
3389Si le hook échoue ou ne produit aucun chemin, la création du worktree échoue avec une erreur.3415Si le hook échoue ou ne produit aucun chemin, la création du worktree échoue avec une erreur.
3390 3416
3391Claude 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.3417Claude 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 `..`. 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.
3392 3418
3393Claude 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.3419Claude Code refuse un chemin absolu contenant des segments `.` ou `..`, ainsi que tout chemin qui passe 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 hors 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.
3394 3420
3395<h3 id="worktreeremove">3421<h3 id="worktreeremove">
3396 WorktreeRemove3422 WorktreeRemove
3399S'exécute lorsque Claude Code nettoie un worktree créé par votre hook [`WorktreeCreate`](#worktreecreate). L'événement se déclenche lorsque :3425S'exécute lorsque Claude Code nettoie un worktree créé par votre hook [`WorktreeCreate`](#worktreecreate). L'événement se déclenche lorsque :
3400 3426
3401* 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 demande3427* 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
3402* 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 demander3428* 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 demander
3403* Vous supprimez une [session en arrière-plan](/docs/fr/agent-view#what-deleting-a-session-removes) qui s'exécute dans le worktree3429* Vous supprimez une [session en arrière-plan](/docs/fr/agent-view#what-deleting-a-session-removes) qui s'exécute dans le worktree
3404* Vous demandez à Claude de quitter et de supprimer le worktree pendant une session, et Claude le supprime avec l'outil [`ExitWorktree`](/docs/fr/tools-reference)3430* Vous demandez à Claude de quitter et de supprimer le worktree pendant une session, et Claude le supprime avec l'outil [`ExitWorktree`](/docs/fr/tools-reference)
3405* Une session démarrée par [`claude remote-control`](/docs/fr/remote-control#start-a-remote-control-session) en mode `worktree` se termine sans plantage, et Claude Code ne trouve dans son worktree aucun fichier modifié ou non suivi ni aucun nouveau commit3431* Une session que [`claude remote-control`](/docs/fr/remote-control#start-a-remote-control-session) a démarrée en mode `worktree` se termine sans plantage, et Claude Code ne trouve aucun fichier modifié ou non suivi ni aucun nouveau commit dans son worktree
3406* Vous arrêtez `claude remote-control` alors que des sessions qu'il a démarrées en mode `worktree` sont toujours en cours d'exécution, et Claude Code ne trouve dans leurs worktrees aucun fichier modifié ou non suivi ni aucun nouveau commit3432* Vous arrêtez `claude remote-control` alors que des sessions qu'il a démarrées en mode `worktree` sont encore en cours d'exécution, et Claude Code ne trouve aucun fichier modifié ou non suivi ni aucun nouveau commit dans leurs worktrees
3407 3433
3408Lorsqu'un sous-agent ou un agent de workflow se termine, Claude Code conserve le worktree que votre hook WorktreeCreate a créé pour lui et n'exécute pas votre hook WorktreeRemove. Supprimez vous-même ces worktrees une fois le travail terminé.3434Lorsqu'un sous-agent ou un agent de workflow termine, Claude Code conserve le worktree que votre hook WorktreeCreate a créé pour lui et n'exécute pas votre hook WorktreeRemove. Supprimez vous-même ces worktrees une fois le travail terminé.
3409 3435
3410Claude Code ne vous demande rien avant l'exécution de votre hook pour un appel `ExitWorktree` ou un nettoyage `claude remote-control`. `ExitWorktree` refuse de supprimer un worktree créé par un hook à moins que l'appel ne passe [`discard_changes: true`](/docs/fr/agent-sdk/typescript#exitworktree), ce qui fait de votre hook la dernière vérification sur ce chemin.3436Claude Code ne vous demande rien avant que votre hook s'exécute pour un appel `ExitWorktree` ou un nettoyage `claude remote-control`. `ExitWorktree` refuse de supprimer un worktree créé par un hook à moins que l'appel ne transmette [`discard_changes: true`](/docs/fr/agent-sdk/typescript#exitworktree), ce qui fait de votre hook la dernière vérification sur ce chemin.
3411 3437
3412Claude 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.3438Claude 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 ou qui ne se trouve pas dans un checkout git, 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.
3413 3439
3414Pour 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 :3440Pour 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 :
3415 3441
3416* **Aucun hook WorktreeRemove** : Claude Code se rabat sur git pour une suppression à la sortie ou via `ExitWorktree`, et conserve le worktree lorsque `claude remote-control` effectue le nettoyage :3442* **Aucun hook WorktreeRemove** : Claude Code se rabat sur git pour une suppression à la sortie ou via `ExitWorktree`, et conserve le worktree lors du nettoyage par `claude remote-control` :
3417 * **Vous quittez une session worktree, ou Claude appelle `ExitWorktree`** : Claude Code supprime le chemin renvoyé par votre hook WorktreeCreate comme le ferait `git worktree remove --force`, 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.3443 * **Vous quittez une session de worktree, ou Claude appelle `ExitWorktree`** : Claude Code supprime le chemin renvoyé par votre hook WorktreeCreate comme le ferait `git worktree remove --force`, 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.
3418 * **`claude remote-control` nettoie le worktree d'une session** : le worktree reste sur le disque, et le terminal qui exécute `claude remote-control` affiche `worktree removal failed, kept: <path>`.3444 * **`claude remote-control` nettoie le worktree d'une session** : le worktree reste sur le disque, et le terminal qui exécute `claude remote-control` affiche `worktree removal failed, kept: <path>`.
3419 * **Vous supprimez une session en arrière-plan** : consultez [Ce que supprime la suppression d'une session](/docs/fr/agent-view#what-deleting-a-session-removes).3445 * **Vous supprimez une session en arrière-plan** : consultez [Ce que supprime la suppression d'une session](/docs/fr/agent-view#what-deleting-a-session-removes).
3420* **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.3446* **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.
3421* **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).3447* **Le hook se termine avec un code non nul** : la suppression échoue si le répertoire situé à `worktree_path` existe encore 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 WorktreeRemove](#worktreeremove-input).
3422 3448
3423Claude 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.3449Claude 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.
3424 3450
3425Claude Code ignore les [champs de sortie JSON](#json-output) d'un hook WorktreeRemove, tels que `systemMessage` et `continue`.3451Claude Code ignore les [champs de sortie JSON](#json-output) d'un hook WorktreeRemove, comme `systemMessage` et `continue`.
3426 3452
3427Lors de 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 situé sous la racine du dépôt. Sur ce chemin, le hook ne s'exécute pour un worktree qui contient encore des fichiers que 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.3453Pour 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 situé sous la racine du dépôt. Sur ce chemin, le hook s'exécute pour un worktree qui contient 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.
3428 3454
3429Claude 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 :3455Claude 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 :
3430 3456
3431```json theme={null}3457```json theme={null}
3432{3458{
3446```3472```
3447 3473
3448<h4 id="worktreeremove-input">3474<h4 id="worktreeremove-input">
3449 Entrée de WorktreeRemove3475 Entrée WorktreeRemove
3450</h4>3476</h4>
3451 3477
3452En 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.3478En 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.
3461}3487}
3462```3488```
3463 3489
3464Le 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 :3490Le 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 encore ensuite, la suppression échoue :
3465 3491
3466* Le worktree reste sur le disque, et la commande et le stderr du hook sont envoyés au [log de débogage](#debug-hooks).3492* Le worktree reste sur le disque, et la commande et le stderr du hook sont envoyés dans le [log de débogage](#debug-hooks).
3467* 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.3493* Si vous supprimiez une session en arrière-plan, la session reste également. 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 supprimer à nouveau la session supprime quand même le répertoire.
3468* Si `claude remote-control` nettoyait le worktree d'une session, le terminal qui l'exécute affiche `worktree removal failed, kept: <path>`.3494* Si `claude remote-control` nettoyait le worktree d'une session, le terminal qui l'exécute affiche `worktree removal failed, kept: <path>`.
3469 3495
3470<h3 id="precompact">3496<h3 id="precompact">
3471 PreCompact3497 PreCompact
3472</h3>3498</h3>
3473 3499
3474S'exécute juste avant que Claude Code n'effectue une opération de compaction.3500S'exécute juste avant que Claude Code lance une opération de compaction.
3475 3501
3476La valeur du matcher indique si la compaction a été déclenchée manuellement ou automatiquement :3502La valeur du matcher indique si la compaction a été déclenchée manuellement ou automatiquement :
3477 3503
3478| Matcher | Quand il se déclenche |3504| Matcher | Quand il se déclenche |
3479| :- | :- |3505| :- | :- |
3480| `manual` | `/compact` |3506| `manual` | `/compact` |
3481| `auto` | Compaction automatique lorsque la conversation atteint la [fenêtre de compaction automatique](/docs/fr/model-config#set-the-auto-compact-window) |3507| `auto` | Compaction automatique lorsque la conversation atteint la [fenêtre de compaction automatique](/docs/fr/model-config#set-the-auto-compact-window), et [compaction en cas d'inactivité](/docs/fr/settings-reference#idlecompaction) |
3482 3508
3483Terminez 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"`.3509Terminez 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"`.
3484 3510
3485Bloquer 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.3511Bloquer 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 compaction. 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 apparaît et la requête en cours échoue.
3486 3512
3487Claude Code ignore les champs `systemMessage` et `continue` d'un hook PreCompact.3513Claude Code ignore les champs `systemMessage` et `continue` d'un hook PreCompact.
3488 3514
3489<h4 id="precompact-input">3515<h4 id="precompact-input">
3490 Entrée de PreCompact3516 Entrée PreCompact
3491</h4>3517</h4>
3492 3518
3493En 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`.3519En 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`.
3494 3520
3495```json theme={null}3521```json theme={null}
3496{3522{
3509 3535
3510S'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.3536S'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.
3511 3537
3512Les mêmes valeurs de matcher que pour `PreCompact` s'appliquent :3538Les mêmes valeurs de matcher s'appliquent que pour `PreCompact` :
3513 3539
3514| Matcher | Quand il se déclenche |3540| Matcher | Quand il se déclenche |
3515| :- | :- |3541| :- | :- |
3516| `manual` | Après `/compact` |3542| `manual` | Après `/compact` |
3517| `auto` | Après la compaction automatique lorsque la conversation atteint la [fenêtre de compaction automatique](/docs/fr/model-config#set-the-auto-compact-window) |3543| `auto` | Après la compaction automatique lorsque la conversation atteint la [fenêtre de compaction automatique](/docs/fr/model-config#set-the-auto-compact-window), et après la [compaction en cas d'inactivité](/docs/fr/settings-reference#idlecompaction) |
3518 3544
3519<h4 id="postcompact-input">3545<h4 id="postcompact-input">
3520 Entrée de PostCompact3546 Entrée PostCompact
3521</h4>3547</h4>
3522 3548
3523En plus des [champs d'entrée communs](#common-input-fields), les hooks PostCompact reçoivent `trigger` et `compact_summary`. Le champ `compact_summary` contient le résumé de la conversation généré par l'opération de compaction.3549En plus des [champs d'entrée communs](#common-input-fields), les hooks PostCompact reçoivent `trigger` et `compact_summary`. Le champ `compact_summary` contient le résumé de la conversation généré par l'opération de compaction.
3533}3559}
3534```3560```
3535 3561
3536Les 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.3562Les hooks PostCompact n'ont pas de contrôle de décision. Ils ne peuvent pas modifier le résultat de la compaction, mais peuvent effectuer des tâches de suivi.
3537 3563
3538<h3 id="premodelswitch">3564<h3 id="premodelswitch">
3539 PreModelSwitch3565 PreModelSwitch
3540</h3>3566</h3>
3541 3567
3542S'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.3568S'exécute avant que Claude Code applique un changement de modèle que vous ou un client avez demandé. Utilisez-le pour bloquer un changement, exiger une confirmation ou afficher ce que coûtera le changement avant qu'il ait lieu.
3543 3569
3544PreModelSwitch nécessite Claude Code v2.1.251 ou ultérieur. Claude Code l'exécute pour les demandes suivantes :3570PreModelSwitch nécessite Claude Code v2.1.251 ou une version ultérieure. Claude Code l'exécute pour ces demandes :
3545 3571
3546* `/model <name>` et le sélecteur `/model`3572* `/model <name>` et le sélecteur `/model`
3547* Le sélecteur de modèle `Option+P` ou `Alt+P`3573* Le sélecteur de modèle `Option+P` ou `Alt+P`
3548* Le paramètre Model dans `/config`3574* Le paramètre Model dans `/config`
3549* L'activation du [mode rapide](/docs/fr/fast-mode) lorsque cela change le modèle de la session3575* L'activation du [mode rapide](/docs/fr/fast-mode) lorsqu'elle change le modèle de la session
3550* 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)3576* 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)
3551 3577
3552Claude 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).3578Claude 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).
3553 3579
3554Claude 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.3580Claude 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 écritures d'Opus 5.
3555 3581
3556Lorsque 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.3582Lorsque Claude Code ne peut pas déterminer de 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 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.
3557 3583
3558É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 :3584Écrivez le matcher sous la forme d'un nom exact, d'une liste séparée par `|` comme `claude-opus-4-6|claude-opus-5`, ou d'une expression régulière comme `.*opus.*`. Cet exemple utilise un matcher de 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 :
3559 3585
3560<Tabs>3586<Tabs>
3561 <Tab title="macOS/Linux">3587 <Tab title="macOS/Linux">
3608 }3634 }
3609 ```3635 ```
3610 3636
3611 Enregistrez ce script dans `.claude/hooks/block-opus-46.ps1` dans votre projet :3637 Enregistrez ce script sous `.claude/hooks/block-opus-46.ps1` dans votre projet :
3612 3638
3613 ```powershell theme={null}3639 ```powershell theme={null}
3614 $hookInput = [Console]::In.ReadToEnd() | ConvertFrom-Json3640 $hookInput = [Console]::In.ReadToEnd() | ConvertFrom-Json
3621 </Tab>3647 </Tab>
3622</Tabs>3648</Tabs>
3623 3649
3624Pour vérifier que le hook fonctionne, exécutez `/model claude-opus-4-6` depuis une session utilisant un autre modèle. Claude Code conserve le modèle actuel et indique qu'un hook PreModelSwitch a bloqué le changement, avec votre message comme motif.3650Pour vérifier que le hook fonctionne, exécutez `/model claude-opus-4-6` depuis une session utilisant un autre modèle. Claude Code conserve le modèle actuel et signale qu'un hook PreModelSwitch a bloqué le changement, avec votre message comme motif.
3625 3651
3626<h4 id="premodelswitch-input">3652<h4 id="premodelswitch-input">
3627 Entrée de PreModelSwitch3653 Entrée PreModelSwitch
3628</h4>3654</h4>
3629 3655
3630En 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.3656En 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 chiffre avant que le changement ait lieu.
3631 3657
3632| Champ | Type | Description |3658| Champ | Type | Description |
3633| :- | :- | :- |3659| :- | :- | :- |
3634| `from_model` | string | ID du modèle de départ du changement |3660| `from_model` | string | ID du modèle à partir duquel le changement s'effectue |
3635| `to_model` | string | ID du modèle d'arrivée du changement. Le matcher est comparé au nom canonique de ce modèle |3661| `to_model` | string | ID du modèle vers lequel le changement s'effectue. Le matcher est comparé au nom canonique de ce modèle |
3636| `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 |3662| `requested_model` | string ou `null` | Le modèle nommé dans la demande : un alias tel que `opus`, un ID de modèle complet, ou `null` lorsque la demande portait sur le modèle par défaut |
3637| `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 |3663| `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 |
3638| `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 |3664| `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 |
3639| `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 |3665| `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 |
3640| `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"` |3666| `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"` |
3641| `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 |3667| `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 cette valeur comme une estimation |
3642| `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 |3668| `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 |
3643 3669
3644Cet exemple montre l'entrée pour `/model opus` dans une session utilisant Sonnet 5 :3670Cet exemple montre l'entrée pour `/model opus` dans une session utilisant Sonnet 5 :
3662```3688```
3663 3689
3664<h4 id="premodelswitch-decision-control">3690<h4 id="premodelswitch-decision-control">
3665 Contrôle de décision de PreModelSwitch3691 Contrôle de décision PreModelSwitch
3666</h4>3692</h4>
3667 3693
3668Les hooks `PreModelSwitch` peuvent annuler le changement, demander à l'utilisateur de le confirmer ou le laisser se poursuivre. Le code de sortie 2 ou un `decision: "block"` de premier niveau annule le changement.3694Les hooks `PreModelSwitch` peuvent annuler le changement, demander à l'utilisateur de le confirmer ou le laisser se poursuivre. Le code de sortie 2 ou un `decision: "block"` de premier niveau annule le changement.
3690 3716
3691Lorsque plusieurs hooks PreModelSwitch renvoient des décisions différentes, l'ordre de priorité est `deny` > `ask` > `allow`.3717Lorsque plusieurs hooks PreModelSwitch renvoient des décisions différentes, l'ordre de priorité est `deny` > `ask` > `allow`.
3692 3718
3693Claude 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.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.
3694 3720
3695Un hook PreModelSwitch qui ne répond pas avant son délai d'expiration bloque le changement. Pour savoir ce que provoque 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 des hooks `command`, `http` et `mcp_tool` ; les valeurs par défaut de `prompt` et `agent` ne s'appliquent donc pas.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.
3696 3722
3697Un 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).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).
3698 3724
3700 PostModelSwitch3726 PostModelSwitch
3701</h3>3727</h3>
3702 3728
3703S'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.3729S'exécute après le changement du modèle de la session. Utilisez-le pour donner à Claude des consignes propres au modèle sans modifier chaque CLAUDE.md, par exemple une instruction à l'échelle de l'organisation qui s'applique à certains modèles.
3704 3730
3705PostModelSwitch 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 :3731PostModelSwitch 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 :
3706 3732
3707* Un changement que vous ou un client avez demandé3733* Un changement que vous ou un client avez demandé
3708* Un [basculement automatique vers un modèle de secours](/docs/fr/model-config#automatic-model-fallback), qui change le modèle de la session3734* Un [basculement automatique vers un modèle de secours](/docs/fr/model-config#automatic-model-fallback), qui change le modèle de la session
3736Pour vérifier que le hook fonctionne, passez à un modèle Opus depuis une session utilisant un autre modèle, par exemple en exécutant `/model opus` depuis une session Sonnet, puis demandez à Claude quelles consignes il a concernant le modèle actuel.3762Pour vérifier que le hook fonctionne, passez à un modèle Opus depuis une session utilisant un autre modèle, par exemple en exécutant `/model opus` depuis une session Sonnet, puis demandez à Claude quelles consignes il a concernant le modèle actuel.
3737 3763
3738<h4 id="postmodelswitch-input">3764<h4 id="postmodelswitch-input">
3739 Entrée de PostModelSwitch3765 Entrée PostModelSwitch
3740</h4>3766</h4>
3741 3767
3742Les 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.3768Les hooks PostModelSwitch reçoivent les mêmes champs que [PreModelSwitch](#premodelswitch-input), avec `hook_event_name` défini sur `"PostModelSwitch"` et deux valeurs `source` supplémentaires : `"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.
3743 3769
3744`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é.3770`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é.
3745 3771
3746<h4 id="postmodelswitch-decision-control">3772<h4 id="postmodelswitch-decision-control">
3747 Contrôle de décision de PostModelSwitch3773 Contrôle de décision PostModelSwitch
3748</h4>3774</h4>
3749 3775
3750Claude 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 :3776Claude Code prend la [sortie stdout en texte brut](#exit-code-0) de votre hook en cas de sortie avec le code 0, ou `additionalContext` issu de la sortie JSON, et la transmet à Claude avec la requête suivant le changement. En plus des [champs de sortie JSON](#json-output) disponibles pour tous les hooks, vous pouvez renvoyer :
3751 3777
3752| Champ | Description |3778| Champ | Description |
3753| :- | :- |3779| :- | :- |
3754| `additionalContext` | Chaîne ajoutée au contexte de Claude avec la prochaine requête. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |3780| `additionalContext` | Chaîne ajoutée au contexte de Claude avec la requête suivante. Consultez [Ajouter du contexte pour Claude](#add-context-for-claude) |
3755 3781
3756Si 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.3782Si le hook n'a pas terminé dans les cinq secondes suivant l'envoi de votre prompt suivant, Claude Code envoie cette requête sans la sortie et la joint plutôt à la requête d'après. Si le modèle change plusieurs fois avant la requête suivante, Claude Code ne transmet que la sortie correspondant au modèle cible du dernier changement.
3757 3783
3758<h3 id="sessionend">3784<h3 id="sessionend">
3759 SessionEnd3785 SessionEnd
3760</h3>3786</h3>
3761 3787
3762S'exécute à la fin d'une session Claude Code. Utile pour les tâches de nettoyage, la journalisation des3788S'exécute lorsqu'une session Claude Code se termine. Utile pour les tâches de nettoyage, la journalisation des
3763statistiques de session ou l'enregistrement de l'état de la session. Prend en charge les matchers pour filtrer par motif de sortie.3789statistiques de session ou l'enregistrement de l'état de la session. Prend en charge les matchers pour filtrer selon le motif de sortie.
3764 3790
3765Le champ `reason` de l'entrée du hook indique pourquoi la session s'est terminée :3791Le champ `reason` de l'entrée du hook indique pourquoi la session s'est terminée :
3766 3792
3774| `bypass_permissions_disabled` | Supprimé dans la v2.1.234 ; Claude Code ne l'envoie plus. Retirez-le de vos matchers `SessionEnd` |3800| `bypass_permissions_disabled` | Supprimé dans la v2.1.234 ; Claude Code ne l'envoie plus. Retirez-le de vos matchers `SessionEnd` |
3775 3801
3776<h4 id="sessionend-input">3802<h4 id="sessionend-input">
3777 Entrée de SessionEnd3803 Entrée SessionEnd
3778</h4>3804</h4>
3779 3805
3780En plus des [champs d'entrée communs](#common-input-fields), les hooks SessionEnd reçoivent un champ `reason` indiquant pourquoi la session s'est terminée. Consultez le [tableau des motifs](#sessionend) ci-dessus pour toutes les valeurs.3806En plus des [champs d'entrée communs](#common-input-fields), les hooks SessionEnd reçoivent un champ `reason` indiquant pourquoi la session s'est terminée. Consultez le [tableau des motifs](#sessionend) ci-dessus pour toutes les valeurs.
3789}3815}
3790```3816```
3791 3817
3792Les 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`.3818Les 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), comme `systemMessage`.
3793 3819
3794Les 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 :3820Les 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 :
3795 3821
3796* **`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.3822* **`timeout` par hook** : définissez `timeout` dans la configuration de ce hook. Le budget global augmente automatiquement pour correspondre au `timeout` par hook le plus élevé dans vos fichiers de paramètres, dans la limite de 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.
3797* **`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`.3823* **`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`.
3798 3824
3799Cet exemple définit le budget à 5 secondes :3825Cet exemple définit le budget à 5 secondes :
3808 Elicitation3834 Elicitation
3809</h3>3835</h3>
3810 3836
3811S'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.3837S'exécute lorsqu'un serveur MCP demande une saisie à l'utilisateur en cours de tâche. Par défaut, Claude Code affiche une boîte de dialogue interactive permettant à l'utilisateur de répondre. Les hooks peuvent intercepter cette demande et y répondre par programmation, en ignorant entièrement la boîte de dialogue.
3812 3838
3813Pour 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).3839Pour 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).
3814 3840
3815Le champ matcher est comparé au nom du serveur MCP.3841Le champ matcher est comparé au nom du serveur MCP.
3816 3842
3817<h4 id="elicitation-input">3843<h4 id="elicitation-input">
3818 Entrée d'Elicitation3844 Entrée Elicitation
3819</h4>3845</h4>
3820 3846
3821En 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`.3847En 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`.
3822 3848
3823Pour une élicitation en mode formulaire, le cas le plus courant :3849Pour une élicitation en mode formulaire, le cas le plus courant :
3824 3850
3856```3882```
3857 3883
3858<h4 id="elicitation-output">3884<h4 id="elicitation-output">
3859 Sortie d'Elicitation3885 Sortie Elicitation
3860</h4>3886</h4>
3861 3887
3862Un 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 :3888Un 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 le code 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 :
3863 3889
3864| Pour | Renvoyer | Le serveur reçoit |3890| Pour | Renvoyer | Le serveur reçoit |
3865| :- | :- | :- |3891| :- | :- | :- |
3868| Annuler la demande | `"action": "cancel"` | `cancel` |3894| Annuler la demande | `"action": "cancel"` | `cancel` |
3869| 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) |3895| 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) |
3870 3896
3871Cette 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 :3897Cette sortie répond à la demande en mode formulaire présentée dans [Entrée Elicitation](#elicitation-input). Les clés de `content` sont les noms de propriétés du `requested_schema` de cette demande :
3872 3898
3873```json theme={null}3899```json theme={null}
3874{3900{
3906Votre hook peut également refuser de ces façons. Le serveur reçoit le même `decline` que pour `"action": "decline"` :3932Votre hook peut également refuser de ces façons. Le serveur reçoit le même `decline` que pour `"action": "decline"` :
3907 3933
3908* **Se terminer avec le code 2** : Claude Code ignore un `hookSpecificOutput` affiché par le même hook3934* **Se terminer avec le code 2** : Claude Code ignore un `hookSpecificOutput` affiché par le même hook
3909* **Afficher un `"decision": "block"` de premier niveau** : le blocage remplace une `action` dans la même sortie3935* **Afficher un `"decision": "block"` de premier niveau** : le blocage l'emporte sur une `action` dans la même sortie
3910 3936
3911Lorsque 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.3937Lorsque 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.
3912 3938
3921 3947
3922Ni l'utilisateur ni le serveur ne voient pourquoi votre hook a refusé, car Claude Code n'affiche ni votre stderr ni votre `reason`.3948Ni l'utilisateur ni le serveur ne voient pourquoi votre hook a refusé, car Claude Code n'affiche ni votre stderr ni votre `reason`.
3923 3949
3924Claude 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.3950Claude Code ignorait un `decision` de premier niveau provenant des hooks `Elicitation` et `ElicitationResult` de la v2.1.105 jusqu'au correctif de la v2.1.284.
3925 3951
3926<h4 id="answer-a-form-request-from-a-script">3952<h4 id="answer-a-form-request-from-a-script">
3927 Répondre à une demande de formulaire depuis un script3953 Répondre à une demande de formulaire depuis un script
3928</h4>3954</h4>
3929 3955
3930Cet 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.3956Cet 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, de sorte que la boîte de dialogue apparaît.
3931 3957
3932<Tabs>3958<Tabs>
3933 <Tab title="macOS/Linux">3959 <Tab title="macOS/Linux">
3952 }3978 }
3953 ```3979 ```
3954 3980
3955 Enregistrez ce script dans `.claude/hooks/answer-project-key.sh` dans votre projet et rendez-le exécutable avec `chmod +x` :3981 Enregistrez ce script sous `.claude/hooks/answer-project-key.sh` dans votre projet et rendez-le exécutable avec `chmod +x` :
3956 3982
3957 ```bash theme={null}3983 ```bash theme={null}
3958 #!/bin/bash3984 #!/bin/bash
3993 }4019 }
3994 ```4020 ```
3995 4021
3996 Enregistrez ce script dans `.claude/hooks/answer-project-key.ps1` dans votre projet :4022 Enregistrez ce script sous `.claude/hooks/answer-project-key.ps1` dans votre projet :
3997 4023
3998 ```powershell theme={null}4024 ```powershell theme={null}
3999 $request = [Console]::In.ReadToEnd() | ConvertFrom-Json4025 $request = [Console]::In.ReadToEnd() | ConvertFrom-Json
4012 </Tab>4038 </Tab>
4013</Tabs>4039</Tabs>
4014 4040
4015Pour 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"}}`.4041Pour vérifier que le hook fonctionne, démarrez Claude Code avec `claude --debug` et confiez à 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"}}`.
4016 4042
4017<h3 id="elicitationresult">4043<h3 id="elicitationresult">
4018 ElicitationResult4044 ElicitationResult
4019</h3>4045</h3>
4020 4046
4021S'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.4047S'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 soit renvoyée au serveur MCP.
4022 4048
4023Lorsqu'un hook [Elicitation](#elicitation) répond à une demande, Claude Code envoie cette réponse au serveur sans exécuter les hooks ElicitationResult.4049Lorsqu'un hook [Elicitation](#elicitation) répond à une demande, Claude Code envoie cette réponse au serveur sans exécuter les hooks ElicitationResult.
4024 4050
4025Le champ matcher est comparé au nom du serveur MCP.4051Le champ matcher est comparé au nom du serveur MCP.
4026 4052
4027<h4 id="elicitationresult-input">4053<h4 id="elicitationresult-input">
4028 Entrée d'ElicitationResult4054 Entrée ElicitationResult
4029</h4>4055</h4>
4030 4056
4031En 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`.4057En 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`.
4032 4058
4033```json theme={null}4059```json theme={null}
4034{4060{
4044```4070```
4045 4071
4046<h4 id="elicitationresult-output">4072<h4 id="elicitationresult-output">
4047 Sortie d'ElicitationResult4073 Sortie ElicitationResult
4048</h4>4074</h4>
4049 4075
4050Un 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 :4076Un 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 le code 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 :
4051 4077
4052| Pour | Renvoyer | Le serveur reçoit |4078| Pour | Renvoyer | Le serveur reçoit |
4053| :- | :- | :- |4079| :- | :- | :- |
4056| Bloquer la réponse | `"action": "decline"` | `decline`, sans les valeurs de l'utilisateur |4082| Bloquer la réponse | `"action": "decline"` | `decline`, sans les valeurs de l'utilisateur |
4057| Annuler la demande | `"action": "cancel"` | `cancel`, accompagné des valeurs soumises par l'utilisateur. Pour les retenir, renvoyez `"decline"` |4083| Annuler la demande | `"action": "cancel"` | `cancel`, accompagné des valeurs soumises par l'utilisateur. Pour les retenir, renvoyez `"decline"` |
4058 4084
4059Cette 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` :4085Cette sortie modifie la réponse présentée dans [Entrée ElicitationResult](#elicitationresult-input), de sorte que le serveur reçoit `alice@example.com` là où l'utilisateur a soumis `alice` :
4060 4086
4061```json theme={null}4087```json theme={null}
4062{4088{
4070}4096}
4071```4097```
4072 4098
4073Votre `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`.4099Votre `content` remplace l'intégralité de l'objet `content` de l'utilisateur ; incluez donc les champs que vous ne modifiez pas. Renvoyez `action` avec lui, car Claude Code ignore un `hookSpecificOutput` dépourvu d'`action`.
4074 4100
4075Les 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 :4101Les 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 le cas contraire :
4076 4102
4077```bash theme={null}4103```bash theme={null}
4078#!/bin/bash4104#!/bin/bash
4351* **Seule sur stdout** : lorsque la réponse est le seul texte sur stdout, elle peut s'étendre sur plusieurs lignes, comme une sortie `jq` formatée (pretty-printed). L'extension sur plusieurs lignes nécessite Claude Code v2.1.295 ou ultérieur.4377* **Seule sur stdout** : lorsque la réponse est le seul texte sur stdout, elle peut s'étendre sur plusieurs lignes, comme une sortie `jq` formatée (pretty-printed). L'extension sur plusieurs lignes nécessite Claude Code v2.1.295 ou ultérieur.
4352* **Sur une ligne à part** : un hook asynchrone peut afficher d'autre texte sur stdout lorsque la réponse tient seule sur une ligne, par exemple avec `jq -c`.4378* **Sur une ligne à part** : un hook asynchrone peut afficher d'autre texte sur stdout lorsque la réponse tient seule sur une ligne, par exemple avec `jq -c`.
4353 4379
4354Claude Code valide que la réponse JSON respecte le même [schéma de sortie](#json-output) que les hooks synchrones, et supprime tout champ dont la valeur a le mauvais type, comme un `systemMessage` qui n'est pas une chaîne de caractères, au lieu de le livrer. Exécutez avec `--debug` pour voir un avertissement nommant chaque champ supprimé. Avant la v2.1.202, une sortie JSON malformée d'un hook asynchrone pouvait faire planter la session, et le plantage s'est reproduit chaque fois que la session a été reprise.4380Claude Code valide que la réponse JSON respecte le même [schéma de sortie](#json-output) que les hooks synchrones, et supprime tout champ dont la valeur a le mauvais type, comme un `systemMessage` qui n'est pas une chaîne de caractères, au lieu de le livrer. Exécutez avec `--debug` pour voir un avertissement nommant chaque champ supprimé.
4355 4381
4356Les notifications d'achèvement des hooks asynchrones sont supprimées par défaut. Pour les voir, activez le mode verbeux avec `Ctrl+O` ou démarrez Claude Code avec `--verbose`.4382Les notifications d'achèvement des hooks asynchrones sont supprimées par défaut. Pour les voir, activez le mode verbeux avec `Ctrl+O` ou démarrez Claude Code avec `--verbose`.
4357 4383