476| `async` | nein | Wenn `true`, wird im Hintergrund ohne Blockierung ausgeführt. Siehe [Hooks im Hintergrund ausführen](#run-hooks-in-the-background) |476| `async` | nein | Wenn `true`, wird im Hintergrund ohne Blockierung ausgeführt. Siehe [Hooks im Hintergrund ausführen](#run-hooks-in-the-background) |
477| `asyncRewake` | nein | Wenn `true`, wird im Hintergrund ausgeführt und weckt Claude bei Exit-Code 2 auf. Die stderr des Hooks oder stdout, wenn stderr leer ist, wird Claude als [Systemerinnerung](/docs/de/glossary#system-reminder) angezeigt, damit es auf einen langfristigen Hintergrund-Fehler reagieren kann |477| `asyncRewake` | nein | Wenn `true`, wird im Hintergrund ausgeführt und weckt Claude bei Exit-Code 2 auf. Die stderr des Hooks oder stdout, wenn stderr leer ist, wird Claude als [Systemerinnerung](/docs/de/glossary#system-reminder) angezeigt, damit es auf einen langfristigen Hintergrund-Fehler reagieren kann |
478| `shell` | nein | Shell, die für diesen Hook verwendet werden soll. Akzeptiert `"bash"` oder `"powershell"`. Standardmäßig `"bash"` oder `"powershell"` unter Windows, wenn Git Bash nicht installiert ist. Das Setzen von `"powershell"` führt den Befehl über PowerShell unter Windows aus. Erfordert nicht `CLAUDE_CODE_USE_POWERSHELL_TOOL`, da Hooks PowerShell direkt spawnen. Wird ignoriert, wenn `args` gesetzt ist |478| `shell` | nein | Shell, die für diesen Hook verwendet werden soll. Akzeptiert `"bash"` oder `"powershell"`. Standardmäßig `"bash"` oder `"powershell"` unter Windows, wenn Git Bash nicht installiert ist. Das Setzen von `"powershell"` führt den Befehl über PowerShell unter Windows aus. Erfordert nicht `CLAUDE_CODE_USE_POWERSHELL_TOOL`, da Hooks PowerShell direkt spawnen. Wird ignoriert, wenn `args` gesetzt ist |
479| `onFailure` | nein | Was mit der Aktion geschieht, wenn der Hook fehlschlägt: `"continue"`, der Standardwert, oder `"block"`. Siehe [Aktion blockieren, wenn ein Hook fehlschlägt](#block-the-action-when-a-hook-fails). Erfordert Claude Code v2.1.295 oder später |479| `onFailure` | nein | Ob die Aktion, die den Hook ausgelöst hat, fortgesetzt wird, wenn der Hook fehlschlägt: `"continue"` oder `"block"`. Siehe [Aktion blockieren, wenn ein Hook fehlschlägt](#block-the-action-when-a-hook-fails) für `"block"` und für den Fall, dass das Feld nicht gesetzt ist. Erfordert Claude Code v2.1.295 oder später |
480 480
481<a id="exec-form-and-shell-form" />481<a id="exec-form-and-shell-form" />
482 482
829 829
830* **Erfolg**: Ihr Hook wird mit 0 beendet. Claude Code wendet alle [JSON-Ausgabe](#json-output)-Felder an, die Ihr Hook ausgegeben hat, und die Aktion wird fortgesetzt, sofern diese Felder sie nicht blockieren oder verweigern. [Hooks, die einen Hintergrundprozess starten](#hooks-that-start-a-background-process) behandelt die Ausnahme.830* **Erfolg**: Ihr Hook wird mit 0 beendet. Claude Code wendet alle [JSON-Ausgabe](#json-output)-Felder an, die Ihr Hook ausgegeben hat, und die Aktion wird fortgesetzt, sofern diese Felder sie nicht blockieren oder verweigern. [Hooks, die einen Hintergrundprozess starten](#hooks-that-start-a-background-process) behandelt die Ausnahme.
831* **Blockierender Fehler**: Ihr Hook wird mit 2 beendet. Bei [Events, die blockieren können](#exit-code-2-behavior-per-event), stoppt Claude Code die Aktion.831* **Blockierender Fehler**: Ihr Hook wird mit 2 beendet. Bei [Events, die blockieren können](#exit-code-2-behavior-per-event), stoppt Claude Code die Aktion.
832* **Nicht blockierender Fehler**: Ihr Hook wird mit einem anderen Code beendet oder schlägt auf andere Weise fehl, etwa weil er nicht startet oder ungültiges JSON ausgibt. Die Aktion wird fortgesetzt, und bei Events wie `PreToolUse` sehen Sie einen `<hook name> hook error`-Hinweis im Transkript. Wenn ein fehlgeschlagener Hook die Aktion blockieren soll, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails).832* **Nicht blockierender Fehler**: Ihr Hook wird mit einem anderen Code beendet oder schlägt auf andere Weise fehl, etwa weil er nicht startet oder ungültiges JSON ausgibt. Die Aktion wird fortgesetzt, außer bei Hooks, [deren Fehlschlag die Aktion blockiert](#block-the-action-when-a-hook-fails), zum Beispiel einem Hook, bei dem `onFailure` auf `"block"` gesetzt ist. Bei Events wie `PreToolUse` sehen Sie einen `<hook name> hook error`-Hinweis im Transkript.
833 833
834Was Ihr Hook auf stdout ausgibt, kann das Ergebnis ändern. Wenn zum Beispiel ein `PreToolUse`-Hook mit 1 beendet wird, aber JSON ausgibt, das die Validierung besteht, ist der Lauf ein Erfolg, und die JSON-Felder entscheiden, was passiert. Um das Ergebnis Ihres Hooks bei einem Event wie `PreToolUse` zu ermitteln, suchen Sie in der ersten Spalte, was er auf stdout ausgegeben hat, und oben seinen Exit-Code:834Was Ihr Hook auf stdout ausgibt, kann das Ergebnis ändern. Wenn zum Beispiel ein `PreToolUse`-Hook mit 1 beendet wird, aber JSON ausgibt, das die Validierung besteht, kann dieses JSON trotzdem entscheiden, was passiert. Um das Ergebnis Ihres Hooks bei einem Event wie `PreToolUse` zu ermitteln, suchen Sie in der ersten Spalte, was er auf stdout ausgegeben hat, und oben seinen Exit-Code:
835 835
836| Stdout | Exit 0 | Exit 2 | Jeder andere Exit-Code |836| Stdout | Exit 0 | Exit 2 | Jeder andere Exit-Code |
837| :- | :- | :- | :- |837| :- | :- | :- | :- |
838| JSON-Objekt, das die [Schemavalidierung](#json-output) besteht | Erfolg. Die Felder werden angewendet | Blockierender Fehler. Claude Code liest die Felder trotzdem, aber sie können den Block nicht überschreiben | Erfolg. Claude Code ignoriert den Exit-Code, und allein die Felder entscheiden. Mit [`onFailure: "block"`](#block-the-action-when-a-hook-fails) zählt dies als Fehlschlag |838| JSON-Objekt, das die [Schemavalidierung](#json-output) besteht | Erfolg. Die Felder werden angewendet | Blockierender Fehler. Claude Code liest die Felder trotzdem, aber sie können den Block nicht überschreiben | Erfolg. Claude Code ignoriert den Exit-Code, und allein die Felder entscheiden. Bei Hooks, [deren Fehlschlag die Aktion blockiert](#block-the-action-when-a-hook-fails), zählt der Lauf stattdessen als Fehlschlag |
839| JSON, das [nicht geparst werden kann](#exit-code-0) oder die Schemavalidierung nicht besteht | Nicht blockierender Fehler. Der Hinweis enthält die Parse- oder Validierungsmeldung | Blockierender Fehler. Ihr stderr ist der Grund | Nicht blockierender Fehler. Der Hinweis enthält die Parse- oder Validierungsmeldung |839| JSON, das [nicht geparst werden kann](#exit-code-0) oder die Schemavalidierung nicht besteht | Nicht blockierender Fehler. Der Hinweis enthält die Parse- oder Validierungsmeldung | Blockierender Fehler. Ihr stderr ist der Grund | Nicht blockierender Fehler. Der Hinweis enthält die Parse- oder Validierungsmeldung |
840| [Einfacher Text](#exit-code-0) oder nichts | Erfolg | Blockierender Fehler. Ihr stderr ist der Grund | Nicht blockierender Fehler. Der Hinweis enthält die erste Zeile Ihres stderr |840| [Einfacher Text](#exit-code-0) oder nichts | Erfolg | Blockierender Fehler. Ihr stderr ist der Grund | Nicht blockierender Fehler. Der Hinweis enthält die erste Zeile Ihres stderr |
841 841
864* **Zwei oder mehr Zeilen, die jeweils für sich als JSON geparst werden, wobei die erste mit `{` beginnt und die letzte mit `}` endet**: einfacher Text, wenn keine Zeile ein JSON-Ausgabe-Objekt ist, das ein Feld setzt, und ein Parse-Fehler, wenn eine Zeile es ist.864* **Zwei oder mehr Zeilen, die jeweils für sich als JSON geparst werden, wobei die erste mit `{` beginnt und die letzte mit `}` endet**: einfacher Text, wenn keine Zeile ein JSON-Ausgabe-Objekt ist, das ein Feld setzt, und ein Parse-Fehler, wenn eine Zeile es ist.
865* **Alles andere, das mit `{` beginnt und mit `}` endet, aber kein gültiges JSON ist**: ein Parse-Fehler.865* **Alles andere, das mit `{` beginnt und mit `}` endet, aber kein gültiges JSON ist**: ein Parse-Fehler.
866 866
867Wenn Claude Code versucht, Ihren stdout als JSON zu parsen, und dies fehlschlägt, oder das geparste Objekt die [Schemavalidierung](#json-output) nicht besteht, ist der Lauf ein [nicht blockierender Fehler](#exit-code-output). Der `<hook name> hook error`-Hinweis enthält die Parse- oder Validierungsmeldung. Bei den Events, die einfachen Text-stdout als Kontext hinzufügen, fügt Claude Code stdout, den es nicht parsen konnte, nicht hinzu.867Sofern es sich nicht um einen Hook handelt, [dessen Fehlschlag die Aktion blockiert](#block-the-action-when-a-hook-fails), ist ein Parse-Fehler oder ein geparstes Objekt, das die [Schemavalidierung](#json-output) nicht besteht, ein [nicht blockierender Fehler](#exit-code-output). Der `<hook name> hook error`-Hinweis enthält die Parse- oder Validierungsmeldung. Bei den Events, die einfachen Text-stdout als Kontext hinzufügen, fügt Claude Code stdout, den es nicht parsen konnte, nicht hinzu.
868 868
869Claude sieht stderr von einem Hook, der mit 0 beendet wird, nie. Um ihn bei Events wie `PreToolUse` selbst zu lesen, aktivieren Sie [Debug-Logging](#debug-hooks). Um eine Warnung an Claude von einem `PostToolUse`- oder `PostToolUseFailure`-Hook zu übermitteln, beenden Sie stattdessen mit 2, damit [Claude den stderr sieht](#exit-code-2-behavior-per-event), obwohl das Tool bereits ausgeführt wurde.869Claude sieht stderr von einem Hook, der mit 0 beendet wird, nie. Um ihn bei Events wie `PreToolUse` selbst zu lesen, aktivieren Sie [Debug-Logging](#debug-hooks). Um eine Warnung an Claude von einem `PostToolUse`- oder `PostToolUseFailure`-Hook zu übermitteln, beenden Sie stattdessen mit 2, damit [Claude den stderr sieht](#exit-code-2-behavior-per-event), obwohl das Tool bereits ausgeführt wurde.
870 870
907 Andere Exit-Codes907 Andere Exit-Codes
908</h4>908</h4>
909 909
910Wenn Ihr Hook mit einem anderen Code als 0 oder 2 beendet wird und einfachen Text oder nichts auf stdout ausgibt, ist der Lauf ein [nicht blockierender Fehler](#exit-code-output). Sie sehen im Transkript einen `<hook name> hook error`-Hinweis mit `Failed with non-blocking status code:` und der ersten Zeile des stderr Ihres Hooks. Wenn zum Beispiel ein `PreToolUse`-Hook für `Bash` `something broke` auf stderr ausgibt und mit 1 beendet wird, enthält der `PreToolUse:Bash hook error`-Hinweis diese Zeile:910Sofern es sich nicht um einen Hook handelt, [dessen Fehlschlag die Aktion blockiert](#block-the-action-when-a-hook-fails), ist ein Exit-Code außer 0 oder 2 mit einfachem Text oder nichts auf stdout ein [nicht blockierender Fehler](#exit-code-output). Wenn die Aktion fortgesetzt wird, sehen Sie im Transkript einen `<hook name> hook error`-Hinweis mit `Failed with non-blocking status code:` und der ersten Zeile des stderr Ihres Hooks.
911
912Wenn zum Beispiel ein `PreToolUse`-Hook für `Bash` `something broke` auf stderr ausgibt und mit 1 beendet wird, enthält der `PreToolUse:Bash hook error`-Hinweis diese Zeile:
911 913
912```text theme={null}914```text theme={null}
913Failed with non-blocking status code: something broke915Failed with non-blocking status code: something broke
915 917
916Um den vollständigen stderr statt nur seiner ersten Zeile zu erfassen, aktivieren Sie [Debug-Logging](#debug-hooks).918Um den vollständigen stderr statt nur seiner ersten Zeile zu erfassen, aktivieren Sie [Debug-Logging](#debug-hooks).
917 919
918Ein Hook, der nicht starten kann, ist ebenfalls ein nicht blockierender Fehler. In Shell-Form beendet sich die Shell, wenn der Skriptpfad nicht existiert oder nicht ausführbar ist, mit einem Code wie 127, und der Hinweis enthält die Meldung des Interpreters, zum Beispiel `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`. Wenn Sie einen Policy-Hook einrichten, achten Sie bei seiner ersten Ausführung auf diesen Hinweis, denn ein falsch geschriebener Pfad in `settings.json` bedeutet, dass der Hook nie ausgeführt wird. Um die Aktion stattdessen zu blockieren, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails).920Sofern es sich nicht um einen Hook handelt, [dessen Fehlschlag die Aktion blockiert](#block-the-action-when-a-hook-fails), ist ein Hook, der nicht starten kann, ebenfalls ein nicht blockierender Fehler. In Shell-Form beendet sich die Shell, wenn der Skriptpfad nicht existiert oder nicht ausführbar ist, mit einem Code wie 127, und der Hinweis enthält die Meldung des Interpreters. Wenn der Skriptpfad zum Beispiel nicht existiert, enthält der Hinweis eine Zeile wie diese:
921
922```text theme={null}
923Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory
924```
925
926Wenn Sie einen Policy-Hook einrichten, achten Sie bei seiner ersten Ausführung auf diesen Hinweis, denn ein falsch geschriebener Pfad in `settings.json` bedeutet, dass der Hook nie ausgeführt wird. Um die Aktion zu blockieren, wenn der Hook nicht starten kann, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails).
919 927
920<Warning>928<Warning>
921 Ohne gültiges JSON auf stdout behandelt Claude Code Exit-Code 1 als nicht blockierenden Fehler, obwohl 1 der konventionelle Unix-Fehlercode ist. Wenn Ihr Hook eine Richtlinie durchsetzen soll, verwenden Sie `exit 2`.929 Exit-Code 1 ohne gültige JSON-Ausgabe ist ein nicht blockierender Fehler, sofern es sich nicht um einen Hook handelt, [dessen Fehlschlag die Aktion blockiert](#block-the-action-when-a-hook-fails), obwohl 1 der konventionelle Unix-Fehlercode ist. Wenn Ihr Hook eine Richtlinie durchsetzen soll, verwenden Sie `exit 2`.
922</Warning>930</Warning>
923 931
924<h4 id="timeouts">932<h4 id="timeouts">
929 937
930Bei [`PreModelSwitch`](#premodelswitch) blockiert ein Hook, der bei seinem Timeout abgebrochen wird, den Modellwechsel. Bei `PreToolUse` unterscheiden sich die beiden Hook-Familien:938Bei [`PreModelSwitch`](#premodelswitch) blockiert ein Hook, der bei seinem Timeout abgebrochen wird, den Modellwechsel. Bei `PreToolUse` unterscheiden sich die beiden Hook-Familien:
931 939
932* Ein abgelaufener `command`-, `http`- oder `mcp_tool`-Hook blockiert den Tool-Aufruf nicht. Der Aufruf wird durch den normalen [Berechtigungsfluss](/docs/de/permissions) fortgesetzt, verlassen Sie sich also nicht auf einen steckengebliebenen Hook, um als Gate zu fungieren. Um den Aufruf zu blockieren, wenn ein `command`- oder `http`-Hook in ein Timeout läuft, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails).940* Ein abgelaufener `command`-, `http`- oder `mcp_tool`-Hook blockiert den Tool-Aufruf nicht, außer bei Hooks, [deren Fehlschlag die Aktion blockiert](#block-the-action-when-a-hook-fails). Der Aufruf wird durch den normalen [Berechtigungsfluss](/docs/de/permissions) fortgesetzt, verlassen Sie sich also nicht auf einen steckengebliebenen Hook, um als Gate zu fungieren. Um den Aufruf zu blockieren, wenn ein `command`- oder `http`-Hook in ein Timeout läuft, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails).
933* Ein [Agent SDK Callback Hook](/docs/de/agent-sdk/hooks), der sein Timeout überschreitet, [blockiert den Tool-Aufruf](#pretooluse).941* Ein [Agent SDK Callback Hook](/docs/de/agent-sdk/hooks), der sein Timeout überschreitet, [blockiert den Tool-Aufruf](#pretooluse).
934 942
935<h4 id="hooks-that-start-a-background-process">943<h4 id="hooks-that-start-a-background-process">
959 Die Aktion blockieren, wenn ein Hook fehlschlägt967 Die Aktion blockieren, wenn ein Hook fehlschlägt
960</h4>968</h4>
961 969
962Bei den meisten Events führt Claude Code die Aktion trotzdem aus, wenn ein Hook fehlschlägt oder in ein Timeout läuft, sodass ein Policy-Hook mit falschem Pfad oder einem abstürzenden Skript alles durchlässt. Um die Aktion stattdessen zu blockieren, setzen Sie `"onFailure": "block"` bei einem `command`- oder `http`-Hook. Der Standardwert ist `"continue"`. Erfordert Claude Code v2.1.295 oder später.970Bei den meisten Events führt Claude Code die Aktion trotzdem aus, wenn ein Hook fehlschlägt oder in ein Timeout läuft. Ein Policy-Hook mit falschem Pfad oder einem abstürzenden Skript lässt dann alles durch. Um die Aktion stattdessen zu blockieren, setzen Sie `"onFailure": "block"` bei einem `command`- oder `http`-Hook. Erfordert Claude Code v2.1.295 oder später.
971
972<Note>
973 Unter Windows ohne Git Bash kann ein `PreToolUse`- oder `PermissionRequest`-Command-Hook in Shell-Form, der ohne gesetztes `onFailure` fehlschlägt, stattdessen [den Tool-Aufruf blockieren](#failed-hooks-on-windows-without-git-bash).
974</Note>
963 975
964Dieser `PreToolUse`-Hook in `.claude/settings.json` führt vor jedem Bash-Befehl ein Projektskript aus und blockiert den Befehl, wenn das Skript fehlschlägt:976Dieser `PreToolUse`-Hook in `.claude/settings.json` führt vor jedem Bash-Befehl ein Projektskript aus und blockiert den Befehl, wenn das Skript fehlschlägt:
965 977
1007* **`Stop`-, `SubagentStop`-, `TaskCompleted`- und `TeammateIdle`-Hooks**: Exit-Code 2 schickt Claude bei diesen Events zurück an die Arbeit, und Claude kann einen Hook, der nicht läuft, nicht reparieren1019* **`Stop`-, `SubagentStop`-, `TaskCompleted`- und `TeammateIdle`-Hooks**: Exit-Code 2 schickt Claude bei diesen Events zurück an die Arbeit, und Claude kann einen Hook, der nicht läuft, nicht reparieren
1008* **Hintergrund-Command-Hooks**: Command Hooks, die [`async` oder `asyncRewake`](#run-hooks-in-the-background) setzen1020* **Hintergrund-Command-Hooks**: Command Hooks, die [`async` oder `asyncRewake`](#run-hooks-in-the-background) setzen
1009 1021
1022<h4 id="failed-hooks-on-windows-without-git-bash">
1023 Fehlgeschlagene Hooks unter Windows ohne Git Bash
1024</h4>
1025
1026Wenn der Fehler bei einem blockierten Tool-Aufruf diesen Text enthält, ist ein `PreToolUse`- oder `PermissionRequest`-Command-Hook fehlgeschlagen oder in ein Timeout gelaufen und hat den Aufruf blockiert:
1027
1028```text theme={null}
1029blocking because Git Bash wasn't found and this hook doesn't set "shell" to "powershell", so only exit code 0 or 2 counts as its verdict.
1030```
1031
1032Ein Hook in Shell-Form ohne gesetztes `shell` wird in PowerShell ausgeführt, wenn Git Bash nicht installiert ist, und ein für Bash geschriebenes Skript läuft dort möglicherweise nicht unverändert. Wählen Sie die Lösung, die zu Ihrem Hook passt:
1033
1034* **Der Hook ist für Bash geschrieben**: Installieren Sie [Git for Windows](https://git-scm.com/downloads/win) oder setzen Sie [`CLAUDE_CODE_GIT_BASH_PATH`](/docs/de/env-vars), wenn Git Bash an einem Ort installiert ist, an dem Claude Code es nicht findet, und starten Sie dann eine neue Sitzung
1035* **Der Hook führt eine einzelne `.exe` aus, keine `.cmd`- oder `.bat`-Datei**: Tragen Sie das Programm in `command` und seine Argumente in `args` ein, um die [Exec-Form](#exec-form-and-shell-form) zu verwenden, und fügen Sie [`"onFailure": "block"`](#block-the-action-when-a-hook-fails) hinzu. Claude Code startet das Programm dann ohne Shell. Ohne `"onFailure": "block"` kann der Aufruf fortgesetzt werden, wenn das Programm fehlschlägt, fehlt oder in ein Timeout läuft
1036* **Der Hook ist für PowerShell geschrieben**: Fügen Sie dem Hook `"shell": "powershell"` und [`"onFailure": "block"`](#block-the-action-when-a-hook-fails) hinzu. Ohne `"onFailure": "block"` kann der Aufruf fortgesetzt werden, wenn der Hook weiterhin fehlschlägt oder in ein Timeout läuft. Um herauszufinden, warum der Hook fehlgeschlagen ist, prüfen Sie das [Debug-Log](#debug-hooks)
1037* **Die Aktion soll fortgesetzt werden, wenn der Hook fehlschlägt**: Fügen Sie dem Hook `"onFailure": "continue"` hinzu
1038
1039Bei einem Hook, der diesen Fehler anzeigt, zählt jeder Exit-Code außer 0 oder 2 als [Fehlschlag](#block-the-action-when-a-hook-fails), auch wenn der Hook JSON ausgibt, das den Aufruf nicht verweigert.
1040
1010<h4 id="exit-code-2-behavior-per-event">1041<h4 id="exit-code-2-behavior-per-event">
1011 Exit-Code-2-Verhalten pro Event1042 Exit-Code-2-Verhalten pro Event
1012</h4>1043</h4>
1060* **2xx mit leerem Body**: Erfolg, äquivalent zu Exit-Code 0 ohne Ausgabe1091* **2xx mit leerem Body**: Erfolg, äquivalent zu Exit-Code 0 ohne Ausgabe
1061* **2xx mit JSON-Objekt-Body**: geparst mit dem gleichen [JSON-Ausgabe](#json-output)-Schema wie Command Hooks. Ein Body, der die Schema-Validierung nicht besteht, ist ein nicht blockierender Fehler1092* **2xx mit JSON-Objekt-Body**: geparst mit dem gleichen [JSON-Ausgabe](#json-output)-Schema wie Command Hooks. Ein Body, der die Schema-Validierung nicht besteht, ist ein nicht blockierender Fehler
1062* **2xx mit jedem anderen Body, wie einfacher Text**: nicht blockierender Fehler, behandelt wie ein Nicht-2xx-Status. Claude Code fügt den Text nicht zu Claudes Kontext hinzu1093* **2xx mit jedem anderen Body, wie einfacher Text**: nicht blockierender Fehler, behandelt wie ein Nicht-2xx-Status. Claude Code fügt den Text nicht zu Claudes Kontext hinzu
1063* **Nicht-2xx-Status**: nicht blockierender Fehler, Ausführung wird fortgesetzt1094* **Nicht-2xx-Status**: nicht blockierender Fehler
1064* **Verbindungsfehler**: nicht blockierender Fehler, Ausführung wird fortgesetzt1095* **Verbindungsfehler**: nicht blockierender Fehler
1065* **Timeout**: der Hook wird abgebrochen, wie unter [Timeouts](#timeouts) beschrieben1096* **Timeout**: der Hook wird abgebrochen, wie unter [Timeouts](#timeouts) beschrieben
1066 1097
1067HTTP Hooks können einen blockierenden Fehler nicht allein über den Statuscode signalisieren: Ein Nicht-2xx-Status oder eine fehlgeschlagene Verbindung ist ein [nicht blockierender Fehler](#exit-code-output). Um einen Tool-Aufruf zu blockieren oder eine Berechtigung zu verweigern, geben Sie eine 2xx-Response mit einem JSON-Body zurück, der die entsprechenden Entscheidungsfelder enthält. Um die Aktion zu blockieren, wenn die Anfrage fehlschlägt oder einen Nicht-2xx-Status zurückgibt, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails).1098Nach einem [nicht blockierenden Fehler](#exit-code-output) wird die Aktion fortgesetzt, sofern es sich nicht um einen Hook handelt, [dessen Fehlschlag die Aktion blockiert](#block-the-action-when-a-hook-fails). Um einen Tool-Aufruf zu blockieren oder eine Berechtigung zu verweigern, geben Sie eine 2xx-Antwort mit einem JSON-Body zurück, der die entsprechenden [Entscheidungsfelder](#decision-control) enthält. Um die Aktion zu blockieren, wenn die Anfrage fehlschlägt oder einen Nicht-2xx-Status zurückgibt, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails).
1068 1099
1069<h3 id="json-output">1100<h3 id="json-output">
1070 JSON-Ausgabe1101 JSON-Ausgabe
1573}1604}
1574```1605```
1575 1606
1607Wenn der Prompt ein [Skill](/docs/de/skills) oder ein benutzerdefinierter Befehl ist, den Sie eingegeben haben, etwa `/deploy staging`, erhält der Hook diese Zeile so, wie Sie sie eingegeben haben, und nicht den erweiterten Skill-Inhalt. Wenn der Hook den Prompt blockiert, wird der Befehl nicht ausgeführt, sodass auch Shell-Befehle, die der Skill [mit `` !`<command>` `` einfügt](/docs/de/skills#inject-dynamic-context), nicht ausgeführt werden. Um stattdessen auf den Namen oder die Argumente des Befehls abzugleichen, verwenden Sie [UserPromptExpansion](#userpromptexpansion).
1608
1576<h4 id="userpromptsubmit-decision-control">1609<h4 id="userpromptsubmit-decision-control">
1577 UserPromptSubmit-Entscheidungssteuerung1610 UserPromptSubmit-Entscheidungssteuerung
1578</h4>1611</h4>
2076 2109
2077| Feld | Beschreibung |2110| Feld | Beschreibung |
2078| :- | :- |2111| :- | :- |
2079| `permissionDecision` | `"allow"` überspringt die Berechtigungsabfrage, außer bei den [Aktionen, die kein Modus automatisch genehmigt](/docs/de/permission-modes#actions-no-mode-auto-approves), bei [Lesezugriffen auf Netzwerkpfade](/docs/de/permissions#network-paths) sowie bei `AskUserQuestion` und `ExitPlanMode`, die [zusätzlich `updatedInput` benötigen](#allow-with-updatedinput). `"deny"` verhindert den Tool-Aufruf. `"ask"` bittet den Benutzer um Bestätigung. `"defer"` beendet den Lauf geordnet, damit das Tool später fortgesetzt werden kann. [deny- und ask-Regeln](/docs/de/permissions#manage-permissions) werden unabhängig davon ausgewertet, was der Hook zurückgibt |2112| `permissionDecision` | `"allow"` überspringt die Berechtigungsabfrage, außer bei [Aktionen, die kein Modus automatisch genehmigt](/docs/de/permission-modes#actions-no-mode-auto-approves), und bei [Lesezugriffen auf Netzwerkpfade](/docs/de/permissions#network-paths). `AskUserQuestion` und `ExitPlanMode` benötigen [`updatedInput` zusammen mit `"allow"`](#allow-with-updatedinput). Für den Plan-Modus siehe [Hook-Genehmigungen im Plan-Modus](/docs/de/permissions#hook-approvals-in-plan-mode). `"deny"` verhindert den Tool-Aufruf. `"ask"` fordert den Benutzer zur Bestätigung auf. `"defer"` beendet sich ordnungsgemäß, sodass das Tool später fortgesetzt werden kann. [deny- und ask-Regeln](/docs/de/permissions#manage-permissions) werden unabhängig davon ausgewertet, was der Hook zurückgibt |
2080| `permissionDecisionReason` | Bei `"ask"` wird es dem Benutzer in der Berechtigungsabfrage angezeigt. Wenn Claude Code in einem `-p`-Lauf, in dem niemand die Abfrage beantworten kann, [den Aufruf ablehnt](/docs/de/headless#turn-off-permission-prompts-in-unattended-runs), liest Claude den Grund stattdessen im Tool-Ergebnis. Bei `"deny"` wird es Claude angezeigt. Bei `"allow"` und `"defer"` wird es nur in das [Debug-Log](#debug-hooks) geschrieben |2113| `permissionDecisionReason` | Bei `"ask"` wird es dem Benutzer in der Berechtigungsabfrage angezeigt. Wenn Claude Code in einem `-p`-Lauf, in dem niemand die Abfrage beantworten kann, [den Aufruf ablehnt](/docs/de/headless#turn-off-permission-prompts-in-unattended-runs), liest Claude den Grund stattdessen im Tool-Ergebnis. Bei `"deny"` wird es Claude angezeigt. Bei `"allow"` und `"defer"` wird es nur in das [Debug-Log](#debug-hooks) geschrieben |
2081| `updatedInput` | Ändert die Eingabeparameter des Tools vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, fügen Sie daher unveränderte Felder zusammen mit den geänderten ein. Claude Code wertet Berechtigungsregeln und die [Eignung eines Bash-Befehls für den automatischen Wechsel in den Hintergrund](/docs/de/tools-reference#foreground-commands-that-move-to-the-background) anhand der Eingabe aus, die Ihr Hook zurückgibt, nicht anhand der Eingabe, die Claude gesendet hat. Kombinieren Sie es mit `"allow"` für eine automatische Genehmigung oder mit `"ask"`, um dem Benutzer die geänderte Eingabe anzuzeigen. Bei `"defer"` wird es ignoriert |2114| `updatedInput` | Ändert die Eingabeparameter des Tools vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, fügen Sie daher unveränderte Felder zusammen mit den geänderten ein. Claude Code wertet Berechtigungsregeln und die [Eignung eines Bash-Befehls für den automatischen Wechsel in den Hintergrund](/docs/de/tools-reference#foreground-commands-that-move-to-the-background) anhand der Eingabe aus, die Ihr Hook zurückgibt, nicht anhand der Eingabe, die Claude gesendet hat. Kombinieren Sie es mit `"allow"` für eine automatische Genehmigung oder mit `"ask"`, um dem Benutzer die geänderte Eingabe anzuzeigen. Bei `"defer"` wird es ignoriert |
2082| `additionalContext` | String, der zusammen mit dem Tool-Ergebnis zum Kontext von Claude hinzugefügt wird. Wird ignoriert, wenn `permissionDecision` den Wert `"defer"` hat. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |2115| `additionalContext` | String, der zusammen mit dem Tool-Ergebnis zum Kontext von Claude hinzugefügt wird. Wird ignoriert, wenn `permissionDecision` den Wert `"defer"` hat. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
3718 3751
3719Claude Code zeigt dem Benutzer jede `systemMessage`, die Ihr Hook zurückgibt, unabhängig von der Entscheidung an. Ein Hook, der Kosten meldet, kann also `{"systemMessage": "..."}` zurückgeben und mit 0 beendet werden.3752Claude Code zeigt dem Benutzer jede `systemMessage`, die Ihr Hook zurückgibt, unabhängig von der Entscheidung an. Ein Hook, der Kosten meldet, kann also `{"systemMessage": "..."}` zurückgeben und mit 0 beendet werden.
3720 3753
3721Ein PreModelSwitch-Hook, der nicht vor Ablauf seines Timeouts antwortet, blockiert den Wechsel. Was ein Timeout bei anderen Ereignissen bewirkt, lesen Sie unter [Timeouts](#timeouts). Der Standard-Timeout für dieses Ereignis beträgt 30 Sekunden. `PreModelSwitch` führt nur `command`-, `http`- und `mcp_tool`-Hooks aus, daher gelten die Standardwerte für `prompt` und `agent` nicht.3754<h4 id="premodelswitch-timeouts-and-other-exit-codes">
3755 PreModelSwitch-Timeouts und andere Exit-Codes
3756</h4>
3757
3758Ein PreModelSwitch-Hook, der nicht vor Ablauf seines Timeouts antwortet, blockiert den Wechsel. Der Standard-Timeout für dieses Ereignis beträgt 30 Sekunden.
3722 3759
3723Ein Hook, der mit einem anderen Code als 0 oder 2 beendet wird und keine JSON-Entscheidung ausgibt, ist ein nicht blockierender Fehler, wie unter [Andere Exit-Codes](#other-exit-codes) beschrieben.3760Was ein anderer Exit-Code als 0 oder 2 bewirkt, erfahren Sie unter [Andere Exit-Codes](#other-exit-codes).
3724 3761
3725<h3 id="postmodelswitch">3762<h3 id="postmodelswitch">
3726 PostModelSwitch3763 PostModelSwitch