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 480
480<a id="exec-form-and-shell-form" />481<a id="exec-form-and-shell-form" />
481 482
533| `url` | ja | URL zum Senden der POST-Anfrage an |534| `url` | ja | URL zum Senden der POST-Anfrage an |
534| `headers` | nein | Zusätzliche HTTP-Header als Schlüssel-Wert-Paare. Werte unterstützen Umgebungsvariablen-Interpolation mit `$VAR_NAME` oder `${VAR_NAME}`-Syntax. Nur Variablen in `allowedEnvVars` werden aufgelöst |535| `headers` | nein | Zusätzliche HTTP-Header als Schlüssel-Wert-Paare. Werte unterstützen Umgebungsvariablen-Interpolation mit `$VAR_NAME` oder `${VAR_NAME}`-Syntax. Nur Variablen in `allowedEnvVars` werden aufgelöst |
535| `allowedEnvVars` | nein | Liste von Umgebungsvariablennamen, die in Header-Werte interpoliert werden dürfen. Verweise auf nicht aufgelistete Variablen werden durch leere Zeichenketten ersetzt. Erforderlich für jede Umgebungsvariablen-Interpolation |536| `allowedEnvVars` | nein | Liste von Umgebungsvariablennamen, die in Header-Werte interpoliert werden dürfen. Verweise auf nicht aufgelistete Variablen werden durch leere Zeichenketten ersetzt. Erforderlich für jede Umgebungsvariablen-Interpolation |
537| `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 |
536 538
537Claude Code sendet die [JSON-Eingabe](#hook-input-and-output) des Hooks als POST-Anfragekörper mit `Content-Type: application/json`. Der Antwortkörper verwendet das gleiche [JSON-Ausgabeformat](#json-output) wie Command-Hooks.539Claude Code sendet die [JSON-Eingabe](#hook-input-and-output) des Hooks als POST-Anfragekörper mit `Content-Type: application/json`. Der Antwortkörper verwendet das gleiche [JSON-Ausgabeformat](#json-output) wie Command-Hooks.
538 540
821 Exit-Code-Ausgabe823 Exit-Code-Ausgabe
822</h3>824</h3>
823 825
824Der Exit-Code aus Ihrem Hook-Befehl teilt Claude Code mit, ob die Aktion fortgesetzt, blockiert oder ignoriert werden soll. Der Exit-Code wirkt nicht allein. Claude Code liest [JSON-Ausgabefelder](#json-output) von stdout bei jedem Exit-Code, nicht nur 0, und für Events, die das Standard-Entscheidungsmodell verwenden, wirkt ein gepartes Objekt, das die Schema-Validierung besteht, neben dem Code. Exit 2's Block ist das einzige Ergebnis, das JSON nicht überschreiben kann.826Der Exit-Code Ihres Hooks teilt Claude Code mit, ob die Aktion, die den Hook ausgelöst hat, etwa ein Tool-Aufruf oder ein Prompt, fortgesetzt werden soll. Ein abgeschlossener Lauf hat eines von drei Ergebnissen:
825 827
826Zwei Tabellen besitzen die Event-spezifischen Ausnahmen: [Exit-Code-2-Verhalten pro Event](#exit-code-2-behavior-per-event) sagt, was Exit-Codes für jeden Event tun, und [Entscheidungskontrolle](#decision-control) sagt, welche Entscheidungsfelder jeder Event berücksichtigt. Universelle Felder wie `systemMessage` funktionieren über die meisten Events hinweg und sind in der [JSON-Ausgabe](#json-output)-Tabelle aufgelistet.828* **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.
829* **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.
830* **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).
831
832Was 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:
833
834| Stdout | Exit 0 | Exit 2 | Jeder andere Exit-Code |
835| :- | :- | :- | :- |
836| 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 |
837| 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 |
838| [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 |
839
840Einige Events haben eigene Regeln:
841
842* **`WorktreeCreate`**: Jeder Exit-Code ungleich null lässt die Worktree-Erstellung fehlschlagen, unabhängig davon, was Ihr JSON sagt.
843* **`WorktreeRemove`**: Jeder Exit-Code ungleich null lässt die Worktree-Entfernung fehlschlagen, wenn das Verzeichnis danach noch existiert.
844* **`Stop`, `SubagentStop`, `TaskCompleted` und der `UserPromptSubmit`-Hook eines Plugins**: Wenn Ihr Hook mit 2 beendet wird, nichts auf stdout ausgibt und sein stderr meldet, dass eine Datei fehlt, etwa `No such file or directory`, behandelt Claude Code den Lauf als nicht blockierenden Fehler.
845* **`Elicitation` und `ElicitationResult`**: Claude Code wendet Ihre `hookSpecificOutput` an, wenn Ihr Hook mit 0 beendet wird, und ignoriert sie bei jedem anderen Exit-Code.
846* **Events, die Hook-Ausgabe verwerfen, wie `StopFailure`**: Claude Code ignoriert Ihr JSON bei jedem Exit-Code, abgesehen von Nebeneffekt-Feldern wie `terminalSequence`, die trotzdem ausgelöst werden.
847
848Was Exit-Code 2 bei Ihrem Event bewirkt, sehen Sie unter [Exit-Code-2-Verhalten pro Event](#exit-code-2-behavior-per-event). Welche Entscheidungsfelder es berücksichtigt, sehen Sie unter [Entscheidungskontrolle](#decision-control).
827 849
828<h4 id="exit-code-0">850<h4 id="exit-code-0">
829 Exit-Code 0851 Exit-Code 0
835 857
836Ob Claude Code Ihren stdout als [JSON-Ausgabe](#json-output) oder als einfachen Text liest, hängt davon ab, wie er beginnt und endet, wobei umgebender Whitespace ignoriert wird:858Ob Claude Code Ihren stdout als [JSON-Ausgabe](#json-output) oder als einfachen Text liest, hängt davon ab, wie er beginnt und endet, wobei umgebender Whitespace ignoriert wird:
837 859
838* **Beginnt mit `{` und endet mit `}`**: Claude Code parst es als JSON. Wenn die Ausgabe zwei oder mehr Zeilen sind, die jeweils selbst als JSON geparst werden, und keine Zeile ein [JSON-Ausgabe](#json-output)-Objekt ist, das ein Feld setzt, behandelt Claude Code die gesamte Ausgabe als einfachen Text. Wenn eine dieser Zeilen ein Feld setzt, ist die gesamte Ausgabe ein Parse-Fehler, der unten beschrieben wird.860* **Beginnt mit `{` und endet mit `}`**: Claude Code parst es als JSON. Wenn die Ausgabe zwei oder mehr Zeilen sind, die jeweils selbst als JSON geparst werden, und keine Zeile ein [JSON-Ausgabe](#json-output)-Objekt ist, das ein Feld setzt, behandelt Claude Code die gesamte Ausgabe als einfachen Text. Wenn eine dieser Zeilen ein Feld setzt, ist die gesamte Ausgabe ein Parse-Fehler.
839* **Beginnt mit `{` aber endet nicht mit `}`**: Claude Code behandelt es als einfachen Text.861* **Beginnt mit `{` aber endet nicht mit `}`**: Claude Code behandelt es als einfachen Text.
840* **Beginnt mit etwas anderem**: Claude Code behandelt es als einfachen Text, ein JSON-Array oder einen zitierten JSON-String enthalten.862* **Beginnt mit etwas anderem**: Claude Code behandelt es als einfachen Text, ein JSON-Array oder einen zitierten JSON-String enthalten.
841 863
842Für Events, die das Standard-Entscheidungsmodell verwenden, ist Exit 0 mit einem geparsten Objekt, das die Schema-Validierung nicht besteht, ein nicht blockierender Fehler: die Aktion wird fortgesetzt, und das Transkript zeigt einen `<Hook-Name> hook error`-Hinweis mit der Validierungsmeldung. Das gleiche passiert bei jedem Exit-Code außer 2, während [Exit 2 immer noch blockiert](#exit-code-2).864Wenn 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.
843
844Für Events, die das Standard-Entscheidungsmodell verwenden, wenn Claude Code versucht, Ihren stdout als JSON zu parsen und kann nicht, meldet es einen nicht blockierenden Fehler bei jedem Exit-Code außer 2. Das Transkript zeigt einen `<Hook-Name> hook error`-Hinweis mit der Parse-Meldung. Bei den Events, die einfachen Text-stdout als Kontext hinzufügen, fügt Claude Code den Text nicht hinzu. Vor v2.1.248 behandelte Claude Code diesen stdout als einfachen Text.
845 865
846Stderr von einem Hook, der mit 0 beendet wird, geht nur in das Debug-Protokoll, nie in das Transkript, und Claude sieht es nie. Um es selbst zu lesen, aktivieren Sie [Debug-Protokollierung](#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.866Claude 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.
847 867
848<h4 id="exit-code-2">868<h4 id="exit-code-2">
849 Exit-Code 2869 Exit-Code 2
850</h4>870</h4>
851 871
852Exit 2 bedeutet einen blockierenden Fehler. Bei [Events, die blockieren können](#exit-code-2-behavior-per-event), blockiert Exit 2, unabhängig davon, ob Sie JSON drucken oder nicht: selbst ein JSON `permissionDecision` von `"allow"` kann es nicht überschreiben. Claude Code liest immer noch alle gültigen [JSON-Ausgabe](#json-output) auf stdout. Bei `Elicitation` und `ElicitationResult` wird die `hookSpecificOutput` eines Exit-2-Hooks ignoriert.872Beenden Sie mit Code 2, um die Aktion zu blockieren. Bei [Events, die blockieren können](#exit-code-2-behavior-per-event), stoppt Claude Code die Aktion: Ein `PreToolUse`-Hook blockiert zum Beispiel den Tool-Aufruf, und ein `UserPromptSubmit`-Hook lehnt den Prompt ab.
853 873
854Die Blockierungsmeldung ist der Grund aus der Blockierungsentscheidung Ihres JSON, wenn es eine gibt, und Ihr stderr-Text andernfalls. Was der Block tut, variiert je nach Event: `PreToolUse` blockiert den Tool-Aufruf, `UserPromptSubmit` lehnt den Prompt ab, und so weiter. [Exit-Code-2-Verhalten pro Event](#exit-code-2-behavior-per-event) listet die Auswirkung für jeden Event auf, und jeder Event-Abschnitt sagt, wohin die Meldung geht.874Die Meldung, die mit dem Block einhergeht, ist der stderr Ihres Hooks. Wenn Ihr Hook zusätzlich JSON ausgegeben hat, das eine blockierende Entscheidung trifft, verwendet Claude Code stattdessen den Grund dieser Entscheidung.
855 875
856Ein Hook, der mit 2 beendet wird, während JSON gedruckt wird, das die [JSON-Ausgabe](#json-output)-Schema-Validierung nicht besteht, blockiert immer noch: Claude Code verwendet stderr als Blockierungsgrund und zeichnet den Validierungsfehler im Debug-Protokoll auf. Vor v2.1.214 behandelte Claude Code diese Kombination als nicht blockierenden Fehler und die Aktion wurde fortgesetzt.876Exit 2 blockiert auch dann, wenn Ihr Hook JSON ausgibt:
877
878* **JSON, das die Schemavalidierung besteht**: Claude Code liest die [JSON-Ausgabe](#json-output)-Felder trotzdem, aber sie können den Block nicht überschreiben. Selbst eine `permissionDecision` von `"allow"` lässt die Aktion nicht durch. Bei `Elicitation` und `ElicitationResult` wird die `hookSpecificOutput` eines Exit-2-Hooks ignoriert.
879* **JSON, das die Schemavalidierung nicht besteht**: Der Hook blockiert trotzdem. Claude Code verwendet Ihren stderr als Blockierungsgrund und zeichnet den Validierungsfehler im Debug-Log auf.
857 880
858Dieses Skript blockiert `rm`-Befehle durch Beendigung mit 2 und lässt jeden anderen Befehl zum normalen Berechtigungsfluss:881Dieses Skript blockiert `rm`-Befehle durch Beendigung mit 2 und lässt jeden anderen Befehl zum normalen Berechtigungsfluss:
859 882
871exit 0 # No decision: the normal permission flow applies894exit 0 # No decision: the normal permission flow applies
872```895```
873 896
897Wenn dieses Skript als `PreToolUse`-Hook für `Bash` registriert ist, wird ein Befehl, der mit `rm` beginnt, blockiert, und Claude erhält den stderr des Hooks als Fehler des Tools, mit dem Event-Namen, dem Tool-Namen und dem Befehl des Hooks als Präfix:
898
899```text theme={null}
900PreToolUse:Bash hook error: [${CLAUDE_PROJECT_DIR}/.claude/hooks/no-rm.sh]: Blocked: rm commands are not allowed
901```
902
874<h4 id="other-exit-codes">903<h4 id="other-exit-codes">
875 Andere Exit-Codes904 Andere Exit-Codes
876</h4>905</h4>
877 906
878Jeder andere Exit-Code blockiert nicht allein für die meisten Hook-Events. Was passiert, hängt von Ihrem stdout ab:907Wenn 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:
879 908
880* Mit einem geparsten Objekt, das die Schema-Validierung besteht, für Events, die das Standard-Entscheidungsmodell verwenden, ignoriert Claude Code den Exit-Code und das JSON allein entscheidet das Ergebnis:909```text theme={null}
881 * Jedes Feld, das der Event unterstützt, wird berücksichtigt, einschließlich `permissionDecision`, `additionalContext`, `updatedInput` und `systemMessage`, und der Hook wird nicht als Fehler gemeldet.910Failed with non-blocking status code: something broke
882 * [Entscheidungskontrolle](#decision-control) listet die Entscheidungsfelder pro Event auf; universelle Felder wie `systemMessage` folgen der [JSON-Ausgabe](#json-output)-Tabelle.911```
883* Mit einem geparsten Objekt, das die Schema-Validierung nicht besteht, für Events, die das Standard-Entscheidungsmodell verwenden, ist es der gleiche nicht blockierende Fehler wie [bei Exit 0](#exit-code-0): die Aktion wird fortgesetzt, und der `<Hook-Name> hook error`-Hinweis trägt die Validierungsmeldung.
884* Mit stdout, das Claude Code [versucht als JSON zu parsen](#exit-code-0) und kann nicht, meldet Claude Code den gleichen nicht blockierenden Fehler wie bei Exit 0 für Events, die das Standard-Entscheidungsmodell verwenden. Die Aktion wird fortgesetzt, und der Hinweis trägt die Parse-Meldung.
885* Mit stdout, das Claude Code [als einfachen Text behandelt](#exit-code-0), oder mit leerem stdout, ist es ein nicht blockierender Fehler für die meisten Hook-Events: die Aktion wird fortgesetzt, und das Transkript zeigt einen `<Hook-Name> hook error`-Hinweis gefolgt von der ersten Zeile von stderr, mit dem Präfix `Failed with non-blocking status code:`. Um den vollständigen stderr zu erfassen, aktivieren Sie [Debug-Protokollierung](#debug-hooks).
886 912
887Events außerhalb des Standard-Entscheidungsmodells behalten ihre eigenen Zeilen in der [Pro-Event-Tabelle](#exit-code-2-behavior-per-event): `WorktreeCreate` schlägt die Erstellung bei jedem Nonzero-Exit fehl, unabhängig davon, was Ihr JSON sagt, und Events, die Hook-Ausgabe vollständig verwerfen, wie `StopFailure`, ignorieren Ihr JSON bei jedem Exit-Code, abgesehen von Nebeneffekt-Feldern wie `terminalSequence`, die immer noch ausgelöst werden.913Um den vollständigen stderr statt nur seiner ersten Zeile zu erfassen, aktivieren Sie [Debug-Logging](#debug-hooks).
888 914
889Ein Hook, der nicht starten kann, landet im gleichen nicht blockierenden Bucket. Wenn der Skriptpfad nicht existiert oder nicht ausführbar ist, beendet die Shell mit einem Code wie 127 und Sie sehen den gleichen Hinweis mit der Interpreter-Meldung, zum Beispiel `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`. Für die meisten Hook-Events wird die Aktion fortgesetzt. Wenn Sie einen Policy-Hook einrichten, achten Sie auf diesen Hinweis bei seiner ersten Ausführung: ein Tippfehler im Pfad in `settings.json` lässt das Gate stillschweigend deaktiviert.915Ein 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).
890 916
891<Warning>917<Warning>
892 Für die meisten Hook-Events ist Exit-Code 2 der einzige Exit-Code, der allein durch den Code blockiert. Ohne gültiges JSON auf stdout behandelt Claude Code Exit-Code 1 als nicht blockierenden Fehler und setzt die Aktion fort, obwohl 1 der konventionelle Unix-Fehlercode ist. Wenn Ihr Hook eine Richtlinie durchsetzen soll, verwenden Sie `exit 2`. Die Worktree-Events unterscheiden sich: jeder Nonzero-Exit-Code von `WorktreeCreate` bricht die Worktree-Erstellung ab, und jeder Nonzero-Exit-Code von `WorktreeRemove` lässt die Worktree-Entfernung fehlschlagen, wenn das Verzeichnis danach noch existiert.918 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`.
893</Warning>919</Warning>
894 920
895<h4 id="timeouts">921<h4 id="timeouts">
900 926
901Bei [`PreModelSwitch`](#premodelswitch) blockiert ein Hook, der bei seinem Timeout abgebrochen wird, den Modellwechsel. Bei `PreToolUse` unterscheiden sich die beiden Hook-Familien:927Bei [`PreModelSwitch`](#premodelswitch) blockiert ein Hook, der bei seinem Timeout abgebrochen wird, den Modellwechsel. Bei `PreToolUse` unterscheiden sich die beiden Hook-Familien:
902 928
903* 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.929* 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).
904* Ein [Agent SDK Callback Hook](/docs/de/agent-sdk/hooks), der sein Timeout überschreitet, [blockiert den Tool-Aufruf](#pretooluse).930* Ein [Agent SDK Callback Hook](/docs/de/agent-sdk/hooks), der sein Timeout überschreitet, [blockiert den Tool-Aufruf](#pretooluse).
905 931
932<h4 id="block-the-action-when-a-hook-fails">
933 Die Aktion blockieren, wenn ein Hook fehlschlägt
934</h4>
935
936Bei 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.
937
938Dieser `PreToolUse`-Hook in `.claude/settings.json` führt vor jedem Bash-Befehl ein Projektskript aus und blockiert den Befehl, wenn das Skript fehlschlägt:
939
940```json theme={null}
941{
942 "hooks": {
943 "PreToolUse": [
944 {
945 "matcher": "Bash",
946 "hooks": [
947 {
948 "type": "command",
949 "command": "node",
950 "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/check-command.js"],
951 "onFailure": "block"
952 }
953 ]
954 }
955 ]
956 }
957}
958```
959
960Um ihn zu testen, lassen Sie `check-command.js` fehlen und bitten Sie Claude, einen Bash-Befehl wie `ls` auszuführen. Claude Code blockiert den Aufruf, und der Fehler enthält `failed; blocking because onFailure is "block"`, gefolgt von der eigenen Fehlerausgabe von node, hier auf eine Zeile gekürzt:
961
962```text theme={null}
963PreToolUse:Bash hook error: [node ${CLAUDE_PROJECT_DIR}/.claude/hooks/check-command.js]: failed; blocking because onFailure is "block"
964Error: Cannot find module '/path/to/project/.claude/hooks/check-command.js'
965```
966
967Nach einem Timeout lautet die Meldung `timed out` statt `failed`. Ohne gesetztes `onFailure` ist dasselbe fehlende Skript ein nicht blockierender Fehler, und `ls` wird ausgeführt.
968
969Jeder der folgenden Fälle zählt als Fehlschlag:
970
971* **Kann nicht starten**: Ein Command Hook startet nicht, zum Beispiel weil das Skript oder die ausführbare Datei nicht existiert
972* **Exit-Code außer 0 oder 2**: zählt bei einem Command Hook auch dann, wenn er JSON ausgegeben hat, das die Aktion erlaubt, etwa `permissionDecision: "allow"`. Um eine JSON-Entscheidung zurückzugeben, beenden Sie mit 0
973* **HTTP-Fehler**: Die Verbindung eines HTTP Hooks schlägt fehl, oder der Response-Status ist nicht 2xx
974* **Timeout**: Der Hook erreicht sein [`timeout`](#common-fields)
975* **Ungültige Ausgabe**: Die JSON-Ausgabe [kann nicht geparst werden](#exit-code-0) oder besteht die [Schemavalidierung](#json-output) nicht. Bei einem HTTP Hook zählt auch ein 2xx-Body, der weder leer noch ein JSON-Objekt ist. Einfacher Text-stdout eines Command Hooks ist kein Fehlschlag
976
977Mit gesetztem `"block"` bewirkt ein Fehlschlag dasselbe wie [Exit-Code 2 bei diesem Event](#exit-code-2-behavior-per-event), außer bei `PermissionRequest`, wo er die Anfrage verweigert. Zum Beispiel blockiert ein `PreToolUse`-Fehlschlag den Tool-Aufruf und ein `UserPromptSubmit`-Fehlschlag den Prompt.
978
979Das Feld hat bei diesen Hooks keine Wirkung:
980
981* **`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
982* **Hintergrund-Command-Hooks**: Command Hooks, die [`async` oder `asyncRewake`](#run-hooks-in-the-background) setzen
983
906<h4 id="exit-code-2-behavior-per-event">984<h4 id="exit-code-2-behavior-per-event">
907 Exit-Code-2-Verhalten pro Event985 Exit-Code-2-Verhalten pro Event
908</h4>986</h4>
960* **Verbindungsfehler**: nicht blockierender Fehler, Ausführung wird fortgesetzt1038* **Verbindungsfehler**: nicht blockierender Fehler, Ausführung wird fortgesetzt
961* **Timeout**: der Hook wird abgebrochen, wie unter [Timeouts](#timeouts) beschrieben1039* **Timeout**: der Hook wird abgebrochen, wie unter [Timeouts](#timeouts) beschrieben
962 1040
963Im Gegensatz zu Command Hooks können HTTP Hooks einen blockierenden Fehler nicht allein durch Statuscodes signalisieren. 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.1041HTTP 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).
964 1042
965<h3 id="json-output">1043<h3 id="json-output">
966 JSON-Ausgabe1044 JSON-Ausgabe
1237 SessionStart-Entscheidungssteuerung1315 SessionStart-Entscheidungssteuerung
1238</h4>1316</h4>
1239 1317
1240Claude Code fügt stdout, das es [als reinen Text behandelt](#exit-code-0), dem Kontext von Claude hinzu. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können Sie diese ereignisspezifischen Felder zurückgeben:1318Ein SessionStart-Hook kann Kontext für Claude hinzufügen, die erste Benutzernachricht liefern, den Sitzungstitel setzen, Dateien überwachen und Skills neu laden. Geben Sie dafür jeweils das entsprechende Feld zurück, zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen:
1241 1319
1242| Feld | Beschreibung |1320| Feld | Beschreibung |
1243| :- | :- |1321| :- | :- |
1244| `additionalContext` | String, der zu Beginn der Konversation vor dem ersten Prompt dem Kontext von Claude hinzugefügt wird. Unter [Kontext für Claude hinzufügen](#add-context-for-claude) erfahren Sie, wie der Text übermittelt wird und was er enthalten sollte |1322| `additionalContext` | String, der zu Beginn der Konversation vor dem ersten Prompt dem Kontext von Claude hinzugefügt wird. Unter [Kontext für Claude hinzufügen](#add-context-for-claude) erfahren Sie, wie der Text übermittelt wird und was er enthalten sollte |
1245| `initialUserMessage` | String, der als erste Benutzernachricht der Sitzung verwendet wird. Gilt im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p`, wo er zum ersten Turn wird, auch wenn kein Prompt angegeben ist. Wenn ein Prompt angegeben ist, folgt dieser als nächster Turn. Anders als `additionalContext`, das an einen bestehenden Turn angehängt wird, erzeugt dies den Turn |1323| `initialUserMessage` | Zeichenkette, die im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p` als erste Benutzernachricht der Sitzung verwendet wird. Sie wird zum ersten Turn, auch wenn Sie keinen Prompt übergeben. Ein Prompt, den Sie übergeben, folgt als nächster Turn |
1246| `sessionTitle` | Legt den Sitzungstitel fest, mit derselben Wirkung wie `/rename`. Verwenden Sie dies, um Sitzungen automatisch nach dem Startordner, dem Git-Branch oder dem Worktree-Namen zu benennen. Gilt, wenn `source` den Wert `"startup"`, `"resume"` oder `"fork"` hat; wird bei `"clear"` und `"compact"` ignoriert |1324| `sessionTitle` | Setzt den Sitzungstitel, mit derselben Wirkung wie `/rename`. Gilt, wenn `source` den Wert `"startup"`, `"resume"` oder `"fork"` hat |
1247| `watchPaths` | Array absoluter Pfade, die während dieser Sitzung auf [FileChanged](#filechanged)-Ereignisse überwacht werden sollen |1325| `watchPaths` | Array absoluter Pfade, die während dieser Sitzung auf [FileChanged](#filechanged)-Ereignisse überwacht werden sollen |
1248| `reloadSkills` | Boolean. Bei `true` durchsucht Claude Code die Verzeichnisse für [Skills](/docs/de/skills) und Befehle erneut, nachdem die SessionStart-Hooks abgeschlossen sind, sodass Skills, die der Hook installiert hat, in derselben Sitzung ab dem ersten Prompt verfügbar sind |1326| `reloadSkills` | Boolescher Wert. Bei `true` durchsucht Claude Code die [Skill](/docs/de/skills)- und Befehlsverzeichnisse erneut, nachdem die SessionStart-Hooks abgeschlossen sind. Siehe [Skills neu laden, die ein Hook installiert](#reload-skills-that-a-hook-installs) |
1327
1328Diese Ausgabe fügt Kontext hinzu und benennt die Sitzung:
1249 1329
1250```json theme={null}1330```json theme={null}
1251{1331{
1257}1337}
1258```1338```
1259 1339
1260Da reines stdout für dieses Ereignis Claude bereits erreicht, kann ein Hook, der nur Kontext lädt, direkt auf stdout ausgeben, ohne JSON zu erstellen. Verwenden Sie die JSON-Form, wenn Sie Kontext mit anderen Feldern wie `sessionTitle` kombinieren müssen.1340Ein Hook, der nur Kontext hinzufügt, kann diesen ausgeben, ohne JSON zu erstellen, da Claude Code die [Klartext-Ausgabe auf stdout](#exit-code-0) eines SessionStart-Hooks zum Kontext von Claude hinzufügt.
1341
1342Wenn der SessionStart-Hook Ihres Plugins `initialUserMessage` oder `sessionTitle` liefert, installieren Sie das Plugin, bevor die Sitzung startet. Claude Code ignoriert beide Felder von einem Plugin, dessen Installation erst abgeschlossen wird, nachdem die SessionStart-Hooks ausgeführt wurden.
1343
1344<h4 id="reload-skills-that-a-hook-installs">
1345 Skills neu laden, die ein Hook installiert
1346</h4>
1347
1348Damit Skills, die ein SessionStart-Hook installiert, in derselben Sitzung verfügbar sind, geben Sie `reloadSkills` zurück. Die Skill-Erkennung läuft normalerweise, bevor SessionStart-Hooks abgeschlossen sind; ohne dieses Feld können Dateien, die ein Hook in `~/.claude/skills/` oder `.claude/skills/` schreibt, beim ersten Prompt fehlen.
1261 1349
1262Verwenden Sie `reloadSkills`, wenn ein SessionStart-Hook Skills installiert oder aktualisiert. Die Skill-Erkennung läuft normalerweise, bevor SessionStart-Hooks abgeschlossen sind, sodass Dateien, die der Hook in `~/.claude/skills/` oder `.claude/skills/` schreibt, sonst erst in der nächsten Sitzung erscheinen würden. Dieses Beispiel synchronisiert ein gemeinsames Skills-Repository und fordert die erneute Durchsuchung an:1350Dieses Beispiel synchronisiert ein gemeinsames Skills-Repository und fordert das erneute Durchsuchen an:
1263 1351
1264```bash theme={null}1352```bash theme={null}
1265#!/bin/bash1353#!/bin/bash
1270echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1358echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1271```1359```
1272 1360
1273Die Repository-URL ist ein Platzhalter; ersetzen Sie sie durch Ihr eigenes Skills-Repository. Mit dem Platzhalter schlägt das Klonen fehl und gibt eine `fatal:`-Meldung auf stderr aus. Stderr eines SessionStart-Hooks, der mit 0 beendet wird, dient nur zur Information, daher gilt die `reloadSkills`-Anforderung trotzdem.1361Die Repository-URL ist ein Platzhalter. Ersetzen Sie sie durch Ihr eigenes Skills-Repository.
1274 1362
1275<h4 id="persist-environment-variables">1363<h4 id="persist-environment-variables">
1276 Umgebungsvariablen beibehalten1364 Umgebungsvariablen beibehalten
1419 1507
1420`UserPromptSubmit`-Hooks haben für die Typen `command`, `http` und `mcp_tool` einen Standard-Timeout von 30 Sekunden, kürzer als der Standard von 600 Sekunden für diese Typen bei den meisten anderen Ereignissen. Da dieser Hook vor jedem Prompt läuft und die Modellverarbeitung bis zu seinem Abschluss blockiert, bringt ein hängender Hook die Sitzung zum Stillstand. Wenn Ihr Hook mehr Zeit benötigt, setzen Sie das Feld `timeout` im Hook-Eintrag.1508`UserPromptSubmit`-Hooks haben für die Typen `command`, `http` und `mcp_tool` einen Standard-Timeout von 30 Sekunden, kürzer als der Standard von 600 Sekunden für diese Typen bei den meisten anderen Ereignissen. Da dieser Hook vor jedem Prompt läuft und die Modellverarbeitung bis zu seinem Abschluss blockiert, bringt ein hängender Hook die Sitzung zum Stillstand. Wenn Ihr Hook mehr Zeit benötigt, setzen Sie das Feld `timeout` im Hook-Eintrag.
1421 1509
1422Abgesehen von einem Befehls-Hook, den Sie mit [`async: true`](#run-hooks-in-the-background) ausführen, wird ein `UserPromptSubmit`-Befehls-, HTTP- oder MCP-Tool-Hook, der seinen Timeout erreicht, abgebrochen, und seine Ausgabe einschließlich eines eventuellen `additionalContext` wird verworfen. Der Prompt erreicht Claude trotzdem, nur ohne diesen Kontext. Das Transkript zeigt einen Hinweis, der den Hook und den ausgelösten Timeout nennt und angibt, dass die Ausgabe verworfen wurde.1510Abgesehen von einem Befehls-Hook, den Sie mit [`async: true`](#run-hooks-in-the-background) ausführen, wird ein `UserPromptSubmit`-Befehls-, HTTP- oder MCP-Tool-Hook, der seinen Timeout erreicht, abgebrochen, und seine Ausgabe, einschließlich `additionalContext`, wird verworfen. Der Prompt erreicht Claude trotzdem, nur ohne diesen Kontext. Um den Prompt stattdessen zu blockieren, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails) für einen Befehls- oder HTTP-Hook. Das Transkript zeigt einen Hinweis, der den Hook, den ausgelösten Timeout und das Verwerfen der Ausgabe nennt.
1423 1511
1424Ein [Agent-SDK-Callback-Hook](/docs/de/agent-sdk/hooks) bei `UserPromptSubmit`, der seinen Timeout erreicht, blockiert den Prompt mit einer Meldung, die den Hook und den Timeout nennt, weil ein Callback an dieser Stelle als Richtlinien-Gate fungieren kann, das nicht offen fehlschlagen darf. Die Sitzung wird fortgesetzt. Vor v2.1.208 beendete ein Callback-Timeout bei diesem Ereignis den Turn mit einem Ausführungsfehler.1512Ein [Agent-SDK-Callback-Hook](/docs/de/agent-sdk/hooks) bei `UserPromptSubmit`, der seinen Timeout erreicht, blockiert den Prompt mit einer Meldung, die den Hook und den Timeout nennt, weil ein Callback an dieser Stelle als Richtlinien-Gate fungieren kann, das nicht offen fehlschlagen darf. Die Sitzung wird fortgesetzt. Vor v2.1.208 beendete ein Callback-Timeout bei diesem Ereignis den Turn mit einem Ausführungsfehler.
1425 1513
1860| :- | :- | :- | :- |1948| :- | :- | :- | :- |
1861| `url` | string | `"https://example.com/api"` | URL, von der Inhalte abgerufen werden |1949| `url` | string | `"https://example.com/api"` | URL, von der Inhalte abgerufen werden |
1862| `prompt` | string | `"Extract the API endpoints"` | Prompt, der auf den abgerufenen Inhalt angewendet wird |1950| `prompt` | string | `"Extract the API endpoints"` | Prompt, der auf den abgerufenen Inhalt angewendet wird |
1951| `offset` | number | `100000` | Optionale Anzahl von Zeichen, die ab dem Seitenanfang übersprungen werden. Claude setzt diesen Wert, um eine lange Seite weiterzulesen. Erfordert Claude Code v2.1.290 oder höher |
1863 1952
1864<h5 id="websearch">1953<h5 id="websearch">
1865 WebSearch1954 WebSearch
2112| `message` | Nur für `"deny"`: teilt Claude mit, warum die Berechtigung verweigert wurde |2201| `message` | Nur für `"deny"`: teilt Claude mit, warum die Berechtigung verweigert wurde |
2113| `interrupt` | Nur für `"deny"`: bei `true` wird Claude gestoppt |2202| `interrupt` | Nur für `"deny"`: bei `true` wird Claude gestoppt |
2114 2203
2115Ein Hook, der ohne `decision`-Objekt mit Exit-Code 2 beendet wird, lässt den Berechtigungsablauf unverändert, und sein stderr wird verworfen. Nur das `decision`-Objekt kann die Anfrage genehmigen oder ablehnen.2204Ein Hook, der ohne `decision`-Objekt mit Exit-Code 2 endet, lässt den Berechtigungsablauf unverändert, und sein stderr wird verworfen. Um die Anfrage zu erlauben oder abzulehnen, geben Sie das `decision`-Objekt zurück.
2116 2205
2117```json theme={null}2206```json theme={null}
2118{2207{
2678 TaskCreated-Entscheidungssteuerung2767 TaskCreated-Entscheidungssteuerung
2679</h4>2768</h4>
2680 2769
2681Ein TaskCreated-Hook kann die Erstellung auf zwei Arten blockieren. In beiden Fällen löscht Claude Code die Aufgabe und gibt Ihre Nachricht als Fehler des Tools an Claude zurück. Claude Code ignoriert `continue: false` bei diesem Ereignis, und Claude arbeitet weiter.2770Ein TaskCreated-Hook kann die Erstellung mit Exit-Code 2 oder mit einer JSON-Entscheidung blockieren. In beiden Fällen löscht Claude Code die Aufgabe und gibt Ihre Nachricht als Fehler des Tools an Claude zurück. Claude Code ignoriert `continue: false` bei diesem Ereignis, und Claude arbeitet weiter.
2682 2771
2683* **Exit-Code 2**: Claude Code gibt den stderr-Text als Nachricht zurück.2772* **Exit-Code 2**: Claude Code gibt den stderr-Text als Nachricht zurück.
2684* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code gibt `reason` als Nachricht zurück.2773* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code gibt `reason` als Nachricht zurück.
3561 3650
3562Claude Code zeigt dem Benutzer jede `systemMessage` an, die Ihr Hook zurückgibt, unabhängig von der Entscheidung, sodass ein Hook zur Kostenmeldung `{"systemMessage": "..."}` zurückgeben und mit 0 beendet werden kann.3651Claude Code zeigt dem Benutzer jede `systemMessage` an, die Ihr Hook zurückgibt, unabhängig von der Entscheidung, sodass ein Hook zur Kostenmeldung `{"systemMessage": "..."}` zurückgeben und mit 0 beendet werden kann.
3563 3652
3564Ein PreModelSwitch-Hook, der nicht vor Ablauf seines Timeouts antwortet, blockiert den Wechsel. Bei [PreToolUse](#timeouts) hingegen lässt ein Command-Hook mit Zeitüberschreitung den Tool-Aufruf fortfahren. 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.3653Ein PreModelSwitch-Hook, der nicht vor seinem Timeout antwortet, blockiert den Wechsel. Was ein Timeout bei anderen Ereignissen bewirkt, erfahren 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.
3565 3654
3566Ein Hook, der mit einem anderen Code als 0 oder 2 beendet wird und keine JSON-Entscheidung ausgibt, blockiert nicht: Claude Code zeigt seine stderr-Ausgabe an und wendet den Wechsel an, wie unter [Andere Exit-Codes](#other-exit-codes) beschrieben.3655Ein 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.
3567 3656
3568<h3 id="postmodelswitch">3657<h3 id="postmodelswitch">
3569 PostModelSwitch3658 PostModelSwitch
4279Asynchrone Hooks haben zusätzliche Einschränkungen im Vergleich zu synchronen Hooks:4368Asynchrone Hooks haben zusätzliche Einschränkungen im Vergleich zu synchronen Hooks:
4280 4369
4281* Hook-Ausgabe wird beim nächsten Gesprächsturn geliefert. Wenn die Sitzung untätig ist, wartet die Response, bis die nächste Benutzerinteraktion erfolgt. Ausnahme: Ein `asyncRewake`-Hook, der mit Code 2 beendet wird, weckt Claude sofort auf, auch wenn die Sitzung untätig ist.4370* Hook-Ausgabe wird beim nächsten Gesprächsturn geliefert. Wenn die Sitzung untätig ist, wartet die Response, bis die nächste Benutzerinteraktion erfolgt. Ausnahme: Ein `asyncRewake`-Hook, der mit Code 2 beendet wird, weckt Claude sofort auf, auch wenn die Sitzung untätig ist.
4282* Jede Ausführung erstellt einen separaten Hintergrund-Prozess. Es gibt keine Deduplizierung über mehrere Auslösungen des gleichen asynchronen Hooks.4371* Jede Ausführung erstellt einen separaten Hintergrund-Prozess.
4283 4372
4284<h2 id="security-considerations">4373<h2 id="security-considerations">
4285 Sicherheitsüberlegungen4374 Sicherheitsüberlegungen