924| `StopFailure` | Nein | Ausgabe und Exit-Code werden ignoriert, außer `terminalSequence` |924| `StopFailure` | Nein | Ausgabe und Exit-Code werden ignoriert, außer `terminalSequence` |
925| `PostToolUse` | Nein | Zeigt stderr Claude; das Tool ist bereits ausgeführt |925| `PostToolUse` | Nein | Zeigt stderr Claude; das Tool ist bereits ausgeführt |
926| `PostToolUseFailure` | Nein | Zeigt stderr Claude; das Tool ist bereits fehlgeschlagen |926| `PostToolUseFailure` | Nein | Zeigt stderr Claude; das Tool ist bereits fehlgeschlagen |
927| `PostToolBatch` | Ja | Stoppt die agentic Loop vor dem nächsten Modellaufruf |927| `PostToolBatch` | Ja | Stoppt die Agentenschleife vor dem nächsten Modellaufruf |
928| `PermissionDenied` | Nein | Exit-Code und stderr werden ignoriert, da die Verweigerung bereits aufgetreten ist. Verwenden Sie JSON `hookSpecificOutput.retry: true`, um dem Modell zu sagen, dass es möglicherweise erneut versuchen kann; Claude Code ignoriert `retry: true` für [No-Verdict-Verweigerungen](#permissiondenied-decision-control) |928| `PermissionDenied` | Nein | Exit-Code und stderr werden ignoriert, da die Verweigerung bereits aufgetreten ist. Verwenden Sie JSON `hookSpecificOutput.retry: true`, um dem Modell zu sagen, dass es möglicherweise erneut versuchen kann; Claude Code ignoriert `retry: true` für [No-Verdict-Verweigerungen](#permissiondenied-decision-control) |
929| `Notification` | Nein | Exit-Code und stderr werden ignoriert |929| `Notification` | Nein | Exit-Code und stderr werden ignoriert |
930| `SubagentStart` | Nein | Zeigt stderr nur dem Benutzer |930| `SubagentStart` | Nein | Zeigt stderr nur dem Benutzer |
938| `PostCompact` | Nein | Zeigt stderr nur dem Benutzer |938| `PostCompact` | Nein | Zeigt stderr nur dem Benutzer |
939| `PreModelSwitch` | Ja | Blockiert den Modellwechsel und zeigt stderr dem Benutzer |939| `PreModelSwitch` | Ja | Blockiert den Modellwechsel und zeigt stderr dem Benutzer |
940| `PostModelSwitch` | Nein | Zeigt stderr nur dem Benutzer; das Modell ist bereits gewechselt |940| `PostModelSwitch` | Nein | Zeigt stderr nur dem Benutzer; das Modell ist bereits gewechselt |
941| `Elicitation` | Ja | Verweigert die Elicitation |941| `Elicitation` | Ja | Lehnt die Anfrage ab, und es erscheint kein Dialog |
942| `ElicitationResult` | Ja | Blockiert die Antwort (Aktion wird Ablehnung) |942| `ElicitationResult` | Ja | Blockiert die Antwort (Aktion wird Ablehnung) |
943| `WorktreeCreate` | Ja | Jeder Nonzero-Exit-Code führt dazu, dass die Worktree-Erstellung fehlschlägt |943| `WorktreeCreate` | Ja | Jeder Nonzero-Exit-Code führt dazu, dass die Worktree-Erstellung fehlschlägt |
944| `WorktreeRemove` | Ja | Jeder Nonzero-Exit-Code führt dazu, dass die Worktree-Entfernung fehlschlägt, wenn das Verzeichnis danach noch existiert. Siehe [WorktreeRemove](#worktreeremove) für das, was mit dem Verzeichnis passiert |944| `WorktreeRemove` | Ja | Jeder Nonzero-Exit-Code führt dazu, dass die Worktree-Entfernung fehlschlägt, wenn das Verzeichnis danach noch existiert. Siehe [WorktreeRemove](#worktreeremove) für das, was mit dem Verzeichnis passiert |
972 Wählen Sie einen Ansatz pro Hook: Verwenden Sie entweder Exit-Codes allein zum Signalisieren oder beenden Sie mit 0 und drucken Sie JSON für strukturierte Kontrolle. Wenn Sie sie mischen, behält Exit 2 seine [blockierende Auswirkung](#exit-code-2-behavior-per-event), und Claude Code liest immer noch die JSON-Felder, mit der einen Elicitation-Ausnahme, die unter [Exit-Code 2](#exit-code-2) notiert ist.972 Wählen Sie einen Ansatz pro Hook: Verwenden Sie entweder Exit-Codes allein zum Signalisieren oder beenden Sie mit 0 und drucken Sie JSON für strukturierte Kontrolle. Wenn Sie sie mischen, behält Exit 2 seine [blockierende Auswirkung](#exit-code-2-behavior-per-event), und Claude Code liest immer noch die JSON-Felder, mit der einen Elicitation-Ausnahme, die unter [Exit-Code 2](#exit-code-2) notiert ist.
973</Note>973</Note>
974 974
975Der stdout Ihres Hooks muss nur das JSON-Objekt enthalten. Wenn Ihr Shell-Profil beim Start Text druckt, kann es die JSON-Analyse beeinträchtigen. Siehe [Hook JSON hat keine Auswirkung](/docs/de/hooks-guide#hook-json-has-no-effect) im Troubleshooting-Leitfaden.975Der stdout Ihres Hooks muss nur das JSON-Objekt enthalten. Wenn Ihr Shell-Profil beim Start Text druckt, kann es die JSON-Analyse beeinträchtigen. Siehe [Hook JSON hat keine Auswirkung](/docs/de/hooks-guide#hook-json-has-no-effect) im Leitfaden zur Fehlerbehebung.
976 976
977Die Strings `additionalContext`, `systemMessage` und `initialUserMessage` eines Hooks sowie sein einfacher stdout sind auf 10.000 Zeichen begrenzt:977Die Strings `additionalContext`, `systemMessage` und `initialUserMessage` eines Hooks sowie sein einfacher stdout sind auf 10.000 Zeichen begrenzt:
978 978
992| `stopReason` | keine | Meldung, die dem Benutzer angezeigt wird, wenn `continue` `false` ist. Sie bleibt in der Konversation, sodass Claude sie sieht, wenn die Konversation fortgesetzt wird |992| `stopReason` | keine | Meldung, die dem Benutzer angezeigt wird, wenn `continue` `false` ist. Sie bleibt in der Konversation, sodass Claude sie sieht, wenn die Konversation fortgesetzt wird |
993| `suppressOutput` | `false` | Hat keine Auswirkung: Claude Code akzeptiert das Feld, aber handelt nicht danach. Der stdout eines erfolgreichen Hooks wird nie im Transkript angezeigt und wird im Debug-Protokoll aufgezeichnet |993| `suppressOutput` | `false` | Hat keine Auswirkung: Claude Code akzeptiert das Feld, aber handelt nicht danach. Der stdout eines erfolgreichen Hooks wird nie im Transkript angezeigt und wird im Debug-Protokoll aufgezeichnet |
994| `systemMessage` | keine | Warnmeldung, die dem Benutzer angezeigt wird. In [Agent SDK](/docs/de/agent-sdk/overview) und [`--output-format stream-json`](/docs/de/headless)-Ausgabe kann es als [`SDKInformationalMessage`](/docs/de/agent-sdk/typescript#sdkinformationalmessage) ankommen |994| `systemMessage` | keine | Warnmeldung, die dem Benutzer angezeigt wird. In [Agent SDK](/docs/de/agent-sdk/overview) und [`--output-format stream-json`](/docs/de/headless)-Ausgabe kann es als [`SDKInformationalMessage`](/docs/de/agent-sdk/typescript#sdkinformationalmessage) ankommen |
995| `terminalSequence` | keine | Eine Terminal-Escape-Sequenz, die Claude Code in Ihrem Namen ausgeben soll, wie eine Desktop-Benachrichtigung, einen Fenstertitel oder eine Glocke. Beschränkt auf OSC `0`/`1`/`2`/`9`/`99`/`777` und BEL. Wenn der Wert etwas außerhalb der Zulassungsliste enthält, wird das Feld ignoriert. Verwenden Sie dies anstelle des Schreibens zu `/dev/tty`, das für Hooks nicht verfügbar ist |995| `terminalSequence` | keine | Eine Terminal-Escape-Sequenz, die Claude Code in Ihrem Namen ausgeben soll, wie eine Desktop-Benachrichtigung, einen Fenstertitel oder eine Glocke. Beschränkt auf OSC `0`/`1`/`2`/`9`/`99`/`777` und BEL. Wenn der Wert etwas außerhalb der Allowlist enthält, wird das Feld ignoriert. Verwenden Sie dies anstelle des Schreibens zu `/dev/tty`, das für Hooks nicht verfügbar ist |
996 996
997Um Claude vollständig zu stoppen:997Um Claude vollständig zu stoppen:
998 998
1016* OSC `777`: urxvt, Ghostty und Warp-Benachrichtigungen1016* OSC `777`: urxvt, Ghostty und Warp-Benachrichtigungen
1017* Bare BEL1017* Bare BEL
1018 1018
1019Sequenzen können mit BEL oder mit ST beendet werden. Alles außerhalb der Zulassungsliste, einschließlich CSI-Cursor- und Farbsequenzen, OSC-Palettensequenzen, OSC-8-Hyperlinks, OSC-52-Clipboard-Schreibvorgänge und OSC 1337, wird abgelehnt und das Feld wird ignoriert.1019Sequenzen können mit BEL oder mit ST beendet werden. Alles außerhalb der Allowlist, einschließlich CSI-Cursor- und Farbsequenzen, OSC-Palettensequenzen, OSC-8-Hyperlinks, OSC-52-Clipboard-Schreibvorgänge und OSC 1337, wird abgelehnt und das Feld wird ignoriert.
1020 1020
1021Claude Code schreibt die Sequenz selbst, wenn es Ihre Hook-Ausgabe verarbeitet, sodass das Feld bei Events funktioniert, die `systemMessage` und `continue` verwerfen, wie `Notification` und `StopFailure`. Es hat zwei Limits:1021Claude Code schreibt die Sequenz selbst, wenn es Ihre Hook-Ausgabe verarbeitet, sodass das Feld bei Events funktioniert, die `systemMessage` und `continue` verwerfen, wie `Notification` und `StopFailure`. Es hat zwei Limits:
1022 1022
1023* Claude Code schreibt die Sequenz nur in einer interaktiven Session und nur, während seine Schnittstelle auf dem Bildschirm ist. Im nicht-interaktiven Modus mit dem `-p`-Flag und im Agent SDK ignoriert es das Feld.1023* Claude Code schreibt die Sequenz nur in einer interaktiven Session und nur, während seine Schnittstelle auf dem Bildschirm ist. Im nicht interaktiven Modus mit dem `-p`-Flag und im Agent SDK ignoriert es das Feld.
1024* Ein `WorktreeCreate`-Command-Hook kann kein JSON zurückgeben, da Claude Code seinen stdout als Worktree-Pfad liest. Ein HTTP-`WorktreeCreate`-Hook gibt JSON zurück und kann das Feld enthalten.1024* Ein `WorktreeCreate`-Command-Hook kann kein JSON zurückgeben, da Claude Code seinen stdout als Worktree-Pfad liest. Ein HTTP-`WorktreeCreate`-Hook gibt JSON zurück und kann das Feld enthalten.
1025 1025
1026Das folgende Beispiel löst eine Desktop-Benachrichtigung von einem `Notification`-Hook aus. Die Escape-Sequenz wird mit `printf`-Oktal-Escapes erstellt, sodass die Steuerbytes nie auf der Shell-Befehlszeile erscheinen, und `jq -n --arg` erstellt die JSON-Ausgabe, sodass Anführungszeichen, Backslashes und Zeilenumbrüche in der Benachrichtigungsmeldung korrekt escaped werden:1026Das folgende Beispiel löst eine Desktop-Benachrichtigung von einem `Notification`-Hook aus. Die Escape-Sequenz wird mit `printf`-Oktal-Escapes erstellt, sodass die Steuerbytes nie auf der Shell-Befehlszeile erscheinen, und `jq -n --arg` erstellt die JSON-Ausgabe, sodass Anführungszeichen, Backslashes und Zeilenumbrüche in der Benachrichtigungsmeldung korrekt escaped werden:
1041 Kontext für Claude hinzufügen1041 Kontext für Claude hinzufügen
1042</h4>1042</h4>
1043 1043
1044Das `additionalContext`-Feld übergibt einen String von Ihrem Hook in Claudes Kontextfenster. Claude Code umhüllt den String in eine [Systemerinnerung](/docs/de/glossary#system-reminder) und fügt ihn in die Konversation an dem Punkt ein, an dem der Hook ausgelöst wurde. Claude liest die Erinnerung bei der nächsten Modellanfrage, aber sie erscheint nicht als Chat-Nachricht in der Schnittstelle.1044Das `additionalContext`-Feld übergibt einen String von Ihrem Hook in Claudes Kontextfenster. Claude Code umhüllt den String in eine [System-Erinnerung](/docs/de/glossary#system-reminder) und fügt ihn in die Konversation an dem Punkt ein, an dem der Hook ausgelöst wurde. Claude liest die Erinnerung bei der nächsten Modellanfrage, aber sie erscheint nicht als Chat-Nachricht in der Schnittstelle.
1045 1045
1046Geben Sie `additionalContext` innerhalb von `hookSpecificOutput` neben dem Event-Namen zurück:1046Geben Sie `additionalContext` innerhalb von `hookSpecificOutput` neben dem Event-Namen zurück:
1047 1047
1068 1068
1069Verwenden Sie `additionalContext` für Informationen, die Claude über den aktuellen Zustand Ihrer Umgebung oder die gerade ausgeführte Operation wissen sollte:1069Verwenden Sie `additionalContext` für Informationen, die Claude über den aktuellen Zustand Ihrer Umgebung oder die gerade ausgeführte Operation wissen sollte:
1070 1070
1071* **Umgebungszustand**: der aktuelle Branch, Bereitstellungsziel oder aktive Feature-Flags1071* **Umgebungszustand**: der aktuelle Branch, Deployment-Ziel oder aktive Feature-Flags
1072* **Bedingte Projektregeln**: welcher Test-Befehl für die gerade bearbeitete Datei gilt, welche Verzeichnisse in diesem Worktree schreibgeschützt sind1072* **Bedingte Projektregeln**: welcher Test-Befehl für die gerade bearbeitete Datei gilt, welche Verzeichnisse in diesem Worktree schreibgeschützt sind
1073* **Externe Daten**: offene Issues, die Ihnen zugewiesen sind, aktuelle CI-Ergebnisse, Inhalte, die von einem internen Service abgerufen wurden1073* **Externe Daten**: offene Issues, die Ihnen zugewiesen sind, aktuelle CI-Ergebnisse, Inhalte, die von einem internen Service abgerufen wurden
1074 1074
1075Für Anweisungen, die sich nie ändern, bevorzugen Sie [CLAUDE.md](/docs/de/memory). Es wird ohne Ausführung eines Skripts geladen und ist der Standard-Ort für statische Projektkonventionen.1075Für Anweisungen, die sich nie ändern, bevorzugen Sie [CLAUDE.md](/docs/de/memory). Es wird ohne Ausführung eines Skripts geladen und ist der Standard-Ort für statische Projektkonventionen.
1076 1076
1077Schreiben Sie den Text als sachliche Aussagen statt imperativer Systembefehle. Formulierungen wie „Das Bereitstellungsziel ist Produktion“ oder „Dieses Repo verwendet `bun test`“ werden als Projektinformationen gelesen. Text, der als Out-of-Band-Systembefehle formuliert ist, kann Claudes Prompt-Injection-Abwehr auslösen, was dazu führt, dass Claude den Text an Sie übermittelt, anstatt ihn als Kontext zu behandeln.1077Schreiben Sie den Text als sachliche Aussagen statt imperativer Systembefehle. Formulierungen wie „Das Deployment-Ziel ist Produktion“ oder „Dieses Repo verwendet `bun test`“ werden als Projektinformationen gelesen. Text, der als Out-of-Band-Systembefehle formuliert ist, kann Claudes Prompt-Injection-Abwehr auslösen, was dazu führt, dass Claude den Text an Sie übermittelt, anstatt ihn als Kontext zu behandeln.
1078 1078
1079Claude Code speichert den eingefügten Text im Session-Transkript. Für Mid-Session-Events wie `PostToolUse` oder `UserPromptSubmit`, wenn Sie mit `--continue` oder `--resume` fortfahren, spielt Claude Code den gespeicherten Text erneut ab, anstatt den Hook für vergangene Turns erneut auszuführen, sodass Werte wie Zeitstempel oder Commit-SHAs veraltet werden. `SessionStart`-Hooks werden bei Wiederaufnahme mit `source` auf `"resume"` oder `"fork"` gesetzt, wenn Sie `--fork-session` hinzugefügt haben, erneut ausgeführt, sodass sie ihren Kontext aktualisieren können.1079Claude Code speichert den eingefügten Text im Session-Transkript. Für Mid-Session-Events wie `PostToolUse` oder `UserPromptSubmit`, wenn Sie mit `--continue` oder `--resume` fortfahren, spielt Claude Code den gespeicherten Text erneut ab, anstatt den Hook für vergangene Turns erneut auszuführen, sodass Werte wie Zeitstempel oder Commit-SHAs veraltet werden. `SessionStart`-Hooks werden bei Wiederaufnahme mit `source` auf `"resume"` oder `"fork"` gesetzt, wenn Sie `--fork-session` hinzugefügt haben, erneut ausgeführt, sodass sie ihren Kontext aktualisieren können.
1080 1080
1095| PermissionDenied | `hookSpecificOutput` | `retry: true` teilt dem Modell mit, dass es den verweigerten Tool-Aufruf möglicherweise erneut versuchen kann; Claude Code ignoriert es für [No-Verdict-Verweigerungen](#permissiondenied-decision-control) |1095| PermissionDenied | `hookSpecificOutput` | `retry: true` teilt dem Modell mit, dass es den verweigerten Tool-Aufruf möglicherweise erneut versuchen kann; Claude Code ignoriert es für [No-Verdict-Verweigerungen](#permissiondenied-decision-control) |
1096| WorktreeCreate | Pfad-Rückgabe | Command Hook druckt Pfad auf stdout; HTTP Hook gibt `hookSpecificOutput.worktreePath` zurück. Hook-Fehler oder fehlender Pfad schlägt die Erstellung fehl |1096| WorktreeCreate | Pfad-Rückgabe | Command Hook druckt Pfad auf stdout; HTTP Hook gibt `hookSpecificOutput.worktreePath` zurück. Hook-Fehler oder fehlender Pfad schlägt die Erstellung fehl |
1097| WorktreeRemove | Exit-Code | Jeder Nonzero-Exit-Code lässt die Entfernung fehlschlagen, wenn das Verzeichnis danach noch existiert. JSON-Ausgabe wird verworfen |1097| WorktreeRemove | Exit-Code | Jeder Nonzero-Exit-Code lässt die Entfernung fehlschlagen, wenn das Verzeichnis danach noch existiert. JSON-Ausgabe wird verworfen |
1098| Elicitation | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (Formularfeldwerte für accept) |1098| Elicitation, ElicitationResult | `hookSpecificOutput` oder Top-Level `decision` | `action` (accept/decline/cancel), `content` (Formularfeldwerte). `decision: "block"` [lehnt ebenfalls ab](#other-ways-to-decline-an-elicitation) |
1099| ElicitationResult | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (Formularfeldwerte überschreiben) |
1100| MessageDisplay | `hookSpecificOutput` | `displayContent` ersetzt den angezeigten Text auf dem Bildschirm. Nur Anzeige: das Transkript und das, was Claude sieht, behalten das Original |1099| MessageDisplay | `hookSpecificOutput` | `displayContent` ersetzt den angezeigten Text auf dem Bildschirm. Nur Anzeige: das Transkript und das, was Claude sieht, behalten das Original |
1101| SessionStart, SubagentStart, PostModelSwitch | Nur Kontext | `hookSpecificOutput.additionalContext` fügt Kontext für Claude hinzu. SessionStart akzeptiert auch [`initialUserMessage`, `watchPaths`, `sessionTitle` und `reloadSkills`](#sessionstart-decision-control). Keine Blockierung oder Entscheidungskontrolle |1100| SessionStart, SubagentStart, PostModelSwitch | Nur Kontext | `hookSpecificOutput.additionalContext` fügt Kontext für Claude hinzu. SessionStart akzeptiert auch [`initialUserMessage`, `watchPaths`, `sessionTitle` und `reloadSkills`](#sessionstart-decision-control). Keine Blockierung oder Entscheidungskontrolle |
1102| Setup, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, DirectoryAdded, FileChanged | Keine | Keine Entscheidungskontrolle. Wird für Nebeneffekte wie Protokollierung oder Bereinigung verwendet |1101| Setup, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, DirectoryAdded, FileChanged | Keine | Keine Entscheidungskontrolle. Wird für Nebeneffekte wie Protokollierung oder Bereinigung verwendet |
1163 Hook-Ereignisse1162 Hook-Ereignisse
1164</h2>1163</h2>
1165 1164
1166Jedes Ereignis entspricht einem Punkt im Lebenszyklus von Claude Code, an dem Hooks ausgeführt werden können. Die folgenden Abschnitte sind in der Reihenfolge des Lebenszyklus angeordnet: von der Einrichtung der Sitzung über die Agentenschleife bis zum Ende der Sitzung. Jeder Abschnitt beschreibt, wann das Ereignis ausgelöst wird, welche Matcher es unterstützt, welche JSON-Eingabe es erhält und wie Sie das Verhalten über die Ausgabe steuern.1165Jedes Ereignis entspricht einem Punkt im Lebenszyklus von Claude Code, an dem Hooks ausgeführt werden können. Die folgenden Abschnitte sind entsprechend dem Lebenszyklus geordnet: von der Einrichtung der Sitzung über die Agentenschleife bis zum Ende der Sitzung. Jeder Abschnitt beschreibt, wann das Ereignis ausgelöst wird, welche Matcher es unterstützt, welche JSON-Eingabe es erhält und wie Sie das Verhalten über die Ausgabe steuern.
1167 1166
1168<h3 id="sessionstart">1167<h3 id="sessionstart">
1169 SessionStart1168 SessionStart
1171 1170
1172Wird ausgeführt, wenn Claude Code eine neue Sitzung startet oder eine bestehende Sitzung fortsetzt. Nützlich, um Entwicklungskontext wie bestehende Issues oder kürzliche Änderungen an Ihrer Codebasis zu laden oder Umgebungsvariablen einzurichten. Für statischen Kontext, der kein Skript erfordert, verwenden Sie stattdessen [CLAUDE.md](/docs/de/memory).1171Wird ausgeführt, wenn Claude Code eine neue Sitzung startet oder eine bestehende Sitzung fortsetzt. Nützlich, um Entwicklungskontext wie bestehende Issues oder kürzliche Änderungen an Ihrer Codebasis zu laden oder Umgebungsvariablen einzurichten. Für statischen Kontext, der kein Skript erfordert, verwenden Sie stattdessen [CLAUDE.md](/docs/de/memory).
1173 1172
1174SessionStart wird bei jeder Sitzung ausgeführt, halten Sie diese Hooks daher schnell. Nur Hooks vom Typ `type: "command"` und `type: "mcp_tool"` werden unterstützt. Unter [MCP-Tool-Hook-Felder](#mcp-tool-hook-fields) erfahren Sie, wann `mcp_tool`-Hooks ausgeführt werden.1173SessionStart wird bei jeder Sitzung ausgeführt, halten Sie diese Hooks daher schnell. Nur Hooks vom Typ `type: "command"` und `type: "mcp_tool"` werden unterstützt. Unter [Felder für MCP-Tool-Hooks](#mcp-tool-hook-fields) erfahren Sie, wann `mcp_tool`-Hooks ausgeführt werden.
1175 1174
1176Der Matcher-Wert entspricht der Art, wie die Sitzung gestartet wurde:1175Der Matcher-Wert entspricht der Art, wie die Sitzung eingeleitet wurde:
1177 1176
1178| Matcher | Wann er ausgelöst wird |1177| Matcher | Wann er ausgelöst wird |
1179| :- | :- |1178| :- | :- |
1185 1184
1186Vor v2.1.214 meldeten abgezweigte Sitzungen die Quelle `"resume"`.1185Vor v2.1.214 meldeten abgezweigte Sitzungen die Quelle `"resume"`.
1187 1186
1188Wenn Sie eine interaktive Sitzung starten, beim Start eine Konversation mit `--continue` oder `--resume` fortsetzen oder `/clear` ausführen, laufen SessionStart-Hooks im Hintergrund. Sie können sofort tippen, und eine fortgesetzte Konversation erscheint, ohne auf die Hooks zu warten. Claudes erste Antwort wartet dennoch, bis die Hooks abgeschlossen sind, damit deren Kontext Claude erreicht.1187Wenn Sie eine interaktive Sitzung starten, eine Konversation beim Start mit `--continue` oder `--resume` fortsetzen oder `/clear` ausführen, laufen SessionStart-Hooks im Hintergrund. Sie können sofort tippen, und eine fortgesetzte Konversation erscheint, ohne auf die Hooks zu warten. Die erste Antwort von Claude wartet dennoch, bis die Hooks abgeschlossen sind, damit deren Kontext Claude erreicht.
1189 1188
1190Wenn Sie innerhalb einer Sitzung mit `/resume` die Konversation wechseln, wartet der Wechsel stattdessen, bis die Hooks abgeschlossen sind. Wenn Sie `/clear` ausführen oder zu einer anderen Konversation wechseln, während Hintergrund-Hooks noch laufen, wird nichts von dem, was sie zurückgeben, auf die Sitzung angewendet.1189Wenn Sie innerhalb einer Sitzung mit `/resume` die Konversation wechseln, wartet der Wechsel stattdessen auf den Abschluss der Hooks. Wenn Sie `/clear` ausführen oder zu einer anderen Konversation wechseln, während Hintergrund-Hooks noch laufen, wird nichts von dem, was sie zurückgeben, auf die Sitzung angewendet.
1191 1190
1192Dieselbe Wartezeit gilt beim Start, auch für eine fortgesetzte Sitzung: Ein Prompt, den Sie senden, während SessionStart-Hooks noch laufen, erreicht Claude erst, wenn diese abgeschlossen sind.1191Dasselbe Warten gilt beim Start, auch für eine fortgesetzte Sitzung: Ein Prompt, den Sie senden, während SessionStart-Hooks noch laufen, erreicht Claude erst, wenn sie abgeschlossen sind.
1193 1192
1194Drücken Sie während einer dieser Wartezeiten `Esc`, um den Prompt zurück in die Eingabe zu holen, ohne ihn zu senden. Die Hooks laufen weiter.1193Drücken Sie während eines dieser Wartevorgänge `Esc`, um den Prompt zurück in das Eingabefeld zu holen, ohne ihn zu senden. Die Hooks laufen weiter.
1195 1194
1196<h4 id="sessionstart-input">1195<h4 id="sessionstart-input">
1197 SessionStart-Eingabe1196 SessionStart-Eingabe
1203| :- | :- |1202| :- | :- |
1204| `source` | Wie die Sitzung gestartet wurde: `"startup"` für neue Sitzungen, `"resume"` für fortgesetzte Sitzungen, `"clear"` nach `/clear`, `"compact"` nach einer Komprimierung oder `"fork"` für eine neue Sitzung, die von einer bestehenden abgezweigt wurde |1203| `source` | Wie die Sitzung gestartet wurde: `"startup"` für neue Sitzungen, `"resume"` für fortgesetzte Sitzungen, `"clear"` nach `/clear`, `"compact"` nach einer Komprimierung oder `"fork"` für eine neue Sitzung, die von einer bestehenden abgezweigt wurde |
1205| `model` | Die aktive Modellkennung. Sie kann fehlen, zum Beispiel nach `/clear` oder wenn eine Sitzung über die Konversationswiederherstellung wiederhergestellt wird. Prüfen Sie daher, ob das Feld vorhanden ist, bevor Sie es lesen |1204| `model` | Die aktive Modellkennung. Sie kann fehlen, zum Beispiel nach `/clear` oder wenn eine Sitzung über die Konversationswiederherstellung wiederhergestellt wird. Prüfen Sie daher, ob das Feld vorhanden ist, bevor Sie es lesen |
1206| `agent_type` | Der Name des Agenten, vorhanden, wenn Sie Claude Code mit `claude --agent <name>` starten |1205| `agent_type` | Der Agentenname, vorhanden, wenn Sie Claude Code mit `claude --agent <name>` starten |
1207| `session_title` | Der benutzerdefinierte Titel der Sitzung, vorhanden, wenn einer gesetzt ist, zum Beispiel mit `--name`, `/rename`, der `sessionTitle`-Ausgabe eines Hooks oder `renameSession()` des Agent SDK. Ein Hook, der `sessionTitle` ausgibt, kann zuerst dieses Feld prüfen, um einen bestehenden benutzerdefinierten Titel nicht zu überschreiben |1206| `session_title` | Der benutzerdefinierte Titel der Sitzung, vorhanden, wenn einer gesetzt ist, zum Beispiel mit `--name`, `/rename`, der `sessionTitle`-Ausgabe eines Hooks oder `renameSession()` des Agent SDK. Ein Hook, der `sessionTitle` ausgibt, kann zuerst dieses Feld prüfen, um einen vorhandenen benutzerdefinierten Titel nicht zu überschreiben |
1208 1207
1209Eine Sitzung, die Sie nicht benannt haben, kann dennoch einen [generierten Titel](/docs/de/sessions#name-your-sessions) haben. Dieser Titel ist kein benutzerdefinierter Titel und erscheint nicht in `session_title`.1208Eine Sitzung, die Sie nicht benannt haben, kann trotzdem einen [generierten Titel](/docs/de/sessions#name-your-sessions) haben. Dieser Titel ist kein benutzerdefinierter Titel und erscheint nicht in `session_title`.
1210 1209
1211Wenn `source` den Wert `"resume"` oder `"fork"` hat und das Transkript mindestens eine Antwort von Claude enthält, erhalten SessionStart-Hooks zusätzlich die folgenden vier Felder. Ihr Hook kann damit vor der ersten Anfrage melden, was das Fortsetzen einer veralteten Konversation kostet, zum Beispiel in einer [`systemMessage`](#json-output). Diese Felder erfordern Claude Code v2.1.251 oder höher.1210Wenn `source` den Wert `"resume"` oder `"fork"` hat und das Transkript mindestens eine Antwort von Claude enthält, erhalten SessionStart-Hooks zusätzlich die vier folgenden Felder. Ihr Hook kann damit vor der ersten Anfrage melden, was das Fortsetzen einer länger inaktiven Konversation kostet, zum Beispiel in einer [`systemMessage`](#json-output). Diese Felder erfordern Claude Code v2.1.251 oder höher.
1212 1211
1213| Feld | Beschreibung |1212| Feld | Beschreibung |
1214| :- | :- |1213| :- | :- |
1215| `seconds_since_last_response` | Echtzeit in Sekunden seit der letzten Antwort im fortgesetzten Transkript |1214| `seconds_since_last_response` | Verstrichene Echtzeit in Sekunden seit der letzten Antwort im fortgesetzten Transkript |
1216| `context_tokens` | Token, die die erste Anfrage der fortgesetzten Sitzung erneut als Prompt sendet |1215| `context_tokens` | Token, die die erste Anfrage der fortgesetzten Sitzung erneut als Prompt sendet |
1217| `prompt_cache_likely_expired` | `true`, wenn die letzte Antwort älter ist als die [Lebensdauer des Prompt-Cache](/docs/de/prompt-caching#cache-lifetime) der Sitzung oder eine spätere Komprimierung die zwischengespeicherte Konversation ersetzt hat |1216| `prompt_cache_likely_expired` | `true`, wenn die letzte Antwort älter als die [Lebensdauer des Prompt-Cache](/docs/de/prompt-caching#cache-lifetime) der Sitzung ist oder eine spätere Komprimierung die zwischengespeicherte Konversation ersetzt hat |
1218| `estimated_cache_write_usd` | Geschätzte Kosten in US-Dollar für das Schreiben von `context_tokens` in den Prompt-Cache mit dem Modell der Sitzung, ohne die Antwort |1217| `estimated_cache_write_usd` | Geschätzte Kosten in US-Dollar für das Schreiben von `context_tokens` in den Prompt-Cache mit dem Modell der Sitzung, ohne die Antwort |
1219 1218
1220Dieses Beispiel zeigt die Eingabe für eine Sitzung, die 90 Minuten nach ihrer letzten Antwort fortgesetzt wurde:1219Dieses Beispiel zeigt die Eingabe für eine Sitzung, die 90 Minuten nach ihrer letzten Antwort fortgesetzt wurde:
1238 SessionStart-Entscheidungssteuerung1237 SessionStart-Entscheidungssteuerung
1239</h4>1238</h4>
1240 1239
1241Claude Code fügt stdout, das es [als reinen Text behandelt](#exit-code-0), zu Claudes Kontext hinzu. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können Sie diese ereignisspezifischen Felder zurückgeben: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:
1242 1241
1243| Feld | Beschreibung |1242| Feld | Beschreibung |
1244| :- | :- |1243| :- | :- |
1245| `additionalContext` | Zeichenkette, die zu Beginn der Konversation vor dem ersten Prompt zu Claudes Kontext hinzugefügt wird. Unter [Kontext für Claude hinzufügen](#add-context-for-claude) erfahren Sie, wie der Text übermittelt wird und was hineingehört |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 |
1246| `initialUserMessage` | Zeichenkette, die als erste Benutzernachricht der Sitzung verwendet wird. Gilt im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p`, wo sie zum ersten Turn wird, auch wenn kein Prompt angegeben ist. Wird ein Prompt angegeben, folgt er als nächster Turn. Anders als `additionalContext`, das an einen bestehenden Turn angehängt wird, erzeugt dieses Feld den Turn |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 |
1247| `sessionTitle` | Setzt den Sitzungstitel, mit derselben Wirkung wie `/rename`. Verwenden Sie es, 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 |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 |
1248| `watchPaths` | Array absoluter Pfade, die während dieser Sitzung auf [FileChanged](#filechanged)-Ereignisse überwacht werden |1247| `watchPaths` | Array absoluter Pfade, die während dieser Sitzung auf [FileChanged](#filechanged)-Ereignisse überwacht werden sollen |
1249| `reloadSkills` | Boolescher Wert. Bei `true` durchsucht Claude Code die [Skill](/docs/de/skills)- und Befehlsverzeichnisse erneut, nachdem die SessionStart-Hooks abgeschlossen sind, sodass vom Hook installierte Skills in derselben Sitzung ab dem ersten Prompt verfügbar sind |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 |
1250 1249
1251```json theme={null}1250```json theme={null}
1252{1251{
1258}1257}
1259```1258```
1260 1259
1261Da reines stdout bei diesem Ereignis Claude bereits erreicht, kann ein Hook, der nur Kontext lädt, direkt auf stdout ausgeben, ohne JSON zu erzeugen. Verwenden Sie die JSON-Form, wenn Sie Kontext mit anderen Feldern wie `sessionTitle` kombinieren müssen.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.
1262 1261
1263Verwenden 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: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:
1264 1263
1271echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1270echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1272```1271```
1273 1272
1274Die 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`-Anfrage trotzdem.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.
1275 1274
1276<h4 id="persist-environment-variables">1275<h4 id="persist-environment-variables">
1277 Umgebungsvariablen dauerhaft speichern1276 Umgebungsvariablen beibehalten
1278</h4>1277</h4>
1279 1278
1280SessionStart-Hooks haben Zugriff auf die Umgebungsvariable `CLAUDE_ENV_FILE`, die einen Dateipfad bereitstellt, unter dem Sie Umgebungsvariablen für nachfolgende Bash-Befehle dauerhaft speichern können.1279SessionStart-Hooks haben Zugriff auf die Umgebungsvariable `CLAUDE_ENV_FILE`, die einen Dateipfad bereitstellt, in dem Sie Umgebungsvariablen für nachfolgende Bash-Befehle dauerhaft speichern können.
1281 1280
1282Um einzelne Umgebungsvariablen zu setzen, schreiben Sie `export`-Anweisungen in `CLAUDE_ENV_FILE`. Verwenden Sie Anhängen (`>>`), um von anderen Hooks gesetzte Variablen zu erhalten:1281Um einzelne Umgebungsvariablen zu setzen, schreiben Sie `export`-Anweisungen in `CLAUDE_ENV_FILE`. Verwenden Sie Anhängen (`>>`), um von anderen Hooks gesetzte Variablen zu erhalten:
1283 1282
1293exit 01292exit 0
1294```1293```
1295 1294
1296Um alle Umgebungsänderungen durch Einrichtungsbefehle zu erfassen, vergleichen Sie die exportierten Variablen vorher und nachher:1295Um alle Umgebungsänderungen aus Einrichtungsbefehlen zu erfassen, vergleichen Sie die exportierten Variablen vorher und nachher:
1297 1296
1298```bash theme={null}1297```bash theme={null}
1299#!/bin/bash1298#!/bin/bash
1320 Setup1319 Setup
1321</h3>1320</h3>
1322 1321
1323Wird nur ausgelöst, wenn Sie Claude Code mit `--init-only` oder mit `--init` bzw. `--maintenance` im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p` starten. Beim normalen Start wird es nicht ausgelöst. Verwenden Sie es für die einmalige Installation von Abhängigkeiten oder für geplante Bereinigungen, die Sie explizit aus CI oder Skripten auslösen, getrennt vom normalen Sitzungsstart. Für die Initialisierung pro Sitzung verwenden Sie stattdessen [SessionStart](#sessionstart).1322Wird nur ausgelöst, wenn Sie Claude Code mit `--init-only` starten oder mit `--init` bzw. `--maintenance` im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p`. Beim normalen Start wird es nicht ausgelöst. Verwenden Sie es für eine einmalige Installation von Abhängigkeiten oder eine geplante Bereinigung, die Sie explizit aus CI oder Skripten auslösen, getrennt vom normalen Sitzungsstart. Für die Initialisierung pro Sitzung verwenden Sie stattdessen [SessionStart](#sessionstart).
1324 1323
1325Der Matcher-Wert entspricht dem CLI-Flag, das den Hook ausgelöst hat:1324Der Matcher-Wert entspricht dem CLI-Flag, das den Hook ausgelöst hat:
1326 1325
1331 1330
1332Wenn Sie `claude --init-only` ausführen, führt Claude Code Setup-Hooks und `SessionStart`-Hooks mit dem Matcher `startup` aus und beendet sich dann, ohne eine Konversation zu starten.1331Wenn Sie `claude --init-only` ausführen, führt Claude Code Setup-Hooks und `SessionStart`-Hooks mit dem Matcher `startup` aus und beendet sich dann, ohne eine Konversation zu starten.
1333 1332
1334Wenn Sie eine Konversation mit `-p` starten oder fortsetzen, müssen Sie außerdem einen Prompt angeben, als Argument oder über stdin weitergeleitet. Sie können den Prompt weglassen, wenn ein `SessionStart`-Hook [`initialUserMessage`](#sessionstart-decision-control) liefert oder wenn Sie eine Sitzung mit einem [zurückgestellten Tool-Aufruf](#defer-a-tool-call-for-later) fortsetzen.1333Wenn Sie eine Konversation mit `-p` starten oder fortsetzen, müssen Sie außerdem einen Prompt angeben, als Argument oder über stdin. Sie können den Prompt weglassen, wenn ein `SessionStart`-Hook [`initialUserMessage`](#sessionstart-decision-control) liefert oder wenn Sie eine Sitzung mit einem [zurückgestellten Tool-Aufruf](#defer-a-tool-call-for-later) fortsetzen.
1335 1334
1336Bei Erfolg gibt `--init-only` nichts im Terminal aus. Um zu bestätigen, dass die Hooks ausgeführt wurden, starten Sie mit `claude --debug-file <path> --init-only`, ersetzen `<path>` durch einen Speicherort für die Logdatei und prüfen das Log auf die Einträge der Setup- und SessionStart-Hooks.1335Bei Erfolg gibt `--init-only` nichts im Terminal aus. Um zu bestätigen, dass die Hooks ausgeführt wurden, starten Sie mit `claude --debug-file <path> --init-only`, ersetzen `<path>` durch den Speicherort einer Logdatei und prüfen das Log auf die Einträge der Setup- und SessionStart-Hooks.
1337 1336
1338Da Setup nicht bei jedem Start ausgelöst wird, kann sich ein Plugin, das eine installierte Abhängigkeit benötigt, nicht allein auf Setup verlassen. Das praktikable Muster besteht darin, bei der ersten Verwendung auf die Abhängigkeit zu prüfen und sie bei Fehlen zu installieren, zum Beispiel mit einem Hook oder Skill, der auf `${CLAUDE_PLUGIN_DATA}/node_modules` prüft und `npm install` ausführt, wenn es fehlt. Unter [Persistentes Datenverzeichnis](/docs/de/plugins/components#path-variables-and-persistent-data) erfahren Sie, wo installierte Abhängigkeiten gespeichert werden. Wenn Sie Ihr Plugin über einen Marketplace verteilen, benötigen Sie dieses Muster möglicherweise nicht: Claude Code [installiert geeignete Node.js-Paketabhängigkeiten automatisch](/docs/de/plugins/loading#node-js-package-dependencies), wenn es das Plugin im Cache speichert.1337Da Setup nicht bei jedem Start ausgelöst wird, kann sich ein Plugin, das eine installierte Abhängigkeit benötigt, nicht allein auf Setup verlassen. Das praktische Muster besteht darin, bei der ersten Verwendung auf die Abhängigkeit zu prüfen und sie bei Fehlen zu installieren, zum Beispiel mit einem Hook oder Skill, der auf `${CLAUDE_PLUGIN_DATA}/node_modules` prüft und `npm install` ausführt, wenn es fehlt. Unter [persistentes Datenverzeichnis](/docs/de/plugins/components#path-variables-and-persistent-data) erfahren Sie, wo installierte Abhängigkeiten gespeichert werden sollten. Wenn Sie Ihr Plugin über einen Marketplace verteilen, benötigen Sie dieses Muster möglicherweise nicht: Claude Code [installiert geeignete Node.js-Paketabhängigkeiten automatisch](/docs/de/plugins/loading#node-js-package-dependencies), wenn es das Plugin im Cache speichert.
1339 1338
1340<h4 id="setup-input">1339<h4 id="setup-input">
1341 Setup-Eingabe1340 Setup-Eingabe
1359 1358
1360Setup-Hooks können nicht blockieren; die Ausführung wird bei jedem Exit-Code fortgesetzt. Bei jedem Exit-Code verwirft Claude Code die [JSON-Ausgabefelder](#json-output) eines Setup-Hooks, etwa `systemMessage`, `continue` und `hookSpecificOutput.additionalContext`. Mit `-p` erscheinen stdout, stderr und Exit-Code eines Setup-Hooks in der Ausgabe des Laufs nur als [`hook_response`-Ereignisse](/docs/de/headless#read-session-metadata), wenn Sie mit `--output-format stream-json --verbose` starten.1359Setup-Hooks können nicht blockieren; die Ausführung wird bei jedem Exit-Code fortgesetzt. Bei jedem Exit-Code verwirft Claude Code die [JSON-Ausgabefelder](#json-output) eines Setup-Hooks, etwa `systemMessage`, `continue` und `hookSpecificOutput.additionalContext`. Mit `-p` erscheinen stdout, stderr und Exit-Code eines Setup-Hooks in der Ausgabe des Laufs nur als [`hook_response`-Ereignisse](/docs/de/headless#read-session-metadata), wenn Sie mit `--output-format stream-json --verbose` starten.
1361 1360
1362Setup-Hooks haben Zugriff auf `CLAUDE_ENV_FILE`. In diese Datei geschriebene Variablen bleiben für nachfolgende Bash-Befehle der Sitzung erhalten, wie bei [SessionStart-Hooks](#persist-environment-variables). Bei `Setup` werden nur Hooks vom Typ `type: "command"` ausgeführt. Ein Hook vom Typ `type: "mcp_tool"` bei `Setup` wird immer übersprungen, wie unter [MCP-Tool-Hook-Felder](#mcp-tool-hook-fields) beschrieben.1361Setup-Hooks haben Zugriff auf `CLAUDE_ENV_FILE`. In diese Datei geschriebene Variablen bleiben für nachfolgende Bash-Befehle der Sitzung erhalten, wie bei [SessionStart-Hooks](#persist-environment-variables). Bei `Setup` werden nur Hooks vom Typ `type: "command"` ausgeführt. Ein Hook vom Typ `type: "mcp_tool"` bei `Setup` wird immer übersprungen, wie unter [Felder für MCP-Tool-Hooks](#mcp-tool-hook-fields) beschrieben.
1363 1362
1364<h3 id="instructionsloaded">1363<h3 id="instructionsloaded">
1365 InstructionsLoaded1364 InstructionsLoaded
1366</h3>1365</h3>
1367 1366
1368Wird ausgelöst, wenn eine `CLAUDE.md`- oder `.claude/rules/*.md`-Datei in den Kontext geladen wird. Dieses Ereignis wird beim Sitzungsstart für sofort geladene Dateien ausgelöst und später erneut, wenn Dateien verzögert geladen werden, zum Beispiel wenn Claude auf ein Unterverzeichnis zugreift, das eine verschachtelte `CLAUDE.md` enthält, oder wenn bedingte Regeln mit `paths:`-Frontmatter zutreffen. Der Hook unterstützt weder Blockieren noch Entscheidungssteuerung. Er läuft asynchron zu Beobachtungszwecken.1367Wird ausgelöst, wenn eine `CLAUDE.md`- oder `.claude/rules/*.md`-Datei in den Kontext geladen wird. Dieses Ereignis wird beim Sitzungsstart für sofort geladene Dateien ausgelöst und später erneut, wenn Dateien verzögert geladen werden, zum Beispiel wenn Claude auf ein Unterverzeichnis zugreift, das eine verschachtelte `CLAUDE.md` enthält, oder wenn bedingte Regeln mit `paths:`-Frontmatter zutreffen. Der Hook unterstützt weder Blockieren noch Entscheidungssteuerung. Er läuft asynchron zu Beobachtbarkeitszwecken.
1369 1368
1370Dieses Ereignis wird nicht ausgelöst, wenn Claude über die Einstellung **Project instructions** [`AGENTS.md` direkt liest](/docs/de/memory#agents-md). Es wird ausgelöst, wenn eine `CLAUDE.md` Ihre `AGENTS.md` importiert, wobei `load_reason` wie bei jeder anderen importierten Datei auf `include` gesetzt ist, und wenn `CLAUDE.md` ein Symlink darauf ist, als normales Laden von `CLAUDE.md`.1369Dieses Ereignis wird nicht ausgelöst, wenn Claude über die Einstellung **Project instructions** [`AGENTS.md` direkt liest](/docs/de/memory#agents-md). Es wird ausgelöst, wenn eine `CLAUDE.md` Ihre `AGENTS.md` importiert, wobei `load_reason` wie bei jeder anderen importierten Datei auf `include` gesetzt ist, und wenn `CLAUDE.md` ein Symlink darauf ist, als normales Laden von `CLAUDE.md`.
1371 1370
1372Der Matcher wird gegen `load_reason` ausgewertet. Verwenden Sie zum Beispiel `"matcher": "session_start"`, um nur für beim Sitzungsstart geladene Dateien auszulösen, oder `"matcher": "path_glob_match|nested_traversal"`, um nur bei verzögertem Laden auszulösen.1371Der Matcher wird gegen `load_reason` geprüft. Verwenden Sie zum Beispiel `"matcher": "session_start"`, um nur für beim Sitzungsstart geladene Dateien auszulösen, oder `"matcher": "path_glob_match|nested_traversal"`, um nur bei verzögertem Laden auszulösen.
1373 1372
1374<h4 id="instructionsloaded-input">1373<h4 id="instructionsloaded-input">
1375 InstructionsLoaded-Eingabe1374 InstructionsLoaded-Eingabe
1381| :- | :- |1380| :- | :- |
1382| `file_path` | Absoluter Pfad zur geladenen Anweisungsdatei |1381| `file_path` | Absoluter Pfad zur geladenen Anweisungsdatei |
1383| `memory_type` | Geltungsbereich der Datei: `"User"`, `"Project"`, `"Local"` oder `"Managed"` |1382| `memory_type` | Geltungsbereich der Datei: `"User"`, `"Project"`, `"Local"` oder `"Managed"` |
1384| `load_reason` | Warum die Datei geladen wurde: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` oder `"compact"`. Der Wert `"compact"` tritt auf, wenn Anweisungsdateien nach einem Komprimierungsereignis erneut geladen werden |1383| `load_reason` | Warum die Datei geladen wurde: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` oder `"compact"`. Der Wert `"compact"` tritt auf, wenn Anweisungsdateien nach einer Komprimierung erneut geladen werden |
1385| `globs` | Pfad-Glob-Muster aus dem `paths:`-Frontmatter der Datei, falls vorhanden. Nur bei `path_glob_match`-Ladevorgängen vorhanden |1384| `globs` | Pfad-Glob-Muster aus dem `paths:`-Frontmatter der Datei, falls vorhanden. Nur bei `path_glob_match`-Ladevorgängen vorhanden |
1386| `trigger_file_path` | Pfad zu der Datei, deren Zugriff dieses Laden ausgelöst hat, bei verzögertem Laden |1385| `trigger_file_path` | Pfad zu der Datei, deren Zugriff diesen Ladevorgang ausgelöst hat, bei verzögertem Laden |
1387| `parent_file_path` | Pfad zur übergeordneten Anweisungsdatei, die diese eingebunden hat, bei `include`-Ladevorgängen |1386| `parent_file_path` | Pfad zur übergeordneten Anweisungsdatei, die diese eingebunden hat, bei `include`-Ladevorgängen |
1388 1387
1389```json theme={null}1388```json theme={null}
1408 UserPromptSubmit1407 UserPromptSubmit
1409</h3>1408</h3>
1410 1409
1411Wird ausgeführt, wenn ein Prompt gesendet wird, bevor Claude ihn verarbeitet. Damit können Sie1410Wird ausgeführt, wenn ein Prompt übermittelt wird, bevor Claude ihn verarbeitet. So können Sie
1412zusätzlichen Kontext basierend auf dem Prompt bzw. der Konversation hinzufügen, Prompts validieren oder1411zusätzlichen Kontext basierend auf dem Prompt bzw. der Konversation hinzufügen, Prompts validieren oder
1413bestimmte Arten von Prompts blockieren.1412bestimmte Arten von Prompts blockieren.
1414 1413
1415`UserPromptSubmit`-Hooks werden nicht nur bei Prompts ausgelöst, die Sie eintippen. Claude Code führt sie auch aus, wenn:1414`UserPromptSubmit`-Hooks werden nicht nur bei Prompts ausgelöst, die Sie eingeben. Claude Code führt sie auch in folgenden Fällen aus:
1416 1415
1417* eine [geplante Aufgabe](/docs/de/scheduled-tasks) ausgelöst wird, einschließlich einer `/loop`-Iteration1416* Eine [geplante Aufgabe](/docs/de/scheduled-tasks) wird ausgelöst, einschließlich einer `/loop`-Iteration
1418* ein [Hintergrund-Subagent](/docs/de/sub-agents#run-subagents-in-foreground-or-background) an die Sitzung zurückmeldet, die ihn gestartet hat1417* Ein [Hintergrund-Subagent](/docs/de/sub-agents#run-subagents-in-foreground-or-background) meldet sich bei der Sitzung zurück, die ihn gestartet hat
1419* [eine andere Sitzung eine Nachricht](/docs/de/cross-session-messaging) an Ihre Hauptkonversation sendet1418* Eine [Nachricht, die eine andere Sitzung](/docs/de/cross-session-messaging) an Ihre Hauptkonversation sendet
1420 1419
1421`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 ausgeführt wird und die Verarbeitung durch das Modell blockiert, bis er abgeschlossen ist, legt ein hängender Hook die Sitzung lahm. Wenn Ihr Hook mehr Zeit benötigt, setzen Sie das Feld `timeout` im Hook-Eintrag.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.
1422 1421
1423Abgesehen 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 etwaigen `additionalContext` wird verworfen. Der Prompt erreicht Claude trotzdem, aber ohne diesen Kontext. Das Transkript zeigt einen Hinweis mit dem Namen des Hooks, dem ausgelösten Timeout und der Angabe, dass die Ausgabe verworfen wurde.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.
1424 1423
1425Ein [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, da 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.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.
1426 1425
1427<h4 id="userpromptsubmit-input">1426<h4 id="userpromptsubmit-input">
1428 UserPromptSubmit-Eingabe1427 UserPromptSubmit-Eingabe
1429</h4>1428</h4>
1430 1429
1431Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten UserPromptSubmit-Hooks das Feld `prompt` mit dem gesendeten Text. Eingefügter Inhalt, der zu einem Platzhalter `[Pasted text #N]` zusammengeklappt wurde, kommt an Ort und Stelle erweitert an. In Sitzungen, in denen Claude Code [eingefügten Text für Claude kennzeichnet](/docs/de/terminal-config#how-claude-treats-pasted-text), steht dieser erweiterte Inhalt zwischen einer Zeile `<pasted_content id="…">` und einer Zeile `</pasted_content id="…">`; berücksichtigen Sie diese Zeilen, wenn Ihr Hook den Prompt parst.1430Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten UserPromptSubmit-Hooks das Feld `prompt` mit dem übermittelten Text. Eingefügter Inhalt, der zu einem Platzhalter `[Pasted text #N]` zusammengeklappt wurde, kommt an Ort und Stelle erweitert an. In Sitzungen, in denen Claude Code [eingefügten Text für Claude kennzeichnet](/docs/de/terminal-config#how-claude-treats-pasted-text), steht dieser erweiterte Inhalt zwischen einer Zeile `<pasted_content id="…">` und einer Zeile `</pasted_content id="…">`. Berücksichtigen Sie diese Zeilen, wenn Ihr Hook den Prompt parst.
1432 1431
1433UserPromptSubmit-Hooks erhalten außerdem `session_title`, wenn die Sitzung einen benutzerdefinierten Titel hat, mit derselben Bedeutung wie das [SessionStart-Feld `session_title`](#sessionstart-input).1432UserPromptSubmit-Hooks erhalten außerdem `session_title`, wenn die Sitzung einen benutzerdefinierten Titel hat, mit derselben Bedeutung wie das [SessionStart-Feld `session_title`](#sessionstart-input).
1434 1433
1447 UserPromptSubmit-Entscheidungssteuerung1446 UserPromptSubmit-Entscheidungssteuerung
1448</h4>1447</h4>
1449 1448
1450`UserPromptSubmit`-Hooks können steuern, ob ein gesendeter Prompt verarbeitet wird, und Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.1449`UserPromptSubmit`-Hooks können steuern, ob ein übermittelter Prompt verarbeitet wird, und Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.
1451 1450
1452Es gibt zwei Möglichkeiten, bei Exit-Code 0 Kontext zur Konversation hinzuzufügen:1451Es gibt zwei Möglichkeiten, bei Exit-Code 0 Kontext zur Konversation hinzuzufügen:
1453 1452
1454* **Reiner Text auf stdout**: Claude Code fügt stdout, das es [als reinen Text behandelt](#exit-code-0), zu Claudes Kontext hinzu1453* **Reiner Text auf stdout**: Claude Code fügt stdout, das es [als reinen Text behandelt](#exit-code-0), dem Kontext von Claude hinzu
1455* **JSON mit `additionalContext`**: Verwenden Sie das unten gezeigte JSON-Format für mehr Kontrolle. Das Feld `additionalContext` wird als Kontext hinzugefügt1454* **JSON mit `additionalContext`**: Verwenden Sie das folgende JSON-Format für mehr Kontrolle. Das Feld `additionalContext` wird als Kontext hinzugefügt
1456 1455
1457Keiner der beiden Kanäle erzeugt einen sichtbaren Eintrag im Transkript. Reines stdout und der Wert von `additionalContext` werden jeweils als System-Erinnerung eingefügt, die mit dem Namen des Hooks beginnt; Claude liest beide. Um die Übermittlung zu bestätigen, prüfen Sie das [Debug-Log](#debug-hooks).1456Keiner der beiden Kanäle erzeugt einen sichtbaren Transkripteintrag. Reines stdout und der Wert von `additionalContext` werden jeweils als System-Erinnerung eingefügt, die mit dem Namen des Hooks beginnt; Claude liest beide. Um die Übermittlung zu bestätigen, prüfen Sie das [Debug-Log](#debug-hooks).
1458 1457
1459Um einen Prompt zu blockieren, geben Sie ein JSON-Objekt zurück, in dem `decision` auf `"block"` gesetzt ist:1458Um einen Prompt zu blockieren, geben Sie ein JSON-Objekt zurück, in dem `decision` auf `"block"` gesetzt ist:
1460 1459
1461| Feld | Beschreibung |1460| Feld | Beschreibung |
1462| :- | :- |1461| :- | :- |
1463| `decision` | `"block"` hält den Prompt auf, bevor er Claude erreicht. Weglassen, damit der Prompt fortgesetzt wird |1462| `decision` | `"block"` stoppt den Prompt, bevor er Claude erreicht. Weglassen, um den Prompt fortfahren zu lassen |
1464| `reason` | Wird dem Benutzer angezeigt, wenn `decision` den Wert `"block"` hat. Wird nicht zum Kontext hinzugefügt |1463| `reason` | Wird dem Benutzer angezeigt, wenn `decision` den Wert `"block"` hat. Wird nicht dem Kontext hinzugefügt |
1465| `additionalContext` | Zeichenkette, die neben dem abgesendeten Prompt zu Claudes Kontext hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |1464| `additionalContext` | String, der zusammen mit dem übermittelten Prompt dem Kontext von Claude hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
1466| `sessionTitle` | Setzt den Sitzungstitel. Verwenden Sie es, um Sitzungen automatisch anhand des Prompt-Inhalts zu benennen |1465| `sessionTitle` | Legt den Sitzungstitel fest. Verwenden Sie dies, um Sitzungen automatisch anhand des Prompt-Inhalts zu benennen |
1467| `suppressOriginalPrompt` | Bei `true` lässt es den Prompt-Text aus der Blockierungsmeldung weg, wenn der Hook den Prompt blockiert. Siehe [Was ein blockierter Prompt hinterlässt](#what-a-blocked-prompt-leaves-behind) |1466| `suppressOriginalPrompt` | Bei `true` wird der Prompt-Text, wenn der Hook den Prompt blockiert, in der Blockierungsmeldung weggelassen. Siehe [Was ein blockierter Prompt hinterlässt](#what-a-blocked-prompt-leaves-behind) |
1468 1467
1469Ein Hook, der durch Beenden mit 2 blockiert, wird genauso behandelt wie `reason`: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text, und dieser wird nicht zum Kontext hinzugefügt.1468Ein Hook, der durch Beenden mit Exit-Code 2 blockiert, wird genauso behandelt wie `reason`: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text, und er wird nicht dem Kontext hinzugefügt.
1470 1469
1471```json theme={null}1470```json theme={null}
1472{1471{
1485 Was ein blockierter Prompt hinterlässt1484 Was ein blockierter Prompt hinterlässt
1486</h4>1485</h4>
1487 1486
1488Ein blockierter Prompt erreicht Claude nie, sein Text wird jedoch nicht überall entfernt. Standardmäßig endet die dem Benutzer angezeigte Blockierungsmeldung mit `Original prompt:`, gefolgt vom abgesendeten Text, und Claude Code schreibt diese Meldung in die Transkriptdatei der Sitzung auf der Festplatte. Um den Text aus der Meldung wegzulassen, geben Sie JSON mit `"suppressOriginalPrompt": true` innerhalb von `hookSpecificOutput` aus. Das funktioniert unabhängig davon, ob der Hook mit `decision: "block"` oder durch Beenden mit 2 blockiert.1487Ein blockierter Prompt erreicht Claude nie, aber sein Text wird nicht überall entfernt. Standardmäßig endet die dem Benutzer angezeigte Blockierungsmeldung mit `Original prompt:`, gefolgt vom übermittelten Text, und Claude Code schreibt diese Meldung in die Transkriptdatei der Sitzung auf dem Datenträger. Um den Text aus der Meldung wegzulassen, geben Sie JSON mit `"suppressOriginalPrompt": true` innerhalb von `hookSpecificOutput` aus. Das funktioniert unabhängig davon, ob der Hook mit `decision: "block"` oder durch Beenden mit Exit-Code 2 blockiert.
1489 1488
1490`suppressOriginalPrompt` ändert nur die Blockierungsmeldung. Der abgesendete Text kann weiterhin in lokalen Dateien wie dem Sitzungstranskript und Ihrem Prompt-Verlauf erscheinen, ein blockierender Hook ist also kein Mittel, um ein Geheimnis von der Festplatte fernzuhalten. Informationen zum Begrenzen oder Entfernen dieser Dateien finden Sie unter [Klartextspeicherung](/docs/de/claude-directory#plaintext-storage) und [Lokale Daten löschen](/docs/de/claude-directory#clear-local-data).1489`suppressOriginalPrompt` ändert nur die Blockierungsmeldung. Der übermittelte Text kann weiterhin in lokalen Dateien wie dem Sitzungstranskript und Ihrem Prompt-Verlauf erscheinen. Ein blockierender Hook ist also kein Weg, ein Geheimnis vom Datenträger fernzuhalten. Informationen zum Begrenzen oder Entfernen dieser Dateien finden Sie unter [Klartextspeicherung](/docs/de/claude-directory#plaintext-storage) und [Lokale Daten löschen](/docs/de/claude-directory#clear-local-data).
1491 1490
1492<h3 id="userpromptexpansion">1491<h3 id="userpromptexpansion">
1493 UserPromptExpansion1492 UserPromptExpansion
1494</h3>1493</h3>
1495 1494
1496Wird ausgeführt, wenn ein vom Benutzer eingegebener Befehl zu einem Prompt expandiert wird, bevor er Claude erreicht. Verwenden Sie dies, um bestimmte Befehle am direkten Aufruf zu hindern, Kontext für einen bestimmten Skill einzufügen oder zu protokollieren, welche Befehle Benutzer aufrufen. Zum Beispiel kann ein Hook, der auf `deploy` matcht, `/deploy` blockieren, sofern keine Genehmigungsdatei vorhanden ist, oder ein Hook, der auf einen Review-Skill matcht, die Review-Checkliste des Teams als `additionalContext` anhängen.1495Wird ausgeführt, wenn ein vom Benutzer eingegebener Befehl zu einem Prompt erweitert wird, bevor er Claude erreicht. Verwenden Sie dies, um bestimmte Befehle für den direkten Aufruf zu sperren, Kontext für einen bestimmten Skill einzufügen oder zu protokollieren, welche Befehle Benutzer aufrufen. Zum Beispiel kann ein Hook, der auf `deploy` passt, `/deploy` blockieren, sofern keine Genehmigungsdatei vorhanden ist, oder ein Hook, der auf einen Review-Skill passt, die Review-Checkliste des Teams als `additionalContext` anhängen.
1497 1496
1498Dieses Ereignis deckt den Weg ab, den `PreToolUse` nicht abdeckt: Ein `PreToolUse`-Hook, der auf das Tool `Skill` matcht, wird nur ausgelöst, wenn Claude das Tool aufruft, aber die direkte Eingabe von `/skillname` umgeht `PreToolUse`. `UserPromptExpansion` wird auf diesem direkten Weg ausgelöst.1497Dieses Ereignis deckt den Weg ab, den `PreToolUse` nicht abdeckt: Ein `PreToolUse`-Hook, der auf das Tool `Skill` passt, wird nur ausgelöst, wenn Claude das Tool aufruft, aber die direkte Eingabe von `/skillname` umgeht `PreToolUse`. `UserPromptExpansion` wird auf diesem direkten Weg ausgelöst.
1499 1498
1500Matcht auf `command_name`. Lassen Sie den Matcher leer, um bei jedem Befehl vom Typ Prompt auszulösen.1499Gleicht auf `command_name` ab. Lassen Sie den Matcher leer, um bei jedem Befehl vom Typ Prompt auszulösen.
1501 1500
1502<h4 id="userpromptexpansion-input">1501<h4 id="userpromptexpansion-input">
1503 UserPromptExpansion-Eingabe1502 UserPromptExpansion-Eingabe
1504</h4>1503</h4>
1505 1504
1506Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten UserPromptExpansion-Hooks `expansion_type`, `command_name`, `command_args`, `command_source` und die ursprüngliche Zeichenkette `prompt`. Das Feld `expansion_type` ist `slash_command` für Skills und benutzerdefinierte Befehle oder `mcp_prompt` für Prompts von MCP-Servern.1505Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten UserPromptExpansion-Hooks `expansion_type`, `command_name`, `command_args`, `command_source` und den ursprünglichen `prompt`-String. Das Feld `expansion_type` ist `slash_command` für Skills und benutzerdefinierte Befehle oder `mcp_prompt` für Prompts von MCP-Servern.
1507 1506
1508```json theme={null}1507```json theme={null}
1509{1508{
1524 UserPromptExpansion-Entscheidungssteuerung1523 UserPromptExpansion-Entscheidungssteuerung
1525</h4>1524</h4>
1526 1525
1527`UserPromptExpansion`-Hooks können die Expansion blockieren oder Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.1526`UserPromptExpansion`-Hooks können die Erweiterung blockieren oder Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.
1528 1527
1529| Feld | Beschreibung |1528| Feld | Beschreibung |
1530| :- | :- |1529| :- | :- |
1531| `decision` | `"block"` verhindert die Expansion des Befehls. Weglassen, damit er fortgesetzt wird |1530| `decision` | `"block"` verhindert die Erweiterung des Befehls. Weglassen, um fortzufahren |
1532| `reason` | Wird dem Benutzer angezeigt, wenn `decision` den Wert `"block"` hat |1531| `reason` | Wird dem Benutzer angezeigt, wenn `decision` den Wert `"block"` hat |
1533| `additionalContext` | Zeichenkette, die neben dem expandierten Prompt zu Claudes Kontext hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |1532| `additionalContext` | String, der zusammen mit dem erweiterten Prompt dem Kontext von Claude hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
1534 1533
1535Ein Hook, der durch Beenden mit 2 blockiert, wird genauso behandelt wie `reason`: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text.1534Ein Hook, der durch Beenden mit Exit-Code 2 blockiert, wird genauso behandelt wie `reason`: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text.
1536 1535
1537```json theme={null}1536```json theme={null}
1538{1537{
1549 MessageDisplay1548 MessageDisplay
1550</h3>1549</h3>
1551 1550
1552Wird ausgeführt, während eine Assistentennachricht auf den Bildschirm gestreamt wird. Claude Code zeigt die Nachricht in Schritten an: Jedes Mal, wenn ein Stapel neu abgeschlossener Zeilen zur Darstellung bereit ist, wird der Hook einmal mit diesen Zeilen ausgeführt, und Claude Code stellt an ihrer Stelle den Ersatztext des Hooks dar. Eine lange Nachricht erzeugt mehrere Aufrufe; eine kurze Nachricht möglicherweise nur einen.1551Wird ausgeführt, während eine Assistentennachricht auf den Bildschirm gestreamt wird. Claude Code zeigt die Nachricht schrittweise an: Jedes Mal, wenn ein Stapel neu vervollständigter Zeilen zur Darstellung bereit ist, wird der Hook einmal mit diesen Zeilen ausgeführt, und Claude Code stellt an ihrer Stelle den Ersatztext des Hooks dar. Eine lange Nachricht erzeugt mehrere Aufrufe; eine kurze Nachricht möglicherweise nur einen.
1553 1552
1554Verwenden Sie MessageDisplay, um:1553Verwenden Sie MessageDisplay, um:
1555 1554
1556* Markdown für eine minimale Anzeige zu entfernen1555* Markdown für eine minimalistische Anzeige zu entfernen
1557* den Text umzuwandeln, den eine Agent SDK-Anwendung ihren Benutzern anzeigt1556* den Text umzuwandeln, den eine Agent-SDK-Anwendung ihren Benutzern anzeigt
1558* API-Schlüssel oder interne Hostnamen aus Claudes Antworten zu schwärzen1557* API-Schlüssel oder interne Hostnamen aus den Antworten von Claude zu schwärzen
1559 1558
1560Claude Code hält jeden Stapel zurück, bis Ihr Hook zurückkehrt, halten Sie den Hook daher schnell. Wenn der Hook fehlschlägt oder eine Zeitüberschreitung auftritt, zeigt Claude Code den ursprünglichen Text an. Der Standard-Timeout für dieses Ereignis beträgt 10 Sekunden; wenn Ihr Hook mehr Zeit benötigt, setzen Sie das Feld `timeout` im Hook-Eintrag.1559Claude Code hält jeden Stapel zurück, bis Ihr Hook zurückkehrt. Halten Sie den Hook daher schnell. Wenn der Hook fehlschlägt oder eine Zeitüberschreitung auftritt, zeigt Claude Code den ursprünglichen Text an. Der Standard-Timeout für dieses Ereignis beträgt 10 Sekunden; wenn Ihr Hook mehr Zeit benötigt, setzen Sie das Feld `timeout` im Hook-Eintrag.
1561 1560
1562MessageDisplay dient nur der Anzeige: Der Ersatztext ändert nur, was auf dem Bildschirm dargestellt wird. Das Transkript und das, was Claude sieht, behalten den ursprünglichen Text, Claude sieht den Ersatz also nie, und der ausführliche Modus zeigt das Original. Der Hook erhält nur den Text von Assistentennachrichten, sodass Tool-Ergebnisse und der von Ihnen eingegebene Text unverändert dargestellt werden.1561MessageDisplay dient nur der Anzeige: Der Ersatztext ändert nur, was auf dem Bildschirm dargestellt wird. Das Transkript und das, was Claude sieht, behalten den ursprünglichen Text. Claude sieht den Ersatz also nie, und der ausführliche Modus zeigt das Original. Der Hook erhält nur den Text von Assistentennachrichten, sodass Tool-Ergebnisse und der von Ihnen eingegebene Text unverändert dargestellt werden.
1563 1562
1564MessageDisplay unterstützt keine Matcher und wird für jede Assistentennachricht ausgelöst, die Text streamt; Nachrichten ohne Text, etwa Antworten, die nur aus Tool-Aufrufen bestehen, lösen es nicht aus.1563MessageDisplay unterstützt keine Matcher und wird für jede Assistentennachricht ausgelöst, die Text streamt; Nachrichten ohne Text, etwa Antworten, die nur aus Tool-Aufrufen bestehen, lösen es nicht aus.
1565 1564
1566In nicht interaktiven Läufen, einschließlich Agent SDK-Abfragen und `claude -p`, wird MessageDisplay einmal pro Assistentennachricht statt einmal pro Zeilenstapel ausgeführt. Der einzelne Aufruf erfolgt nach Abschluss der Nachricht und enthält den vollständigen Nachrichtentext: `index` ist `0`, `final` ist `true`, und `delta` enthält die gesamte Nachricht. Ein Hook, der den `delta`-Text jeder Nachricht sammelt, erhält in beiden Modi denselben Gesamttext.1565In nicht interaktiven Läufen, einschließlich Agent-SDK-Abfragen und `claude -p`, wird MessageDisplay einmal pro Assistentennachricht statt einmal pro Zeilenstapel ausgeführt. Der einzelne Aufruf erfolgt nach Abschluss der Nachricht und enthält den vollständigen Nachrichtentext: `index` ist `0`, `final` ist `true`, und `delta` enthält die gesamte Nachricht. Ein Hook, der den `delta`-Text jeder Nachricht sammelt, erhält in beiden Modi denselben Gesamttext.
1567 1566
1568<h4 id="messagedisplay-input">1567<h4 id="messagedisplay-input">
1569 MessageDisplay-Eingabe1568 MessageDisplay-Eingabe
1570</h4>1569</h4>
1571 1570
1572Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten MessageDisplay-Hooks Kennungen für den Turn und die Nachricht, die Position dieses Aufrufs innerhalb der Nachricht und den neuen Text in `delta`. Die Stapelgrenzen hängen davon ab, wie der Text gestreamt wird. Verwenden Sie daher `index` und `final`, um den Fortschritt durch eine Nachricht zu verfolgen, statt zu erwarten, dass Zeilen auf eine bestimmte Weise gruppiert sind.1571Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten MessageDisplay-Hooks Kennungen für den Turn und die Nachricht, die Position dieses Aufrufs innerhalb der Nachricht und den neuen Text in `delta`. Stapelgrenzen hängen davon ab, wie der Text gestreamt wird. Verwenden Sie daher `index` und `final`, um den Fortschritt innerhalb einer Nachricht zu verfolgen, anstatt zu erwarten, dass Zeilen auf eine bestimmte Weise gruppiert sind.
1573 1572
1574| Feld | Beschreibung |1573| Feld | Beschreibung |
1575| :- | :- |1574| :- | :- |
1576| `turn_id` | UUID des aktuellen Turns |1575| `turn_id` | UUID des aktuellen Turns |
1577| `message_id` | UUID der angezeigten Assistentennachricht. Über alle Stapel derselben Nachricht hinweg stabil. Dies ist nicht die API-ID `msg_…`, daher kann sie nicht mit den Nachrichten-IDs im Transkript abgeglichen werden |1576| `message_id` | UUID der angezeigten Assistentennachricht. Stabil über alle Stapel derselben Nachricht. Dies ist nicht die API-ID `msg_…` und kann daher nicht mit Nachrichten-IDs im Transkript abgeglichen werden |
1578| `index` | Nullbasierter Index dieses Stapels innerhalb der Nachricht |1577| `index` | Nullbasierter Index dieses Stapels innerhalb der Nachricht |
1579| `final` | `true` beim letzten Stapel der Nachricht. Jede Nachricht hat genau einen letzten Stapel |1578| `final` | `true` beim letzten Stapel der Nachricht. Jede Nachricht hat genau einen letzten Stapel |
1580| `delta` | Die seit dem vorherigen Stapel neu abgeschlossenen Zeilen, einschließlich abschließender Zeilenumbrüche. Immer ganze Zeilen, außer beim letzten Stapel, der mitten in einer Zeile enden kann. In interaktiven Läufen ist das Delta des letzten Stapels leer, wenn die Nachricht mit einem Zeilenumbruch endet. Behandeln Sie daher `final` und nicht ein nicht leeres Delta als Signal für das Nachrichtenende. In Agent SDK- und `claude -p`-Läufen enthält der einzelne Aufruf die gesamte Nachricht |1579| `delta` | Die seit dem vorherigen Stapel neu vervollständigten Zeilen, einschließlich abschließender Zeilenumbrüche. Immer ganze Zeilen, außer beim letzten Stapel, der mitten in einer Zeile enden kann. In interaktiven Läufen ist das Delta des letzten Stapels leer, wenn die Nachricht mit einem Zeilenumbruch endet. Behandeln Sie daher `final` und nicht ein nicht leeres Delta als Signal für das Nachrichtenende. In Agent-SDK- und `claude -p`-Läufen enthält der einzelne Aufruf die gesamte Nachricht |
1581 1580
1582```json theme={null}1581```json theme={null}
1583{1582{
1603| :- | :- |1602| :- | :- |
1604| `displayContent` | Text, der anstelle des Deltas angezeigt wird. Weglassen, um das Original anzuzeigen |1603| `displayContent` | Text, der anstelle des Deltas angezeigt wird. Weglassen, um das Original anzuzeigen |
1605 1604
1606MessageDisplay-Hooks haben keine Entscheidungssteuerung. Sie können die Nachricht weder blockieren noch ändern, was im Transkript gespeichert oder an Claude gesendet wird. Claude Code verarbeitet `displayContent` aus ihrer JSON-Ausgabe und verwirft `systemMessage` und `continue`.1605MessageDisplay-Hooks haben keine Entscheidungssteuerung. Sie können die Nachricht nicht blockieren und nicht ändern, was im Transkript gespeichert oder an Claude gesendet wird. Claude Code berücksichtigt `displayContent` aus ihrer JSON-Ausgabe und verwirft `systemMessage` und `continue`.
1607 1606
1608Dieses Beispiel entfernt Markdown-Formatierung aus Claudes Antworten für eine reine Textanzeige. Das Skript liest jeden Stapel von stdin, entfernt Fettdruck-Markierungen und Backticks für Inline-Code aus `delta` und gibt das Ergebnis als `displayContent` zurück.1607Dieses Beispiel entfernt Markdown-Formatierung aus den Antworten von Claude für eine Klartextanzeige. Das Skript liest jeden Stapel von stdin, entfernt Fettdruck-Markierungen und Backticks für Inline-Code aus `delta` und gibt das Ergebnis als `displayContent` zurück.
1609 1608
1610<Tabs>1609<Tabs>
1611 <Tab title="macOS/Linux">1610 <Tab title="macOS/Linux">
1687 PreToolUse1686 PreToolUse
1688</h3>1687</h3>
1689 1688
1690Wird ausgeführt, nachdem Claude Tool-Parameter erstellt hat und bevor der Tool-Aufruf verarbeitet wird. Matcht auf jeden Tool-Namen außer `EndConversation`: integrierte Tools wie `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` und `ExitPlanMode` sowie beliebige [MCP-Tool-Namen](#match-mcp-tools).1689Wird ausgeführt, nachdem Claude Tool-Parameter erstellt hat und bevor der Tool-Aufruf verarbeitet wird. Passt auf jeden Tool-Namen außer `EndConversation`: integrierte Tools wie `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` und `ExitPlanMode` sowie beliebige [MCP-Tool-Namen](#match-mcp-tools).
1691 1690
1692Um einen Hook auszuführen, wenn sich eine bestimmte Datei auf der Festplatte ändert, unabhängig davon, was sie geschrieben hat, verwenden Sie [FileChanged](#filechanged), statt dateibearbeitende Tools nach Namen zu matchen. Anders als PreToolUse führt Claude Code FileChanged-Hooks nach der Änderung aus, und sie haben keine Entscheidungssteuerung, können den Schreibvorgang also nicht blockieren.1691Um einen Hook auszuführen, wenn sich eine bestimmte Datei auf dem Datenträger ändert, unabhängig davon, was sie geschrieben hat, verwenden Sie [FileChanged](#filechanged), anstatt dateibearbeitende Tools nach Namen abzugleichen. Anders als PreToolUse führt Claude Code FileChanged-Hooks nach der Änderung aus, und sie haben keine Entscheidungssteuerung, können den Schreibvorgang also nicht blockieren.
1693 1692
1694<Warning>1693<Warning>
1695 PreToolUse wird nur ausgeführt, wenn Claude ein Tool aufruft. Dateien, die Sie [mit `@` in Ihrem Prompt referenzieren](/docs/de/common-workflows#reference-files-and-directories), werden ohne Tool-Aufruf hinzugefügt: Claude Code fügt ihren Inhalt beim Aufbau des Prompts ein, sodass für sie kein PreToolUse-Hook ausgelöst wird, auch keine Hooks, die auf `Read` matchen. Um bestimmte Pfade für `@`-Referenzen zu sperren, verwenden Sie stattdessen eine [`Read`-deny-Regel](/docs/de/permissions#read-and-edit).1694 PreToolUse wird nur ausgeführt, wenn Claude ein Tool aufruft. Dateien, die Sie [mit `@` in Ihrem Prompt referenzieren](/docs/de/common-workflows#reference-files-and-directories), werden ohne Tool-Aufruf hinzugefügt: Claude Code fügt ihren Inhalt beim Erstellen des Prompts ein, sodass für sie kein PreToolUse-Hook ausgelöst wird, auch keine Hooks, die auf `Read` passen. Um bestimmte Pfade für `@`-Referenzen zu sperren, verwenden Sie stattdessen eine [`Read`-deny-Regel](/docs/de/permissions#read-and-edit).
1696 1695
1697 PreToolUse wird außerdem nicht für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgelöst.1696 PreToolUse wird auch nicht für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgelöst.
1698</Warning>1697</Warning>
1699 1698
1700Verwenden Sie die [PreToolUse-Entscheidungssteuerung](#pretooluse-decision-control), um den Tool-Aufruf zuzulassen, abzulehnen, nachzufragen oder zurückzustellen.1699Verwenden Sie die [PreToolUse-Entscheidungssteuerung](#pretooluse-decision-control), um den Tool-Aufruf zu erlauben, abzulehnen, nachzufragen oder zurückzustellen.
1701 1700
1702Ein [Agent SDK-Callback-Hook](/docs/de/agent-sdk/hooks) bei `PreToolUse`, der seinen Timeout überschreitet, blockiert den Tool-Aufruf, und Claude erhält ein Fehlerergebnis, das den Timeout nennt. Eine explizite Ablehnung durch einen anderen Hook hat weiterhin Vorrang.1701Ein [Agent-SDK-Callback-Hook](/docs/de/agent-sdk/hooks) bei `PreToolUse`, der seinen Timeout überschreitet, blockiert den Tool-Aufruf, und Claude erhält ein Fehlerergebnis, das den Timeout nennt. Eine explizite Ablehnung, die ein anderer Hook zurückgibt, hat weiterhin Vorrang.
1703 1702
1704<h4 id="pretooluse-input">1703<h4 id="pretooluse-input">
1705 PreToolUse-Eingabe1704 PreToolUse-Eingabe
1707 1706
1708Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreToolUse-Hooks `tool_name`, `tool_input` und `tool_use_id`.1707Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreToolUse-Hooks `tool_name`, `tool_input` und `tool_use_id`.
1709 1708
1710Bei einem [MCP-Tool](#match-mcp-tools) enthält die Eingabe zusätzlich `mcp_server`, ein Objekt mit dem `name` des Servers und einer `source`, die angibt, woher die Definition des Servers stammt. Zu den `source`-Werten gehören `plugin`, `sdk` und Konfigurations-Geltungsbereiche wie `user` und `project`. [`McpServerProvenance`](/docs/de/agent-sdk/typescript#mcpserverprovenance) in der Agent SDK-Referenz listet alle auf und erklärt, wie Sie mit einem Wert umgehen, den Sie nicht kennen. Stützen Sie Vertrauensentscheidungen auf `source` statt auf `name` oder das Tool-Namenspräfix `mcp__<server>__`. Das Feld `mcp_server` erfordert Claude Code v2.1.274 oder höher.1709Bei einem [MCP-Tool](#match-mcp-tools) enthält die Eingabe außerdem `mcp_server`, ein Objekt mit dem `name` des Servers und einer `source`, die angibt, woher die Definition des Servers stammt. Zu den `source`-Werten gehören `plugin`, `sdk` sowie Konfigurations-Geltungsbereiche wie `user` und `project`. [`McpServerProvenance`](/docs/de/agent-sdk/typescript#mcpserverprovenance) in der Agent-SDK-Referenz listet alle auf und erklärt, wie Sie mit einem Wert umgehen, den Sie nicht kennen. Stützen Sie Vertrauensentscheidungen auf `source` statt auf `name` oder das Tool-Namenspräfix `mcp__<server>__`. Das Feld `mcp_server` erfordert Claude Code v2.1.274 oder höher.
1711 1710
1712Für die Datei-Tools `Write`, `Edit` und `Read` ist `tool_input.file_path` immer absolut:1711Bei den Datei-Tools `Write`, `Edit` und `Read` ist `tool_input.file_path` immer absolut:
1713 1712
1714* Claude Code expandiert `~` und relative Pfade, bevor Hooks ausgeführt werden, sodass ein Hook, der auf Pfade matcht, nicht über `~` oder eine relative Schreibweise desselben Pfads umgangen werden kann1713* Claude Code erweitert `~` und relative Pfade, bevor Hooks ausgeführt werden, sodass ein Hook, der auf Pfade abgleicht, nicht über `~` oder eine relative Schreibweise desselben Pfads umgangen werden kann
1715* Unter Windows kommt der Pfad mit Backslash-Trennzeichen an, auch wenn Ihr Hook unter Git Bash läuft, wo `$PWD` wie `/c/project` aussieht1714* Unter Windows kommt der Pfad mit Backslash-Trennzeichen an, auch wenn Ihr Hook unter Git Bash läuft, wo `$PWD` wie `/c/project` aussieht
1716* Ein Vergleich mit Schrägstrichen, etwa eine Prüfung auf `/src/`, matcht nie einen Backslash-Pfad, und der Tool-Aufruf wird fortgesetzt, als hätte der Hook nichts zu blockieren1715* Ein mit Schrägstrichen geschriebener Vergleich, etwa eine Prüfung auf `/src/`, passt nie auf einen Backslash-Pfad, und der Tool-Aufruf wird fortgesetzt, als hätte der Hook nichts zu blockieren
1717* Normalisieren Sie die Trennzeichen vor dem Vergleich: `FILE_PATH="${FILE_PATH//\\//}"` in Bash oder `file_path.replace("\\", "/")` in Python, und matchen Sie dann ein Pfadsegment wie `/src/`, statt mit `^` zu verankern, da der Pfad absolut ist1716* Normalisieren Sie die Trennzeichen vor dem Vergleich: `FILE_PATH="${FILE_PATH//\\//}"` in Bash oder `file_path.replace("\\", "/")` in Python. Gleichen Sie dann auf ein Pfadsegment wie `/src/` ab, anstatt mit `^` zu verankern, da der Pfad absolut ist
1718 1717
1719Ein `Write`-Aufruf unter Windows liefert:1718Ein `Write`-Aufruf unter Windows liefert:
1720 1719
1730}1729}
1731```1730```
1732 1731
1733Die Felder von `tool_input` hängen vom Tool ab:1732Die `tool_input`-Felder hängen vom Tool ab:
1734 1733
1735<a id="bash" />1734<a id="bash" />
1736 1735
1744| :- | :- | :- | :- |1743| :- | :- | :- | :- |
1745| `command` | string | `"npm test"` | Der auszuführende Shell-Befehl |1744| `command` | string | `"npm test"` | Der auszuführende Shell-Befehl |
1746| `description` | string | `"Run test suite"` | Optionale Beschreibung dessen, was der Befehl tut |1745| `description` | string | `"Run test suite"` | Optionale Beschreibung dessen, was der Befehl tut |
1747| `timeout` | number | `120000` | Optionaler Timeout in Millisekunden. Werte über dem [Maximum](/docs/de/tools-reference#bash-tool-behavior) werden auf das Maximum reduziert statt abgelehnt |1746| `timeout` | number | `120000` | Optionaler Timeout in Millisekunden. Werte über dem [Maximum](/docs/de/tools-reference#bash-tool-behavior) werden auf das Maximum reduziert, statt abgelehnt zu werden |
1748| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |1747| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |
1749 1748
1750Wenn ein Bash-Befehl Dateien in einem Git-Repository ändert, kann Claude Code aufzeichnen, was sich geändert hat. Es zeichnet die Änderungen in jedem Berechtigungsmodus auf, wenn die Einstellung [`bashEditDiffEnabled`](/docs/de/settings-reference#basheditdiffenabled) die Aufzeichnung aktiviert; der Eintrag dieser Einstellung gibt an, welche Dateien sie setzen können. Andernfalls zeichnet es sie nur im Auto-Modus und im Modus `bypassPermissions` auf, und nur dann, wenn Claude Code Claude anweist, Dateien über Bash zu bearbeiten. Setzen Sie `bashEditDiffEnabled` auf `false`, um die Aufzeichnung auszuschalten. Hintergrundbefehle und nur lesende Befehle enthalten keinen Diff.1749Wenn ein Bash-Befehl Dateien in einem Git-Repository ändert, kann Claude Code aufzeichnen, was sich geändert hat. Es zeichnet die Änderungen in jedem Berechtigungsmodus auf, wenn die Einstellung [`bashEditDiffEnabled`](/docs/de/settings-reference#basheditdiffenabled) die Aufzeichnung aktiviert; der Eintrag dieser Einstellung gibt an, in welchen Dateien sie gesetzt werden kann. Andernfalls zeichnet es sie nur im Auto-Modus und im Modus `bypassPermissions` auf, und nur, wenn Claude Code Claude anweist, Dateien über Bash zu bearbeiten. Setzen Sie `bashEditDiffEnabled` auf `false`, um die Aufzeichnung auszuschalten. Hintergrundbefehle und nur lesende Befehle enthalten keinen Diff.
1751 1750
1752Ihr [PostToolUse-Hook](#posttooluse) erhält die geänderten Dateien dann in `tool_response.bashEditDiff`. Die Liste umfasst, was sich im Repository geändert hat, während der Befehl lief. Dateien, die Git ignoriert, und Dateien in Submodulen werden nicht aufgeführt. Erfordert Claude Code v2.1.269 oder höher.1751Ihr [PostToolUse-Hook](#posttooluse) erhält die geänderten Dateien dann in `tool_response.bashEditDiff`. Die Liste umfasst, was sich im Repository geändert hat, während der Befehl lief. Dateien, die Git ignoriert, und Dateien in Submodulen werden nicht aufgeführt. Erfordert Claude Code v2.1.269 oder höher.
1753 1752
1754<Note>1753<Note>
1755 Die Liste wird nach bestem Bemühen erstellt und befindet sich in der öffentlichen Beta. Claude Code kann eine Änderung übersehen, eine Datei aufnehmen, die ein anderer Prozess gleichzeitig geändert hat, oder an seinen Größenlimits abbrechen. Die Struktur des Felds kann sich ändern. Verwenden Sie die Liste, um herauszufinden, was überprüft werden sollte, nicht um eine Richtlinie durchzusetzen.1754 Die Liste wird nach bestem Bemühen erstellt und ist als öffentliche Beta verfügbar. Claude Code kann eine Änderung übersehen, eine Datei aufnehmen, die ein anderer Prozess gleichzeitig geändert hat, oder an seinen Größengrenzen abbrechen. Die Struktur des Feldes kann sich ändern. Verwenden Sie die Liste, um herauszufinden, was überprüft werden sollte, nicht um eine Richtlinie durchzusetzen.
1756</Note>1755</Note>
1757 1756
1758`changedFiles` und `files` listen auf, was der Befehl geändert hat; die übrigen Felder geben an, wie vollständig und wie zuverlässig diese Liste ist.1757`changedFiles` und `files` listen auf, was der Befehl geändert hat; die übrigen Felder geben an, wie vollständig und wie zuverlässig diese Liste ist.
1763| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs von bis zu 5 geänderten Dateien, zur Anzeige. `created` oder `deleted` ist `true` für eine Datei, die der Befehl hinzugefügt oder entfernt hat |1762| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs von bis zu 5 geänderten Dateien, zur Anzeige. `created` oder `deleted` ist `true` für eine Datei, die der Befehl hinzugefügt oder entfernt hat |
1764| `moreFiles` | number | `2` | Anzahl geänderter Dateien ohne Diff in `files` |1763| `moreFiles` | number | `2` | Anzahl geänderter Dateien ohne Diff in `files` |
1765| `unavailable` | boolean | `true` | Gesetzt, wenn der Diff unvollständig ist oder nicht erstellt werden konnte |1764| `unavailable` | boolean | `true` | Gesetzt, wenn der Diff unvollständig ist oder nicht erstellt werden konnte |
1766| `skipped` | boolean | `true` | Gesetzt für einen Git-Befehl, der den Arbeitsbaum verschiebt, etwa `git checkout` oder `git stash`, sodass Claude Code keinen Diff erstellt |1765| `skipped` | boolean | `true` | Gesetzt bei einem Git-Befehl, der den Working Tree verändert, etwa `git checkout` oder `git stash`, sodass Claude Code keinen Diff erstellt |
1767| `shared` | boolean | `true` | Gesetzt, wenn ein anderer Bash-Tool-Aufruf, etwa der eines Subagenten, gleichzeitig im selben Repository lief, sodass einige aufgeführte Änderungen von diesem Befehl stammen können |1766| `shared` | boolean | `true` | Gesetzt, wenn ein anderer Bash-Tool-Aufruf, etwa der eines Subagenten, gleichzeitig im selben Repository lief, sodass einige aufgeführte Änderungen von diesem Befehl stammen können |
1768 1767
1769<a id="powershell" />1768<a id="powershell" />
1772 PowerShell1771 PowerShell
1773</h5>1772</h5>
1774 1773
1775Führt PowerShell-Befehle aus. Informationen zur Verfügbarkeit je nach Plattform finden Sie unter [PowerShell-Tool](/docs/de/tools-reference#powershell-tool).1774Führt PowerShell-Befehle aus. Informationen zur Verfügbarkeit je Plattform finden Sie beim [PowerShell-Tool](/docs/de/tools-reference#powershell-tool).
1776 1775
1777Die Felder entsprechen denen des Bash-Tools, mit der Befehlszeichenkette in `command`:1776Die Felder entsprechen denen des Bash-Tools, mit dem Befehlsstring in `command`:
1778 1777
1779| Feld | Typ | Beispiel | Beschreibung |1778| Feld | Typ | Beispiel | Beschreibung |
1780| :- | :- | :- | :- |1779| :- | :- | :- | :- |
1783| `timeout` | number | `120000` | Optionaler Timeout in Millisekunden |1782| `timeout` | number | `120000` | Optionaler Timeout in Millisekunden |
1784| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |1783| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |
1785 1784
1786Matchen Sie in Hooks, die Shell-Befehle prüfen, auf `Bash|PowerShell`, damit sie beide Tools abdecken:1785Gleichen Sie in Hooks, die Shell-Befehle prüfen, auf `Bash|PowerShell` ab, damit sie beide Tools abdecken:
1787 1786
1788* Unter Windows behandelt Claude PowerShell überall dort, wo das PowerShell-Tool aktiviert ist, als primäre Shell und leitet Shell-Befehle darüber.1787* Unter Windows behandelt Claude PowerShell überall dort, wo das PowerShell-Tool aktiviert ist, als primäre Shell und leitet Shell-Befehle darüber.
1789* Unter Windows ohne Git Bash wird das Tool automatisch aktiviert, und Claude Code registriert das Bash-Tool überhaupt nicht.1788* Unter Windows ohne Git Bash wird das Tool automatisch aktiviert, und Claude Code registriert das Bash-Tool überhaupt nicht.
1790* Ein Hook, der nur auf `Bash` matcht, wird dort nie ausgelöst.1789* Ein Hook, der nur auf `Bash` abgleicht, wird dort nie ausgelöst.
1791 1790
1792<h5 id="write">1791<h5 id="write">
1793 Write1792 Write
1804 Edit1803 Edit
1805</h5>1804</h5>
1806 1805
1807Ersetzt eine Zeichenkette in einer bestehenden Datei.1806Ersetzt einen String in einer bestehenden Datei.
1808 1807
1809| Feld | Typ | Beispiel | Beschreibung |1808| Feld | Typ | Beispiel | Beschreibung |
1810| :- | :- | :- | :- |1809| :- | :- | :- | :- |
1811| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu bearbeitenden Datei |1810| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu bearbeitenden Datei |
1812| `old_string` | string | `"original text"` | Zu suchender und zu ersetzender Text |1811| `old_string` | string | `"original text"` | Zu suchender und zu ersetzender Text |
1813| `new_string` | string | `"replacement text"` | Ersatztext |1812| `new_string` | string | `"replacement text"` | Ersetzungstext |
1814| `replace_all` | boolean | `false` | Ob alle Vorkommen ersetzt werden sollen |1813| `replace_all` | boolean | `false` | Ob alle Vorkommen ersetzt werden sollen |
1815 1814
1816<h5 id="read">1815<h5 id="read">
1822| Feld | Typ | Beispiel | Beschreibung |1821| Feld | Typ | Beispiel | Beschreibung |
1823| :- | :- | :- | :- |1822| :- | :- | :- | :- |
1824| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu lesenden Datei |1823| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu lesenden Datei |
1825| `offset` | number | `10` | Optionale Zeilennummer, ab der gelesen wird |1824| `offset` | number | `10` | Optionale Zeilennummer, ab der gelesen werden soll |
1826| `limit` | number | `50` | Optionale Anzahl zu lesender Zeilen |1825| `limit` | number | `50` | Optionale Anzahl zu lesender Zeilen |
1827 1826
1828<h5 id="glob">1827<h5 id="glob">
1833 1832
1834| Feld | Typ | Beispiel | Beschreibung |1833| Feld | Typ | Beispiel | Beschreibung |
1835| :- | :- | :- | :- |1834| :- | :- | :- | :- |
1836| `pattern` | string | `"**/*.ts"` | Glob-Muster, gegen das Dateien abgeglichen werden |1835| `pattern` | string | `"**/*.ts"` | Glob-Muster, mit dem Dateien abgeglichen werden |
1837| `path` | string | `"/path/to/dir"` | Optionales Verzeichnis, in dem gesucht wird. Standardmäßig das aktuelle Arbeitsverzeichnis |1836| `path` | string | `"/path/to/dir"` | Optionales Verzeichnis für die Suche. Standardmäßig das aktuelle Arbeitsverzeichnis |
1838 1837
1839<h5 id="grep">1838<h5 id="grep">
1840 Grep1839 Grep
1844 1843
1845| Feld | Typ | Beispiel | Beschreibung |1844| Feld | Typ | Beispiel | Beschreibung |
1846| :- | :- | :- | :- |1845| :- | :- | :- | :- |
1847| `pattern` | string | `"TODO.*fix"` | Zu suchendes Muster als regulärer Ausdruck |1846| `pattern` | string | `"TODO.*fix"` | Zu suchendes Muster eines regulären Ausdrucks |
1848| `path` | string | `"/path/to/dir"` | Optionale Datei oder optionales Verzeichnis, in dem gesucht wird |1847| `path` | string | `"/path/to/dir"` | Optionale Datei oder optionales Verzeichnis für die Suche |
1849| `glob` | string | `"*.ts"` | Optionales Glob-Muster zum Filtern von Dateien |1848| `glob` | string | `"*.ts"` | Optionales Glob-Muster zum Filtern von Dateien |
1850| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` oder `"count"`. Standardmäßig `"files_with_matches"` |1849| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` oder `"count"`. Standardmäßig `"files_with_matches"` |
1851| `-i` | boolean | `true` | Suche ohne Berücksichtigung der Groß-/Kleinschreibung |1850| `-i` | boolean | `true` | Suche ohne Beachtung der Groß-/Kleinschreibung |
1852| `multiline` | boolean | `false` | Mehrzeiliges Matching aktivieren |1851| `multiline` | boolean | `false` | Mehrzeiligen Abgleich aktivieren |
1853 1852
1854<h5 id="webfetch">1853<h5 id="webfetch">
1855 WebFetch1854 WebFetch
1885| `prompt` | string | `"Find all API endpoints"` | Die Aufgabe, die der Agent ausführen soll |1884| `prompt` | string | `"Find all API endpoints"` | Die Aufgabe, die der Agent ausführen soll |
1886| `description` | string | `"Find API endpoints"` | Kurze Beschreibung der Aufgabe |1885| `description` | string | `"Find API endpoints"` | Kurze Beschreibung der Aufgabe |
1887| `subagent_type` | string | `"Explore"` | Typ des zu verwendenden spezialisierten Agenten |1886| `subagent_type` | string | `"Explore"` | Typ des zu verwendenden spezialisierten Agenten |
1888| `model` | string | `"sonnet"` | Optionaler Modell-Alias, um den Standard zu überschreiben |1887| `model` | string | `"sonnet"` | Optionaler Modell-Alias, der den Standard überschreibt |
1889 1888
1890Wenn ein Agent-Aufruf im Vordergrund abgeschlossen ist, erhält Ihr [PostToolUse-Hook](#posttooluse) das Ergebnis des Subagenten und die Telemetrie des Laufs in `tool_response`. Lesen Sie diese Felder, um den Lauf zu untersuchen; für Token- und Kostenzusammenfassungen über Subagenten hinweg verwenden Sie die [Token- und Kostenzähler](/docs/de/monitoring-usage#token-counter), gefiltert auf `query_source` `"subagent"`, da `totalTokens` und `usage` nur die letzte Anfrage abdecken:1889Wenn ein Agent-Aufruf im Vordergrund abgeschlossen ist, erhält Ihr [PostToolUse-Hook](#posttooluse) das Ergebnis und die Lauf-Telemetrie des Subagenten in `tool_response`. Lesen Sie diese Felder, um den Lauf zu untersuchen; für Token- und Kostenübersichten über Subagenten hinweg verwenden Sie die [Token- und Kostenzähler](/docs/de/monitoring-usage#token-counter), gefiltert auf `query_source` `"subagent"`, da `totalTokens` und `usage` nur die letzte Anfrage abdecken:
1891 1890
1892| Feld | Typ | Beispiel | Beschreibung |1891| Feld | Typ | Beispiel | Beschreibung |
1893| :- | :- | :- | :- |1892| :- | :- | :- | :- |
1894| `status` | string | `"completed"` | `"completed"` für Subagenten im Vordergrund, `"async_launched"` für Subagenten im Hintergrund. Subagenten laufen standardmäßig im Hintergrund, daher erzeugt auch ein Agent-Aufruf ohne `run_in_background` den Wert `"async_launched"` |1893| `status` | string | `"completed"` | `"completed"` für Subagenten im Vordergrund, `"async_launched"` für Subagenten im Hintergrund. Subagenten laufen standardmäßig im Hintergrund, daher erzeugt auch ein Agent-Aufruf ohne `run_in_background` `"async_launched"` |
1895| `agentId` | string | `"a4d2c8f1e0b3a297"` | Kennung des Subagenten-Laufs |1894| `agentId` | string | `"a4d2c8f1e0b3a297"` | Kennung des Subagenten-Laufs |
1896| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Die abschließenden Textblöcke des Subagenten oder, bei einem Subagenten, dessen Bericht über `SubagentHandback` läuft, an ihrer Stelle ein kurzer Hinweis auf diese Übergabe |1895| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Die abschließenden Textblöcke des Subagenten oder, bei einem Subagenten, dessen Bericht über `SubagentHandback` läuft, stattdessen ein kurzer Hinweis auf diese Übergabe |
1897| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modell, mit dem der Subagent gestartet ist, das vom angeforderten Modell abweichen kann |1896| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modell, mit dem der Subagent gestartet wurde; kann vom angeforderten Modell abweichen |
1898| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Verwendete Modelle in Reihenfolge, wobei aufeinanderfolgende Wiederholungen zusammengefasst werden; nur gesetzt, wenn das Modell während des Laufs gewechselt wurde. Erfordert Claude Code v2.1.212 oder höher |1897| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Verwendete Modelle in Reihenfolge, wobei aufeinanderfolgende Wiederholungen zusammengefasst werden; nur gesetzt, wenn das Modell während des Laufs gewechselt wurde. Erfordert Claude Code v2.1.212 oder höher |
1899| `totalTokens` | number | `12450` | Token-Anzahl aus der letzten API-Anfrage des Subagenten: Eingabe-, Ausgabe- und Cache-Token zusammen. Dies ist keine Summe über den gesamten Lauf |1898| `totalTokens` | number | `12450` | Token-Anzahl der letzten API-Anfrage des Subagenten: Eingabe-, Ausgabe- und Cache-Token zusammen. Dies ist keine Summe über den gesamten Lauf |
1900| `totalDurationMs` | number | `48211` | Echtzeitdauer des Subagenten-Laufs |1899| `totalDurationMs` | number | `48211` | Echtzeitdauer des Subagenten-Laufs |
1901| `totalToolUseCount` | number | `7` | Anzahl der Tool-Aufrufe, die der Subagent durchgeführt hat |1900| `totalToolUseCount` | number | `7` | Anzahl der Tool-Aufrufe, die der Subagent durchgeführt hat |
1902| `usage` | object | `{"input_tokens": 8320, ...}` | Token-Aufschlüsselung nach Typ für die letzte API-Anfrage: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1901| `usage` | object | `{"input_tokens": 8320, ...}` | Aufschlüsselung der Token nach Typ für die letzte API-Anfrage: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1903 1902
1904Ab Claude Code v2.1.271 liefert ein Subagent, der mit dem Tool [`SubagentHandback`](/docs/de/tools-reference) läuft, das Claude Code im [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) bereitstellt, seinen Bericht über dieses Tool, statt ihn als Text zurückzugeben. Das Feld `content` seines `completed`-Ergebnisses enthält dann einen kurzen Hinweis auf diese Übergabe statt des Berichts selbst. Um den Bericht zu lesen, lassen Sie einen `PreToolUse`- oder `PostToolUse`-Hook auf `SubagentHandback` matchen und lesen `tool_input.message`.1903Ab Claude Code v2.1.271 liefert ein Subagent, der mit dem Tool [`SubagentHandback`](/docs/de/tools-reference) läuft, das Claude Code im [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) bereitstellt, seinen Bericht über dieses Tool, statt ihn als Text zurückzugeben. Das Feld `content` seines `completed`-Ergebnisses enthält dann einen kurzen Hinweis auf diese Übergabe statt des Berichts selbst. Um den Bericht zu lesen, lassen Sie einen `PreToolUse`- oder `PostToolUse`-Hook auf `SubagentHandback` abgleichen und lesen `tool_input.message`.
1905 1904
1906Bei Subagenten im Hintergrund kehrt das Tool zurück, wenn die Aufgabe in den Hintergrund wechselt, daher enthält `tool_response` keine Nutzungsfelder: Ein Start im Hintergrund kehrt sofort zurück, und eine Vordergrundaufgabe, die Claude Code während des Laufs in den Hintergrund verschiebt, kehrt bei diesem Übergang zurück. Sie hat `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` und `resolvedModel`.1905Bei Hintergrund-Subagenten kehrt das Tool zurück, wenn die Aufgabe in den Hintergrund wechselt, daher enthält `tool_response` keine Nutzungsfelder: Ein Start im Hintergrund kehrt sofort zurück, und eine Vordergrundaufgabe, die Claude Code während des Laufs in den Hintergrund verschiebt, kehrt bei diesem Übergang zurück. Die Antwort enthält `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` und `resolvedModel`.
1907 1906
1908Bei einer `completed`-Antwort nennt `resolvedModel` das Modell, mit dem der Subagent gestartet ist, das vom `model`-Wert in `tool_input` abweichen kann, etwa wenn `availableModels` oder eine andere Überschreibung greift. Bei einer `async_launched`-Antwort nennt `resolvedModel` das Modell, das verwendet wurde, als der Agent in den Hintergrund wechselte, sodass ein Wechsel vor dem Verschieben in den Hintergrund dort berücksichtigt ist. `modelsUsed` und das Verhalten von `resolvedModel` zum Zeitpunkt des Verschiebens in den Hintergrund erfordern Claude Code v2.1.212 oder höher.1907Bei einer `completed`-Antwort nennt `resolvedModel` das Modell, mit dem der Subagent gestartet wurde. Es kann vom Wert `model` in `tool_input` abweichen, etwa wenn `availableModels` oder eine andere Überschreibung greift. Bei einer `async_launched`-Antwort nennt `resolvedModel` das Modell, das beim Wechsel des Agenten in den Hintergrund verwendet wurde, sodass ein Modellwechsel vor dem Verschieben in den Hintergrund dort berücksichtigt wird. `modelsUsed` und das Verhalten von `resolvedModel` zum Zeitpunkt des Verschiebens in den Hintergrund erfordern Claude Code v2.1.212 oder höher.
1909 1908
1910<a id="askuserquestion" />1909<a id="askuserquestion" />
1911 1910
1917 1916
1918| Feld | Typ | Beispiel | Beschreibung |1917| Feld | Typ | Beispiel | Beschreibung |
1919| :- | :- | :- | :- |1918| :- | :- | :- | :- |
1920| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React", "description": "Component library"}, {"label": "Vue", "description": "Progressive framework"}], "multiSelect": false}]` | Zu stellende Fragen, jeweils mit einem `question`-String, kurzem `header`, `options`-Array und optionalem `multiSelect`-Flag |1919| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React", "description": "Component library"}, {"label": "Vue", "description": "Progressive framework"}], "multiSelect": false}]` | Zu stellende Fragen, jeweils mit einem `question`-String, einem kurzen `header`, einem `options`-Array und einem optionalen `multiSelect`-Flag |
1921| `answers` | object | `{"Which framework?": "React"}` | Optional. Ordnet den Fragetext dem ausgewählten Optionslabel zu. Antworten mit Mehrfachauswahl verbinden Labels mit Kommas. Claude setzt dieses Feld nicht; liefern Sie es über `updatedInput`, um programmatisch zu antworten |1920| `answers` | object | `{"Which framework?": "React"}` | Optional. Ordnet den Fragetext der Bezeichnung der gewählten Option zu. Bei Mehrfachauswahl werden die Bezeichnungen durch Kommas verbunden. Claude setzt dieses Feld nicht; liefern Sie es über `updatedInput`, um programmatisch zu antworten |
1922 1921
1923<h5 id="exitplanmode">1922<h5 id="exitplanmode">
1924 ExitPlanMode1923 ExitPlanMode
1925</h5>1924</h5>
1926 1925
1927Präsentiert einen Plan und bittet den Benutzer um Genehmigung, bevor Claude den [Plan-Modus](/docs/de/permission-modes#analyze-before-you-edit-with-plan-mode) verlässt. Claude schreibt den Plan vor dem Aufruf des Tools in eine Datei auf der Festplatte, daher ist das wörtliche `tool_input` des Modells in der Regel leer. Claude Code fügt den Planinhalt und den Dateipfad ein, bevor die Eingabe an Hooks übergeben wird.1926Präsentiert einen Plan und bittet den Benutzer um Genehmigung, bevor Claude den [Plan-Modus](/docs/de/permission-modes#analyze-before-you-edit-with-plan-mode) verlässt. Claude schreibt den Plan vor dem Tool-Aufruf in eine Datei auf dem Datenträger, daher ist das wörtliche `tool_input` des Modells typischerweise leer. Claude Code fügt den Planinhalt und den Dateipfad ein, bevor die Eingabe an Hooks übergeben wird.
1928 1927
1929| Feld | Typ | Beispiel | Beschreibung |1928| Feld | Typ | Beispiel | Beschreibung |
1930| :- | :- | :- | :- |1929| :- | :- | :- | :- |
1931| `plan` | string | `"## Refactor auth\n1. Extract..."` | Planinhalt in Markdown. Aus der Plandatei auf der Festplatte eingefügt |1930| `plan` | string | `"## Refactor auth\n1. Extract..."` | Planinhalt in Markdown. Aus der Plandatei auf dem Datenträger eingefügt |
1932| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Pfad zur Plandatei. Eingefügt |1931| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Pfad zur Plandatei. Eingefügt |
1933| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Veraltet. Claude Code akzeptiert das Feld, ignoriert es aber. Vor v2.1.205 enthielt es promptbasierte Berechtigungen, die Claude zur Umsetzung des Plans angefordert hat |1932| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Veraltet. Claude Code akzeptiert das Feld, ignoriert es aber. Vor v2.1.205 enthielt es Prompt-basierte Berechtigungen, die Claude zur Umsetzung des Plans angefordert hat |
1934 1933
1935In `PostToolUse` ist `tool_response` ein Objekt mit den Feldern `plan` und `filePath`, die den genehmigten Plan enthalten, sowie internen Status-Flags. Lesen Sie `tool_response.plan` für den Planinhalt, statt die Datei erneut von der Festplatte zu lesen.1934In `PostToolUse` ist `tool_response` ein Objekt mit den Feldern `plan` und `filePath`, die den genehmigten Plan enthalten, sowie internen Status-Flags. Lesen Sie `tool_response.plan` für den Planinhalt, statt die Datei erneut vom Datenträger zu lesen.
1936 1935
1937<h4 id="pretooluse-decision-control">1936<h4 id="pretooluse-decision-control">
1938 PreToolUse-Entscheidungssteuerung1937 PreToolUse-Entscheidungssteuerung
1939</h4>1938</h4>
1940 1939
1941`PreToolUse`-Hooks können steuern, ob ein Tool-Aufruf fortgesetzt wird. Anders als andere Hooks, die ein `decision`-Feld auf oberster Ebene verwenden, gibt PreToolUse seine Entscheidung innerhalb eines `hookSpecificOutput`-Objekts zurück. Das ermöglicht eine umfassendere Steuerung: vier Ergebnisse (allow, deny, ask oder defer) sowie die Möglichkeit, die Tool-Eingabe vor der Ausführung zu ändern.1940`PreToolUse`-Hooks können steuern, ob ein Tool-Aufruf fortgesetzt wird. Anders als andere Hooks, die ein `decision`-Feld auf oberster Ebene verwenden, gibt PreToolUse seine Entscheidung innerhalb eines `hookSpecificOutput`-Objekts zurück. Das ermöglicht eine umfassendere Steuerung: vier Ergebnisse (erlauben, ablehnen, nachfragen oder zurückstellen) sowie die Möglichkeit, die Tool-Eingabe vor der Ausführung zu ändern.
1942 1941
1943| Feld | Beschreibung |1942| Feld | Beschreibung |
1944| :- | :- |1943| :- | :- |
1945| `permissionDecision` | `"allow"` überspringt die Berechtigungsabfrage, außer bei den [Aktionen, die kein Modus automatisch genehmigt](/docs/de/permission-modes#actions-no-mode-auto-approves), sowie bei `AskUserQuestion` und `ExitPlanMode`, die [`updatedInput` zusammen damit](#allow-with-updatedinput) benötigen. `"deny"` verhindert den Tool-Aufruf. `"ask"` bittet den Benutzer um Bestätigung. `"defer"` beendet sauber, 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 |1944| `permissionDecision` | `"allow"` überspringt die Berechtigungsabfrage, außer bei den [Aktionen, die kein Modus automatisch genehmigt](/docs/de/permission-modes#actions-no-mode-auto-approves), sowie bei `AskUserQuestion` und `ExitPlanMode`, die [zusammen mit `updatedInput`](#allow-with-updatedinput) verwendet werden müssen. `"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 |
1946| `permissionDecisionReason` | Bei `"ask"` wird er dem Benutzer in der Berechtigungsabfrage angezeigt. Wenn Claude Code [den Aufruf ablehnt](/docs/de/headless#turn-off-permission-prompts-in-unattended-runs), in einem `-p`-Lauf, in dem niemand diese Abfrage beantworten kann, liest Claude den Grund stattdessen im Tool-Ergebnis. Bei `"deny"` wird er Claude angezeigt. Bei `"allow"` und `"defer"` wird er nur in das [Debug-Log](#debug-hooks) geschrieben |1945| `permissionDecisionReason` | Bei `"ask"` wird der Grund dem Benutzer in der Berechtigungsabfrage angezeigt. Wenn Claude Code in einem `-p`-Lauf, in dem niemand diese 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 er Claude angezeigt. Bei `"allow"` und `"defer"` wird er nur in das [Debug-Log](#debug-hooks) geschrieben |
1947| `updatedInput` | Ändert die Eingabeparameter des Tools vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, nehmen Sie daher unveränderte Felder zusammen mit den geänderten auf. Claude Code wertet Berechtigungsregeln und die [Eignung eines Bash-Befehls für das automatische Verschieben 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 automatische Genehmigung oder mit `"ask"`, um dem Benutzer die geänderte Eingabe anzuzeigen. Bei `"defer"` wird es ignoriert |1946| `updatedInput` | Ändert die Eingabeparameter des Tools vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, geben Sie daher unveränderte Felder zusammen mit geänderten an. Claude Code wertet Berechtigungsregeln und die [Eignung eines Bash-Befehls für die automatische Ausführung im 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"` zur automatischen Genehmigung oder mit `"ask"`, um dem Benutzer die geänderte Eingabe anzuzeigen. Bei `"defer"` wird es ignoriert |
1948| `additionalContext` | Zeichenkette, die neben dem Tool-Ergebnis zu Claudes Kontext hinzugefügt wird. Wird ignoriert, wenn `permissionDecision` den Wert `"defer"` hat. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |1947| `additionalContext` | String, der zusammen mit dem Tool-Ergebnis dem 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) |
1949 1948
1950Wenn mehrere PreToolUse-Hooks unterschiedliche Entscheidungen zurückgeben, gilt die Rangfolge `deny` > `defer` > `ask` > `allow`.1949Wenn mehrere PreToolUse-Hooks unterschiedliche Entscheidungen zurückgeben, gilt die Rangfolge `deny` > `defer` > `ask` > `allow`.
1951 1950
1952Ein Hook, der durch Beenden mit 2 blockiert, wird genauso behandelt wie `"deny"`: Claude sieht die stderr-Meldung als Ablehnungsgrund.1951Ein Hook, der durch Beenden mit Exit-Code 2 blockiert, wird genauso behandelt wie `"deny"`: Claude sieht die stderr-Meldung als Ablehnungsgrund.
1953 1952
1954Wenn ein Hook `"ask"` zurückgibt, enthält die dem Benutzer angezeigte Berechtigungsabfrage ein Label, das angibt, woher der Hook stammt: `[settings]` für einen Hook aus einer beliebigen Einstellungsdatei oder aus Agenten-Frontmatter, `[plugin:<name>]` für den Hook eines Plugins oder `[skill]` für einen Hook aus Skill-Frontmatter. So können Benutzer nachvollziehen, welche Konfigurationsquelle die Bestätigung anfordert.1953Wenn ein Hook `"ask"` zurückgibt, enthält die dem Benutzer angezeigte Berechtigungsabfrage eine Kennzeichnung, woher der Hook stammt: `[settings]` für einen Hook aus einer beliebigen Einstellungsdatei oder aus Agent-Frontmatter, `[plugin:<name>]` für den Hook eines Plugins oder `[skill]` für einen Hook aus Skill-Frontmatter. So können Benutzer nachvollziehen, welche Konfigurationsquelle die Bestätigung anfordert.
1955 1954
1956Ein `"ask"` eines Hooks erzwingt auch im [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) eine Berechtigungsabfrage: Der Klassifikator kann den Tool-Aufruf weiterhin ablehnen, ihn aber nicht stillschweigend genehmigen. Vor v2.1.211 konnte der Klassifikator einen Bash-Befehl, der außerhalb der [Sandbox](/docs/de/sandboxing) lief, genehmigen, ohne die vom Hook angeforderte Abfrage anzuzeigen; der Klassifikator wendete dabei weiterhin seine eigenen Sicherheitsregeln auf diesen Befehl an, und ein `"deny"` eines Hooks wurde immer beachtet.1955Das `"ask"` eines Hooks erzwingt auch im [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) eine Berechtigungsabfrage: Der Klassifikator kann den Tool-Aufruf weiterhin ablehnen, ihn aber nicht stillschweigend genehmigen. Vor v2.1.211 konnte der Klassifikator einen Bash-Befehl, der außerhalb der [Sandbox](/docs/de/sandboxing) lief, genehmigen, ohne die vom Hook angeforderte Abfrage anzuzeigen; der Klassifikator wandte auf diesen Befehl dennoch seine eigenen Sicherheitsregeln an, und ein `"deny"` eines Hooks wurde immer berücksichtigt.
1957 1956
1958```json theme={null}1957```json theme={null}
1959{1958{
1982Ein `PreToolUse`-Hook erfüllt diese Anforderung, wenn er Folgendes tut:1981Ein `PreToolUse`-Hook erfüllt diese Anforderung, wenn er Folgendes tut:
1983 1982
19841. Er liest die Eingabe des Tools von stdin19831. Er liest die Eingabe des Tools von stdin
19852. Er erfasst die Antwort über Ihre eigene Benutzeroberfläche19842. Er sammelt die Antwort über Ihre eigene Oberfläche
19863. Er gibt `permissionDecision: "allow"` zusammen mit `updatedInput` zurück, das die Antwort enthält, sodass das Tool ohne Abfrage ausgeführt wird19853. Er gibt `permissionDecision: "allow"` zusammen mit `updatedInput` zurück, das die Antwort enthält, sodass das Tool ohne Abfrage ausgeführt wird
1987 1986
1988Die alleinige Rückgabe von `"allow"` reicht für diese Tools nicht aus.1987Die Rückgabe von `"allow"` allein reicht für diese Tools nicht aus.
1989 1988
1990Geben Sie bei `AskUserQuestion` das ursprüngliche `questions`-Array zurück und fügen Sie ein [`answers`](#askuserquestion)-Objekt hinzu, das den Text jeder Frage der gewählten Antwort zuordnet. Diese Ausgabe beantwortet eine Frage mit `React`:1989Geben Sie bei `AskUserQuestion` das ursprüngliche `questions`-Array zurück und fügen Sie ein [`answers`](#askuserquestion)-Objekt hinzu, das den Text jeder Frage der gewählten Antwort zuordnet. Diese Ausgabe beantwortet eine Frage mit `React`:
1991 1990
2009}2008}
2010```2009```
2011 2010
2012Ein MCP-Tool, das sein Server mit [`_meta["anthropic/requiresUserInteraction"]`](/docs/de/mcp#require-approval-for-a-specific-tool) kennzeichnet, ist strenger: Ein Hook kann dessen Genehmigungsabfrage mit `"allow"` nicht überspringen, weder mit noch ohne `updatedInput`, da Claude Code nicht bestätigen kann, dass der Hook die vom Tool benötigte Interaktion erfasst hat.2011Ein MCP-Tool, das sein Server mit [`_meta["anthropic/requiresUserInteraction"]`](/docs/de/mcp#require-approval-for-a-specific-tool) kennzeichnet, ist strenger: Ein Hook kann dessen Genehmigungsabfrage nicht mit `"allow"` überspringen, weder mit noch ohne `updatedInput`, weil Claude Code nicht bestätigen kann, dass der Hook die vom Tool benötigte Interaktion eingeholt hat.
2013 2012
2014<h4 id="defer-a-tool-call-for-later">2013<h4 id="defer-a-tool-call-for-later">
2015 Einen Tool-Aufruf für später zurückstellen2014 Einen Tool-Aufruf auf später zurückstellen
2016</h4>2015</h4>
2017 2016
2018`"defer"` ist für Integrationen gedacht, die `claude -p` als Subprozess ausführen und dessen JSON-Ausgabe lesen, etwa eine Agent SDK-App oder eine auf Claude Code aufbauende benutzerdefinierte Oberfläche. Damit kann der aufrufende Prozess Claude bei einem Tool-Aufruf anhalten, Eingaben über seine eigene Oberfläche erfassen und dort weitermachen, wo er aufgehört hat. Claude Code berücksichtigt diesen Wert nur im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p`. In interaktiven Sitzungen protokolliert es eine Warnung und ignoriert das Hook-Ergebnis.2017`"defer"` ist für Integrationen gedacht, die `claude -p` als Unterprozess ausführen und dessen JSON-Ausgabe lesen, etwa eine Agent-SDK-App oder eine auf Claude Code aufbauende benutzerdefinierte Oberfläche. Damit kann der aufrufende Prozess Claude bei einem Tool-Aufruf anhalten, Eingaben über seine eigene Oberfläche sammeln und dort fortfahren, wo er aufgehört hat. Claude Code berücksichtigt diesen Wert nur im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p`. In interaktiven Sitzungen protokolliert es eine Warnung und ignoriert das Hook-Ergebnis.
2019 2018
2020Das Tool `AskUserQuestion` ist der typische Fall: Claude möchte dem Benutzer eine Frage stellen, aber es gibt kein Terminal, in dem geantwortet werden kann. Ein `-p`-Lauf bietet `AskUserQuestion` nur an, wenn er einen [Berechtigungs-Host](/docs/de/headless#turn-off-permission-prompts-in-unattended-runs) hat, etwa ein MCP-Tool, das Sie mit `--permission-prompt-tool` übergeben. Starten Sie den Lauf daher mit einem solchen. Der Ablauf funktioniert so:2019Das Tool `AskUserQuestion` ist der typische Fall: Claude möchte dem Benutzer eine Frage stellen, aber es gibt kein Terminal, in dem geantwortet werden kann. Ein `-p`-Lauf bietet `AskUserQuestion` nur an, wenn er einen [Berechtigungs-Host](/docs/de/headless#turn-off-permission-prompts-in-unattended-runs) hat, etwa ein MCP-Tool, das Sie mit `--permission-prompt-tool` übergeben. Starten Sie den Lauf daher mit einem solchen. Der Ablauf funktioniert so:
2021 2020
20254. Der aufrufende Prozess führt `claude -p --resume <session-id>` mit demselben Berechtigungs-Host aus. Derselbe Tool-Aufruf löst `PreToolUse` erneut aus.20244. Der aufrufende Prozess führt `claude -p --resume <session-id>` mit demselben Berechtigungs-Host aus. Derselbe Tool-Aufruf löst `PreToolUse` erneut aus.
20265. Der Hook gibt `permissionDecision: "allow"` mit der Antwort in `updatedInput` zurück. Das Tool wird ausgeführt, und Claude fährt fort.20255. Der Hook gibt `permissionDecision: "allow"` mit der Antwort in `updatedInput` zurück. Das Tool wird ausgeführt, und Claude fährt fort.
2027 2026
2028Das Feld `deferred_tool_use` enthält `id`, `name` und `input` des Tools. `input` sind die Parameter, die Claude für den Tool-Aufruf erzeugt hat, erfasst vor der Ausführung:2027Das Feld `deferred_tool_use` enthält `id`, `name` und `input` des Tools. `input` enthält die Parameter, die Claude für den Tool-Aufruf generiert hat, erfasst vor der Ausführung:
2029 2028
2030```json theme={null}2029```json theme={null}
2031{2030{
2041}2040}
2042```2041```
2043 2042
2044Es gibt weder einen Timeout noch ein Limit für Wiederholungsversuche. Die Sitzung bleibt auf der Festplatte, bis Sie sie fortsetzen, vorbehaltlich der Aufbewahrungsbereinigung durch [`cleanupPeriodDays`](/docs/de/settings-reference#cleanupperioddays), die Sitzungsdateien standardmäßig nach 30 Tagen löscht, gemäß den [Regeln der Aufbewahrungsbereinigung](/docs/de/claude-directory#cleaned-up-automatically). Wenn die Antwort beim Fortsetzen noch nicht bereit ist, kann der Hook erneut `"defer"` zurückgeben, und der Prozess wird auf dieselbe Weise beendet. Der aufrufende Prozess bestimmt, wann die Schleife endet, indem er schließlich `"allow"` oder `"deny"` aus dem Hook zurückgibt.2043Es gibt keinen Timeout und kein Limit für Wiederholungsversuche. Die Sitzung bleibt auf dem Datenträger, bis Sie sie fortsetzen, vorbehaltlich der Aufbewahrungsbereinigung durch [`cleanupPeriodDays`](/docs/de/settings-reference#cleanupperioddays), die Sitzungsdateien standardmäßig nach 30 Tagen löscht, gemäß den [Regeln der Aufbewahrungsbereinigung](/docs/de/claude-directory#cleaned-up-automatically). Wenn die Antwort beim Fortsetzen noch nicht bereit ist, kann der Hook erneut `"defer"` zurückgeben, und der Prozess wird auf dieselbe Weise beendet. Der aufrufende Prozess bestimmt, wann die Schleife endet, indem der Hook schließlich `"allow"` oder `"deny"` zurückgibt.
2045 2044
2046`"defer"` funktioniert nur, wenn Claude im Turn einen einzigen Tool-Aufruf durchführt. Wenn Claude mehrere Tool-Aufrufe gleichzeitig durchführt, wird `"defer"` mit einer Warnung ignoriert, und das Tool durchläuft den normalen Berechtigungsablauf. Diese Einschränkung besteht, weil beim Fortsetzen nur ein Tool erneut ausgeführt werden kann: Es gibt keine Möglichkeit, einen Aufruf aus einem Stapel zurückzustellen, ohne die anderen ungeklärt zu lassen.2045`"defer"` funktioniert nur, wenn Claude im Turn einen einzelnen Tool-Aufruf macht. Wenn Claude mehrere Tool-Aufrufe gleichzeitig macht, wird `"defer"` mit einer Warnung ignoriert, und das Tool durchläuft den normalen Berechtigungsablauf. Die Einschränkung besteht, weil beim Fortsetzen nur ein Tool erneut ausgeführt werden kann: Es gibt keine Möglichkeit, einen Aufruf aus einem Stapel zurückzustellen, ohne die anderen ungelöst zu lassen.
2047 2046
2048Wenn das zurückgestellte Tool beim Fortsetzen nicht mehr verfügbar ist, wird der Prozess mit `stop_reason: "tool_deferred_unavailable"` und `is_error: true` beendet, bevor der Hook ausgelöst wird. Das passiert, wenn ein MCP-Server, der das Tool bereitgestellt hat, für die fortgesetzte Sitzung nicht verbunden ist. Die Payload `deferred_tool_use` ist trotzdem enthalten, sodass Sie erkennen können, welches Tool fehlt.2047Wenn das zurückgestellte Tool beim Fortsetzen nicht mehr verfügbar ist, wird der Prozess mit `stop_reason: "tool_deferred_unavailable"` und `is_error: true` beendet, bevor der Hook ausgelöst wird. Das passiert, wenn ein MCP-Server, der das Tool bereitgestellt hat, für die fortgesetzte Sitzung nicht verbunden ist. Die `deferred_tool_use`-Payload ist weiterhin enthalten, sodass Sie erkennen können, welches Tool fehlt.
2049 2048
2050<Note>2049<Note>
2051 Um eine zurückgestellte Sitzung im Plan-Modus fortzusetzen, übergeben Sie [`--permission-prompt-tool`](/docs/de/cli-reference#cli-flags) zusammen mit `--resume`, damit Claude Code den Plan zur Genehmigung vorlegen kann. Wenn Sie bestimmte andere Start-Flags übergeben, kehrt der fortgesetzte Lauf nicht in den Plan-Modus zurück; siehe [Im Plan-Modus mit `-p` fortsetzen](/docs/de/sessions#resume-in-plan-mode-with-p). Erfordert Claude Code v2.1.246 oder höher.2050 Um eine zurückgestellte Sitzung im Plan-Modus fortzusetzen, übergeben Sie [`--permission-prompt-tool`](/docs/de/cli-reference#cli-flags) zusammen mit `--resume`, damit Claude Code den Plan zur Genehmigung vorlegen kann. Wenn Sie bestimmte andere Start-Flags übergeben, kehrt der fortgesetzte Lauf nicht in den Plan-Modus zurück; siehe [Im Plan-Modus mit `-p` fortsetzen](/docs/de/sessions#resume-in-plan-mode-with-p). Erfordert Claude Code v2.1.246 oder höher.
2052 2051
2053 Wenn Sie mit `-p` fortsetzen, stellt Claude Code keinen anderen gespeicherten Berechtigungsmodus wieder her. Es startet den Lauf in dem Berechtigungsmodus, in dem ein neuer `claude -p`-Lauf starten würde. Übergeben Sie daher `--permission-mode` oder `--dangerously-skip-permissions` erneut, wenn die zurückgestellte Sitzung eines davon verwendet hat. Wenn Sie mit `claude --resume <session-id>` ohne `-p` fortsetzen, stellt Claude Code den gespeicherten Berechtigungsmodus wieder her, mit den unter [Berechtigungsmodus beim Fortsetzen](/docs/de/sessions#permission-mode-on-resume) aufgeführten Ausnahmen.2052 Wenn Sie mit `-p` fortsetzen, stellt Claude Code keinen anderen gespeicherten Berechtigungsmodus wieder her. Es startet den Lauf in dem Berechtigungsmodus, in dem ein neuer `claude -p`-Lauf starten würde. Übergeben Sie daher `--permission-mode` oder `--dangerously-skip-permissions` erneut, falls die zurückgestellte Sitzung eines davon verwendet hat. Wenn Sie mit `claude --resume <session-id>` ohne `-p` fortsetzen, stellt Claude Code den gespeicherten Berechtigungsmodus wieder her, mit den unter [Berechtigungsmodus beim Fortsetzen](/docs/de/sessions#permission-mode-on-resume) aufgeführten Ausnahmen.
2054</Note>2053</Note>
2055 2054
2056<h3 id="permissionrequest">2055<h3 id="permissionrequest">
2057 PermissionRequest2056 PermissionRequest
2058</h3>2057</h3>
2059 2058
2060Wird ausgeführt, wenn Claude Code Sie gleich um Erlaubnis zur Verwendung eines Tools bitten wird. In Sitzungen, die keine Abfrage anzeigen können, etwa bei Subagenten im Hintergrund im [nicht interaktiven Modus](/docs/de/headless), führt Claude Code diese Hooks trotzdem aus, und wenn kein Hook eine Entscheidung zurückgibt, lehnt es den Tool-Aufruf ab. Bei einem Aufruf, der ein `--permission-prompt-tool` oder den [`canUseTool`-Callback](/docs/de/agent-sdk/permissions) des Agent SDK erreicht, laufen die Hooks parallel zu Ihrem Host, und es gilt, wer zuerst entscheidet.2059Wird ausgeführt, wenn Claude Code Sie gleich um Erlaubnis zur Verwendung eines Tools bitten wird. In Sitzungen, die keine Abfrage anzeigen können, etwa bei Hintergrund-Subagenten im [nicht interaktiven Modus](/docs/de/headless), führt Claude Code diese Hooks trotzdem aus, und wenn kein Hook eine Entscheidung zurückgibt, lehnt es den Tool-Aufruf ab. Bei einem Aufruf, der ein `--permission-prompt-tool` oder den [`canUseTool`-Callback](/docs/de/agent-sdk/permissions) des Agent SDK erreicht, laufen die Hooks parallel zu Ihrem Host, und es gilt die Entscheidung, die zuerst getroffen wird.
2061Verwenden Sie die [PermissionRequest-Entscheidungssteuerung](#permissionrequest-decision-control), um im Namen des Benutzers zuzulassen oder abzulehnen.2060Verwenden Sie die [PermissionRequest-Entscheidungssteuerung](#permissionrequest-decision-control), um im Namen des Benutzers zu erlauben oder abzulehnen.
2062 2061
2063Verwenden Sie dieses Ereignis, wenn Sie ein Signal in dem Moment benötigen, in dem Claude um Erlaubnis zur Verwendung eines Tools bittet. Claude Code führt einen [Notification](#notification)-Hook mit dem Typ `permission_prompt` erst aus, nachdem die Abfrage etwa sechs Sekunden gewartet hat.2062Verwenden Sie dieses Ereignis, wenn Sie in dem Moment ein Signal benötigen, in dem Claude um Erlaubnis zur Verwendung eines Tools bittet. Claude Code führt einen [Notification](#notification)-Hook mit dem Typ `permission_prompt` erst aus, nachdem die Abfrage etwa sechs Sekunden gewartet hat.
2064 2063
2065Claude Code führt keine PermissionRequest-Hooks für die [Netzwerkanfrage](/docs/de/sandboxing#network-isolation) eines in einer Sandbox ausgeführten Befehls aus. Um für diese Abfrage ein Signal zu erhalten, verwenden Sie den Benachrichtigungstyp `permission_prompt`.2064Claude Code führt PermissionRequest-Hooks nicht für die [Netzwerkanfrage](/docs/de/sandboxing#network-isolation) eines in einer Sandbox ausgeführten Befehls aus. Um für diese Abfrage ein Signal zu erhalten, verwenden Sie den Benachrichtigungstyp `permission_prompt`.
2066 2065
2067Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.2066Gleicht auf den Tool-Namen ab, mit denselben Werten wie PreToolUse.
2068 2067
2069<h4 id="permissionrequest-input">2068<h4 id="permissionrequest-input">
2070 PermissionRequest-Eingabe2069 PermissionRequest-Eingabe
2072 2071
2073PermissionRequest-Hooks erhalten wie PreToolUse-Hooks die Felder `tool_name` und `tool_input`, jedoch ohne `tool_use_id`. Bei einem MCP-Tool erhalten sie außerdem das Objekt [`mcp_server`](#pretooluse-input). Ein optionales Array `permission_suggestions` enthält die [Berechtigungsaktualisierungen](#permission-update-entries), die Claude Code für diese Anfrage vorschlägt, etwa das Hinzufügen einer allow-Regel oder das Ändern des Berechtigungsmodus.2072PermissionRequest-Hooks erhalten wie PreToolUse-Hooks die Felder `tool_name` und `tool_input`, jedoch ohne `tool_use_id`. Bei einem MCP-Tool erhalten sie außerdem das Objekt [`mcp_server`](#pretooluse-input). Ein optionales Array `permission_suggestions` enthält die [Berechtigungsaktualisierungen](#permission-update-entries), die Claude Code für diese Anfrage vorschlägt, etwa das Hinzufügen einer allow-Regel oder das Ändern des Berechtigungsmodus.
2074 2073
2075Das Array `permission_suggestions` ist keine exakte Liste der angezeigten Optionen, da jeder Berechtigungsdialog seine eigenen Optionen aufbaut. Manche Dialoge, etwa der für Dateibearbeitungen, lesen das Array überhaupt nicht und leiten ihre Optionen aus der Anfrage selbst ab. Ein Dialog, der es liest, kann dennoch eine Option zurückhalten, deren Vorschlag im Array verbleibt, zum Beispiel wenn [`allowManagedPermissionRulesOnly`](/docs/de/settings-reference#allowmanagedpermissionrulesonly) Optionen zum Speichern von Regeln ausblendet. Er kann auch Optionen anbieten, für die es keinen Vorschlagseintrag gibt, etwa [**Yes, and switch to auto mode**](/docs/de/permission-modes#switch-permission-modes), das den Berechtigungsmodus direkt ändert statt über eine Berechtigungsaktualisierung.2074Das Array `permission_suggestions` ist keine exakte Liste der Optionen, die Sie sehen, da jeder Berechtigungsdialog seine eigenen Optionen erstellt. Einige Dialoge, etwa der für Dateibearbeitungen, lesen das Array überhaupt nicht und leiten ihre Optionen aus der Anfrage selbst ab. Ein Dialog, der es liest, kann trotzdem eine Option zurückhalten, deren Vorschlag im Array verbleibt, zum Beispiel wenn [`allowManagedPermissionRulesOnly`](/docs/de/settings-reference#allowmanagedpermissionrulesonly) Optionen zum Speichern von Regeln ausblendet. Er kann auch Optionen anbieten, für die es keinen Vorschlagseintrag gibt, etwa [**Yes, and switch to auto mode**](/docs/de/permission-modes#switch-permission-modes), das den Berechtigungsmodus direkt ändert statt über eine Berechtigungsaktualisierung.
2076 2075
2077PreToolUse-Hooks werden vor jedem Tool-Aufruf ausgeführt, unabhängig davon, ob er eine Berechtigung benötigt. PermissionRequest-Hooks werden nur ausgeführt, wenn Claude Code Sie gleich um Erlaubnis bitten wird oder wenn es andernfalls einen Aufruf, der keine Abfrage anzeigen kann, automatisch ablehnen würde. Keines der beiden Ereignisse wird für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgelöst.2076PreToolUse-Hooks laufen vor jedem Tool-Aufruf, unabhängig davon, ob er eine Berechtigung benötigt. PermissionRequest-Hooks laufen nur, wenn Claude Code Sie gleich um Erlaubnis bitten wird oder wenn es einen Aufruf, der keine Abfrage anzeigen kann, andernfalls automatisch ablehnen würde. Keines der beiden Ereignisse wird für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgelöst.
2078 2077
2079```json theme={null}2078```json theme={null}
2080{2079{
2103 PermissionRequest-Entscheidungssteuerung2102 PermissionRequest-Entscheidungssteuerung
2104</h4>2103</h4>
2105 2104
2106`PermissionRequest`-Hooks können Berechtigungsanfragen zulassen oder ablehnen. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, kann Ihr Hook-Skript ein `decision`-Objekt mit diesen ereignisspezifischen Feldern zurückgeben:2105`PermissionRequest`-Hooks können Berechtigungsanfragen erlauben oder ablehnen. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, kann Ihr Hook-Skript ein `decision`-Objekt mit diesen ereignisspezifischen Feldern zurückgeben:
2107 2106
2108| Feld | Beschreibung |2107| Feld | Beschreibung |
2109| :- | :- |2108| :- | :- |
2110| `behavior` | `"allow"` erteilt die Berechtigung, `"deny"` lehnt sie ab. [Deny- und ask-Regeln](/docs/de/permissions#manage-permissions) werden weiterhin ausgewertet, sodass ein Hook, der `"allow"` zurückgibt, eine passende deny-Regel nicht überschreibt |2109| `behavior` | `"allow"` erteilt die Berechtigung, `"deny"` verweigert sie. [deny- und ask-Regeln](/docs/de/permissions#manage-permissions) werden weiterhin ausgewertet, sodass ein Hook, der `"allow"` zurückgibt, eine passende deny-Regel nicht überschreibt |
2111| `updatedInput` | Nur für `"allow"`: ändert die Eingabeparameter des Tools vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, nehmen Sie daher unveränderte Felder zusammen mit den geänderten auf. Die geänderte Eingabe wird erneut gegen deny- und ask-Regeln ausgewertet |2110| `updatedInput` | Nur für `"allow"`: ändert die Eingabeparameter des Tools vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, geben Sie daher unveränderte Felder zusammen mit geänderten an. Die geänderte Eingabe wird erneut gegen deny- und ask-Regeln ausgewertet |
2112| `updatedPermissions` | Nur für `"allow"`: Array von anzuwendenden [Einträgen für Berechtigungsaktualisierungen](#permission-update-entries), etwa zum Hinzufügen einer allow-Regel oder zum Ändern des Berechtigungsmodus der Sitzung |2111| `updatedPermissions` | Nur für `"allow"`: Array von [Einträgen für Berechtigungsaktualisierungen](#permission-update-entries), die angewendet werden sollen, etwa das Hinzufügen einer allow-Regel oder das Ändern des Berechtigungsmodus der Sitzung |
2113| `message` | Nur für `"deny"`: teilt Claude mit, warum die Berechtigung abgelehnt wurde |2112| `message` | Nur für `"deny"`: teilt Claude mit, warum die Berechtigung verweigert wurde |
2114| `interrupt` | Nur für `"deny"`: bei `true` wird Claude gestoppt |2113| `interrupt` | Nur für `"deny"`: bei `true` wird Claude gestoppt |
2115 2114
2116Ein Hook, der ohne `decision`-Objekt mit 2 beendet wird, lässt den Berechtigungsablauf unverändert, und sein stderr wird verworfen. Nur das `decision`-Objekt kann die Anfrage genehmigen oder ablehnen.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.
2117 2116
2118```json theme={null}2117```json theme={null}
2119{2118{
2137 2136
2138| `type` | Felder | Wirkung |2137| `type` | Felder | Wirkung |
2139| :- | :- | :- |2138| :- | :- | :- |
2140| `addRules` | `rules`, `behavior`, `destination` | Fügt Berechtigungsregeln hinzu. `rules` ist ein Array von `{toolName, ruleContent?}`-Objekten. Lassen Sie `ruleContent` weg, um das gesamte Tool zu matchen. `behavior` ist `"allow"`, `"deny"` oder `"ask"` |2139| `addRules` | `rules`, `behavior`, `destination` | Fügt Berechtigungsregeln hinzu. `rules` ist ein Array von `{toolName, ruleContent?}`-Objekten. Lassen Sie `ruleContent` weg, um das gesamte Tool abzudecken. `behavior` ist `"allow"`, `"deny"` oder `"ask"` |
2141| `replaceRules` | `rules`, `behavior`, `destination` | Ersetzt alle Regeln des angegebenen `behavior` in der `destination` durch die bereitgestellten `rules` |2140| `replaceRules` | `rules`, `behavior`, `destination` | Ersetzt alle Regeln des angegebenen `behavior` an der `destination` durch die angegebenen `rules` |
2142| `removeRules` | `rules`, `behavior`, `destination` | Entfernt passende Regeln des angegebenen `behavior` |2141| `removeRules` | `rules`, `behavior`, `destination` | Entfernt übereinstimmende Regeln des angegebenen `behavior` |
2143| `setMode` | `mode`, `destination` | Ändert den Berechtigungsmodus. Gültige Modi sind `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` sowie `manual` als Alias für `default` |2142| `setMode` | `mode`, `destination` | Ändert den Berechtigungsmodus. Gültige Modi sind `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` und `manual` als Alias für `default` |
2144| `addDirectories` | `directories`, `destination` | Fügt Arbeitsverzeichnisse hinzu. `directories` ist ein Array von Pfadzeichenketten |2143| `addDirectories` | `directories`, `destination` | Fügt Arbeitsverzeichnisse hinzu. `directories` ist ein Array von Pfad-Strings |
2145| `removeDirectories` | `directories`, `destination` | Entfernt Arbeitsverzeichnisse |2144| `removeDirectories` | `directories`, `destination` | Entfernt Arbeitsverzeichnisse |
2146 2145
2147<Note>2146<Note>
2148 `setMode` mit `bypassPermissions` wird nur wirksam, wenn Sie die Sitzung mit bereits verfügbarem Bypass-Modus gestartet haben: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions` oder `permissions.defaultMode: "bypassPermissions"` in [Benutzereinstellungen, `--settings` oder verwalteten Einstellungen](/docs/de/settings-reference#permissions-defaultmode). Andernfalls hat die Aktualisierung keine Wirkung. Die Aktualisierung hat ebenfalls keine Wirkung, wenn [`permissions.disableBypassPermissionsMode`](/docs/de/permissions#managed-settings) den Modus deaktiviert oder wenn die Sitzung im [eingeschränkten Modus](/docs/de/cli-reference#cli-flags) startet.2147 `setMode` mit `bypassPermissions` wird nur wirksam, wenn Sie die Sitzung mit bereits verfügbarem Bypass-Modus gestartet haben: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions` oder `permissions.defaultMode: "bypassPermissions"` in [Benutzereinstellungen, `--settings` oder verwalteten Einstellungen](/docs/de/settings-reference#permissions-defaultmode). Andernfalls hat die Aktualisierung keine Wirkung. Die Aktualisierung hat ebenfalls keine Wirkung, wenn [`permissions.disableBypassPermissionsMode`](/docs/de/permissions#managed-settings) den Modus deaktiviert oder wenn die Sitzung im [eingeschränkten Modus](/docs/de/cli-reference#cli-flags) startet.
2149 2148
2150 `bypassPermissions` wird unabhängig von `destination` niemals als `defaultMode` gespeichert.2149 `bypassPermissions` wird unabhängig von `destination` nie als `defaultMode` gespeichert.
2151</Note>2150</Note>
2152 2151
2153Das Feld `destination` jedes Eintrags bestimmt, ob die Änderung nur im Arbeitsspeicher bleibt oder in eine Einstellungsdatei geschrieben wird.2152Das Feld `destination` jedes Eintrags bestimmt, ob die Änderung nur im Arbeitsspeicher bleibt oder dauerhaft in eine Einstellungsdatei geschrieben wird.
2154 2153
2155| `destination` | Schreibt in |2154| `destination` | Schreibt in |
2156| :- | :- |2155| :- | :- |
2159| `projectSettings` | `.claude/settings.json` |2158| `projectSettings` | `.claude/settings.json` |
2160| `userSettings` | `~/.claude/settings.json` |2159| `userSettings` | `~/.claude/settings.json` |
2161 2160
2162Ein Hook kann einen der empfangenen `permission_suggestions` als eigene `updatedPermissions`-Ausgabe zurückgeben.2161Ein Hook kann einen der erhaltenen `permission_suggestions` als eigene `updatedPermissions`-Ausgabe zurückgeben.
2163 2162
2164<h3 id="posttooluse">2163<h3 id="posttooluse">
2165 PostToolUse2164 PostToolUse
2171 2170
2172Matchen Sie breiter, wenn der Tool-Name nicht der richtige Filter ist:2171Matchen Sie breiter, wenn der Tool-Name nicht der richtige Filter ist:
2173 2172
2174* Um einen Hook nach jedem erfolgreich abgeschlossenen Tool auszuführen, lassen Sie den `matcher` weg oder setzen Sie ihn auf `"*"`. Ihr Hook kann dann selbst ermitteln, was sich geändert hat, beispielsweise durch Ausführen von `git status --porcelain`, das auch nicht verfolgte Dateien auflistet, die `git diff` übersieht. Für fehlgeschlagene Tool-Aufrufe fügen Sie denselben Hook unter [PostToolUseFailure](#posttoolusefailure) hinzu.2173* Um einen Hook nach jedem erfolgreich abgeschlossenen Tool auszuführen, lassen Sie den `matcher` weg oder setzen Sie ihn auf `"*"`. Ihr Hook kann dann selbst ermitteln, was sich geändert hat, zum Beispiel durch Ausführen von `git status --porcelain`, das auch nicht verfolgte Dateien auflistet, die `git diff` übersieht. Für fehlgeschlagene Tool-Aufrufe fügen Sie denselben Hook unter [PostToolUseFailure](#posttoolusefailure) hinzu.
2175* Um einen Hook auszuführen, wenn sich eine bestimmte Datei auf der Festplatte ändert, unabhängig davon, wer sie geschrieben hat, verwenden Sie [FileChanged](#filechanged). Claude Code führt keinen `PostToolUse`-Hook mit dem Matcher `Edit|Write` aus, wenn ein `Bash`-Befehl oder ein Prozess außerhalb von Claude Code dieselbe Datei neu schreibt.2174* Um einen Hook auszuführen, wenn sich eine bestimmte Datei auf der Festplatte ändert, unabhängig davon, was sie geschrieben hat, verwenden Sie [FileChanged](#filechanged). Claude Code führt keinen `PostToolUse`-Hook mit dem Matcher `Edit|Write` aus, wenn ein `Bash`-Befehl oder ein Prozess außerhalb von Claude Code dieselbe Datei neu schreibt.
2176 2175
2177<h4 id="posttooluse-input">2176<h4 id="posttooluse-input">
2178 PostToolUse-Eingabe2177 PostToolUse-Eingabe
2179</h4>2178</h4>
2180 2179
2181`PostToolUse`-Hooks werden ausgelöst, nachdem ein Tool bereits erfolgreich ausgeführt wurde. Die Eingabe enthält sowohl `tool_input`, die an das Tool gesendeten Argumente, als auch `tool_response`, das vom Tool zurückgegebene Ergebnis. Das genaue Schema beider Felder hängt vom Tool ab. Pfade in `tool_input` von Datei-Tools kommen im selben Format wie bei [PreToolUse](#pretooluse-input) an: immer absolut, mit den nativen Trennzeichen der Plattform, unter Windows also mit Backslashes. Bei einem MCP-Tool enthält die Eingabe außerdem das Objekt [`mcp_server`](#pretooluse-input).2180`PostToolUse`-Hooks werden ausgelöst, nachdem ein Tool bereits erfolgreich ausgeführt wurde. Die Eingabe enthält sowohl `tool_input`, die an das Tool gesendeten Argumente, als auch `tool_response`, das zurückgegebene Ergebnis. Das genaue Schema beider Felder hängt vom Tool ab. Pfade in `tool_input` von Datei-Tools kommen im selben Format an wie bei [PreToolUse](#pretooluse-input): immer absolut, mit den nativen Trennzeichen der Plattform, unter Windows also mit Backslashes. Bei einem MCP-Tool enthält die Eingabe außerdem das Objekt [`mcp_server`](#pretooluse-input).
2182 2181
2183```json theme={null}2182```json theme={null}
2184{2183{
2203 2202
2204| Feld | Beschreibung |2203| Feld | Beschreibung |
2205| :- | :- |2204| :- | :- |
2206| `duration_ms` | Optional. Ausführungszeit des Tools in Millisekunden. Schließt die Zeit in Berechtigungsabfragen und PreToolUse-Hooks aus |2205| `duration_ms` | Optional. Ausführungszeit des Tools in Millisekunden. Ohne die Zeit in Berechtigungsabfragen und PreToolUse-Hooks |
2207 2206
2208<h4 id="posttooluse-decision-control">2207<h4 id="posttooluse-decision-control">
2209 PostToolUse-Entscheidungssteuerung2208 PostToolUse-Entscheidungssteuerung
2214| Feld | Beschreibung |2213| Feld | Beschreibung |
2215| :- | :- |2214| :- | :- |
2216| `decision` | `"block"` fügt den `reason` neben dem Tool-Ergebnis hinzu. Claude sieht weiterhin die ursprüngliche Ausgabe; um sie zu ersetzen, verwenden Sie `updatedToolOutput` |2215| `decision` | `"block"` fügt den `reason` neben dem Tool-Ergebnis hinzu. Claude sieht weiterhin die ursprüngliche Ausgabe; um sie zu ersetzen, verwenden Sie `updatedToolOutput` |
2217| `reason` | Erklärung, die Claude angezeigt wird, wenn `decision` den Wert `"block"` hat |2216| `reason` | Erklärung, die Claude angezeigt wird, wenn `decision` `"block"` ist |
2218| `additionalContext` | Zeichenfolge, die Claudes Kontext zusammen mit dem Tool-Ergebnis hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |2217| `additionalContext` | String, der Claudes Kontext zusammen mit dem Tool-Ergebnis hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
2219| `classifierContext` | Kurze Notiz zum Ergebnis dieses Aufrufs, die für den Klassifikator des [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) statt für Claude bestimmt ist. Siehe [Ein Ergebnis für den Klassifikator des Auto-Modus annotieren](#annotate-a-result-for-the-auto-mode-classifier). Erfordert Claude Code v2.1.236 oder höher |2218| `classifierContext` | Kurze Notiz zum Ergebnis dieses Aufrufs für den Klassifikator des [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) statt für Claude. Siehe [Ein Ergebnis für den Klassifikator des Auto-Modus annotieren](#annotate-a-result-for-the-auto-mode-classifier). Erfordert Claude Code v2.1.236 oder höher |
2220| `updatedToolOutput` | Ersetzt die Ausgabe des Tools durch den angegebenen Wert, bevor sie an Claude gesendet wird. Der Wert muss der Ausgabestruktur des Tools entsprechen |2219| `updatedToolOutput` | Ersetzt die Ausgabe des Tools durch den angegebenen Wert, bevor sie an Claude gesendet wird. Der Wert muss der Ausgabestruktur des Tools entsprechen |
2221| `updatedMCPToolOutput` | Ersetzt die Ausgabe nur für [MCP-Tools](#match-mcp-tools). Verwenden Sie vorzugsweise `updatedToolOutput`, das für alle Tools funktioniert |2220| `updatedMCPToolOutput` | Ersetzt die Ausgabe nur für [MCP-Tools](#match-mcp-tools). Bevorzugen Sie `updatedToolOutput`, das für alle Tools funktioniert |
2222 2221
2223Das folgende Beispiel ersetzt die Ausgabe eines `Bash`-Aufrufs. Der Ersatzwert entspricht der Ausgabestruktur des `Bash`-Tools:2222Das folgende Beispiel ersetzt die Ausgabe eines `Bash`-Aufrufs. Der Ersatzwert entspricht der Ausgabestruktur des `Bash`-Tools:
2224 2223
2238```2237```
2239 2238
2240<Warning>2239<Warning>
2241 `updatedToolOutput` ändert nur, was Claude sieht. Das Tool wurde bereits ausgeführt, wenn der Hook ausgelöst wird, sodass geschriebene Dateien, ausgeführte Befehle oder gesendete Netzwerkanfragen bereits wirksam sind. Telemetrie wie OpenTelemetry-Tool-Spans und Analyseereignisse erfasst ebenfalls die ursprüngliche Ausgabe, bevor der Hook ausgeführt wird. Um einen Tool-Aufruf vor seiner Ausführung zu verhindern oder zu ändern, verwenden Sie stattdessen einen [PreToolUse](#pretooluse)-Hook.2240 `updatedToolOutput` ändert nur, was Claude sieht. Das Tool wurde bereits ausgeführt, wenn der Hook ausgelöst wird, sodass geschriebene Dateien, ausgeführte Befehle oder gesendete Netzwerkanfragen bereits wirksam sind. Telemetrie wie OpenTelemetry-Tool-Spans und Analyseereignisse erfasst ebenfalls die ursprüngliche Ausgabe, bevor der Hook läuft. Um einen Tool-Aufruf vor seiner Ausführung zu verhindern oder zu ändern, verwenden Sie stattdessen einen [PreToolUse](#pretooluse)-Hook.
2242 2241
2243 Der Ersatzwert muss der Ausgabestruktur des Tools entsprechen. Integrierte Tools geben strukturierte Objekte statt einfacher Zeichenfolgen zurück. Beispielsweise gibt `Bash` ein Objekt mit den Feldern `stdout`, `stderr`, `interrupted` und `isImage` zurück. Bei integrierten Tools wird ein Wert, der nicht dem Ausgabeschema des Tools entspricht, ignoriert und die ursprüngliche Ausgabe verwendet. Die Ausgabe von MCP-Tools wird ohne Schemavalidierung durchgereicht. Das Entfernen von Fehlerdetails, die Claude benötigt, kann dazu führen, dass Claude auf Basis einer falschen Annahme weiterarbeitet.2242 Der Ersatzwert muss der Ausgabestruktur des Tools entsprechen. Integrierte Tools geben strukturierte Objekte statt einfacher Strings zurück. Beispielsweise gibt `Bash` ein Objekt mit den Feldern `stdout`, `stderr`, `interrupted` und `isImage` zurück. Bei integrierten Tools wird ein Wert, der nicht dem Ausgabeschema des Tools entspricht, ignoriert und die ursprüngliche Ausgabe verwendet. Die Ausgabe von MCP-Tools wird ohne Schemavalidierung durchgereicht. Das Entfernen von Fehlerdetails, die Claude benötigt, kann dazu führen, dass Claude auf Grundlage einer falschen Annahme weiterarbeitet.
2244</Warning>2243</Warning>
2245 2244
2246<h4 id="annotate-a-result-for-the-auto-mode-classifier">2245<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2247 Ein Ergebnis für den Klassifikator des Auto-Modus annotieren2246 Ein Ergebnis für den Klassifikator des Auto-Modus annotieren
2248</h4>2247</h4>
2249 2248
2250Geben Sie `classifierContext` zurück, um eine kurze Notiz zum Ergebnis des Tool-Aufrufs an den Klassifikator des [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) statt an Claude zu senden. Der Klassifikator [erhält niemals die Tool-Ergebnisse selbst](/docs/de/permission-modes#how-the-classifier-evaluates-actions), daher ist dieses Feld der unterstützte Weg, ihm etwas darüber mitzuteilen, was ein Aufruf zurückgegeben hat, bevor er spätere Aktionen prüft. Das Feld erfordert Claude Code v2.1.236 oder höher.2249Geben Sie `classifierContext` zurück, um eine kurze Notiz zum Ergebnis des Tool-Aufrufs an den Klassifikator des [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) statt an Claude zu senden. Der Klassifikator [erhält die Tool-Ergebnisse selbst nie](/docs/de/permission-modes#how-the-classifier-evaluates-actions), daher ist dieses Feld der unterstützte Weg, ihm etwas darüber mitzuteilen, was ein Aufruf zurückgegeben hat, bevor er spätere Aktionen prüft. Das Feld erfordert Claude Code v2.1.236 oder höher.
2251 2250
2252Das folgende Beispiel teilt dem Klassifikator mit, woher die Ausgabe einer Abfrage stammt:2251Das folgende Beispiel teilt dem Klassifikator mit, woher die Ausgabe einer Abfrage stammt:
2253 2252
2260}2259}
2261```2260```
2262 2261
2263Wie stark der Klassifikator die Notiz gewichtet, hängt davon ab, wo Sie den Hook konfiguriert haben:2262Wie viel Gewicht der Klassifikator der Notiz beimisst, hängt davon ab, wo Sie den Hook konfiguriert haben:
2264 2263
2265* **In Claude Code konfigurierte Hooks**: Bei Hooks aus Einstellungsdateien, Plugins, Skills und Agenten-Frontmatter behandelt der Klassifikator die Notiz als nicht verifizierten, von der Anwendung bereitgestellten Kontext. Die Notiz begründet niemals eine Benutzerabsicht, und wenn sie behauptet, Sie hätten etwas genehmigt oder angefordert, prüft der Klassifikator diese Behauptung anhand Ihrer eigenen Nachrichten in der Konversation2264* **In Claude Code konfigurierte Hooks**: Bei Hooks aus Einstellungsdateien, Plugins, Skills und Agenten-Frontmatter behandelt der Klassifikator die Notiz als unverifizierten, von der Anwendung bereitgestellten Kontext. Die Notiz begründet nie eine Absicht des Benutzers, und wenn sie behauptet, Sie hätten etwas genehmigt oder angefordert, prüft der Klassifikator diese Behauptung anhand Ihrer eigenen Nachrichten in der Konversation
2266* **In-Process-Callbacks des Agent SDK**: Wenn eine Anwendung, die Claude Code einbettet, den Hook als [TypeScript-SDK-Callback](/docs/de/agent-sdk/hooks) registriert und die Notiz während der laufenden Sitzung zurückgibt, kann der Klassifikator eine in der Notiz weitergegebene Benutzeraussage als Benutzerabsicht werten. Eine solche Aussage kann eine Zustimmungsanforderung erfüllen, die der Klassifikator auch von einer von Ihnen gesendeten Nachricht akzeptieren würde, hebt aber niemals eine Blockierung auf, die auch Ihre eigene Nachricht nicht aufheben könnte. Nach dem Fortsetzen einer Sitzung behandelt Claude Code wiederhergestellte Notizen als nicht verifizierten Kontext. Wenn Hooks aus beiden Gruppen denselben Aufruf annotieren, behandelt der Klassifikator die kombinierte Notiz als nicht verifiziert2265* **In-Process-Callbacks des Agent SDK**: Wenn eine Anwendung, die Claude Code einbettet, den Hook als [TypeScript-SDK-Callback](/docs/de/agent-sdk/hooks) registriert und die Notiz während der laufenden Sitzung zurückgibt, kann der Klassifikator eine in der Notiz weitergegebene Benutzeraussage als Absicht des Benutzers werten. Eine solche Aussage kann eine Zustimmungsanforderung erfüllen, die der Klassifikator auch von einer von Ihnen gesendeten Nachricht akzeptieren würde, hebt aber nie eine Blockierung auf, die auch Ihre eigene Nachricht nicht aufheben könnte. Nach dem Fortsetzen einer Sitzung behandelt Claude Code wiederhergestellte Notizen als unverifizierten Kontext. Wenn Hooks aus beiden Gruppen denselben Aufruf annotieren, behandelt der Klassifikator die kombinierte Notiz als unverifiziert
2267 2266
2268Claude Code wendet beim Zustellen der Notiz diese Grenzen an:2267Claude Code wendet beim Zustellen der Notiz diese Grenzen an:
2269 2268
2270* **Länge**: Claude Code begrenzt die Notizen für einen Tool-Aufruf auf 2.000 Zeichen und schneidet den Rest ab. Die Grenze gilt gemeinsam für alle Hooks, die auf diesen Aufruf antworten2269* **Länge**: Claude Code begrenzt die Notizen für einen Tool-Aufruf auf 2.000 Zeichen und kürzt den Rest. Die Grenze gilt gemeinsam für alle Hooks, die auf diesen Aufruf antworten
2271* **Nur synchrone Antworten**: Claude Code ignoriert das Feld in der Antwort eines Hooks, der [im Hintergrund ausgeführt wird](#run-hooks-in-the-background), da diese Antwort eintrifft, nachdem Claude Code das Tool-Ergebnis aufgezeichnet hat2270* **Nur synchrone Antworten**: Claude Code ignoriert das Feld in der Antwort eines Hooks, der [im Hintergrund läuft](#run-hooks-in-the-background), da diese Antwort eintrifft, nachdem Claude Code das Tool-Ergebnis erfasst hat
2272* **Aufrufe, die der Klassifikator nicht aufzeichnet**: Das Transkript des Klassifikators lässt nur lesende Abfragen wie Dateilesevorgänge und Suchen aus. Claude Code verwirft eine Notiz, die an einen dieser Aufrufe angehängt ist2271* **Aufrufe, die der Klassifikator nicht erfasst**: Das Transkript des Klassifikators lässt nur lesende Abfragen wie Dateilesevorgänge und Suchen aus. Claude Code verwirft eine Notiz, die an einen dieser Aufrufe angehängt ist
2273* **Zusammenspiel mit Umschreibungen**: Wenn die Notiz eine Ausgabe beschreibt, die Sie mit `updatedToolOutput` ersetzen, geben Sie beide Felder in derselben Hook-Antwort zurück. Claude Code verwirft die Notiz, wenn diese Umschreibung abgelehnt wird oder die Umschreibung eines anderen Hooks sie ersetzt. Eine Notiz, die Sie ohne Umschreibung zurückgeben, stellt Claude Code auch dann zu, wenn ein anderer Hook die Ausgabe umschreibt2272* **Zusammenspiel mit Umschreibungen**: Wenn die Notiz eine Ausgabe beschreibt, die Sie mit `updatedToolOutput` ersetzen, geben Sie beide Felder in derselben Hook-Antwort zurück. Claude Code verwirft die Notiz, wenn diese Umschreibung abgelehnt wird oder die Umschreibung eines anderen Hooks sie ersetzt. Claude Code stellt eine Notiz, die Sie ohne Umschreibung zurückgeben, auch dann zu, wenn ein anderer Hook die Ausgabe umschreibt
2274 2273
2275<Warning>2274<Warning>
2276 Der Klassifikator liest Inhalte, die Sie in `classifierContext` ablegen, als Informationen der Anwendung, die die Sitzung hostet. Kopieren Sie daher keine nicht vertrauenswürdige Tool-Ausgabe oder Texte von Drittanbietern hinein. Beschränken Sie die Notiz auf eine kurze Aussage zu diesem einen Aufruf, etwa eine Tatsache über seine Herkunft oder eine Benutzeraussage dazu; verwenden Sie das Feld nicht, um unzusammenhängende Nachrichten oder einen Strom von Ereignissen zu übermitteln.2275 Der Klassifikator liest Inhalte, die Sie in `classifierContext` einfügen, als Informationen der Anwendung, die die Sitzung hostet. Kopieren Sie daher keine nicht vertrauenswürdige Tool-Ausgabe oder Texte Dritter hinein. Beschränken Sie die Notiz auf eine kurze Aussage über genau diesen einen Aufruf, etwa eine Tatsache über seine Herkunft oder eine Benutzeraussage dazu; verwenden Sie das Feld nicht, um unzusammenhängende Nachrichten oder einen Strom von Ereignissen zu übermitteln.
2277</Warning>2276</Warning>
2278 2277
2279<h3 id="posttoolusefailure">2278<h3 id="posttoolusefailure">
2285Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.2284Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.
2286 2285
2287<Note>2286<Note>
2288 Dieses Ereignis wird nicht für Tool-Aufrufe ausgelöst, die vor der Ausführung abgelehnt werden: ein unbekannter Tool-Name, eine Eingabe, die die Schema- oder tool-spezifische Validierung nicht besteht, oder eine verweigerte Berechtigung. Validierungsablehnungen werden als `tool_use_error`-Ergebnisse zurückgegeben und erfolgen, bevor Hooks ausgeführt werden, sodass sie weder `PreToolUse` noch `PostToolUseFailure` auslösen. Verweigerte Berechtigungen lösen `PreToolUse` aus, nicht aber dieses Ereignis; siehe [PermissionDenied](#permissiondenied).2287 Dieses Ereignis wird nicht für Tool-Aufrufe ausgelöst, die vor der Ausführung abgelehnt werden: ein unbekannter Tool-Name, eine Eingabe, die die Schema- oder toolspezifische Validierung nicht besteht, oder eine Verweigerung der Berechtigung. Validierungsablehnungen werden als `tool_use_error`-Ergebnisse zurückgegeben und erfolgen, bevor Hooks laufen, sodass sie weder `PreToolUse` noch `PostToolUseFailure` auslösen. Verweigerte Berechtigungen lösen `PreToolUse` aus, aber nicht dieses Ereignis; siehe [PermissionDenied](#permissiondenied).
2289</Note>2288</Note>
2290 2289
2291<h4 id="posttoolusefailure-input">2290<h4 id="posttoolusefailure-input">
2292 PostToolUseFailure-Eingabe2291 PostToolUseFailure-Eingabe
2293</h4>2292</h4>
2294 2293
2295PostToolUseFailure-Hooks erhalten dieselben Felder `tool_name` und `tool_input` wie PostToolUse, zusammen mit Fehlerinformationen als Felder der obersten Ebene. Bei einem MCP-Tool erhalten sie außerdem das Objekt [`mcp_server`](#pretooluse-input). Ein fehlgeschlagener `npm test`-Befehl könnte beispielsweise Folgendes liefern:2294PostToolUseFailure-Hooks erhalten dieselben Felder `tool_name` und `tool_input` wie PostToolUse sowie Fehlerinformationen als Felder der obersten Ebene. Bei einem MCP-Tool erhalten sie außerdem das Objekt [`mcp_server`](#pretooluse-input). Ein fehlgeschlagener `npm test`-Befehl könnte beispielsweise Folgendes liefern:
2296 2295
2297```json theme={null}2296```json theme={null}
2298{2297{
2315 2314
2316| Feld | Beschreibung |2315| Feld | Beschreibung |
2317| :- | :- |2316| :- | :- |
2318| `error` | Zeichenfolge, die beschreibt, was schiefgelaufen ist. Das Format hängt vom fehlgeschlagenen Tool ab |2317| `error` | String, der beschreibt, was schiefgelaufen ist. Das Format hängt vom fehlgeschlagenen Tool ab |
2319| `is_interrupt` | Optionaler Boolean. True, wenn der Fehler Claude Code als Abbruch erreicht hat und nicht als vom Tool gemeldeter Fehler. Das Abbrechen eines laufenden Tools löst diesen Hook nicht aus; stattdessen enthält das Tool-Ergebnis die Unterbrechungsmeldung |2318| `is_interrupt` | Optionaler boolescher Wert. True, wenn der Fehler Claude Code als Abbruch erreicht hat statt als vom Tool gemeldeter Fehler. Das Abbrechen eines laufenden Tools löst diesen Hook nicht aus; stattdessen enthält das Tool-Ergebnis die Unterbrechungsnachricht |
2320| `duration_ms` | Optional. Ausführungszeit des Tools in Millisekunden. Schließt die Zeit in Berechtigungsabfragen und PreToolUse-Hooks aus |2319| `duration_ms` | Optional. Ausführungszeit des Tools in Millisekunden. Ohne die Zeit in Berechtigungsabfragen und PreToolUse-Hooks |
2321 2320
2322Die Zeichenfolge `error` ist im Allgemeinen derselbe Text, den Claude als Ergebnis des fehlgeschlagenen Tools erhält. Ihr Format variiert je nach Tool und Fehler. Richten Sie Ihren Hook an `tool_name`, `is_interrupt` und der ersten Zeile `Exit code N` aus; behandeln Sie den Rest der Zeichenfolge als Anzeigetext, nicht als stabiles Format.2321Der `error`-String ist in der Regel derselbe Text, den Claude als Ergebnis des fehlgeschlagenen Tools erhält. Sein Format variiert je nach Tool und Fehler. Richten Sie Ihren Hook an `tool_name`, `is_interrupt` und der ersten Zeile `Exit code N` aus; behandeln Sie den Rest des Strings als Anzeigetext, nicht als stabiles Format.
2323 2322
2324* Bei Bash und PowerShell erzeugt ein Befehl, der ausgeführt und beendet wurde, eine erste Zeile `Exit code N`, gefolgt von der gesamten Ausgabe des Befehls als ein Block, in dem stdout und stderr verschachtelt sind2323* Bei Bash und PowerShell erzeugt ein Befehl, der gelaufen und beendet ist, eine erste Zeile `Exit code N`, gefolgt von der gesamten Ausgabe des Befehls als ein Block, in dem stdout und stderr verschränkt sind
2325* Eine Payload kann auch eine reine Fehlermeldung ohne Exit-Code-Zeile enthalten, wenn Claude Code den Shell-Prozess selbst nicht starten konnte2324* Eine Payload kann auch eine reine Fehlermeldung ohne Exit-Code-Zeile enthalten, wenn Claude Code den Shell-Prozess selbst nicht starten konnte
2326* Claude Code kürzt lange Zeichenfolgen in der Mitte um eine Markierung `... [N characters truncated] ...` und kann eigene Zeilen einfügen, etwa `Command timed out after 2m 0s`2325* Claude Code kürzt lange Strings in der Mitte um eine Markierung `... [N characters truncated] ...` und kann eigene Zeilen einfügen, etwa `Command timed out after 2m 0s`
2327 2326
2328<h4 id="posttoolusefailure-decision-control">2327<h4 id="posttoolusefailure-decision-control">
2329 PostToolUseFailure-Entscheidungssteuerung2328 PostToolUseFailure-Entscheidungssteuerung
2333 2332
2334| Feld | Beschreibung |2333| Feld | Beschreibung |
2335| :- | :- |2334| :- | :- |
2336| `additionalContext` | Zeichenfolge, die Claudes Kontext zusammen mit dem Fehler hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |2335| `additionalContext` | String, der Claudes Kontext zusammen mit dem Fehler hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
2337 2336
2338```json theme={null}2337```json theme={null}
2339{2338{
2348 PostToolBatch2347 PostToolBatch
2349</h3>2348</h3>
2350 2349
2351Wird einmal ausgeführt, nachdem alle Tool-Aufrufe in einem Batch abgeschlossen sind, bevor Claude Code die nächste Anfrage an das Modell sendet. `PostToolUse` wird einmal pro Tool ausgelöst, was bedeutet, dass es parallel ausgelöst wird, wenn Claude parallele Tool-Aufrufe durchführt. `PostToolBatch` wird genau einmal mit dem vollständigen Batch ausgelöst und ist daher der richtige Ort, um Kontext einzufügen, der von der Gesamtheit der ausgeführten Tools abhängt und nicht von einem einzelnen Tool. Für dieses Ereignis gibt es keinen Matcher.2350Wird einmal ausgeführt, nachdem alle Tool-Aufrufe in einem Batch abgeschlossen sind, bevor Claude Code die nächste Anfrage an das Modell sendet. `PostToolUse` wird einmal pro Tool ausgelöst, also gleichzeitig, wenn Claude parallele Tool-Aufrufe ausführt. `PostToolBatch` wird genau einmal mit dem vollständigen Batch ausgelöst und ist daher der richtige Ort, um Kontext einzufügen, der von der Menge der ausgeführten Tools statt von einem einzelnen Tool abhängt. Für dieses Ereignis gibt es keinen Matcher.
2352 2351
2353<h4 id="posttoolbatch-input">2352<h4 id="posttoolbatch-input">
2354 PostToolBatch-Eingabe2353 PostToolBatch-Eingabe
2380}2379}
2381```2380```
2382 2381
2383`tool_response` enthält denselben Inhalt, den das Modell im entsprechenden `tool_result`-Block erhält. Der Wert ist eine serialisierte Zeichenfolge oder ein Content-Block-Array, genau so, wie das Tool ihn ausgegeben hat. Für `Read` bedeutet das Text mit vorangestellten Zeilennummern statt des rohen Dateiinhalts. Antworten können groß sein, parsen Sie daher nur die Felder, die Sie benötigen.2382`tool_response` enthält denselben Inhalt, den das Modell im entsprechenden `tool_result`-Block erhält. Der Wert ist ein serialisierter String oder ein Content-Block-Array, genau so, wie das Tool ihn ausgegeben hat. Für `Read` bedeutet das Text mit vorangestellten Zeilennummern statt des rohen Dateiinhalts. Antworten können groß sein, parsen Sie daher nur die Felder, die Sie benötigen.
2384 2383
2385<Note>2384<Note>
2386 Die Struktur von `tool_response` unterscheidet sich von der in `PostToolUse`. `PostToolUse` übergibt das strukturierte `Output`-Objekt des Tools, etwa `{filePath: "...", type: "create"}` für `Write`; `PostToolBatch` übergibt den serialisierten `tool_result`-Inhalt, den das Modell sieht.2385 Die Struktur von `tool_response` unterscheidet sich von der bei `PostToolUse`. `PostToolUse` übergibt das strukturierte `Output`-Objekt des Tools, etwa `{filePath: "...", type: "create"}` für `Write`; `PostToolBatch` übergibt den serialisierten `tool_result`-Inhalt, den das Modell sieht.
2387</Note>2386</Note>
2388 2387
2389<h4 id="posttoolbatch-decision-control">2388<h4 id="posttoolbatch-decision-control">
2394 2393
2395| Feld | Beschreibung |2394| Feld | Beschreibung |
2396| :- | :- |2395| :- | :- |
2397| `additionalContext` | Kontext-Zeichenfolge, die einmal vor dem nächsten Modellaufruf eingefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) für Details zur Zustellung, zum geeigneten Inhalt und dazu, wie fortgesetzte Sitzungen frühere Werte behandeln |2396| `additionalContext` | Kontext-String, der einmal vor dem nächsten Modellaufruf eingefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) für Details zur Zustellung, zum sinnvollen Inhalt und dazu, wie fortgesetzte Sitzungen frühere Werte behandeln |
2398 2397
2399```json theme={null}2398```json theme={null}
2400{2399{
2405}2404}
2406```2405```
2407 2406
2408Die Rückgabe von `decision: "block"` oder `continue: false` stoppt die Agentenschleife vor dem nächsten Modellaufruf. Die Blockierungsmeldung stammt aus dem JSON-Feld `reason` oder `stopReason` oder bei Exit-Code 2 aus stderr. Sie sehen sie als Warnung im Transkript, und sie bleibt in der Konversation, sodass Claude sie sieht, wenn die Konversation fortgesetzt wird.2407Die Rückgabe von `decision: "block"` oder `continue: false` stoppt die Agentenschleife vor dem nächsten Modellaufruf. Die Blockierungsnachricht stammt aus dem JSON-Feld `reason` oder `stopReason` oder bei Exit-Code 2 aus stderr. Sie sehen sie als Warnung im Transkript, und sie bleibt in der Konversation, sodass Claude sie sieht, wenn die Konversation fortgesetzt wird.
2409 2408
2410<h3 id="permissiondenied">2409<h3 id="permissiondenied">
2411 PermissionDenied2410 PermissionDenied
2412</h3>2411</h3>
2413 2412
2414Wird ausgeführt, wenn der [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) einen Tool-Aufruf ablehnt, auch wenn er ohne Urteil des Klassifikators ablehnt, weil [eine vom Auto-Modus unabhängige Sicherheitsprüfung die Anfrage des Klassifikators selbst abgelehnt hat](/docs/de/errors#auto-mode-cannot-determine-the-safety-of-an-action) oder seine Antwort nicht geparst werden konnte. Dieser Hook wird nur im Auto-Modus ausgelöst: Er wird nicht ausgeführt, wenn Sie einen Berechtigungsdialog manuell ablehnen, wenn ein `PreToolUse`-Hook einen Aufruf blockiert oder wenn eine `deny`-Regel zutrifft. Verwenden Sie ihn, um Ablehnungen zu protokollieren, die Konfiguration anzupassen oder dem Modell mitzuteilen, dass es den Tool-Aufruf erneut versuchen darf.2413Wird ausgeführt, wenn der [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) einen Tool-Aufruf verweigert, auch wenn er ohne Urteil des Klassifikators verweigert, weil [eine vom Auto-Modus getrennte Sicherheitsprüfung die eigene Anfrage des Klassifikators abgelehnt hat](/docs/de/errors#auto-mode-cannot-determine-the-safety-of-an-action) oder seine Antwort nicht geparst werden konnte. Dieser Hook wird nur im Auto-Modus ausgelöst: Er läuft nicht, wenn Sie einen Berechtigungsdialog manuell ablehnen, wenn ein `PreToolUse`-Hook einen Aufruf blockiert oder wenn eine `deny`-Regel zutrifft. Verwenden Sie ihn, um Verweigerungen zu protokollieren, die Konfiguration anzupassen oder dem Modell mitzuteilen, dass es den Tool-Aufruf erneut versuchen darf.
2415 2414
2416Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.2415Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.
2417 2416
2440 2439
2441| Feld | Beschreibung |2440| Feld | Beschreibung |
2442| :- | :- |2441| :- | :- |
2443| `reason` | Der Ablehnungsgrund. Bei einem Urteil des Klassifikators nennt er in den meisten Sitzungen die zutreffende Regel in eckigen Klammern, etwa `[Data Exfiltration]`; siehe [Ablehnungen prüfen](/docs/de/auto-mode-config#review-denials) für die anderen Formen. Bei einer [Ablehnung ohne Urteil](#permissiondenied-decision-control) beginnt er mit `Auto mode could not evaluate this action and is blocking it for safety`. Bei einer Ablehnung, weil das Klassifikatormodell nicht verfügbar war, ist er der feste Text `Classifier unavailable` |2442| `reason` | Der Grund der Verweigerung. Bei einem Urteil des Klassifikators nennt er in den meisten Sitzungen die zutreffende Regel in eckigen Klammern, etwa `[Data Exfiltration]`; siehe [Verweigerungen prüfen](/docs/de/auto-mode-config#review-denials) für die anderen Formen. Bei einer [Verweigerung ohne Urteil](#permissiondenied-decision-control) beginnt er mit `Auto mode could not evaluate this action and is blocking it for safety`. Bei einer Verweigerung, weil das Klassifikatormodell nicht verfügbar war, ist er der feste Text `Classifier unavailable` |
2444 2443
2445<h4 id="permissiondenied-decision-control">2444<h4 id="permissiondenied-decision-control">
2446 PermissionDenied-Entscheidungssteuerung2445 PermissionDenied-Entscheidungssteuerung
2447</h4>2446</h4>
2448 2447
2449PermissionDenied-Hooks können dem Modell mitteilen, dass es den abgelehnten Tool-Aufruf erneut versuchen darf. Geben Sie ein JSON-Objekt zurück, in dem `hookSpecificOutput.retry` auf `true` gesetzt ist:2448PermissionDenied-Hooks können dem Modell mitteilen, dass es den verweigerten Tool-Aufruf erneut versuchen darf. Geben Sie ein JSON-Objekt zurück, in dem `hookSpecificOutput.retry` auf `true` gesetzt ist:
2450 2449
2451```json theme={null}2450```json theme={null}
2452{2451{
2457}2456}
2458```2457```
2459 2458
2460Wenn `retry` den Wert `true` hat, fügt Claude Code der Konversation eine Nachricht hinzu, die dem Modell mitteilt, dass es den Tool-Aufruf erneut versuchen darf. Claude Code hebt die Ablehnung selbst nicht auf. Wenn Ihr Hook kein JSON oder `retry: false` zurückgibt, bleibt die Ablehnung bestehen und das Modell erhält die ursprüngliche Ablehnungsnachricht.2459Wenn `retry` `true` ist, fügt Claude Code der Konversation eine Nachricht hinzu, die dem Modell mitteilt, dass es den Tool-Aufruf erneut versuchen darf. Claude Code hebt die Verweigerung selbst nicht auf. Wenn Ihr Hook kein JSON zurückgibt oder `retry: false` zurückgibt, bleibt die Verweigerung bestehen und das Modell erhält die ursprüngliche Ablehnungsnachricht.
2461 2460
2462Claude Code ignoriert `retry: true`, wenn der Klassifikator [kein Urteil über die Aktion](/docs/de/errors#auto-mode-cannot-determine-the-safety-of-an-action) gefällt hat: Seine Antwort konnte nicht geparst werden, oder eine vom Auto-Modus unabhängige Sicherheitsprüfung hat die Anfrage des Klassifikators selbst abgelehnt. Bei diesen Ablehnungen teilt Claude Code dem Modell bereits in der Ablehnungsnachricht mit, ob es später erneut versuchen oder weitermachen soll.2461Claude Code ignoriert `retry: true`, wenn der Klassifikator [kein Urteil über die Aktion](/docs/de/errors#auto-mode-cannot-determine-the-safety-of-an-action) gefällt hat: Seine Antwort konnte nicht geparst werden, oder eine vom Auto-Modus getrennte Sicherheitsprüfung hat die eigene Anfrage des Klassifikators abgelehnt. Bei diesen Verweigerungen teilt Claude Code dem Modell bereits in der Ablehnungsnachricht mit, ob es später erneut versuchen oder weitermachen soll.
2463 2462
2464<h3 id="notification">2463<h3 id="notification">
2465 Notification2464 Notification
2467 2466
2468Wird ausgeführt, wenn Claude Code Benachrichtigungen sendet. Matcht auf den Benachrichtigungstyp. Lassen Sie den Matcher weg, um Hooks für alle Benachrichtigungstypen auszuführen.2467Wird ausgeführt, wenn Claude Code Benachrichtigungen sendet. Matcht auf den Benachrichtigungstyp. Lassen Sie den Matcher weg, um Hooks für alle Benachrichtigungstypen auszuführen.
2469 2468
2470Sie erhalten diese Hook-Ereignisse auch bei deaktivierten Desktop-Benachrichtigungen: Die Einstellung `preferredNotifChannel`, einschließlich `notifications_disabled`, ändert nur, wie Sie benachrichtigt werden, nicht, ob Ihr Hook ausgeführt wird.2469Sie erhalten diese Hook-Ereignisse auch bei ausgeschalteten Desktop-Benachrichtigungen: Die Einstellung `preferredNotifChannel`, einschließlich `notifications_disabled`, ändert nur, wie Sie benachrichtigt werden, nicht, ob Ihr Hook läuft.
2471 2470
2472| Matcher | Wann er ausgelöst wird |2471| Matcher | Wann er ausgelöst wird |
2473| :- | :- |2472| :- | :- |
2475| `idle_prompt` | Claude hat vor etwa 60 Sekunden die Antwort beendet, und Sie haben seitdem nichts eingegeben |2474| `idle_prompt` | Claude hat vor etwa 60 Sekunden die Antwort beendet, und Sie haben seitdem nichts eingegeben |
2476| `auth_success` | Die Authentifizierung ist abgeschlossen |2475| `auth_success` | Die Authentifizierung ist abgeschlossen |
2477| `elicitation_dialog` | Ein MCP-Server öffnet ein Elicitation-Formular, und Sie haben seit etwa sechs Sekunden nichts eingegeben |2476| `elicitation_dialog` | Ein MCP-Server öffnet ein Elicitation-Formular, und Sie haben seit etwa sechs Sekunden nichts eingegeben |
2478| `elicitation_url_dialog` | Ein MCP-Server fordert Sie auf, eine Browser-URL zu öffnen, und Sie haben seit etwa sechs Sekunden nichts eingegeben |2477| `elicitation_url_dialog` | Ein MCP-Server bittet Sie, eine Browser-URL zu öffnen, und Sie haben seit etwa sechs Sekunden nichts eingegeben |
2479| `elicitation_complete` | Ein MCP-Server meldet, dass eine [Elicitation im URL-Modus](#elicitation-input) abgeschlossen ist |2478| `elicitation_complete` | Ein MCP-Server meldet, dass eine [Elicitation im URL-Modus](#elicitation-input) abgeschlossen ist |
2480| `elicitation_response` | Eine MCP-Elicitation-Antwort wird an den Server zurückgesendet |2479| `elicitation_response` | Eine MCP-Elicitation-Antwort wird an den Server zurückgesendet |
2481| `agent_needs_input` | Eine Hintergrundsitzung beginnt, auf Ihre Eingabe zu warten, während die [Agentenansicht](/docs/de/agent-view) in einem Terminal geöffnet ist. Wird auch ausgelöst, wenn eine Terminal-Sitzung Ihnen die [Frage eines Agent-Team-Teammitglieds zur Terminal-Einrichtung](/docs/de/agent-teams#choose-a-display-mode) oder den Hinweis des Auto-Modus zu [Gebühren für Klassifikatoranfragen](/docs/de/auto-mode-classifier-billing) anzeigt und Sie seit etwa sechs Sekunden nichts eingegeben haben |2480| `agent_needs_input` | Eine Hintergrundsitzung beginnt, auf Ihre Eingabe zu warten, während die [Agentenansicht](/docs/de/agent-view) in einem Terminal geöffnet ist. Wird auch ausgelöst, wenn eine Terminal-Sitzung Ihnen die [Frage eines Agent-Team-Teammitglieds zur Terminal-Einrichtung](/docs/de/agent-teams#choose-a-display-mode) oder den Hinweis des Auto-Modus zu [Gebühren für Klassifikator-Anfragen](/docs/de/auto-mode-classifier-billing) anzeigt und Sie seit etwa sechs Sekunden nichts eingegeben haben |
2482| `agent_completed` | Eine Hintergrundsitzung wird beendet oder schlägt fehl. Wird nur ausgelöst, während die [Agentenansicht](/docs/de/agent-view) in einem Terminal geöffnet ist |2481| `agent_completed` | Eine Hintergrundsitzung wird beendet oder schlägt fehl. Wird nur ausgelöst, während die [Agentenansicht](/docs/de/agent-view) in einem Terminal geöffnet ist |
2483| `quota_auto_resume_fired` | Claude Code setzt Ihre Aufgabe fort, nachdem ein claude.ai-Nutzungslimit sie pausiert hat: beim Zurücksetzen oder früher, wenn etwas, das Sie während der Wartezeit in Claude Code tun, etwa das Hinzufügen von Nutzungsguthaben, ein Upgrade Ihres Plans oder ein Modellwechsel, die Nutzung wieder verfügbar macht, mit der [Ausnahme für die Modelleinstellung](/docs/de/interactive-mode#wait-for-a-usage-limit-to-reset) |2482| `quota_auto_resume_fired` | Claude Code setzt Ihre Aufgabe fort, nachdem ein claude.ai-Nutzungslimit sie pausiert hat: beim Zurücksetzen oder früher, wenn etwas, das Sie während der Wartezeit in Claude Code tun, etwa Nutzungsguthaben hinzufügen, Ihren Plan upgraden oder das Modell wechseln, wieder Nutzung verfügbar macht, mit der [Ausnahme für die Modelleinstellung](/docs/de/interactive-mode#wait-for-a-usage-limit-to-reset) |
2484| `quota_auto_resume_stale` | Ein claude.ai-Nutzungslimit wurde zurückgesetzt, während Ihr Computer länger als etwa 30 Minuten im Ruhezustand war. Claude Code wartet, bis Sie `Enter` drücken, anstatt fortzufahren. Nach einem kürzeren Ruhezustand fährt es fort und löst stattdessen `quota_auto_resume_fired` aus |2483| `quota_auto_resume_stale` | Ein claude.ai-Nutzungslimit wurde zurückgesetzt, während Ihr Computer länger als etwa 30 Minuten im Ruhezustand war. Claude Code wartet darauf, dass Sie `Enter` drücken, statt fortzufahren. Nach einem kürzeren Ruhezustand fährt es fort und löst stattdessen `quota_auto_resume_fired` aus |
2485| `quota_auto_resume_disabled` | Claude Code beendet seine Wartezeit auf ein claude.ai-Nutzungslimit, ohne Ihre Aufgabe fortzusetzen: [`autoContinueAtUsageLimit`](/docs/de/settings-reference#autocontinueatusagelimit) wurde ausgeschaltet oder das Zurücksetzen wurde während einer Wartezeit, die Claude Code selbst begonnen hat, um mehr als 24 Stunden verschoben, die fortgesetzte Aufgabe stieß wiederholt an das Limit, oder die Fortsetzung wurde blockiert, bevor sie das Modell erreichte. Wird nicht ausgelöst, wenn Sie `Esc` oder `Ctrl+C` drücken oder **Don't continue automatically** wählen |2484| `quota_auto_resume_disabled` | Claude Code beendet das Warten auf ein claude.ai-Nutzungslimit, ohne Ihre Aufgabe fortzusetzen: [`autoContinueAtUsageLimit`](/docs/de/settings-reference#autocontinueatusagelimit) wurde ausgeschaltet oder das Zurücksetzen hat sich während einer von Claude Code selbst begonnenen Wartezeit um mehr als 24 Stunden verschoben, die fortgesetzte Aufgabe ist wiederholt an das Limit gestoßen, oder die Fortsetzung wurde blockiert, bevor sie das Modell erreicht hat. Wird nicht ausgelöst, wenn Sie `Esc` oder `Ctrl+C` drücken oder **Don't continue automatically** wählen |
2486 2485
2487Die Typen `quota_auto_resume_fired`, `quota_auto_resume_stale` und `quota_auto_resume_disabled` erfordern Claude Code v2.1.234 oder höher.2486Die Typen `quota_auto_resume_fired`, `quota_auto_resume_stale` und `quota_auto_resume_disabled` erfordern Claude Code v2.1.234 oder höher.
2488 2487
2493<Note>2492<Note>
2494 Die Typen `permission_prompt`, `idle_prompt`, `elicitation_dialog` und `elicitation_url_dialog` teilen ihr Timing mit Desktop-Benachrichtigungen, sodass Sie sie in Terminal-Sitzungen nur sehen, wenn Sie scheinbar nicht am Terminal sind:2493 Die Typen `permission_prompt`, `idle_prompt`, `elicitation_dialog` und `elicitation_url_dialog` teilen ihr Timing mit Desktop-Benachrichtigungen, sodass Sie sie in Terminal-Sitzungen nur sehen, wenn Sie scheinbar nicht am Terminal sind:
2495 2494
2496 * Rechnen Sie mit `permission_prompt`, sobald Sie etwa sechs Sekunden lang nichts eingegeben haben. Der Timer startet, wenn die Berechtigungsabfrage erscheint, und jeder Tastendruck verzögert ihn. Um einen Hook sofort auszuführen, wenn Claude um Erlaubnis zur Nutzung eines Tools bittet, verwenden Sie stattdessen [PermissionRequest](#permissionrequest).2495 * Rechnen Sie mit `permission_prompt`, sobald Sie seit etwa sechs Sekunden nichts eingegeben haben. Der Timer startet, wenn die Berechtigungsabfrage erscheint, und jeder Tastendruck schiebt ihn auf. Um einen Hook sofort auszuführen, wenn Claude um Erlaubnis zur Nutzung eines Tools bittet, verwenden Sie stattdessen [PermissionRequest](#permissionrequest).
2497 * Rechnen Sie mit `idle_prompt` etwa 60 Sekunden, nachdem Claude die Antwort beendet hat, und nur, wenn Sie seitdem nichts eingegeben haben und kein Hintergrundagent, etwa ein [Subagent](/docs/de/sub-agents) im Hintergrund, noch läuft. Claude Code sendet `idle_prompt` nicht, während es auf das Zurücksetzen eines claude.ai-Nutzungslimits wartet. Wenn die Wartezeit von selbst endet, wird stattdessen einer der Typen `quota_auto_resume_*` ausgelöst.2496 * Rechnen Sie mit `idle_prompt` etwa 60 Sekunden, nachdem Claude die Antwort beendet hat, und nur, wenn Sie seitdem nichts eingegeben haben und kein Hintergrundagent, etwa ein [Subagent](/docs/de/sub-agents) im Hintergrund, noch läuft. Claude Code sendet `idle_prompt` nicht, während es auf das Zurücksetzen eines claude.ai-Nutzungslimits wartet. Wenn die Wartezeit von selbst endet, wird stattdessen einer der `quota_auto_resume_*`-Typen ausgelöst.
2498 * Rechnen Sie mit `elicitation_dialog` für ein Elicitation-Formular oder `elicitation_url_dialog` für eine Browser-URL-Anfrage, sobald Sie etwa sechs Sekunden lang nichts eingegeben haben. Beide teilen dieselbe Sechs-Sekunden-Schwelle wie `permission_prompt`: Der Timer startet, wenn der Dialog erscheint, und jeder Tastendruck verzögert ihn.2497 * Rechnen Sie mit `elicitation_dialog` für ein Elicitation-Formular oder mit `elicitation_url_dialog` für eine Browser-URL-Anfrage, sobald Sie seit etwa sechs Sekunden nichts eingegeben haben. Beide teilen dieselbe Sechs-Sekunden-Schwelle wie `permission_prompt`: Der Timer startet, wenn der Dialog erscheint, und jeder Tastendruck schiebt ihn auf.
2499 2498
2500 Eine Berechtigungsanfrage oder Elicitation, die eintrifft, während ein anderer Dialog angezeigt wird, behält dieselbe Sechs-Sekunden-Schwelle, gemessen ab dem Eintreffen der Anfrage. Ihre Benachrichtigung kann Sie erreichen, während die Anfrage noch hinter dem geöffneten Dialog wartet.2499 Eine Berechtigungsanfrage oder Elicitation, die eintrifft, während ein anderer Dialog angezeigt wird, behält dieselbe Sechs-Sekunden-Schwelle, gemessen ab dem Eintreffen der Anfrage. Ihre Benachrichtigung kann Sie erreichen, während die Anfrage noch hinter dem geöffneten Dialog wartet.
2501</Note>2500</Note>
2502 2501
2503Claude Code steuert das Timing von `permission_prompt` anders in Sitzungen, in denen es Berechtigungsanfragen an den [`canUseTool`-Callback](/docs/de/agent-sdk/user-input) des Agent SDK sendet. Auf diese Weise hosten Claude Desktop und die VS Code-Erweiterung Claude Code:2502Claude Code taktet `permission_prompt` anders in Sitzungen, in denen es Berechtigungsanfragen an den [`canUseTool`-Callback](/docs/de/agent-sdk/user-input) des Agent SDK sendet, auf diese Weise hosten Claude Desktop und die VS Code-Erweiterung Claude Code:
2504 2503
2505* Rechnen Sie mit `permission_prompt` etwa sechs Sekunden, nachdem Claude um Erlaubnis bittet. Claude Code verzögert es nicht, während Sie tippen.2504* Rechnen Sie mit `permission_prompt` etwa sechs Sekunden, nachdem Claude um Erlaubnis bittet. Claude Code schiebt es nicht auf, während Sie tippen.
2506* Wenn Sie oder ein [PermissionRequest](#permissionrequest)-Hook früher antworten, führt Claude Code `permission_prompt` nicht aus.2505* Wenn Sie oder ein [PermissionRequest](#permissionrequest)-Hook früher antworten, führt Claude Code `permission_prompt` nicht aus.
2507* Setzen Sie [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/de/env-vars) auf `1`, um `permission_prompt` in diesen Sitzungen auszuschalten.2506* Setzen Sie [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/de/env-vars) auf `1`, um `permission_prompt` in diesen Sitzungen auszuschalten.
2508 2507
2509Vor v2.1.233 wurde `permission_prompt` in diesen Sitzungen nicht ausgelöst.2508Vor v2.1.233 wurde `permission_prompt` in diesen Sitzungen nicht ausgelöst.
2510 2509
2511Verwenden Sie separate Matcher, um je nach Benachrichtigungstyp unterschiedliche Handler auszuführen. Diese Konfiguration löst ein berechtigungsspezifisches Warnskript aus, wenn Claude eine Berechtigungsgenehmigung benötigt, und eine andere Benachrichtigung, wenn Claude untätig war:2510Verwenden Sie separate Matcher, um je nach Benachrichtigungstyp unterschiedliche Handler auszuführen. Diese Konfiguration löst ein berechtigungsspezifisches Warnskript aus, wenn Claude eine Genehmigung für eine Berechtigung benötigt, und eine andere Benachrichtigung, wenn Claude inaktiv ist:
2512 2511
2513```json theme={null}2512```json theme={null}
2514{2513{
2541 Notification-Eingabe2540 Notification-Eingabe
2542</h4>2541</h4>
2543 2542
2544Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten Notification-Hooks `message` mit dem Benachrichtigungstext, ein optionales `title` und `notification_type`, das angibt, welcher Typ ausgelöst wurde.2543Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten Notification-Hooks `message` mit dem Benachrichtigungstext, einen optionalen `title` und `notification_type`, das angibt, welcher Typ ausgelöst wurde.
2545 2544
2546```json theme={null}2545```json theme={null}
2547{2546{
2555}2554}
2556```2555```
2557 2556
2558Notification-Hooks können Benachrichtigungen weder blockieren noch ändern. Claude Code verwirft ihre Felder `systemMessage` und `continue`, gibt aber weiterhin [`terminalSequence`](#emit-terminal-notifications) aus, worauf das Beispiel für Desktop-Benachrichtigungen beruht. Notification-Hooks sind für Nebeneffekte gedacht, etwa die Weiterleitung der Benachrichtigung an einen externen Dienst.2557Notification-Hooks können Benachrichtigungen weder blockieren noch ändern. Claude Code verwirft ihre Felder `systemMessage` und `continue`, gibt aber weiterhin [`terminalSequence`](#emit-terminal-notifications) aus, worauf das Beispiel für Desktop-Benachrichtigungen beruht. Notification-Hooks sind für Nebeneffekte gedacht, etwa das Weiterleiten der Benachrichtigung an einen externen Dienst.
2559 2558
2560<h3 id="subagentstart">2559<h3 id="subagentstart">
2561 SubagentStart2560 SubagentStart
2562</h3>2561</h3>
2563 2562
2564Wird ausgeführt, wenn Claude mit dem Agent-Tool einen Subagenten startet, wenn Claude [einen Subagenten fortsetzt](/docs/de/sub-agents#resume-subagents) und jedes Mal, wenn ein In-Process-Teammitglied eines [Agent-Teams](/docs/de/agent-teams) eine neue Nachricht verarbeitet. Unterstützt Matcher zum Filtern nach dem Namen des Agententyps. Bei integrierten Agenten ist dies der Agentenname wie `general-purpose`, `Explore` oder `Plan`. Bei [benutzerdefinierten Subagenten](/docs/de/sub-agents) ist dies das Feld `name` aus dem Frontmatter des Agenten, nicht der Dateiname.2563Wird ausgeführt, wenn Claude mit dem Agent-Tool einen Subagenten startet, wenn Claude [einen Subagenten fortsetzt](/docs/de/sub-agents#resume-subagents), und jedes Mal, wenn ein In-Process-Teammitglied eines [Agent-Teams](/docs/de/agent-teams) eine neue Nachricht bearbeitet. Unterstützt Matcher zum Filtern nach dem Namen des Agententyps. Bei integrierten Agenten ist dies der Agentenname wie `general-purpose`, `Explore` oder `Plan`. Bei [benutzerdefinierten Subagenten](/docs/de/sub-agents) ist dies das Feld `name` aus dem Frontmatter des Agenten, nicht der Dateiname.
2565 2564
2566Bei Subagenten, die von einem [Plugin](/docs/de/plugins/overview) bereitgestellt werden, ist der Agententyp der plugin-bezogene Bezeichner wie `my-plugin:reviewer`, nicht der reine Frontmatter-Name. Der Doppelpunkt führt dazu, dass ein plugin-bezogener Name als regulärer Ausdruck ausgewertet wird. Verankern Sie den Matcher daher für eine exakte Übereinstimmung mit `^` und `$`: `^my-plugin:reviewer$`.2565Bei Subagenten, die von einem [Plugin](/docs/de/plugins/overview) bereitgestellt werden, ist der Agententyp der Plugin-bezogene Bezeichner wie `my-plugin:reviewer`, nicht der reine Frontmatter-Name. Der Doppelpunkt führt einen Plugin-bezogenen Namen auf den Pfad für reguläre Ausdrücke, verankern Sie den Matcher daher für eine exakte Übereinstimmung mit `^` und `$`: `^my-plugin:reviewer$`.
2567 2566
2568<h4 id="subagentstart-input">2567<h4 id="subagentstart-input">
2569 SubagentStart-Eingabe2568 SubagentStart-Eingabe
2570</h4>2569</h4>
2571 2570
2572Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SubagentStart-Hooks `agent_id` mit dem eindeutigen Bezeichner des Subagenten und `agent_type` mit dem Agentennamen, auf den der Matcher filtert.2571Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SubagentStart-Hooks `agent_id` mit dem eindeutigen Bezeichner des Subagenten und `agent_type` mit dem Agentennamen, nach dem der Matcher filtert.
2573 2572
2574```json theme={null}2573```json theme={null}
2575{2574{
2582}2581}
2583```2582```
2584 2583
2585SubagentStart-Hooks können die Erstellung eines Subagenten nicht blockieren, aber Kontext in den Subagenten einfügen. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können Sie Folgendes zurückgeben:2584SubagentStart-Hooks können die Erstellung des Subagenten nicht blockieren, aber Kontext in den Subagenten einfügen. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können Sie Folgendes zurückgeben:
2586 2585
2587| Feld | Beschreibung |2586| Feld | Beschreibung |
2588| :- | :- |2587| :- | :- |
2589| `additionalContext` | Zeichenfolge, die dem Kontext des Subagenten zu Beginn seiner Konversation vor seinem ersten Prompt hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |2588| `additionalContext` | String, der dem Kontext des Subagenten zu Beginn seiner Konversation vor seinem ersten Prompt hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
2590 2589
2591```json theme={null}2590```json theme={null}
2592{2591{
2597}2596}
2598```2597```
2599 2598
2600Wenn der Hook für denselben Subagenten erneut ausgeführt wird, fügt Claude Code den zurückgegebenen Kontext nur ein, wenn der Kontext des Subagenten die Kopie aus einem früheren Durchlauf noch nicht enthält. Die beim Start eingefügte Kopie bleibt bestehen, sodass der [Prompt-Cache](/docs/de/prompt-caching#subagents-and-the-cache) des Subagenten intakt bleibt. Nachdem die [automatische Komprimierung](/docs/de/sub-agents#auto-compaction) diese Kopie verworfen hat, fügt Claude Code den Kontext des nächsten Durchlaufs erneut ein.2599Wenn der Hook für denselben Subagenten erneut läuft, fügt Claude Code den zurückgegebenen Kontext nur ein, wenn der Kontext des Subagenten die Kopie aus einem früheren Lauf nicht bereits enthält. Die beim Start eingefügte Kopie bleibt bestehen, wodurch der [Prompt-Cache](/docs/de/prompt-caching#subagents-and-the-cache) des Subagenten intakt bleibt. Nachdem die [automatische Komprimierung](/docs/de/sub-agents#auto-compaction) diese Kopie verworfen hat, fügt Claude Code den Kontext des nächsten Laufs erneut ein.
2601 2600
2602<h3 id="subagentstop">2601<h3 id="subagentstop">
2603 SubagentStop2602 SubagentStop
2609 SubagentStop-Eingabe2608 SubagentStop-Eingabe
2610</h4>2609</h4>
2611 2610
2612Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SubagentStop-Hooks `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path` und `last_assistant_message`. Das Feld `agent_type` ist der Wert, der für die Matcher-Filterung verwendet wird. `transcript_path` ist das Transkript der Hauptsitzung, während `agent_transcript_path` das eigene Transkript des Subagenten ist, das in einem verschachtelten Ordner `subagents/` gespeichert wird. Das Feld `last_assistant_message` enthält den Textinhalt der letzten Antwort des Subagenten, sodass Hooks darauf zugreifen können, ohne die Transkriptdatei zu parsen.2611Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SubagentStop-Hooks `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path` und `last_assistant_message`. Das Feld `agent_type` ist der Wert, der zum Filtern durch den Matcher verwendet wird. `transcript_path` ist das Transkript der Hauptsitzung, während `agent_transcript_path` das eigene Transkript des Subagenten ist, das in einem verschachtelten Ordner `subagents/` gespeichert ist. Das Feld `last_assistant_message` enthält den Textinhalt der letzten Antwort des Subagenten, sodass Hooks darauf zugreifen können, ohne die Transkriptdatei zu parsen.
2613 2612
2614Nicht jedes SubagentStop-Ereignis stammt von einem Subagenten, den Claude gestartet hat. Claude Code führt für einige seiner eigenen Funktionen auch interne Agenten aus, etwa für [Prompt-Vorschläge](/docs/de/interactive-mode#prompt-suggestions) und [`/btw`-Nebenfragen](/docs/de/interactive-mode#side-questions-with-%2Fbtw), und SubagentStop wird auch ausgelöst, wenn einer davon beendet wird. Bei diesen Ereignissen ist `agent_type` der Agentenname, unter dem die Sitzung selbst läuft, etwa einer, der mit [`--agent`](/docs/de/cli-reference#cli-flags) oder der [Einstellung `agent`](/docs/de/settings-reference#agent) festgelegt wurde, und eine leere Zeichenfolge, wenn die Sitzung ohne einen solchen läuft.2613Nicht jedes SubagentStop-Ereignis stammt von einem Subagenten, den Claude gestartet hat. Claude Code führt für einige eigene Funktionen auch interne Agenten aus, etwa für [Prompt-Vorschläge](/docs/de/interactive-mode#prompt-suggestions) und [`/btw`-Nebenfragen](/docs/de/interactive-mode#side-questions-with-%2Fbtw), und SubagentStop wird auch ausgelöst, wenn einer davon beendet wird. Bei diesen Ereignissen ist `agent_type` der Agentenname, als der die Sitzung selbst läuft, etwa einer, der mit [`--agent`](/docs/de/cli-reference#cli-flags) oder der [Einstellung `agent`](/docs/de/settings-reference#agent) festgelegt wurde, und ein leerer String, wenn die Sitzung ohne einen läuft.
2615 2614
2616Ein `matcher`, der Agententypen benennt, matcht keinen leeren `agent_type`. Ein Hook, dessen Matcher weggelassen, `""` oder `"*"` ist oder ein regulärer Ausdruck ist, der eine leere Zeichenfolge matcht, wird auch für Ereignisse mit leerem `agent_type` ausgeführt.2615Ein `matcher`, der Agententypen benennt, passt nicht auf einen leeren `agent_type`. Ein Hook, dessen Matcher weggelassen, `""` oder `"*"` ist oder ein regulärer Ausdruck ist, der auf einen leeren String passt, läuft auch für Ereignisse mit leerem `agent_type`.
2617 2616
2618Ab Claude Code v2.1.271 übermittelt ein Subagent, der mit dem Tool [`SubagentHandback`](/docs/de/tools-reference) läuft, seinen Bericht über dieses Tool, bevor er stoppt. Das Feld `last_assistant_message` enthält dann den abschließenden Text des Subagenten, falls vorhanden, der nicht der übermittelte Bericht ist. Der Bericht ist die `message`-Eingabe dieses Aufrufs, die ein `PreToolUse`- oder `PostToolUse`-Hook mit dem Matcher `SubagentHandback` als `tool_input.message` erhält.2617Ab Claude Code v2.1.271 liefert ein Subagent, der mit dem Tool [`SubagentHandback`](/docs/de/tools-reference) läuft, seinen Bericht über dieses Tool, bevor er stoppt. Das Feld `last_assistant_message` enthält dann den abschließenden Text des Subagenten, falls vorhanden, der nicht der gelieferte Bericht ist. Der Bericht ist die `message`-Eingabe dieses Aufrufs, die ein `PreToolUse`- oder `PostToolUse`-Hook mit dem Matcher `SubagentHandback` als `tool_input.message` erhält.
2619 2618
2620SubagentStop-Hooks erhalten außerdem die Arrays `background_tasks` und `session_crons`, die unter [Stop-Eingabe](#stop-input) beschrieben sind. Beide Arrays beziehen sich auf die übergeordnete Sitzung, nicht auf den Subagenten.2619SubagentStop-Hooks erhalten außerdem die Arrays `background_tasks` und `session_crons`, die unter [Stop-Eingabe](#stop-input) beschrieben sind. Beide Arrays beziehen sich auf die übergeordnete Sitzung, nicht auf den Subagenten.
2621 2620
2636}2635}
2637```2636```
2638 2637
2639SubagentStop-Hooks verwenden dasselbe Format zur Entscheidungssteuerung wie [Stop-Hooks](#stop-decision-control), einschließlich `hookSpecificOutput.additionalContext` mit `hookEventName` auf `"SubagentStop"` gesetzt, für Feedback ohne Fehlercharakter, das den Subagenten weiterlaufen lässt. Die Rückgabe von `decision: "block"` mit einem `reason` lässt den Subagenten weiterlaufen und übermittelt `reason` an den Subagenten als seine nächste Anweisung. Ein Hook, der durch Exit-Code 2 blockiert, übermittelt seine stderr-Meldung auf dieselbe Weise. Um Kontext in die übergeordnete Sitzung einzufügen, nachdem ein Subagent zurückgekehrt ist, verwenden Sie stattdessen einen [`PostToolUse`](#posttooluse)-Hook für das `Agent`-Tool.2638SubagentStop-Hooks verwenden dasselbe Format zur Entscheidungssteuerung wie [Stop-Hooks](#stop-decision-control), einschließlich `hookSpecificOutput.additionalContext` mit `hookEventName` auf `"SubagentStop"` gesetzt, für Feedback ohne Fehlercharakter, das den Subagenten weiterlaufen lässt. Die Rückgabe von `decision: "block"` mit einem `reason` hält den Subagenten am Laufen und liefert `reason` als nächste Anweisung an den Subagenten. Ein Hook, der durch Beenden mit Exit-Code 2 blockiert, liefert seine stderr-Nachricht auf dieselbe Weise. Um nach der Rückkehr eines Subagenten Kontext in die übergeordnete Sitzung einzufügen, verwenden Sie stattdessen einen [`PostToolUse`](#posttooluse)-Hook für das Tool `Agent`.
2640 2639
2641<h3 id="taskcreated">2640<h3 id="taskcreated">
2642 TaskCreated2641 TaskCreated
2672| `task_subject` | Titel der Aufgabe |2671| `task_subject` | Titel der Aufgabe |
2673| `task_description` | Ausführliche Beschreibung der Aufgabe. Kann fehlen |2672| `task_description` | Ausführliche Beschreibung der Aufgabe. Kann fehlen |
2674| `teammate_name` | Name des Teammitglieds, das die Aufgabe erstellt. Kann fehlen |2673| `teammate_name` | Name des Teammitglieds, das die Aufgabe erstellt. Kann fehlen |
2675| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einer zukünftigen Version entfernt |2674| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einem zukünftigen Release entfernt |
2675| `agent_id` | Bei diesem Ereignis identifiziert das [gemeinsame Eingabefeld](#common-input-fields) den Subagenten oder das [In-Process-Teammitglied](/docs/de/agent-teams#choose-a-display-mode), das die Aufgabe erstellt. Kann fehlen. Erfordert Claude Code v2.1.290 oder höher |
2676 2676
2677<h4 id="taskcreated-decision-control">2677<h4 id="taskcreated-decision-control">
2678 TaskCreated-Entscheidungssteuerung2678 TaskCreated-Entscheidungssteuerung
2702 TaskCompleted2702 TaskCompleted
2703</h3>2703</h3>
2704 2704
2705Wird ausgeführt, wenn eine Aufgabe als abgeschlossen markiert wird. Dies wird in zwei Situationen ausgelöst: wenn ein beliebiger Agent eine Aufgabe über das Tool TaskUpdate ausdrücklich als abgeschlossen markiert oder wenn ein Teammitglied eines [Agent-Teams](/docs/de/agent-teams) seinen Turn mit laufenden Aufgaben beendet. Verwenden Sie dies, um Abschlusskriterien wie bestandene Tests oder Lint-Prüfungen durchzusetzen, bevor eine Aufgabe geschlossen werden kann.2705Wird ausgeführt, wenn eine Aufgabe als abgeschlossen markiert wird. Dies geschieht in zwei Situationen: wenn ein beliebiger Agent eine Aufgabe über das TaskUpdate-Tool explizit als abgeschlossen markiert, oder wenn ein Teammitglied eines [Agent-Teams](/docs/de/agent-teams) seinen Turn mit laufenden Aufgaben beendet. Verwenden Sie dies, um Abschlusskriterien wie bestandene Tests oder Lint-Prüfungen durchzusetzen, bevor eine Aufgabe geschlossen werden kann.
2706 2706
2707TaskCompleted-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.2707TaskCompleted-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.
2708 2708
2733| `task_subject` | Titel der Aufgabe |2733| `task_subject` | Titel der Aufgabe |
2734| `task_description` | Ausführliche Beschreibung der Aufgabe. Kann fehlen |2734| `task_description` | Ausführliche Beschreibung der Aufgabe. Kann fehlen |
2735| `teammate_name` | Name des Teammitglieds, das die Aufgabe abschließt. Kann fehlen |2735| `teammate_name` | Name des Teammitglieds, das die Aufgabe abschließt. Kann fehlen |
2736| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einer zukünftigen Version entfernt |2736| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einem zukünftigen Release entfernt |
2737| `agent_id` | Bei diesem Ereignis identifiziert das [gemeinsame Eingabefeld](#common-input-fields) den Subagenten oder das [In-Process-Teammitglied](/docs/de/agent-teams#choose-a-display-mode), das die Aufgabe abschließt. Kann fehlen. Erfordert Claude Code v2.1.290 oder höher |
2737 2738
2738<h4 id="taskcompleted-decision-control">2739<h4 id="taskcompleted-decision-control">
2739 TaskCompleted-Entscheidungssteuerung2740 TaskCompleted-Entscheidungssteuerung
2740</h4>2741</h4>
2741 2742
2742TaskCompleted-Hooks unterstützen zwei Möglichkeiten, den Aufgabenabschluss zu steuern:2743TaskCompleted-Hooks unterstützen zwei Arten, den Abschluss einer Aufgabe zu steuern:
2743 2744
2744* **Exit-Code 2**: Die Aufgabe wird nicht als abgeschlossen markiert, und die stderr-Meldung wird dem Modell als Feedback zurückgegeben.2745* **Exit-Code 2**: Die Aufgabe wird nicht als abgeschlossen markiert, und die stderr-Nachricht wird dem Modell als Feedback zurückgegeben.
2745* **JSON `{"continue": false, "stopReason": "..."}`**: Wenn ein Teammitglied, das seinen Turn beendet, das Ereignis ausgelöst hat, wird das Teammitglied vollständig gestoppt, entsprechend dem Verhalten des `Stop`-Hooks. Der `stopReason` wird dem Benutzer angezeigt. Wenn das Tool `TaskUpdate` das Ereignis ausgelöst hat, ignoriert Claude Code `continue: false`; Exit-Code 2 blockiert den Abschluss weiterhin.2746* **JSON `{"continue": false, "stopReason": "..."}`**: Wenn ein Teammitglied, das seinen Turn beendet, das Ereignis ausgelöst hat, wird das Teammitglied vollständig gestoppt, entsprechend dem Verhalten des `Stop`-Hooks. Der `stopReason` wird dem Benutzer angezeigt. Wenn das Tool `TaskUpdate` das Ereignis ausgelöst hat, ignoriert Claude Code `continue: false`; Exit-Code 2 blockiert den Abschluss weiterhin.
2746 2747
2747Dieses Beispiel führt Tests aus und blockiert den Aufgabenabschluss, wenn sie fehlschlagen:2748Dieses Beispiel führt Tests aus und blockiert den Abschluss der Aufgabe, wenn sie fehlschlagen:
2748 2749
2749```bash theme={null}2750```bash theme={null}
2750#!/bin/bash2751#!/bin/bash
2765</h3>2766</h3>
2766 2767
2767Wird ausgeführt, wenn der Haupt-Agent von Claude Code seine Antwort beendet hat. Wird nicht ausgeführt, wenn2768Wird ausgeführt, wenn der Haupt-Agent von Claude Code seine Antwort beendet hat. Wird nicht ausgeführt, wenn
2768das Stoppen durch eine Unterbrechung des Benutzers verursacht wurde. API-Fehler lösen2769das Anhalten durch eine Unterbrechung des Benutzers erfolgte. API-Fehler lösen stattdessen
2769stattdessen [StopFailure](#stopfailure) aus.2770[StopFailure](#stopfailure) aus.
2770 2771
2771<Tip>2772<Tip>
2772 Der Befehl [`/goal`](/docs/de/goal) ist eine integrierte Abkürzung für einen sitzungsbezogenen, prompt-basierten Stop-Hook. Verwenden Sie ihn, wenn Claude auf eine Bedingung hinarbeiten soll, ohne dass Sie eine Hook-Konfiguration schreiben.2773 Der Befehl [`/goal`](/docs/de/goal) ist eine integrierte Abkürzung für einen sitzungsbezogenen, Prompt-basierten Stop-Hook. Verwenden Sie ihn, wenn Claude auf eine Bedingung hinarbeiten soll, ohne dass Sie eine Hook-Konfiguration schreiben.
2773</Tip>2774</Tip>
2774 2775
2775<h4 id="stop-input">2776<h4 id="stop-input">
2776 Stop-Eingabe2777 Stop-Eingabe
2777</h4>2778</h4>
2778 2779
2779Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten Stop-Hooks `stop_hook_active`, `last_assistant_message`, `background_tasks` und `session_crons`. Das Feld `stop_hook_active` ist `true`, wenn Claude Code bereits infolge eines Stop-Hooks fortfährt. Prüfen Sie diesen Wert oder verarbeiten Sie das Transkript, um zu vermeiden, dass Sie auf eine Bedingung blockieren, die sich nie auflöst.2780Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten Stop-Hooks `stop_hook_active`, `last_assistant_message`, `background_tasks` und `session_crons`. Das Feld `stop_hook_active` ist `true`, wenn Claude Code bereits aufgrund eines Stop-Hooks fortfährt. Prüfen Sie diesen Wert oder verarbeiten Sie das Transkript, um nicht auf eine Bedingung zu blockieren, die sich nie auflöst.
2780 2781
2781Claude Code wendet eine Obergrenze von 8 aufeinanderfolgenden Fortsetzungen an: Nachdem Stop-Hooks den Turn achtmal hintereinander fortgesetzt haben, überschreibt Claude Code die nächste Blockierung und beendet den Turn. Die Anzahl aufeinanderfolgender Fortsetzungen wird jedes Mal zurückgesetzt, wenn Claude ein Tool aufruft. Um die Obergrenze anzuheben, setzen Sie [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/de/env-vars).2782Claude Code wendet eine Obergrenze von 8 aufeinanderfolgenden Fortsetzungen an: Nachdem Stop-Hooks den Turn achtmal hintereinander fortgesetzt haben, überschreibt Claude Code die nächste Blockierung und beendet den Turn. Die Anzahl aufeinanderfolgender Fortsetzungen wird jedes Mal zurückgesetzt, wenn Claude ein Tool aufruft. Um die Obergrenze zu erhöhen, setzen Sie [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/de/env-vars).
2782 2783
2783Das Feld `last_assistant_message` enthält den Textinhalt von Claudes letzter Antwort, sodass Hooks darauf zugreifen können, ohne die Transkriptdatei zu parsen. Für Hooks, die auf den gerade abgeschlossenen Turn reagieren, etwa Vorlese- oder Benachrichtigungs-Hooks, verwenden Sie dieses Feld, anstatt `transcript_path` zu lesen: Es ist nicht in allen Versionen garantiert, dass die Transkriptdatei zum Stop-Zeitpunkt die letzte Nachricht enthält.2784Das Feld `last_assistant_message` enthält den Textinhalt von Claudes letzter Antwort, sodass Hooks darauf zugreifen können, ohne die Transkriptdatei zu parsen. Für Hooks, die auf den gerade abgeschlossenen Turn reagieren, etwa Vorlese- oder Benachrichtigungs-Hooks, verwenden Sie dieses Feld statt `transcript_path` zu lesen: Es ist nicht in allen Versionen garantiert, dass die Transkriptdatei zum Zeitpunkt von Stop die letzte Nachricht enthält.
2784 2785
2785Mit den Arrays `background_tasks` und `session_crons` können Hooks unterscheiden zwischen „Sitzung ist beendet“ und „Sitzung ist pausiert und wartet darauf, dass Hintergrundarbeit sie wieder aufweckt“. Beide Arrays sind vorhanden, wenn die Aufgabenregistrierung erreichbar ist, und leer, wenn nichts läuft oder geplant ist.2786Mit den Arrays `background_tasks` und `session_crons` können Hooks unterscheiden zwischen „Sitzung ist fertig“ und „Sitzung ist pausiert und wartet darauf, dass Hintergrundarbeit sie wieder aufweckt“. Beide Arrays sind vorhanden, wenn die Aufgabenregistrierung erreichbar ist, und leer, wenn nichts läuft oder geplant ist.
2786 2787
2787Jeder Eintrag in `background_tasks` beschreibt eine laufende Aufgabe und verwendet diese Felder:2788Jeder Eintrag in `background_tasks` beschreibt eine laufende Aufgabe und verwendet diese Felder:
2788 2789
2789| Feld | Beschreibung |2790| Feld | Beschreibung |
2790| :- | :- |2791| :- | :- |
2791| `id` | Aufgabenbezeichner |2792| `id` | Aufgabenbezeichner |
2792| `type` | Lesbare Bezeichnung des Aufgabentyps wie `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` oder `MCP task`. Jede Bezeichnung gibt an, welche Claude Code-Funktion die Aufgabe erstellt hat. Fällt bei nicht erkannten Typen auf den rohen Diskriminator zurück |2793| `type` | Lesbare Bezeichnung des Aufgabentyps wie `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` oder `MCP task`. Jede Bezeichnung gibt an, welche Claude Code-Funktion die Aufgabe erstellt hat. Bei nicht erkannten Typen wird auf den rohen Diskriminator zurückgegriffen |
2793| `status` | Aktueller Aufgabenstatus |2794| `status` | Aktueller Aufgabenstatus |
2794| `description` | Freitextbeschreibung, begrenzt auf 1000 Zeichen, mit einer Markierung `… [+N chars]` in der Zeichenfolge bei Kürzung |2795| `description` | Freitextbeschreibung, begrenzt auf 1000 Zeichen, mit einer Markierung `… [+N chars]` im String, wenn gekürzt |
2795| `command` | Shell-Befehlszeile, begrenzt auf 1000 Zeichen. Nur bei `shell`-Aufgaben vorhanden |2796| `command` | Shell-Befehlszeile, begrenzt auf 1000 Zeichen. Nur bei `shell`-Aufgaben vorhanden |
2796| `agent_type` | Name des Subagententyps. Nur bei `subagent`-Aufgaben vorhanden |2797| `agent_type` | Name des Subagententyps. Nur bei `subagent`-Aufgaben vorhanden |
2797| `server` | Name des MCP-Servers. Nur bei `monitor`- und `MCP task`-Aufgaben vorhanden |2798| `server` | Name des MCP-Servers. Nur bei `monitor`- und `MCP task`-Aufgaben vorhanden |
2798| `tool` | Name des MCP-Tools. Nur bei `monitor`- und `MCP task`-Aufgaben vorhanden |2799| `tool` | Name des MCP-Tools. Nur bei `monitor`- und `MCP task`-Aufgaben vorhanden |
2799| `name` | Name des Workflows. Nur bei `workflow`-Aufgaben vorhanden |2800| `name` | Name des Workflows. Nur bei `workflow`-Aufgaben vorhanden |
2800 2801
2801Jeder Eintrag in `session_crons` beschreibt ein sitzungsbezogenes geplantes Aufwecken, das aus `CronCreate`, `ScheduleWakeup` und `/loop` stammt:2802Jeder Eintrag in `session_crons` beschreibt ein sitzungsbezogenes, geplantes Aufwecken, das aus `CronCreate`, `ScheduleWakeup` und `/loop` stammt:
2802 2803
2803| Feld | Beschreibung |2804| Feld | Beschreibung |
2804| :- | :- |2805| :- | :- |
2805| `id` | Bezeichner der Cron-Aufgabe |2806| `id` | Bezeichner der Cron-Aufgabe |
2806| `schedule` | Cron-Ausdruck, zum Beispiel `0 9 * * 1-5` |2807| `schedule` | Cron-Ausdruck, zum Beispiel `0 9 * * 1-5` |
2807| `recurring` | `false` für einmalige Aufweckvorgänge, deren Zeitplan einen einzigen Auslösezeitpunkt codiert, `true` für Aufgaben, die bei jeder Übereinstimmung erneut ausgelöst werden |2808| `recurring` | `false` für einmalige Aufweckvorgänge, deren Zeitplan einen einzelnen Auslösezeitpunkt kodiert, `true` für Aufgaben, die bei jeder Übereinstimmung erneut ausgelöst werden |
2808| `prompt` | Prompt, der beim Auslösen des Cron-Jobs übermittelt wird, begrenzt auf 1000 Zeichen mit derselben Markierung `… [+N chars]` |2809| `prompt` | Prompt, der beim Auslösen des Cron übermittelt wird, begrenzt auf 1000 Zeichen mit derselben Markierung `… [+N chars]` |
2809 2810
2810Dieses Beispiel zeigt eine Stop-Eingabe mit einer laufenden Shell-Aufgabe und einem wiederkehrenden Cron-Job:2811Dieses Beispiel zeigt eine Stop-Eingabe mit einer laufenden Shell-Aufgabe und einem wiederkehrenden Cron:
2811 2812
2812```json theme={null}2813```json theme={null}
2813{2814{
2846 2847
2847| Feld | Beschreibung |2848| Feld | Beschreibung |
2848| :- | :- |2849| :- | :- |
2849| `decision` | `"block"` verhindert, dass Claude stoppt. Weglassen, um Claude das Stoppen zu erlauben |2850| `decision` | `"block"` verhindert, dass Claude stoppt. Weglassen, um Claude stoppen zu lassen |
2850| `reason` | Erforderlich, wenn `decision` den Wert `"block"` hat. Teilt Claude mit, warum es fortfahren soll |2851| `reason` | Erforderlich, wenn `decision` `"block"` ist. Teilt Claude mit, warum es fortfahren soll |
2851| `hookSpecificOutput.additionalContext` | Feedback für Claude ohne Fehlercharakter. Die Konversation wird fortgesetzt, damit Claude darauf reagieren kann, aber anders als bei `decision: "block"` wird es im Transkript als Hook-Feedback und nicht als Hook-Fehler angezeigt |2852| `hookSpecificOutput.additionalContext` | Feedback ohne Fehlercharakter für Claude. Die Konversation wird fortgesetzt, damit Claude darauf reagieren kann, aber anders als bei `decision: "block"` wird es im Transkript als Hook-Feedback statt als Hook-Fehler angezeigt |
2852 2853
2853Ein Hook, der durch Exit-Code 2 blockiert, wird genauso weitergeleitet wie `reason`: Claude erhält die stderr-Meldung als Erklärung, warum es fortfahren soll.2854Ein Hook, der durch Beenden mit Exit-Code 2 blockiert, wird genauso weitergeleitet wie `reason`: Claude erhält die stderr-Nachricht als Erklärung, warum es fortfahren soll.
2854 2855
2855```json theme={null}2856```json theme={null}
2856{2857{
2859}2860}
2860```2861```
2861 2862
2862Verwenden Sie `additionalContext`, wenn der Hook wie vorgesehen funktioniert und Claude Orientierung gibt, etwa „führe die Testsuite vor dem Abschluss aus“. Es hält die Konversation über dieselben Schleifenschutzmechanismen wie `decision: "block"` am Laufen, nämlich die Eingabe `stop_hook_active` und die Obergrenze von 8 aufeinanderfolgenden Fortsetzungen, aber das Transkript kennzeichnet es als `Stop hook feedback`, und es wird keine Hook-Fehlerbenachrichtigung angezeigt:2863Verwenden Sie `additionalContext`, wenn der Hook wie vorgesehen arbeitet und Claude Hinweise gibt, etwa „die Test-Suite vor dem Abschluss ausführen“. Es hält die Konversation über dieselben Schleifenschutzmechanismen wie `decision: "block"` am Laufen, nämlich die Eingabe `stop_hook_active` und die Obergrenze von 8 aufeinanderfolgenden Fortsetzungen, aber das Transkript kennzeichnet es als `Stop hook feedback`, und es wird keine Hook-Fehlerbenachrichtigung angezeigt:
2863 2864
2864```json theme={null}2865```json theme={null}
2865{2866{
2880 StopFailure-Eingabe2881 StopFailure-Eingabe
2881</h4>2882</h4>
2882 2883
2883Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten StopFailure-Hooks `error`, optional `error_details` und optional `last_assistant_message`. Das Feld `error` gibt den Fehlertyp an und wird für die Matcher-Filterung verwendet.2884Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten StopFailure-Hooks `error`, optional `error_details` und optional `last_assistant_message`. Das Feld `error` identifiziert den Fehlertyp und wird zum Filtern durch den Matcher verwendet.
2884 2885
2885| Feld | Beschreibung |2886| Feld | Beschreibung |
2886| :- | :- |2887| :- | :- |
2887| `error` | Fehlertyp: `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` oder `unknown` |2888| `error` | Fehlertyp: `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` oder `unknown` |
2888| `error_details` | Zusätzliche Details zum Fehler, sofern verfügbar |2889| `error_details` | Zusätzliche Details zum Fehler, sofern verfügbar |
2889| `last_assistant_message` | Der gerenderte Fehlertext, der in der Konversation angezeigt wird. Anders als bei `Stop` und `SubagentStop`, wo dieses Feld Claudes Konversationsausgabe enthält, enthält es bei `StopFailure` die API-Fehlerzeichenfolge selbst, etwa `"API Error: Rate limit reached"` |2890| `last_assistant_message` | Der gerenderte Fehlertext, der in der Konversation angezeigt wird. Anders als bei `Stop` und `SubagentStop`, wo dieses Feld Claudes Konversationsausgabe enthält, enthält es bei `StopFailure` den API-Fehler-String selbst, etwa `"API Error: Rate limit reached"` |
2890 2891
2891```json theme={null}2892```json theme={null}
2892{2893{
2906 TeammateIdle2907 TeammateIdle
2907</h3>2908</h3>
2908 2909
2909Wird ausgeführt, wenn ein Teammitglied eines [Agent-Teams](/docs/de/agent-teams) nach dem Beenden seines Turns kurz davor ist, untätig zu werden. Verwenden Sie dies, um Qualitätsschranken durchzusetzen, bevor ein Teammitglied die Arbeit einstellt, etwa durch das Verlangen bestandener Lint-Prüfungen oder die Überprüfung, ob Ausgabedateien existieren.2910Wird ausgeführt, wenn ein Teammitglied eines [Agent-Teams](/docs/de/agent-teams) nach dem Beenden seines Turns kurz davor ist, inaktiv zu werden. Verwenden Sie dies, um Qualitätsschranken durchzusetzen, bevor ein Teammitglied die Arbeit einstellt, etwa bestandene Lint-Prüfungen zu verlangen oder zu prüfen, ob Ausgabedateien existieren.
2910 2911
2911TeammateIdle-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.2912TeammateIdle-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.
2912 2913
2930 2931
2931| Feld | Beschreibung |2932| Feld | Beschreibung |
2932| :- | :- |2933| :- | :- |
2933| `teammate_name` | Name des Teammitglieds, das kurz davor ist, untätig zu werden |2934| `teammate_name` | Name des Teammitglieds, das kurz davor ist, inaktiv zu werden |
2934| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einer zukünftigen Version entfernt |2935| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einem zukünftigen Release entfernt |
2936| `agent_id` | Bei diesem Ereignis identifiziert das [gemeinsame Eingabefeld](#common-input-fields) das [In-Process-Teammitglied](/docs/de/agent-teams#choose-a-display-mode), das kurz davor ist, inaktiv zu werden. Kann fehlen. Erfordert Claude Code v2.1.290 oder höher |
2935 2937
2936<h4 id="teammateidle-decision-control">2938<h4 id="teammateidle-decision-control">
2937 TeammateIdle-Entscheidungssteuerung2939 TeammateIdle-Entscheidungssteuerung
2938</h4>2940</h4>
2939 2941
2940TeammateIdle-Hooks unterstützen zwei Möglichkeiten, das Verhalten von Teammitgliedern zu steuern:2942TeammateIdle-Hooks unterstützen zwei Arten, das Verhalten von Teammitgliedern zu steuern:
2941 2943
2942* **Exit-Code 2**: Das Teammitglied erhält die stderr-Meldung als Feedback und arbeitet weiter, anstatt untätig zu werden.2944* **Exit-Code 2**: Das Teammitglied erhält die stderr-Nachricht als Feedback und arbeitet weiter, statt inaktiv zu werden.
2943* **JSON `{"continue": false, "stopReason": "..."}`**: Stoppt das Teammitglied vollständig, entsprechend dem Verhalten des `Stop`-Hooks. Der `stopReason` wird dem Benutzer angezeigt.2945* **JSON `{"continue": false, "stopReason": "..."}`**: Stoppt das Teammitglied vollständig, entsprechend dem Verhalten des `Stop`-Hooks. Der `stopReason` wird dem Benutzer angezeigt.
2944 2946
2945Dieses Beispiel prüft, ob ein Build-Artefakt existiert, bevor ein Teammitglied untätig werden darf:2947Dieses Beispiel prüft, ob ein Build-Artefakt existiert, bevor ein Teammitglied inaktiv werden darf:
2946 2948
2947```bash theme={null}2949```bash theme={null}
2948#!/bin/bash2950#!/bin/bash
2959 ConfigChange2961 ConfigChange
2960</h3>2962</h3>
2961 2963
2962Wird ausgeführt, wenn sich während einer Sitzung eine Konfigurationsdatei ändert. Verwenden Sie dies, um Einstellungsänderungen zu prüfen, Sicherheitsrichtlinien durchzusetzen oder nicht autorisierte Änderungen an Konfigurationsdateien zu blockieren.2964Wird ausgeführt, wenn sich während einer Sitzung eine Konfigurationsdatei ändert. Verwenden Sie dies, um Änderungen an Einstellungen zu auditieren, Sicherheitsrichtlinien durchzusetzen oder nicht autorisierte Änderungen an Konfigurationsdateien zu blockieren.
2963 2965
2964Claude Code führt ConfigChange-Hooks aus, wenn sich eine Einstellungsdatei, eine Datei mit verwalteten Richtlinien oder eine Skill-Datei ändert. Bei verwalteten Richtlinien führt es sie nur aus, wenn sich `managed-settings.json` oder eine Datei in `managed-settings.d/` ändert. [Serververwaltete Einstellungen](/docs/de/server-managed-settings) sowie Änderungen an verwalteten macOS-Einstellungen oder Windows-Registrierungsrichtlinien wendet es an, ohne die Hooks auszuführen. Unter WSL mit [`wslInheritsWindowsSettings`](/docs/de/settings-reference#wslinheritswindowssettings) wendet es bei seiner Richtlinienabfrage auch eine geänderte Windows-seitige Datei mit verwalteten Einstellungen an, ohne die Hooks auszuführen.2966Claude Code führt ConfigChange-Hooks aus, wenn sich eine Einstellungsdatei, eine verwaltete Richtliniendatei oder eine Skill-Datei ändert. Bei verwalteten Richtlinien führt es sie nur aus, wenn sich `managed-settings.json` oder eine Datei in `managed-settings.d/` ändert. [Serververwaltete Einstellungen](/docs/de/server-managed-settings) sowie Änderungen an verwalteten macOS-Einstellungen oder an Windows-Registrierungsrichtlinien wendet es an, ohne die Hooks auszuführen. Unter WSL mit [`wslInheritsWindowsSettings`](/docs/de/settings-reference#wslinheritswindowssettings) wendet es außerdem eine geänderte Windows-seitige Datei mit verwalteten Einstellungen bei seiner Richtlinienabfrage an, ohne die Hooks auszuführen.
2965 2967
2966Der Matcher filtert nach der Konfigurationsquelle:2968Der Matcher filtert nach der Konfigurationsquelle:
2967 2969
3014 ConfigChange-Entscheidungssteuerung3016 ConfigChange-Entscheidungssteuerung
3015</h4>3017</h4>
3016 3018
3017ConfigChange-Hooks können verhindern, dass Konfigurationsänderungen wirksam werden. Verwenden Sie Exit-Code 2 oder ein JSON-`decision`, um die Änderung zu verhindern. Bei einer Blockierung werden die neuen Einstellungen nicht auf die laufende Sitzung angewendet.3019ConfigChange-Hooks können verhindern, dass Konfigurationsänderungen wirksam werden. Verwenden Sie Exit-Code 2 oder eine JSON-`decision`, um die Änderung zu verhindern. Bei einer Blockierung werden die neuen Einstellungen nicht auf die laufende Sitzung angewendet.
3018 3020
3019| Feld | Beschreibung |3021| Feld | Beschreibung |
3020| :- | :- |3022| :- | :- |
3021| `decision` | `"block"` verhindert, dass die Konfigurationsänderung angewendet wird. Weglassen, um die Änderung zu erlauben |3023| `decision` | `"block"` verhindert, dass die Konfigurationsänderung angewendet wird. Weglassen, um die Änderung zuzulassen |
3022| `reason` | Wird akzeptiert, aber nie angezeigt |3024| `reason` | Wird akzeptiert, aber nie angezeigt |
3023 3025
3024```json theme={null}3026```json theme={null}
3028}3030}
3029```3031```
3030 3032
3031Änderungen an `policy_settings` können nicht blockiert werden. Hooks werden für `policy_settings`-Quellen weiterhin ausgelöst, wenn sich eine Datei mit verwalteten Einstellungen auf dem Rechner ändert, sodass Sie sie zum Protokollieren dieser Änderungen verwenden können, aber jede Blockierungsentscheidung wird ignoriert. Dadurch wird sichergestellt, dass unternehmensweit verwaltete Einstellungen immer wirksam werden. Claude Code führt keine `ConfigChange`-Hooks aus, wenn [serververwaltete Einstellungen](/docs/de/server-managed-settings) eintreffen oder aktualisiert werden.3033`policy_settings`-Änderungen können nicht blockiert werden. Hooks werden für `policy_settings`-Quellen weiterhin ausgelöst, wenn sich eine Datei mit verwalteten Einstellungen auf dem Rechner ändert, sodass Sie sie zum Protokollieren dieser Änderungen verwenden können, aber jede Blockierungsentscheidung wird ignoriert. Dadurch wird sichergestellt, dass vom Unternehmen verwaltete Einstellungen immer wirksam werden. Claude Code führt keine `ConfigChange`-Hooks aus, wenn [serververwaltete Einstellungen](/docs/de/server-managed-settings) eintreffen oder aktualisiert werden.
3032 3034
3033Claude Code berücksichtigt die Blockierungsentscheidung aus der JSON-Ausgabe eines ConfigChange-Hooks und verwirft `systemMessage` und `continue`. Eine blockierte Änderung zeigt weder Ihnen noch Claude eine Nachricht an, unabhängig davon, ob Sie mit `reason` oder mit stderr bei Exit-Code 2 blockieren. Claude Code schreibt lediglich eine Zeile in das Debug-Log.3035Claude Code berücksichtigt die Blockierungsentscheidung aus der JSON-Ausgabe eines ConfigChange-Hooks und verwirft `systemMessage` und `continue`. Eine blockierte Änderung zeigt weder Ihnen noch Claude eine Nachricht an, unabhängig davon, ob Sie mit `reason` oder mit stderr bei Exit-Code 2 blockieren. Claude Code schreibt lediglich eine Zeile in das Debug-Log.
3034 3036
3036 CwdChanged3038 CwdChanged
3037</h3>3039</h3>
3038 3040
3039Wird ausgeführt, wenn ein Shell-Befehl in der Hauptkonversation das Arbeitsverzeichnis ändert, beispielsweise wenn Claude einen `cd`-Befehl ausführt. Verwenden Sie dies, um auf Verzeichniswechsel zu reagieren: Umgebungsvariablen neu laden, projektspezifische Toolchains aktivieren oder Einrichtungsskripte automatisch ausführen. Lässt sich mit [FileChanged](#filechanged) kombinieren für Tools wie [direnv](https://direnv.net/), die verzeichnisspezifische Umgebungen verwalten.3041Wird ausgeführt, wenn ein Shell-Befehl in der Hauptkonversation das Arbeitsverzeichnis ändert, zum Beispiel wenn Claude einen `cd`-Befehl ausführt. Verwenden Sie dies, um auf Verzeichniswechsel zu reagieren: Umgebungsvariablen neu laden, projektspezifische Toolchains aktivieren oder Setup-Skripte automatisch ausführen. Lässt sich mit [FileChanged](#filechanged) kombinieren, für Tools wie [direnv](https://direnv.net/), die verzeichnisspezifische Umgebungen verwalten.
3040 3042
3041CwdChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). In diese Datei geschriebene Variablen bleiben für nachfolgende Bash-Befehle bis zum nächsten CwdChanged-Ereignis erhalten, bei dem Claude Code sie löscht.3043CwdChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). In diese Datei geschriebene Variablen bleiben für nachfolgende Bash-Befehle erhalten, bis zum nächsten CwdChanged-Ereignis, bei dem Claude Code sie löscht.
3042 3044
3043CwdChanged unterstützt keine Matcher und wird bei jedem Vorkommen ausgelöst.3045CwdChanged unterstützt keine Matcher und wird bei jedem Vorkommen ausgelöst.
3044 3046
3077 DirectoryAdded3079 DirectoryAdded
3078</h3>3080</h3>
3079 3081
3080Wird ausgeführt, nachdem Sie während einer Sitzung mit dem Befehl `/add-dir` ein Arbeitsverzeichnis hinzugefügt haben oder nachdem ein SDK-Client eines mit der Steuerungsanfrage `register_repo_root` hinzugefügt hat. Verwenden Sie dies, um ein neu hinzugefügtes Repository vorzubereiten, beispielsweise durch Installieren seiner Abhängigkeiten.3082Wird ausgeführt, nachdem Sie während einer Sitzung mit dem Befehl `/add-dir` ein Arbeitsverzeichnis hinzugefügt haben oder nachdem ein SDK-Client eines mit der Steueranfrage `register_repo_root` hinzugefügt hat. Verwenden Sie dies, um ein neu hinzugefügtes Repository vorzubereiten, zum Beispiel durch Installieren seiner Abhängigkeiten.
3081 3083
3082Claude Code löst dieses Ereignis nicht aus, wenn:3084Claude Code löst dieses Ereignis nicht aus, wenn:
3083 3085
3084* Sie ein Verzeichnis mit dem Start-Flag `--add-dir` übergeben; [SessionStart](#sessionstart) deckt diese Verzeichnisse ab3086* Sie ein Verzeichnis mit dem Start-Flag `--add-dir` übergeben; [SessionStart](#sessionstart) deckt diese Verzeichnisse ab
3085* Sie ein Verzeichnis auf dem Tab Workspace von `/permissions` hinzufügen3087* Sie ein Verzeichnis auf dem Tab „Workspace“ von `/permissions` hinzufügen
3086* Sie ein Verzeichnis hinzufügen, das bereits ein Arbeitsverzeichnis ist oder sich in einem befindet3088* Sie ein Verzeichnis hinzufügen, das bereits ein Arbeitsverzeichnis ist oder in einem liegt
3087 3089
3088Claude Code löst DirectoryAdded aus, nachdem der Sandbox- und Berechtigungsstatus aktualisiert wurde, sodass in einer Sandbox ausgeführte Tools das neue Verzeichnis bereits sehen, wenn Ihr Hook ausgeführt wird. Hook-Befehle selbst werden außerhalb der Sandbox ausgeführt.3090Claude Code löst DirectoryAdded aus, nachdem der Sandbox- und Berechtigungsstatus aktualisiert wurde, sodass Tools in der Sandbox das neue Verzeichnis bereits sehen, wenn Ihr Hook läuft. Hook-Befehle selbst laufen ohne Sandbox.
3089 3091
3090Claude Code wartet nicht auf den Hook: Das Hinzufügen wird sofort abgeschlossen, und der Hook läuft im Hintergrund mit dem Standard-Timeout von 600 Sekunden.3092Claude Code wartet nicht auf den Hook: Das Hinzufügen wird sofort abgeschlossen, und der Hook läuft im Hintergrund mit dem Standard-Timeout von 600 Sekunden.
3091 3093
3094| Matcher | Wann er ausgelöst wird |3096| Matcher | Wann er ausgelöst wird |
3095| :- | :- |3097| :- | :- |
3096| `slash_command` | Sie fügen ein Verzeichnis mit `/add-dir` hinzu |3098| `slash_command` | Sie fügen ein Verzeichnis mit `/add-dir` hinzu |
3097| `register_repo_root` | Ein SDK-Client fügt ein Verzeichnis mit der Steuerungsanfrage `register_repo_root` hinzu |3099| `register_repo_root` | Ein SDK-Client fügt ein Verzeichnis mit der Steueranfrage `register_repo_root` hinzu |
3098 3100
3099<h4 id="directoryadded-input">3101<h4 id="directoryadded-input">
3100 DirectoryAdded-Eingabe3102 DirectoryAdded-Eingabe
3105| Feld | Beschreibung |3107| Feld | Beschreibung |
3106| :- | :- |3108| :- | :- |
3107| `directory` | Absoluter Pfad des hinzugefügten Verzeichnisses |3109| `directory` | Absoluter Pfad des hinzugefügten Verzeichnisses |
3108| `source` | Wie das Verzeichnis hinzugefügt wurde: `"slash_command"` für `/add-dir` oder `"register_repo_root"` für die SDK-Steuerungsanfrage |3110| `source` | Wie das Verzeichnis hinzugefügt wurde: `"slash_command"` für `/add-dir` oder `"register_repo_root"` für die SDK-Steueranfrage |
3109 3111
3110```json theme={null}3112```json theme={null}
3111{3113{
3118}3120}
3119```3121```
3120 3122
3121DirectoryAdded-Hooks haben keine Entscheidungssteuerung. Sie können das Hinzufügen nicht blockieren, da es bereits abgeschlossen ist, wenn der Hook ausgeführt wird. Claude Code verwirft das Feld `continue` aus ihrer JSON-Ausgabe und behandelt den Rest je nach Quelle unterschiedlich:3123DirectoryAdded-Hooks haben keine Entscheidungssteuerung. Sie können das Hinzufügen nicht blockieren, da es bereits abgeschlossen ist, wenn der Hook läuft. Claude Code verwirft das Feld `continue` aus ihrer JSON-Ausgabe und gibt den Rest je nach Quelle unterschiedlich aus:
3122 3124
3123* `slash_command`: Claude Code übermittelt die `systemMessage` des Hooks im nächsten Konversations-Turn als Kontext an Claude, anstatt sie Ihnen anzuzeigen. Die Anzahl fehlgeschlagener Hooks erscheint im Transkript. Die vollständige Fehlerausgabe geht in das Debug-Log3125* `slash_command`: Claude Code übermittelt die `systemMessage` des Hooks beim nächsten Konversations-Turn als Kontext an Claude, statt sie Ihnen anzuzeigen. Eine Anzahl fehlgeschlagener Hooks erscheint im Transkript. Die vollständige Fehlerausgabe geht in das Debug-Log
3124* `register_repo_root`: Claude Code schreibt die `systemMessage`-Ausgabe und die Fehlerausgabe nur in das Debug-Log3126* `register_repo_root`: Claude Code schreibt die `systemMessage`-Ausgabe und die Fehlerausgabe nur in das Debug-Log
3125 3127
3126<h3 id="filechanged">3128<h3 id="filechanged">
3127 FileChanged3129 FileChanged
3128</h3>3130</h3>
3129 3131
3130Wird ausgeführt, wenn sich eine überwachte Datei auf der Festplatte ändert. Claude Code erkennt Änderungen mit einem Dateisystem-Watcher, nicht durch Prüfen von Tool-Aufrufen, und führt den Hook daher unabhängig davon aus, was die Datei geändert hat: ein `Edit`- oder `Write`-Tool-Aufruf, ein Skript, das Claude mit `Bash` ausführt, oder ein Prozess vollständig außerhalb von Claude Code. Ein häufiger Anwendungsfall ist das Neuladen von Umgebungsvariablen, wenn sich Projektkonfigurationsdateien ändern.3132Wird ausgeführt, wenn sich eine überwachte Datei auf der Festplatte ändert. Claude Code erkennt Änderungen mit einem Dateisystem-Watcher, nicht durch Prüfen von Tool-Aufrufen, und führt den Hook daher unabhängig davon aus, was die Datei geändert hat: ein `Edit`- oder `Write`-Tool-Aufruf, ein Skript, das Claude mit `Bash` ausführt, oder ein Prozess vollständig außerhalb von Claude Code. Ein häufiger Anwendungsfall ist das Neuladen von Umgebungsvariablen, wenn sich Konfigurationsdateien des Projekts ändern.
3131 3133
3132Der `matcher` für dieses Ereignis erfüllt zwei Aufgaben:3134Der `matcher` für dieses Ereignis erfüllt zwei Aufgaben:
3133 3135
3134* **Überwachungsliste aufbauen**: Der Wert wird an `|` aufgeteilt, und jedes Segment wird als literaler Dateiname im Arbeitsverzeichnis registriert, sodass `".envrc|.env"` genau diese beiden Dateien überwacht. Regex-Muster sind hier nicht sinnvoll: Ein Wert wie `^\.env` würde eine Datei überwachen, die buchstäblich `^\.env` heißt.3136* **Die Überwachungsliste aufbauen**: Der Wert wird an `|` aufgeteilt, und jedes Segment wird als literaler Dateiname im Arbeitsverzeichnis registriert, sodass `".envrc|.env"` genau diese beiden Dateien überwacht. Regex-Muster sind hier nicht sinnvoll: Ein Wert wie `^\.env` würde eine Datei überwachen, die wörtlich `^\.env` heißt.
3135* **Filtern, welche Hooks ausgeführt werden**: Wenn sich eine überwachte Datei ändert, filtert derselbe Wert anhand der Standard-[Matcher-Regeln](#matcher-patterns) gegen den Basisnamen der geänderten Datei, welche Hook-Gruppen ausgeführt werden.3137* **Filtern, welche Hooks laufen**: Wenn sich eine überwachte Datei ändert, filtert derselbe Wert anhand der Standard-[Matcher-Regeln](#matcher-patterns) gegen den Basisnamen der geänderten Datei, welche Hook-Gruppen laufen.
3136 3138
3137Dieses Beispiel normalisiert die Zeilenenden in `data.csv` nach jeder Änderung, auch wenn ein `Bash`-Befehl oder ein externes Skript die Datei neu schreibt:3139Dieses Beispiel normalisiert die Zeilenenden in `data.csv` nach jeder Änderung, auch wenn ein `Bash`-Befehl oder ein externes Skript die Datei neu schreibt:
3138 3140
3154}3156}
3155```3157```
3156 3158
3157Der Hook liest den absoluten Pfad der geänderten Datei aus dem Feld `file_path` der [JSON-Eingabe](#filechanged-input) auf stdin. Seine `grep`-Prüfung testet auf dasselbe, was `perl` entfernt, nämlich ein CR am Zeilenende, sodass der Durchlauf nach einer Normalisierung beendet wird, ohne die Datei anzurühren. Eine lockerere Prüfung führt zu einer Endlosschleife, weil `perl -i` die Datei auch dann neu schreibt, wenn es nichts ersetzt, und Claude Code den Hook nach jedem Neuschreiben erneut ausführt. Speichern Sie dieses Skript unter `/path/to/normalize-line-endings.sh` und machen Sie es ausführbar:3159Der Hook liest den absoluten Pfad der geänderten Datei aus dem Feld `file_path` der [JSON-Eingabe](#filechanged-input) auf stdin. Seine `grep`-Prüfung testet auf genau das, was `perl` entfernt, ein CR am Zeilenende, sodass der Lauf nach einer Normalisierung beendet wird, ohne die Datei anzufassen. Eine lockerere Prüfung führt zu einer Endlosschleife, weil `perl -i` die Datei auch dann neu schreibt, wenn es nichts ersetzt, und Claude Code den Hook nach jedem Neuschreiben erneut ausführt. Speichern Sie dieses Skript unter `/path/to/normalize-line-endings.sh` und machen Sie es ausführbar:
3158 3160
3159```bash theme={null}3161```bash theme={null}
3160#!/bin/bash3162#!/bin/bash
3164fi3166fi
3165```3167```
3166 3168
3167Um zu bestätigen, dass der Hook funktioniert, bitten Sie Claude, mit einem `Bash`-Befehl eine CRLF-Zeile an `data.csv` anzuhängen. Claude Code führt den Hook aus, und die Datei hat anschließend LF-Zeilenenden.3169Um zu bestätigen, dass der Hook funktioniert, bitten Sie Claude, mit einem `Bash`-Befehl eine CRLF-Zeile an `data.csv` anzuhängen. Claude Code führt den Hook aus, und die Datei hat am Ende LF-Zeilenenden.
3168 3170
3169Um Dateien zu überwachen, die Sie nicht im Voraus benennen können, geben Sie aus einem Hook [`watchPaths`](#filechanged-output) zurück, um die Überwachungsliste dynamisch zu aktualisieren. Claude Code startet den Watcher nur, wenn etwas eine zu überwachende Datei benennt. Befüllen Sie die Liste daher mit einer FileChanged-Gruppe, deren Matcher mindestens eine Datei benennt, oder mit einem [SessionStart](#sessionstart-decision-control)- oder [CwdChanged](#cwdchanged)-Hook, der `watchPaths` zurückgibt. Der Matcher filtert weiterhin, welche Hook-Gruppen ausgeführt werden, wenn sich eine überwachte Datei ändert. Lassen Sie daher bei der Gruppe, die dynamische Pfade verarbeitet, den Matcher weg; ein weggelassener Matcher matcht jede überwachte Datei und fügt der Überwachungsliste nichts hinzu. Ein `"*"`-Matcher matcht ebenfalls jede Datei, aber Claude Code registriert ihn wie jeden anderen Wert in der Überwachungsliste, als literale Datei namens `*`.3171Um Dateien zu überwachen, die Sie nicht im Voraus benennen können, geben Sie aus einem Hook [`watchPaths`](#filechanged-output) zurück, um die Überwachungsliste dynamisch zu aktualisieren. Claude Code startet den Watcher nur, wenn etwas eine zu überwachende Datei benennt. Befüllen Sie die Liste daher mit einer FileChanged-Gruppe, deren Matcher mindestens eine Datei benennt, oder mit einem [SessionStart](#sessionstart-decision-control)- oder [CwdChanged](#cwdchanged)-Hook, der `watchPaths` zurückgibt. Der Matcher filtert weiterhin, welche Hook-Gruppen laufen, wenn sich eine überwachte Datei ändert. Lassen Sie daher bei der Gruppe, die dynamische Pfade behandelt, den Matcher weg; dieser passt dann auf jede überwachte Datei und fügt der Überwachungsliste nichts hinzu. Ein `"*"`-Matcher passt ebenfalls auf jede Datei, aber Claude Code registriert ihn wie jeden anderen Wert in der Überwachungsliste, als literale Datei namens `*`.
3170 3172
3171FileChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). In diese Datei geschriebene Variablen bleiben für nachfolgende Bash-Befehle bis zum nächsten [CwdChanged](#cwdchanged)-Ereignis erhalten, bei dem Claude Code sie löscht.3173FileChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). In diese Datei geschriebene Variablen bleiben für nachfolgende Bash-Befehle erhalten, bis zum nächsten [CwdChanged](#cwdchanged)-Ereignis, bei dem Claude Code sie löscht.
3172 3174
3173<h4 id="filechanged-input">3175<h4 id="filechanged-input">
3174 FileChanged-Eingabe3176 FileChanged-Eingabe
3210 WorktreeCreate3212 WorktreeCreate
3211</h3>3213</h3>
3212 3214
3213Wird ausgeführt, wenn ein Worktree erstellt wird, sei es über `claude --worktree`, durch einen [Subagenten mit `isolation: "worktree"`](/docs/de/sub-agents#choose-the-subagent-scope) oder für eine [Hintergrundsitzung](/docs/de/agent-view#how-file-edits-are-isolated), die Claude Code in einem eigenen Worktree isoliert. Standardmäßig erstellt Claude Code die isolierte Arbeitskopie mit `git worktree`. Das Konfigurieren eines WorktreeCreate-Hooks ersetzt dieses standardmäßige Git-Verhalten, sodass Sie ein anderes Versionskontrollsystem wie SVN, Perforce oder Mercurial verwenden können.3215Wird ausgeführt, wenn ein Worktree erstellt wird, sei es über `claude --worktree`, über einen [Subagenten mit `isolation: "worktree"`](/docs/de/sub-agents#choose-the-subagent-scope) oder für eine [Hintergrundsitzung](/docs/de/agent-view#how-file-edits-are-isolated), die Claude Code in einem eigenen Worktree isoliert. Standardmäßig erstellt Claude Code die isolierte Arbeitskopie mit `git worktree`. Wenn Sie einen WorktreeCreate-Hook konfigurieren, ersetzt dieser das standardmäßige Git-Verhalten, sodass Sie ein anderes Versionskontrollsystem wie SVN, Perforce oder Mercurial verwenden können.
3214 3216
3215Da der Hook das Standardverhalten vollständig ersetzt, wird [`.worktreeinclude`](/docs/de/worktrees#copy-gitignored-files-into-worktrees) nicht verarbeitet. Wenn Sie lokale Konfigurationsdateien wie `.env` in den neuen Worktree kopieren müssen, tun Sie dies in Ihrem Hook-Skript.3217Da der Hook das Standardverhalten vollständig ersetzt, wird [`.worktreeinclude`](/docs/de/worktrees#copy-gitignored-files-into-worktrees) nicht verarbeitet. Wenn Sie lokale Konfigurationsdateien wie `.env` in den neuen Worktree kopieren müssen, tun Sie dies in Ihrem Hook-Skript.
3216 3218
3217Der Hook muss den Pfad zum erstellten Worktree-Verzeichnis zurückgeben. Claude Code verwendet diesen Pfad als Arbeitsverzeichnis für die isolierte Sitzung. Siehe [WorktreeCreate-Ausgabe](#worktreecreate-output) dazu, wie jeder Hook-Typ den Pfad zurückgibt.3219Der Hook muss den Pfad zum erstellten Worktree-Verzeichnis zurückgeben. Claude Code verwendet diesen Pfad als Arbeitsverzeichnis für die isolierte Sitzung. Unter [WorktreeCreate-Ausgabe](#worktreecreate-output) erfahren Sie, wie die einzelnen Hook-Typen den Pfad zurückgeben.
3218 3220
3219Claude Code berücksichtigt den Erfolg des Hooks und den zurückgegebenen Pfad und verwirft `systemMessage` und `continue`.3221Claude Code berücksichtigt den Erfolg des Hooks und den zurückgegebenen Pfad und verwirft `systemMessage` und `continue`.
3220 3222
3243 WorktreeCreate-Eingabe3245 WorktreeCreate-Eingabe
3244</h4>3246</h4>
3245 3247
3246Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten WorktreeCreate-Hooks das Feld `name`. Dies ist ein Slug-Bezeichner für den neuen Worktree, entweder vom Benutzer angegeben oder automatisch generiert, zum Beispiel `bold-oak-a3f2`.3248Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten WorktreeCreate-Hooks das Feld `name`. Dabei handelt es sich um einen Slug-Bezeichner für den neuen Worktree, der entweder vom Benutzer angegeben oder automatisch generiert wird, zum Beispiel `bold-oak-a3f2`.
3247 3249
3248```json theme={null}3250```json theme={null}
3249{3251{
3259 WorktreeCreate-Ausgabe3261 WorktreeCreate-Ausgabe
3260</h4>3262</h4>
3261 3263
3262WorktreeCreate-Hooks verwenden nicht das übliche Entscheidungsmodell aus Zulassen und Blockieren. Stattdessen bestimmt der Erfolg oder Misserfolg des Hooks das Ergebnis. Der Hook muss den Pfad zum erstellten Worktree-Verzeichnis zurückgeben:3264WorktreeCreate-Hooks verwenden nicht das standardmäßige Entscheidungsmodell aus Zulassen/Blockieren. Stattdessen bestimmt Erfolg oder Fehlschlag des Hooks das Ergebnis. Der Hook muss den Pfad zum erstellten Worktree-Verzeichnis zurückgeben:
3263 3265
3264* **Befehls-Hooks** (`type: "command"`): Geben Sie den Pfad als letzte nicht leere Zeile auf stdout aus. Claude Code entfernt ANSI-Escape-Codes, bevor es diese Zeile liest, sodass Shell-Startbanner, die vor Ihrem `echo` ausgegeben werden, ignoriert werden. Leiten Sie jede andere Ausgabe des Hooks nach stderr um.3266* **Command-Hooks** (`type: "command"`): Geben Sie den Pfad als letzte nicht leere Zeile auf stdout aus. Claude Code entfernt ANSI-Escape-Codes, bevor diese Zeile gelesen wird, sodass Shell-Startbanner, die vor Ihrem `echo` ausgegeben werden, ignoriert werden. Leiten Sie jede andere Hook-Ausgabe nach stderr um.
3265* **HTTP-Hooks** (`type: "http"`): Geben Sie `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` im Response-Body zurück.3267* **HTTP-Hooks** (`type: "http"`): Geben Sie `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` im Response-Body zurück.
3266 3268
3267Wenn der Hook fehlschlägt oder keinen Pfad liefert, schlägt die Erstellung des Worktrees mit einem Fehler fehl.3269Wenn der Hook fehlschlägt oder keinen Pfad liefert, schlägt die Worktree-Erstellung mit einem Fehler fehl.
3268 3270
3269Claude Code löst einen relativen Pfad relativ zu dem Verzeichnis auf, in dem der Hook ausgeführt wurde, und löst dabei alle `.`- oder `..`-Segmente auf. Wenn der resultierende Pfad kein Verzeichnis ist, das Claude Code betreten kann, gibt die Sitzung einen Fehler mit dem Pfad aus und wird mit Exit-Code 1 beendet.3271Claude Code löst einen relativen Pfad relativ zu dem Verzeichnis auf, in dem der Hook ausgeführt wurde, und fasst dabei alle darin enthaltenen `.`- oder `..`-Segmente zusammen. Wenn der resultierende Pfad kein Verzeichnis ist, das Claude Code betreten kann, gibt die Sitzung einen Fehler mit dem Pfad aus und wird mit Code 1 beendet.
3270 3272
3271Claude Code lehnt einen absoluten Pfad ab, der `.`- oder `..`-Segmente enthält, sowie jeden Pfad, der unterhalb des Repository-Stammverzeichnisses durch einen Symlink führt, da ein im Repository committeter Symlink den Worktree aus dem Repository heraus umleiten könnte. Die Fehlermeldung nennt die abgelehnte Komponente. Geben Sie einen normalisierten Pfad zurück, der nicht durch einen Symlink innerhalb des Repositorys führt. Vor v2.1.216 folgte die Worktree-Erstellung dem Pfad des Hooks ohne diese Prüfung.3273Claude Code lehnt einen absoluten Pfad ab, der `.`- oder `..`-Segmente enthält, sowie jeden Pfad, der unterhalb des Repository-Stammverzeichnisses durch einen Symlink führt, da ein in das Repository committeter Symlink den Worktree nach außerhalb umleiten könnte. Der Fehler nennt die abgelehnte Komponente. Geben Sie einen normalisierten Pfad zurück, der nicht durch einen Symlink innerhalb des Repositorys führt. Vor v2.1.216 folgte die Worktree-Erstellung dem Pfad des Hooks ohne diese Prüfung.
3272 3274
3273<h3 id="worktreeremove">3275<h3 id="worktreeremove">
3274 WorktreeRemove3276 WorktreeRemove
3276 3278
3277Wird ausgeführt, wenn Claude Code einen Worktree bereinigt, den Ihr [`WorktreeCreate`](#worktreecreate)-Hook erstellt hat. Das Ereignis wird ausgelöst, wenn:3279Wird ausgeführt, wenn Claude Code einen Worktree bereinigt, den Ihr [`WorktreeCreate`](#worktreecreate)-Hook erstellt hat. Das Ereignis wird ausgelöst, wenn:
3278 3280
3279* Sie eine interaktive [Worktree-Sitzung](/docs/de/worktrees#start-claude-in-a-worktree) beenden und das Entfernen des Worktrees wählen, wenn Claude Code nachfragt3281* Sie eine interaktive [Worktree-Sitzung](/docs/de/worktrees#start-claude-in-a-worktree) beenden und sich dafür entscheiden, den Worktree zu entfernen, wenn Claude Code Sie danach fragt
3280* Sie eine interaktive Worktree-Sitzung beenden, die Sie nicht [benannt](/docs/de/sessions#name-your-sessions) haben, Claude Code keine geänderten oder nicht verfolgten Dateien findet und den Worktree ohne Nachfrage entfernt3282* Sie eine interaktive Worktree-Sitzung beenden, die Sie nicht [benannt](/docs/de/sessions#name-your-sessions) haben, Claude Code keine geänderten oder nicht verfolgten Dateien findet und den Worktree ohne Nachfrage entfernt
3281* Sie eine [Hintergrundsitzung](/docs/de/agent-view#what-deleting-a-session-removes) löschen, die im Worktree läuft3283* Sie eine [Hintergrundsitzung](/docs/de/agent-view#what-deleting-a-session-removes) löschen, die im Worktree läuft
3282 3284
3283Claude Code verwendet Git, um nach geänderten oder nicht verfolgten Dateien zu suchen, und findet daher in einem Worktree, der kein Git-Checkout ist oder sich nicht in einem befindet, keine solchen Dateien, selbst wenn das Verzeichnis nicht committete Arbeit enthält. Prüfen Sie in Ihrem WorktreeRemove-Hook auf solche Arbeit, bevor er etwas löscht.3285Claude Code verwendet Git, um nach geänderten oder nicht verfolgten Dateien zu suchen, und findet daher keine in einem Worktree, der kein Git-Checkout ist oder sich nicht in einem befindet, selbst wenn das Verzeichnis nicht committete Arbeit enthält. Prüfen Sie in Ihrem WorktreeRemove-Hook auf solche Arbeit, bevor er etwas löscht.
3284 3286
3285Bei Git-basierten Worktrees übernimmt Claude Code die Bereinigung automatisch mit `git worktree remove`. Wenn Sie einen WorktreeCreate-Hook konfiguriert haben, kombinieren Sie ihn mit einem WorktreeRemove-Hook, um die Bereinigung der von ihm erstellten Worktrees zu steuern:3287Bei Git-basierten Worktrees übernimmt Claude Code die Bereinigung automatisch mit `git worktree remove`. Wenn Sie einen WorktreeCreate-Hook konfiguriert haben, kombinieren Sie ihn mit einem WorktreeRemove-Hook, um die Bereinigung der von ihm erstellten Worktrees zu steuern:
3286 3288
3287* **Kein WorktreeRemove-Hook**: Wenn Claude Code den Worktree beim Beenden einer Worktree-Sitzung entfernt, greift es ersatzweise auf `git worktree remove --force` für den Pfad zurück, den Ihr WorktreeCreate-Hook zurückgegeben hat, sodass ein Worktree, den Git erkennt, entfernt wird. Ein Worktree, den Git nicht erkennt, zum Beispiel einer, den Ihr Hook mit einem anderen Versionskontrollsystem als Git erstellt hat, bleibt auf dem Datenträger. Was beim Löschen einer [Hintergrundsitzung](/docs/de/agent-view#what-deleting-a-session-removes) mit einem durch einen Hook erstellten Worktree geschieht, entnehmen Sie den Löschregeln der Agent-Ansicht.3289* **Kein WorktreeRemove-Hook**: Wenn Claude Code den Worktree beim Beenden einer Worktree-Sitzung entfernt, greift es ersatzweise auf `git worktree remove --force` für den Pfad zurück, den Ihr WorktreeCreate-Hook zurückgegeben hat, sodass ein Worktree, den Git erkennt, entfernt wird. Ein Worktree, den Git nicht erkennt, zum Beispiel einer, den Ihr Hook mit einem anderen Versionskontrollsystem als Git erstellt hat, bleibt auf der Festplatte. Was das Löschen einer [Hintergrundsitzung](/docs/de/agent-view#what-deleting-a-session-removes) mit einem vom Hook erstellten Worktree bewirkt, entnehmen Sie den Löschregeln der Agent-Ansicht.
3288* **Hook endet mit 0**: Der Worktree gilt als entfernt. Claude Code liest nichts weiter vom Hook, stellen Sie also sicher, dass Ihr Hook das Verzeichnis gelöscht hat.3290* **Hook wird mit 0 beendet**: Der Worktree gilt als entfernt. Claude Code liest nichts weiter vom Hook, stellen Sie also sicher, dass Ihr Hook das Verzeichnis gelöscht hat.
3289* **Hook endet mit einem Wert ungleich 0**: Das Entfernen schlägt fehl, wenn das Verzeichnis unter `worktree_path` danach noch existiert, und der Worktree bleibt ohne Git-Fallback auf der Festplatte. Ein Hook, der das Verzeichnis gelöscht hat, bevor er mit einem Wert ungleich 0 endet, gilt als entfernt. Wie der Fehler gemeldet wird, erfahren Sie unter [WorktreeRemove-Eingabe](#worktreeremove-input).3291* **Hook wird mit einem anderen Code als 0 beendet**: Das Entfernen schlägt fehl, wenn das Verzeichnis unter `worktree_path` danach noch existiert, und der Worktree bleibt ohne Git-Fallback auf der Festplatte. Ein Hook, der das Verzeichnis vor dem Beenden mit einem anderen Code als 0 gelöscht hat, gilt als entfernt. Wie der Fehler gemeldet wird, erfahren Sie unter [WorktreeRemove-Eingabe](#worktreeremove-input).
3290 3292
3291Claude Code löscht niemals einen Branch, der zu einem vom Hook erstellten Worktree gehört, da es nur den Pfad kennt, den Ihr WorktreeCreate-Hook zurückgegeben hat. Wenn Ihr WorktreeCreate-Hook einen Branch erstellt, löschen Sie ihn in Ihrem WorktreeRemove-Hook.3293Claude Code löscht niemals einen Branch, der zu einem vom Hook erstellten Worktree gehört, da es nur den Pfad kennt, den Ihr WorktreeCreate-Hook zurückgegeben hat. Wenn Ihr WorktreeCreate-Hook einen Branch erstellt, löschen Sie ihn in Ihrem WorktreeRemove-Hook.
3292 3294
3293Claude Code verwirft die [JSON-Ausgabefelder](#json-output) eines WorktreeRemove-Hooks, etwa `systemMessage` und `continue`.3295Claude Code verwirft die [JSON-Ausgabefelder](#json-output) eines WorktreeRemove-Hooks, etwa `systemMessage` und `continue`.
3294 3296
3295Beim Löschen einer Hintergrundsitzung überprüft Claude Code den gespeicherten Worktree-Pfad, bevor der Hook ausgeführt wird, und lehnt einen Pfad ab, der ein Symlink ist oder unterhalb des Repository-Stammverzeichnisses durch einen Symlink führt. Für einen Worktree, der noch Dateien enthält, wird der Hook nur ausgeführt, wenn Sie das Löschen in der [Agentenansicht](/docs/de/agent-view#what-deleting-a-session-removes) bestätigen; für einen solchen Worktree behält [`claude rm`](/docs/de/agent-view#manage-sessions-from-the-shell) stattdessen die Sitzung und den Worktree bei. Vor v2.1.216 wurde der Hook ohne diese Prüfungen für den gespeicherten Pfad ausgeführt.3297Beim Löschen einer Hintergrundsitzung überprüft Claude Code den gespeicherten Worktree-Pfad, bevor der Hook ausgeführt wird, und lehnt einen Pfad ab, der ein Symlink ist oder unterhalb des Repository-Stammverzeichnisses durch einen führt. Für einen Worktree, der noch Dateien enthält, wird der Hook nur ausgeführt, wenn Sie das Löschen in der [Agent-Ansicht](/docs/de/agent-view#what-deleting-a-session-removes) bestätigen; für einen solchen Worktree behält [`claude rm`](/docs/de/agent-view#manage-sessions-from-the-shell) stattdessen die Sitzung und den Worktree bei. Vor v2.1.216 wurde der Hook ohne diese Prüfungen für den gespeicherten Pfad ausgeführt.
3296 3298
3297Claude Code übergibt den von WorktreeCreate zurückgegebenen Pfad als `worktree_path` in der Hook-Eingabe. Dieses Beispiel liest diesen Pfad und entfernt das Verzeichnis:3299Claude Code übergibt den von WorktreeCreate zurückgegebenen Pfad als `worktree_path` in der Hook-Eingabe. Dieses Beispiel liest diesen Pfad und entfernt das Verzeichnis:
3298 3300
3329}3331}
3330```3332```
3331 3333
3332Der Exit-Code eines WorktreeRemove-Hooks bestimmt das Ergebnis. Wenn ein Hook mit einem Wert ungleich 0 endet und das Verzeichnis unter `worktree_path` danach noch existiert, schlägt das Entfernen fehl:3334Der Exit-Code eines WorktreeRemove-Hooks entscheidet über das Ergebnis. Wenn ein Hook mit einem anderen Code als 0 beendet wird und das Verzeichnis unter `worktree_path` danach noch existiert, schlägt das Entfernen fehl:
3333 3335
3334* Der Worktree bleibt auf der Festplatte, und der Befehl sowie stderr des Hooks werden in das [Debug-Log](#debug-hooks) geschrieben.3336* Der Worktree bleibt auf der Festplatte, und der Befehl sowie die stderr-Ausgabe des Hooks werden in das [Debug-Log](#debug-hooks) geschrieben.
3335* Wenn Sie eine Hintergrundsitzung gelöscht haben, bleibt auch die Sitzung bestehen. Die Ablehnungsmeldung in der [Agentenansicht](/docs/de/agent-view#what-deleting-a-session-removes) gibt an, wie der Hook beendet wurde, etwa `exited 1`, zitiert den Anfang seiner stderr-Ausgabe und gibt an, ob ein erneutes Löschen der Sitzung das Verzeichnis trotzdem entfernt.3337* Wenn Sie eine Hintergrundsitzung gelöscht haben, bleibt auch die Sitzung erhalten. Die Ablehnungsmeldung in der [Agent-Ansicht](/docs/de/agent-view#what-deleting-a-session-removes) gibt an, wie der Hook beendet wurde, etwa `exited 1`, zitiert den Anfang seiner stderr-Ausgabe und gibt an, ob ein erneutes Löschen der Sitzung das Verzeichnis trotzdem entfernt.
3336 3338
3337<h3 id="precompact">3339<h3 id="precompact">
3338 PreCompact3340 PreCompact
3339</h3>3341</h3>
3340 3342
3341Wird ausgeführt, bevor Claude Code einen Komprimierungsvorgang startet.3343Wird ausgeführt, bevor Claude Code eine Komprimierung durchführt.
3342 3344
3343Der Matcher-Wert gibt an, ob die Komprimierung manuell oder automatisch ausgelöst wurde:3345Der Matcher-Wert gibt an, ob die Komprimierung manuell oder automatisch ausgelöst wurde:
3344 3346
3347| `manual` | `/compact` |3349| `manual` | `/compact` |
3348| `auto` | Automatische Komprimierung, wenn die Konversation das [Fenster für die automatische Komprimierung](/docs/de/model-config#set-the-auto-compact-window) erreicht |3350| `auto` | Automatische Komprimierung, wenn die Konversation das [Fenster für die automatische Komprimierung](/docs/de/model-config#set-the-auto-compact-window) erreicht |
3349 3351
3350Beenden Sie mit Exit-Code 2, um die Komprimierung zu blockieren. Bei einem manuellen `/compact` wird die stderr-Meldung dem Benutzer angezeigt. Sie können auch blockieren, indem Sie JSON mit `"decision": "block"` zurückgeben.3352Beenden Sie mit Code 2, um die Komprimierung zu blockieren. Bei einem manuellen `/compact` wird die stderr-Meldung dem Benutzer angezeigt. Sie können auch blockieren, indem Sie JSON mit `"decision": "block"` zurückgeben.
3351 3353
3352Das Blockieren der automatischen Komprimierung hat je nach Zeitpunkt unterschiedliche Auswirkungen. Wurde die Komprimierung vorsorglich vor dem Kontextlimit ausgelöst, überspringt Claude Code sie, und die Konversation wird unkomprimiert fortgesetzt. Wurde die Komprimierung ausgelöst, um sich von einem bereits von der API zurückgegebenen Kontextlimit-Fehler zu erholen, tritt der zugrunde liegende Fehler zutage, und die aktuelle Anfrage schlägt fehl.3354Das Blockieren der automatischen Komprimierung hat unterschiedliche Auswirkungen, je nachdem, wann sie ausgelöst wird. Wenn die Komprimierung proaktiv vor dem Kontextlimit ausgelöst wurde, überspringt Claude Code sie, und die Konversation wird unkomprimiert fortgesetzt. Wenn die Komprimierung ausgelöst wurde, um sich von einem bereits von der API zurückgegebenen Kontextlimit-Fehler zu erholen, wird der zugrunde liegende Fehler angezeigt und die aktuelle Anfrage schlägt fehl.
3353 3355
3354Claude Code verwirft die Felder `systemMessage` und `continue` eines PreCompact-Hooks.3356Claude Code verwirft die Felder `systemMessage` und `continue` eines PreCompact-Hooks.
3355 3357
3374 PostCompact3376 PostCompact
3375</h3>3377</h3>
3376 3378
3377Wird ausgeführt, nachdem Claude Code einen Komprimierungsvorgang abgeschlossen hat. Verwenden Sie dieses Ereignis, um auf den neuen komprimierten Zustand zu reagieren, etwa um die generierte Zusammenfassung zu protokollieren oder externen Zustand zu aktualisieren. Claude Code verwirft die Felder `systemMessage` und `continue` eines PostCompact-Hooks.3379Wird ausgeführt, nachdem Claude Code eine Komprimierung abgeschlossen hat. Verwenden Sie dieses Ereignis, um auf den neuen komprimierten Zustand zu reagieren, zum Beispiel um die generierte Zusammenfassung zu protokollieren oder einen externen Zustand zu aktualisieren. Claude Code verwirft die Felder `systemMessage` und `continue` eines PostCompact-Hooks.
3378 3380
3379Es gelten dieselben Matcher-Werte wie für `PreCompact`:3381Es gelten dieselben Matcher-Werte wie für `PreCompact`:
3380 3382
3387 PostCompact-Eingabe3389 PostCompact-Eingabe
3388</h4>3390</h4>
3389 3391
3390Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PostCompact-Hooks `trigger` und `compact_summary`. Das Feld `compact_summary` enthält die vom Komprimierungsvorgang generierte Zusammenfassung der Konversation.3392Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PostCompact-Hooks `trigger` und `compact_summary`. Das Feld `compact_summary` enthält die durch die Komprimierung generierte Zusammenfassung der Konversation.
3391 3393
3392```json theme={null}3394```json theme={null}
3393{3395{
3406 PreModelSwitch3408 PreModelSwitch
3407</h3>3409</h3>
3408 3410
3409Wird ausgeführt, bevor Claude Code einen Modellwechsel anwendet, den Sie oder ein Client angefordert haben. Verwenden Sie es, um einen Wechsel zu blockieren, eine Bestätigung zu verlangen oder anzuzeigen, was der Wechsel kosten wird, bevor er erfolgt.3411Wird ausgeführt, bevor Claude Code einen Modellwechsel anwendet, den Sie oder ein Client angefordert haben. Verwenden Sie ihn, um einen Wechsel zu blockieren, eine Bestätigung zu verlangen oder anzuzeigen, was der Wechsel kosten wird, bevor er stattfindet.
3410 3412
3411PreModelSwitch erfordert Claude Code v2.1.251 oder höher. Claude Code führt es für diese Anfragen aus:3413PreModelSwitch erfordert Claude Code v2.1.251 oder höher. Claude Code führt ihn für diese Anfragen aus:
3412 3414
3413* `/model <name>` und die `/model`-Auswahl3415* `/model <name>` und die `/model`-Auswahl
3414* Die Modellauswahl über `Option+P` oder `Alt+P`3416* Die Modellauswahl über `Option+P` oder `Alt+P`
3415* Die Einstellung „Model“ in `/config`3417* Die Einstellung Model in `/config`
3416* Das Einschalten des [Fast-Modus](/docs/de/fast-mode), wenn dadurch das Modell der Sitzung geändert wird3418* Das Einschalten des [Fast-Modus](/docs/de/fast-mode), wenn dies das Modell der Sitzung ändert
3417* Eine `set_model`-Anfrage oder eine Modelländerung in einer `apply_flag_settings`-Anfrage von einem [Agent SDK](/docs/de/agent-sdk/typescript#query-object)-Host oder über [Remote Control](/docs/de/remote-control)3419* Eine `set_model`-Anfrage oder eine Modelländerung in einer `apply_flag_settings`-Anfrage von einem [Agent SDK](/docs/de/agent-sdk/typescript#query-object)-Host oder von [Remote Control](/docs/de/remote-control)
3418 3420
3419Claude Code führt PreModelSwitch-Hooks nicht für Wechsel aus, die es selbst vornimmt, etwa einen [automatischen Modell-Fallback](/docs/de/model-config#automatic-model-fallback) oder das Wiederherstellen des Modells beim Fortsetzen einer Sitzung. Diese Änderungen erreichen nur [PostModelSwitch](#postmodelswitch).3421Claude Code führt PreModelSwitch-Hooks nicht für Wechsel aus, die es selbstständig vornimmt, etwa bei einem [automatischen Modell-Fallback](/docs/de/model-config#automatic-model-fallback) oder beim Wiederherstellen des Modells, wenn Sie eine Sitzung fortsetzen. Diese Änderungen erreichen nur [PostModelSwitch](#postmodelswitch).
3420 3422
3421Claude Code vergleicht den Matcher mit dem kanonischen Namen des Modells, zu dem die Sitzung wechselt, und ignoriert dabei ein etwaiges `[1m]`-Suffix. Ein Alias wie `opus`, eine datierte Modell-ID und eine anbieterspezifische ID wie eine Amazon-Bedrock-Modell-ID stimmen alle mit dem einen kanonischen Namen überein, in den sie aufgelöst werden, sodass `claude-opus-5` jede Schreibweise von Opus 5 abdeckt.3423Claude Code vergleicht den Matcher mit dem kanonischen Namen des Modells, zu dem die Sitzung wechselt, und ignoriert dabei ein eventuelles `[1m]`-Suffix. Ein Alias wie `opus`, eine datierte Modell-ID und eine anbieterspezifische ID wie eine Amazon-Bedrock-Modell-ID entsprechen alle dem einen kanonischen Namen, zu dem sie aufgelöst werden, sodass `claude-opus-5` jede Schreibweise von Opus 5 abdeckt.
3422 3424
3423Wenn Claude Code keinen kanonischen Namen für das Ziel ermitteln kann, etwa bei einer benutzerdefinierten Modell-ID, die nur Ihr [LLM-Gateway](/docs/de/llm-gateway) kennt, führt es jeden PreModelSwitch-Hook unabhängig vom Matcher aus. Ein blockierender Hook sollte daher `to_model` aus seiner Eingabe prüfen, statt sich allein auf den Matcher zu verlassen.3425Wenn Claude Code keinen kanonischen Namen für das Ziel ermitteln kann, zum Beispiel bei einer benutzerdefinierten Modell-ID, die nur Ihr [LLM-Gateway](/docs/de/llm-gateway) kennt, führt es jeden PreModelSwitch-Hook unabhängig vom Matcher aus. Ein blockierender Hook sollte daher `to_model` aus seiner Eingabe prüfen, statt sich allein auf den Matcher zu verlassen.
3424 3426
3425Schreiben Sie den Matcher als exakten Namen, als durch `|` getrennte Liste wie `claude-opus-4-6|claude-opus-5` oder als regulären Ausdruck wie `.*opus.*`. Dieses Beispiel verwendet einen Matcher mit exaktem Namen und prüft zusätzlich `to_model` aus der Hook-Eingabe, sodass es einen Wechsel zu Opus 4.6 durch Beenden mit Exit-Code 2 ablehnt und jedes andere Ziel durchlässt:3427Schreiben Sie den Matcher als exakten Namen, als durch `|` getrennte Liste wie `claude-opus-4-6|claude-opus-5` oder als regulären Ausdruck wie `.*opus.*`. Dieses Beispiel verwendet einen Matcher mit exaktem Namen und prüft zusätzlich `to_model` aus der Hook-Eingabe, sodass es einen Wechsel zu Opus 4.6 durch Beenden mit Code 2 ablehnt und jedes andere Ziel durchlässt:
3426 3428
3427<Tabs>3429<Tabs>
3428 <Tab title="macOS/Linux">3430 <Tab title="macOS/Linux">
3448 </Tab>3450 </Tab>
3449 3451
3450 <Tab title="Windows (PowerShell)">3452 <Tab title="Windows (PowerShell)">
3451 Registrieren Sie einen Befehls-Hook, der ein Skript über PowerShell ausführt:3453 Registrieren Sie einen Command-Hook, der ein Skript über PowerShell ausführt:
3452 3454
3453 ```json theme={null}3455 ```json theme={null}
3454 {3456 {
3475 }3477 }
3476 ```3478 ```
3477 3479
3478 Speichern Sie dieses Skript in Ihrem Projekt unter `.claude/hooks/block-opus-46.ps1`:3480 Speichern Sie dieses Skript unter `.claude/hooks/block-opus-46.ps1` in Ihrem Projekt:
3479 3481
3480 ```powershell theme={null}3482 ```powershell theme={null}
3481 $hookInput = [Console]::In.ReadToEnd() | ConvertFrom-Json3483 $hookInput = [Console]::In.ReadToEnd() | ConvertFrom-Json
3488 </Tab>3490 </Tab>
3489</Tabs>3491</Tabs>
3490 3492
3491Um zu prüfen, ob der Hook funktioniert, führen Sie `/model claude-opus-4-6` in einer Sitzung aus, die ein anderes Modell verwendet. Claude Code behält das aktuelle Modell bei und meldet, dass ein PreModelSwitch-Hook den Wechsel blockiert hat, mit Ihrer Meldung als Grund.3493Um zu überprüfen, ob der Hook funktioniert, führen Sie `/model claude-opus-4-6` in einer Sitzung aus, die ein anderes Modell verwendet. Claude Code behält das aktuelle Modell bei und meldet, dass ein PreModelSwitch-Hook den Wechsel blockiert hat, mit Ihrer Meldung als Begründung.
3492 3494
3493<h4 id="premodelswitch-input">3495<h4 id="premodelswitch-input">
3494 PreModelSwitch-Eingabe3496 PreModelSwitch-Eingabe
3495</h4>3497</h4>
3496 3498
3497Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreModelSwitch-Hooks die Felder in dieser Tabelle. Die letzten fünf beschreiben, was das erneute Senden der Konversation an das neue Modell kostet, sodass ein Hook diesen Wert vor dem Wechsel anzeigen kann.3499Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreModelSwitch-Hooks die Felder in dieser Tabelle. Die letzten fünf beschreiben, was das erneute Senden der Konversation an das neue Modell kostet, sodass ein Hook diesen Betrag anzeigen kann, bevor der Wechsel stattfindet.
3498 3500
3499| Feld | Typ | Beschreibung |3501| Feld | Typ | Beschreibung |
3500| :- | :- | :- |3502| :- | :- | :- |
3501| `from_model` | string | Modell-ID, von der gewechselt wird |3503| `from_model` | string | Modell-ID, von der aus gewechselt wird |
3502| `to_model` | string | Modell-ID, zu der gewechselt wird. Der Matcher wird mit dem kanonischen Namen dieses Modells verglichen |3504| `to_model` | string | Modell-ID, zu der gewechselt wird. Der Matcher wird mit dem kanonischen Namen dieses Modells verglichen |
3503| `requested_model` | string oder `null` | Das in der Anfrage genannte Modell: ein Alias wie `opus`, eine vollständige Modell-ID oder `null`, wenn das Standardmodell angefordert wurde |3505| `requested_model` | string oder `null` | Das in der Anfrage genannte Modell: ein Alias wie `opus`, eine vollständige Modell-ID oder `null`, wenn die Anfrage das Standardmodell betraf |
3504| `source` | string | Woher die Anfrage kam: `"command"` für `/model <name>`, die Einstellung „Model“ in `/config` oder das Einschalten des Fast-Modus; `"picker"` für eine Modellauswahl; `"sdk"` für eine `set_model`-Anfrage oder eine Modelländerung in einer `apply_flag_settings`-Anfrage von einem Agent-SDK-Host oder über Remote Control |3506| `source` | string | Woher die Anfrage kam: `"command"` für `/model <name>`, die Einstellung Model in `/config` oder das Einschalten des Fast-Modus; `"picker"` für eine Modellauswahl; `"sdk"` für eine `set_model`-Anfrage oder eine Modelländerung in einer `apply_flag_settings`-Anfrage von einem Agent SDK-Host oder von Remote Control |
3505| `context_tokens` | number | Token, die die nächste Anfrage erneut als Prompt sendet: die Eingabe-, Cache-Lese-, Cache-Erstellungs- und Ausgabe-Token der letzten Antwort in der Hauptkonversation zusammengenommen. `0` vor der ersten Antwort |3507| `context_tokens` | number | Token, die die nächste Anfrage als Prompt erneut sendet: die Eingabe-, Cache-Lese-, Cache-Erstellungs- und Ausgabe-Token der letzten Antwort in der Hauptkonversation zusammengenommen. `0` vor der ersten Antwort |
3506| `prompt_cache_warm` | boolean | Ob der Prompt-Cache des aktuellen Modells wahrscheinlich noch warm ist, was bedeutet, dass er durch den Wechsel verloren geht |3508| `prompt_cache_warm` | boolean | Ob der Prompt-Cache des aktuellen Modells wahrscheinlich noch warm ist, was bedeutet, dass der Wechsel ihn verwirft |
3507| `cache_ttl` | string | [Lebensdauer des Prompt-Caches](/docs/de/prompt-caching#cache-lifetime), die Claude Code für diese Sitzung anfordert: `"5m"` oder `"1h"` |3509| `cache_ttl` | string | [Lebensdauer des Prompt-Caches](/docs/de/prompt-caching#cache-lifetime), die Claude Code für diese Sitzung anfordert: `"5m"` oder `"1h"` |
3508| `estimated_cache_write_usd` | number | Geschätzte Kosten in US-Dollar für das Schreiben von `context_tokens` in den Prompt-Cache auf `to_model` zum `cache_ttl`-Tarif, ohne die nächste Antwort. Der Server muss möglicherweise nicht den gesamten Kontext erneut zwischenspeichern, betrachten Sie den Wert daher als Schätzung |3510| `estimated_cache_write_usd` | number | Geschätzte Kosten in US-Dollar für das Schreiben von `context_tokens` in den Prompt-Cache von `to_model` zum `cache_ttl`-Tarif, ohne die nächste Antwort. Der Server muss möglicherweise nicht den gesamten Kontext erneut zwischenspeichern, betrachten Sie den Wert daher als Schätzung |
3509| `pricing` | string | Wie Claude Code `estimated_cache_write_usd` berechnet hat: `"configured"` zu den eigenen Tarifen Ihrer Organisation, sofern diese konfiguriert sind, `"catalog"` zum Listenpreis oder `"default"`, wenn für `to_model` kein Preis bekannt ist und Claude Code einen Standardtarif angenommen hat |3511| `pricing` | string | Wie Claude Code `estimated_cache_write_usd` berechnet hat: `"configured"` zu den eigenen Tarifen Ihrer Organisation, wenn diese konfiguriert wurden, `"catalog"` zum Listenpreis oder `"default"`, wenn für `to_model` kein Preis bekannt ist und Claude Code einen Standardtarif angenommen hat |
3510 3512
3511Dieses Beispiel zeigt die Eingabe für `/model opus` in einer Sitzung, die Sonnet 5 verwendet:3513Dieses Beispiel zeigt die Eingabe für `/model opus` in einer Sitzung, die Sonnet 5 verwendet:
3512 3514
3532 PreModelSwitch-Entscheidungssteuerung3534 PreModelSwitch-Entscheidungssteuerung
3533</h4>3535</h4>
3534 3536
3535`PreModelSwitch`-Hooks können den Wechsel abbrechen, den Benutzer um Bestätigung bitten oder ihn fortfahren lassen. Exit-Code 2 oder ein `decision: "block"` auf oberster Ebene bricht den Wechsel ab.3537`PreModelSwitch`-Hooks können den Wechsel abbrechen, den Benutzer um Bestätigung bitten oder ihn fortsetzen lassen. Exit-Code 2 oder ein `decision: "block"` auf oberster Ebene bricht den Wechsel ab.
3536 3538
3537Für eine feinere Steuerung geben Sie `permissionDecision` und `permissionDecisionReason` in einem `hookSpecificOutput`-Objekt zurück, wie bei [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` akzeptiert `"allow"`, `"deny"` und `"ask"`. Es akzeptiert weder `"defer"` noch `updatedInput` oder `additionalContext`. Die folgende Tabelle beschreibt beide Felder:3539Für eine feinere Steuerung geben Sie `permissionDecision` und `permissionDecisionReason` in einem `hookSpecificOutput`-Objekt zurück, wie bei [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` akzeptiert `"allow"`, `"deny"` und `"ask"`. Es akzeptiert weder `"defer"` noch `updatedInput` oder `additionalContext`. Die folgende Tabelle beschreibt beide Felder:
3538 3540
3539| Feld | Beschreibung |3541| Feld | Beschreibung |
3540| :- | :- |3542| :- | :- |
3541| `permissionDecision` | `"allow"` fährt fort und überspringt die [Bestätigung, die Claude Code anzeigt, solange der Prompt-Cache warm ist](/docs/de/prompt-caching#switching-models). `"deny"` bricht den Wechsel ab. `"ask"` bittet den Benutzer um Bestätigung |3543| `permissionDecision` | `"allow"` setzt fort und überspringt die [Bestätigung, die Claude Code anzeigt, solange der Prompt-Cache warm ist](/docs/de/prompt-caching#switching-models). `"deny"` bricht den Wechsel ab. `"ask"` bittet den Benutzer, ihn zu bestätigen |
3542| `permissionDecisionReason` | Bei `"deny"` wird der Wert dem Benutzer als Grund für das Blockieren des Wechsels angezeigt oder bei einer `set_model`-Anfrage als Fehler zurückgegeben. Bei `"ask"` wird er in der Bestätigungsabfrage angezeigt. Bei `"allow"` wird er ignoriert |3544| `permissionDecisionReason` | Bei `"deny"` wird dies dem Benutzer als Grund für die Blockierung des Wechsels angezeigt oder als Fehler für eine `set_model`-Anfrage zurückgegeben. Bei `"ask"` wird es in der Bestätigungsabfrage angezeigt. Wird bei `"allow"` ignoriert |
3543 3545
3544Nur `/model` in einer interaktiven Sitzung kann die `"ask"`-Abfrage anzeigen. Auf allen anderen Oberflächen, einschließlich des nicht interaktiven Modus mit dem Flag `-p`, `/config` und `set_model`-Anfragen, behandelt Claude Code `"ask"` als Ablehnung.3546Nur `/model` in einer interaktiven Sitzung kann die `"ask"`-Abfrage anzeigen. Auf jeder anderen Oberfläche, einschließlich des nicht interaktiven Modus mit dem Flag `-p`, `/config` und `set_model`-Anfragen, behandelt Claude Code `"ask"` als Ablehnung.
3545 3547
3546Dieses Beispiel bittet den Benutzer um Bestätigung und nennt die Token-Anzahl aus `context_tokens`:3548Dieses Beispiel bittet den Benutzer um Bestätigung und nennt die Anzahl der Token aus `context_tokens`:
3547 3549
3548```json theme={null}3550```json theme={null}
3549{3551{
3555}3557}
3556```3558```
3557 3559
3558Wenn mehrere PreModelSwitch-Hooks unterschiedliche Entscheidungen zurückgeben, gilt die Rangfolge `deny` > `ask` > `allow`.3560Wenn mehrere PreModelSwitch-Hooks unterschiedliche Entscheidungen zurückgeben, gilt der Vorrang `deny` > `ask` > `allow`.
3559 3561
3560Claude Code zeigt dem Benutzer jede `systemMessage` an, die Ihr Hook zurückgibt, unabhängig von der Entscheidung, sodass ein Hook zur Kostenanzeige `{"systemMessage": "..."}` zurückgeben und mit 0 enden kann.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.
3561 3563
3562Ein PreModelSwitch-Hook, der nicht vor Ablauf seines Timeouts antwortet, blockiert den Wechsel. Bei [PreToolUse](#timeouts) hingegen lässt ein Befehls-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.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.
3563 3565
3564Ein Hook, der mit einem anderen Code als 0 oder 2 endet 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.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.
3565 3567
3566<h3 id="postmodelswitch">3568<h3 id="postmodelswitch">
3567 PostModelSwitch3569 PostModelSwitch
3568</h3>3570</h3>
3569 3571
3570Wird ausgeführt, nachdem sich das Modell der Sitzung geändert hat. Verwenden Sie es, um Claude modellspezifische Hinweise zu geben, ohne jede CLAUDE.md zu bearbeiten, etwa eine organisationsweite Anweisung, die für bestimmte Modelle gilt.3572Wird ausgeführt, nachdem sich das Modell der Sitzung geändert hat. Verwenden Sie ihn, um Claude modellspezifische Hinweise zu geben, ohne jede CLAUDE.md zu bearbeiten, zum Beispiel eine organisationsweite Anweisung, die für bestimmte Modelle gilt.
3571 3573
3572PostModelSwitch erfordert Claude Code v2.1.251 oder höher. Es kann nicht blockieren, da sich das Modell bereits geändert hat. Claude Code führt PostModelSwitch-Hooks nach jeder dieser Änderungen aus:3574PostModelSwitch erfordert Claude Code v2.1.251 oder höher. Er kann nicht blockieren, da sich das Modell bereits geändert hat. Claude Code führt PostModelSwitch-Hooks nach jeder dieser Änderungen aus:
3573 3575
3574* Ein Wechsel, den Sie oder ein Client angefordert haben3576* Einem Wechsel, den Sie oder ein Client angefordert haben
3575* Ein [automatischer Modell-Fallback](/docs/de/model-config#automatic-model-fallback), der das Modell der Sitzung ändert3577* Einem [automatischen Modell-Fallback](/docs/de/model-config#automatic-model-fallback), der das Modell der Sitzung ändert
3576* Eine Einstellung wie [`opusplan`](/docs/de/model-config#opusplan-model-setting), die den Plan-Modus betritt oder verlässt3578* Einer Einstellung wie [`opusplan`](/docs/de/model-config#opusplan-model-setting), die in den Plan-Modus wechselt oder ihn verlässt
3577* Claude Code stellt das Modell wieder her, wenn Sie eine Sitzung fortsetzen3579* Der Wiederherstellung des Modells durch Claude Code, wenn Sie eine Sitzung fortsetzen
3578 3580
3579Claude Code führt PostModelSwitch-Hooks nicht aus, wenn ein Modell aus einer [Fallback-Modellkette](/docs/de/model-config#fallback-model-chains) einen Turn bedient, da diese Ersetzung nur einen Turn dauert und das Modell der Sitzung unverändert lässt.3581Claude Code führt keine PostModelSwitch-Hooks aus, wenn ein Modell aus einer [Fallback-Modellkette](/docs/de/model-config#fallback-model-chains) einen Turn bedient, da diese Ersetzung nur einen Turn dauert und das Modell der Sitzung unverändert lässt.
3580 3582
3581Der Matcher folgt denselben Regeln wie bei [PreModelSwitch](#premodelswitch): Claude Code vergleicht ihn mit dem kanonischen Namen des Modells, zu dem die Sitzung gewechselt ist.3583Der Matcher folgt denselben Regeln wie bei [PreModelSwitch](#premodelswitch): Claude Code vergleicht ihn mit dem kanonischen Namen des Modells, zu dem die Sitzung gewechselt hat.
3582 3584
3583Dieses Beispiel fügt Hinweise hinzu, sobald das Modell der Sitzung zu einem beliebigen Opus-Modell wechselt:3585Dieses Beispiel fügt Hinweise hinzu, sobald das Modell der Sitzung zu einem beliebigen Opus-Modell wechselt:
3584 3586
3600}3602}
3601```3603```
3602 3604
3603Um zu prüfen, ob der Hook funktioniert, wechseln Sie in einer Sitzung mit einem anderen Modell zu einem Opus-Modell, führen Sie beispielsweise `/model opus` in einer Sonnet-Sitzung aus, und fragen Sie Claude dann, welche Hinweise es zum aktuellen Modell hat.3605Um zu überprüfen, ob der Hook funktioniert, wechseln Sie in einer Sitzung mit einem anderen Modell zu einem Opus-Modell, führen Sie zum Beispiel `/model opus` in einer Sonnet-Sitzung aus, und fragen Sie Claude dann, welche Hinweise es zum aktuellen Modell hat.
3604 3606
3605<h4 id="postmodelswitch-input">3607<h4 id="postmodelswitch-input">
3606 PostModelSwitch-Eingabe3608 PostModelSwitch-Eingabe
3607</h4>3609</h4>
3608 3610
3609PostModelSwitch-Hooks erhalten dieselben Felder wie [PreModelSwitch](#premodelswitch-input), wobei `hook_event_name` auf `"PostModelSwitch"` gesetzt ist und es zwei weitere `source`-Werte gibt: `"auto"` für einen automatischen Fallback oder eine andere Änderung, die Claude Code selbst vorgenommen hat, und `"resume"` für das Modell, das beim Fortsetzen einer Sitzung wiederhergestellt wurde.3611PostModelSwitch-Hooks erhalten dieselben Felder wie [PreModelSwitch](#premodelswitch-input), wobei `hook_event_name` auf `"PostModelSwitch"` gesetzt ist und zwei weitere `source`-Werte hinzukommen: `"auto"` für einen automatischen Fallback oder eine andere Änderung, die Claude Code selbstständig vorgenommen hat, und `"resume"` für das Modell, das beim Fortsetzen einer Sitzung wiederhergestellt wurde.
3610 3612
3611`requested_model` ist `null`, wenn `source` den Wert `"auto"` hat. Wenn `source` den Wert `"resume"` hat, ist es die gespeicherte Modelleinstellung, die Claude Code wiederhergestellt hat.3613`requested_model` ist `null`, wenn `source` den Wert `"auto"` hat. Wenn `source` den Wert `"resume"` hat, enthält es die gespeicherte Modelleinstellung, die Claude Code wiederhergestellt hat.
3612 3614
3613<h4 id="postmodelswitch-decision-control">3615<h4 id="postmodelswitch-decision-control">
3614 PostModelSwitch-Entscheidungssteuerung3616 PostModelSwitch-Entscheidungssteuerung
3615</h4>3617</h4>
3616 3618
3617Claude Code übernimmt die [Klartext-Ausgabe auf stdout](#exit-code-0) Ihres Hooks bei Exit-Code 0 oder `additionalContext` aus der JSON-Ausgabe und übermittelt sie Claude mit der nächsten Anfrage nach dem Wechsel. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können Sie Folgendes zurückgeben:3619Claude Code übernimmt die [Klartext-Ausgabe auf stdout](#exit-code-0) Ihres Hooks bei Exit 0 oder `additionalContext` aus der JSON-Ausgabe und übermittelt sie Claude mit der nächsten Anfrage nach dem Wechsel. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können Sie Folgendes zurückgeben:
3618 3620
3619| Feld | Beschreibung |3621| Feld | Beschreibung |
3620| :- | :- |3622| :- | :- |
3621| `additionalContext` | Zeichenfolge, die mit der nächsten Anfrage zu Claudes Kontext hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |3623| `additionalContext` | Zeichenfolge, die Claudes Kontext mit der nächsten Anfrage hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
3622 3624
3623Wenn der Hook nicht innerhalb von fünf Sekunden nach dem Senden des nächsten Prompts fertig ist, sendet Claude Code diese Anfrage ohne die Ausgabe und hängt sie stattdessen an die darauffolgende Anfrage an. Wenn sich das Modell vor der nächsten Anfrage mehrmals ändert, übermittelt Claude Code nur die Ausgabe für das Zielmodell des letzten Wechsels.3625Wenn der Hook nicht innerhalb von fünf Sekunden nach dem Senden Ihres nächsten Prompts fertig ist, sendet Claude Code diese Anfrage ohne die Ausgabe und hängt sie stattdessen an die darauffolgende Anfrage an. Wenn sich das Modell vor der nächsten Anfrage mehrmals ändert, übermittelt Claude Code nur die Ausgabe für das Zielmodell des letzten Wechsels.
3624 3626
3625<h3 id="sessionend">3627<h3 id="sessionend">
3626 SessionEnd3628 SessionEnd
3627</h3>3629</h3>
3628 3630
3629Wird ausgeführt, wenn eine Claude-Code-Sitzung endet. Nützlich für Bereinigungsaufgaben, das Protokollieren von Sitzungsstatistiken3631Wird ausgeführt, wenn eine Claude Code-Sitzung endet. Nützlich für Bereinigungsaufgaben, das Protokollieren von Sitzungsstatistiken
3630oder das Speichern des Sitzungszustands. Unterstützt Matcher, um nach dem Beendigungsgrund zu filtern.3632oder das Speichern des Sitzungszustands. Unterstützt Matcher, um nach dem Beendigungsgrund zu filtern.
3631 3633
3632Das Feld `reason` in der Hook-Eingabe gibt an, warum die Sitzung beendet wurde:3634Das Feld `reason` in der Hook-Eingabe gibt an, warum die Sitzung beendet wurde:
3634| Grund | Beschreibung |3636| Grund | Beschreibung |
3635| :- | :- |3637| :- | :- |
3636| `clear` | Sitzung mit dem Befehl `/clear` geleert |3638| `clear` | Sitzung mit dem Befehl `/clear` geleert |
3637| `resume` | Sitzung über das interaktive `/resume` gewechselt |3639| `resume` | Sitzung über interaktives `/resume` gewechselt |
3638| `logout` | Benutzer hat sich abgemeldet |3640| `logout` | Benutzer hat sich abgemeldet |
3639| `prompt_input_exit` | Benutzer hat beendet, während das Prompt-Eingabefeld sichtbar war |3641| `prompt_input_exit` | Benutzer hat beendet, während die Prompt-Eingabe sichtbar war |
3640| `other` | Andere Beendigungsgründe |3642| `other` | Andere Beendigungsgründe |
3641| `bypass_permissions_disabled` | In v2.1.234 entfernt; Claude Code sendet diesen Wert nicht. Entfernen Sie ihn aus Ihren `SessionEnd`-Matchern |3643| `bypass_permissions_disabled` | In v2.1.234 entfernt; Claude Code sendet ihn nicht. Entfernen Sie ihn aus Ihren `SessionEnd`-Matchern |
3642 3644
3643<h4 id="sessionend-input">3645<h4 id="sessionend-input">
3644 SessionEnd-Eingabe3646 SessionEnd-Eingabe
3658 3660
3659SessionEnd-Hooks haben keine Entscheidungssteuerung. Sie können das Beenden der Sitzung nicht blockieren, aber Bereinigungsaufgaben ausführen. Claude Code verwirft ihre [JSON-Ausgabefelder](#json-output), etwa `systemMessage`.3661SessionEnd-Hooks haben keine Entscheidungssteuerung. Sie können das Beenden der Sitzung nicht blockieren, aber Bereinigungsaufgaben ausführen. Claude Code verwirft ihre [JSON-Ausgabefelder](#json-output), etwa `systemMessage`.
3660 3662
3661SessionEnd-Hooks haben einen Standard-Timeout von 1,5 Sekunden. Er gilt, wenn Sie beenden, `/clear` ausführen oder mit dem interaktiven `/resume` die Sitzung wechseln. Sie können einem Hook auf zwei Arten mehr Zeit geben:3663SessionEnd-Hooks haben einen Standard-Timeout von 1,5 Sekunden. Er gilt, wenn Sie beenden, `/clear` ausführen oder Sitzungen mit interaktivem `/resume` wechseln. Sie können einem Hook auf zwei Arten mehr Zeit geben:
3662 3664
3663* **`timeout` pro Hook**: Setzen Sie `timeout` in der Konfiguration des jeweiligen Hooks. Das Gesamtbudget steigt automatisch auf den höchsten `timeout`-Wert pro Hook in Ihren Einstellungsdateien, bis zu 60 Sekunden. Wenn Sie das Budget auf diese Weise erhöhen, behält ein Hook ohne eigenen `timeout` weiterhin den Standardwert. Timeouts, die für von Plugins bereitgestellte Hooks festgelegt sind, erhöhen das Budget nicht.3665* **`timeout` pro Hook**: Setzen Sie `timeout` in der Konfiguration dieses Hooks. Das Gesamtbudget steigt automatisch auf den höchsten `timeout`-Wert pro Hook in Ihren Einstellungsdateien, bis zu 60 Sekunden. Wenn Sie das Budget auf diese Weise erhöhen, behält ein Hook ohne eigenen `timeout` weiterhin den Standardwert. Timeouts, die für von Plugins bereitgestellte Hooks festgelegt sind, erhöhen das Budget nicht.
3664* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: Setzen Sie diese Umgebungsvariable in Millisekunden, um das Budget explizit zu überschreiben. Der von Ihnen festgelegte Wert wird außerdem zum Timeout für jeden Hook ohne eigenen `timeout`.3666* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: Setzen Sie diese Umgebungsvariable in Millisekunden, um das Budget explizit zu überschreiben. Der von Ihnen gesetzte Wert wird außerdem zum Timeout für jeden Hook ohne eigenen `timeout`.
3665 3667
3666Dieses Beispiel setzt das Budget auf 5 Sekunden:3668Dieses Beispiel setzt das Budget auf 5 Sekunden:
3667 3669
3675 Elicitation3677 Elicitation
3676</h3>3678</h3>
3677 3679
3678Wird ausgeführt, wenn ein MCP-Server während einer Aufgabe Benutzereingaben anfordert. Standardmäßig zeigt Claude Code einen interaktiven Dialog an, in dem der Benutzer antworten kann. Hooks können diese Anfrage abfangen und programmatisch beantworten, wodurch der Dialog vollständig übersprungen wird.3680Wird ausgeführt, wenn ein MCP-Server während einer Aufgabe eine Benutzereingabe anfordert. Standardmäßig zeigt Claude Code einen interaktiven Dialog an, in dem der Benutzer antworten kann. Hooks können diese Anfrage abfangen und programmgesteuert beantworten, wodurch der Dialog vollständig übersprungen wird.
3681
3682Einen vollständigen Hook mit seinem Einstellungseintrag und Skript finden Sie unter [Eine Formularanfrage über ein Skript beantworten](#answer-a-form-request-from-a-script).
3679 3683
3680Das Matcher-Feld wird mit dem Namen des MCP-Servers abgeglichen.3684Das Matcher-Feld wird mit dem Namen des MCP-Servers abgeglichen.
3681 3685
3683 Elicitation-Eingabe3687 Elicitation-Eingabe
3684</h4>3688</h4>
3685 3689
3686Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten Elicitation-Hooks die Felder `mcp_server_name` und `message` sowie die optionalen Felder `mode`, `url`, `elicitation_id` und `requested_schema`.3690Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten Elicitation-Hooks `mcp_server_name`, `message` sowie die optionalen Felder `mode`, `url`, `elicitation_id` und `requested_schema`.
3687 3691
3688Für eine Elicitation im Formularmodus, den häufigsten Fall:3692Für eine Elicitation im Formularmodus, den häufigsten Fall:
3689 3693
3724 Elicitation-Ausgabe3728 Elicitation-Ausgabe
3725</h4>3729</h4>
3726 3730
3727Um programmatisch zu antworten, ohne den Dialog anzuzeigen, geben Sie ein JSON-Objekt mit `hookSpecificOutput` zurück:3731Ein Elicitation-Hook kann die Anfrage für den Benutzer beantworten, sie ablehnen oder abbrechen oder sie dem Dialog überlassen. Um zu antworten, abzulehnen oder abzubrechen, beenden Sie mit 0 und geben ein `hookSpecificOutput`-Objekt mit einer `action` aus. Der Server erhält Ihre Antwort, und es erscheint kein Dialog. Jede Zeile dieser Tabelle zeigt, was Sie für ein Ergebnis zurückgeben müssen und was der MCP-Server erhält:
3732
3733| Ziel | Rückgabe | Der Server erhält |
3734| :- | :- | :- |
3735| Für den Benutzer antworten | `"action": "accept"`, mit den Werten der Formularfelder in `content` | `accept` mit Ihrem `content` |
3736| Die Anfrage ablehnen | `"action": "decline"` | `decline` |
3737| Die Anfrage abbrechen | `"action": "cancel"` | `cancel` |
3738| Die Anfrage dem Benutzer überlassen | Keine Ausgabe, mit Exit-Code 0 | Die Antwort des Benutzers aus dem [Dialog](/docs/de/mcp#respond-to-mcp-elicitation-requests) |
3739
3740Diese Ausgabe beantwortet die Anfrage im Formularmodus, die unter [Elicitation-Eingabe](#elicitation-input) gezeigt wird. Die Schlüssel in `content` sind die Eigenschaftsnamen aus dem `requested_schema` dieser Anfrage:
3728 3741
3729```json theme={null}3742```json theme={null}
3730{3743{
3738}3751}
3739```3752```
3740 3753
3741| Feld | Werte | Beschreibung |3754Diese Ausgabe lehnt eine Anfrage ab:
3742| :- | :- | :- |3755
3743| `action` | `accept`, `decline`, `cancel` | Ob die Anfrage angenommen, abgelehnt oder abgebrochen werden soll |3756```json theme={null}
3744| `content` | object | Zu übermittelnde Werte der Formularfelder. Wird nur verwendet, wenn `action` den Wert `accept` hat |3757{
3758 "hookSpecificOutput": {
3759 "hookEventName": "Elicitation",
3760 "action": "decline"
3761 }
3762}
3763```
3764
3765Im Dialog sendet die Auswahl von **Decline** `decline` und das Drücken von `Esc` sendet `cancel`, geben Sie also dasjenige zurück, das der Server sehen soll.
3766
3767Bei einer Anfrage im URL-Modus überspringt ein Hook, der `accept` zurückgibt, den Dialog, sodass die URL nie geöffnet wird.
3768
3769Claude Code verwirft `reason`, `systemMessage` und `continue` aus der JSON-Ausgabe eines Elicitation-Hooks, unabhängig davon, welche `action` Sie zurückgeben.
3770
3771<h4 id="other-ways-to-decline-an-elicitation">
3772 Andere Möglichkeiten, eine Elicitation abzulehnen
3773</h4>
3774
3775Ihr Hook kann auch auf diese Weise ablehnen. Der Server erhält dasselbe `decline` wie bei `"action": "decline"`:
3776
3777* **Beendet mit Code 2**: Claude Code ignoriert ein vom selben Hook ausgegebenes `hookSpecificOutput`
3778* **Gibt ein `"decision": "block"` auf oberster Ebene aus**: Die Blockierung überschreibt eine `action` in derselben Ausgabe
3779
3780Wenn mehrere Hooks auf dieselbe Anfrage zutreffen, überschreibt eine Ablehnung durch einen von ihnen ein `accept` oder `cancel` eines anderen.
3781
3782Dieses Skript lehnt Anfragen im URL-Modus ab und überlässt Formularanfragen dem Dialog:
3783
3784```bash theme={null}
3785#!/bin/bash
3786if [ "$(jq -r '.mode')" = "url" ]; then
3787 exit 2
3788fi
3789```
3790
3791Weder der Benutzer noch der Server sieht, warum Ihr Hook abgelehnt hat, da Claude Code weder Ihre stderr-Ausgabe noch Ihren `reason` anzeigt.
3792
3793Claude Code ignorierte ein `decision` auf oberster Ebene von `Elicitation`- und `ElicitationResult`-Hooks ab v2.1.105 bis zur Korrektur in v2.1.284.
3794
3795<h4 id="answer-a-form-request-from-a-script">
3796 Eine Formularanfrage über ein Skript beantworten
3797</h4>
3798
3799Dieses Beispiel beantwortet eine wiederkehrende Frage für den Benutzer. Ein MCP-Server namens `issue-tracker` fragt in einem Formular nach einem Projektschlüssel, und der Hook trägt `DOCS` ein. Das Skript akzeptiert, wenn `project_key` das einzige Feld des Formulars ist. Bei jeder anderen Anfrage gibt es nichts aus, sodass der Dialog erscheint.
3800
3801<Tabs>
3802 <Tab title="macOS/Linux">
3803 Registrieren Sie in Ihrer Einstellungsdatei einen Command-Hook für das Ereignis, mit dem Servernamen als Matcher:
3804
3805 ```json theme={null}
3806 {
3807 "hooks": {
3808 "Elicitation": [
3809 {
3810 "matcher": "issue-tracker",
3811 "hooks": [
3812 {
3813 "type": "command",
3814 "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/answer-project-key.sh",
3815 "args": []
3816 }
3817 ]
3818 }
3819 ]
3820 }
3821 }
3822 ```
3823
3824 Speichern Sie dieses Skript unter `.claude/hooks/answer-project-key.sh` in Ihrem Projekt und machen Sie es mit `chmod +x` ausführbar:
3825
3826 ```bash theme={null}
3827 #!/bin/bash
3828 input=$(cat)
3829 fields=$(jq -c '.requested_schema.properties // {} | keys' <<<"$input")
3830
3831 if [ "$fields" = '["project_key"]' ]; then
3832 jq -n '{hookSpecificOutput: {hookEventName: "Elicitation", action: "accept", content: {project_key: "DOCS"}}}'
3833 fi
3834 ```
3835 </Tab>
3745 3836
3746Exit-Code 2 lehnt die Elicitation ab. Claude Code zeigt Ihre stderr-Meldung nirgends an.3837 <Tab title="Windows (PowerShell)">
3838 Registrieren Sie einen Command-Hook, der das Skript über PowerShell ausführt, mit dem Servernamen als Matcher:
3747 3839
3748Claude Code verarbeitet `hookSpecificOutput` aus der JSON-Ausgabe eines Elicitation-Hooks und verwirft `systemMessage` und `continue`.3840 ```json theme={null}
3841 {
3842 "hooks": {
3843 "Elicitation": [
3844 {
3845 "matcher": "issue-tracker",
3846 "hooks": [
3847 {
3848 "type": "command",
3849 "command": "powershell.exe",
3850 "args": [
3851 "-NoProfile",
3852 "-ExecutionPolicy",
3853 "Bypass",
3854 "-File",
3855 "${CLAUDE_PROJECT_DIR}/.claude/hooks/answer-project-key.ps1"
3856 ]
3857 }
3858 ]
3859 }
3860 ]
3861 }
3862 }
3863 ```
3864
3865 Speichern Sie dieses Skript unter `.claude/hooks/answer-project-key.ps1` in Ihrem Projekt:
3866
3867 ```powershell theme={null}
3868 $request = [Console]::In.ReadToEnd() | ConvertFrom-Json
3869 $fields = @($request.requested_schema.properties.PSObject.Properties.Name)
3870
3871 if ($fields.Count -eq 1 -and $fields[0] -eq 'project_key') {
3872 @{
3873 hookSpecificOutput = @{
3874 hookEventName = "Elicitation"
3875 action = "accept"
3876 content = @{ project_key = "DOCS" }
3877 }
3878 } | ConvertTo-Json -Depth 3
3879 }
3880 ```
3881 </Tab>
3882</Tabs>
3883
3884Um zu überprüfen, ob der Hook funktioniert, starten Sie Claude Code mit `claude --debug` und geben Sie Claude eine Aufgabe, bei der der Server nach dem Projektschlüssel fragt. Es erscheint kein Dialog, und das [Debug-Log](#debug-hooks) enthält eine Zeile, die mit `Elicitation resolved by hook: {"action":"accept","content":{"project_key":"DOCS"}}` endet.
3749 3885
3750<h3 id="elicitationresult">3886<h3 id="elicitationresult">
3751 ElicitationResult3887 ElicitationResult
3753 3889
3754Wird ausgeführt, nachdem ein Benutzer auf eine MCP-Elicitation geantwortet hat. Hooks können die Antwort beobachten, ändern oder blockieren, bevor sie an den MCP-Server zurückgesendet wird.3890Wird ausgeführt, nachdem ein Benutzer auf eine MCP-Elicitation geantwortet hat. Hooks können die Antwort beobachten, ändern oder blockieren, bevor sie an den MCP-Server zurückgesendet wird.
3755 3891
3892Wenn ein [Elicitation](#elicitation)-Hook eine Anfrage beantwortet, sendet Claude Code diese Antwort an den Server, ohne ElicitationResult-Hooks auszuführen.
3893
3756Das Matcher-Feld wird mit dem Namen des MCP-Servers abgeglichen.3894Das Matcher-Feld wird mit dem Namen des MCP-Servers abgeglichen.
3757 3895
3758<h4 id="elicitationresult-input">3896<h4 id="elicitationresult-input">
3759 ElicitationResult-Eingabe3897 ElicitationResult-Eingabe
3760</h4>3898</h4>
3761 3899
3762Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten ElicitationResult-Hooks die Felder `mcp_server_name` und `action` sowie die optionalen Felder `mode`, `elicitation_id` und `content`.3900Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten ElicitationResult-Hooks `mcp_server_name`, `action` sowie die optionalen Felder `mode`, `elicitation_id` und `content`.
3763 3901
3764```json theme={null}3902```json theme={null}
3765{3903{
3770 "mcp_server_name": "my-mcp-server",3908 "mcp_server_name": "my-mcp-server",
3771 "action": "accept",3909 "action": "accept",
3772 "content": { "username": "alice" },3910 "content": { "username": "alice" },
3773 "mode": "form",3911 "mode": "form"
3774 "elicitation_id": "elicit-123"
3775}3912}
3776```3913```
3777 3914
3779 ElicitationResult-Ausgabe3916 ElicitationResult-Ausgabe
3780</h4>3917</h4>
3781 3918
3782Um die Antwort des Benutzers zu überschreiben, geben Sie ein JSON-Objekt mit `hookSpecificOutput` zurück:3919Ein ElicitationResult-Hook kann die Antwort des Benutzers durchlassen, ihre Werte ändern oder sie blockieren. Um die Antwort zu ändern oder zu blockieren, beenden Sie mit 0 und geben ein `hookSpecificOutput`-Objekt mit einer `action` aus. Jede Zeile dieser Tabelle zeigt, was Sie für ein Ergebnis zurückgeben müssen und was der MCP-Server erhält:
3920
3921| Ziel | Rückgabe | Der Server erhält |
3922| :- | :- | :- |
3923| Die Antwort durchlassen | Keine Ausgabe, mit Exit-Code 0 | Die Antwort des Benutzers, unverändert |
3924| Die übermittelten Werte ändern | `"action": "accept"`, mit den neuen Werten in `content` | `accept` mit Ihrem `content` anstelle der Werte des Benutzers |
3925| Die Antwort blockieren | `"action": "decline"` | `decline`, ohne die Werte des Benutzers |
3926| Die Anfrage abbrechen | `"action": "cancel"` | `cancel`, zusammen mit den vom Benutzer übermittelten Werten. Um diese zurückzuhalten, geben Sie `"decline"` zurück |
3927
3928Diese Ausgabe ändert die unter [ElicitationResult-Eingabe](#elicitationresult-input) gezeigte Antwort, sodass der Server `alice@example.com` erhält, wo der Benutzer `alice` übermittelt hat:
3783 3929
3784```json theme={null}3930```json theme={null}
3785{3931{
3786 "hookSpecificOutput": {3932 "hookSpecificOutput": {
3787 "hookEventName": "ElicitationResult",3933 "hookEventName": "ElicitationResult",
3788 "action": "decline",3934 "action": "accept",
3789 "content": {}3935 "content": {
3936 "username": "alice@example.com"
3937 }
3790 }3938 }
3791}3939}
3792```3940```
3793 3941
3794| Feld | Werte | Beschreibung |3942Ihr `content` ersetzt das gesamte `content`-Objekt des Benutzers, schließen Sie also die Felder ein, die Sie nicht ändern. Geben Sie `action` zusammen damit zurück, da Claude Code ein `hookSpecificOutput` ohne `action` ignoriert.
3795| :- | :- | :- |3943
3796| `action` | `accept`, `decline`, `cancel` | Überschreibt die Aktion des Benutzers |3944ElicitationResult-Hooks werden auch ausgeführt, wenn der Benutzer ablehnt oder abbricht, und Ihre `action` ersetzt die des Benutzers. Prüfen Sie, ob die `action` der Eingabe `accept` ist, bevor Sie `accept` zurückgeben, sonst verwandelt Ihr Hook eine abgelehnte Anfrage in eine akzeptierte. Dieses Skript nimmt dieselbe Änderung vor, wenn der Benutzer akzeptiert hat, behält die anderen Felder bei und gibt andernfalls nichts aus:
3797| `content` | object | Überschreibt die Werte der Formularfelder. Nur sinnvoll, wenn `action` den Wert `accept` hat |3945
3946```bash theme={null}
3947#!/bin/bash
3948input=$(cat)
3798 3949
3799Exit-Code 2 blockiert die Antwort und ändert die effektive Aktion in `decline`. Claude Code zeigt Ihre stderr-Meldung nirgends an.3950if [ "$(jq -r '.action' <<<"$input")" = "accept" ]; then
3951 jq '{hookSpecificOutput: {hookEventName: "ElicitationResult", action: "accept", content: (.content + {username: (.content.username + "@example.com")})}}' <<<"$input"
3952fi
3953```
3800 3954
3801Claude Code verarbeitet `hookSpecificOutput` aus der JSON-Ausgabe eines ElicitationResult-Hooks und verwirft `systemMessage` und `continue`.3955Diese Ausgabe blockiert die Antwort:
3956
3957```json theme={null}
3958{
3959 "hookSpecificOutput": {
3960 "hookEventName": "ElicitationResult",
3961 "action": "decline"
3962 }
3963}
3964```
3965
3966Exit-Code 2 und ein `"decision": "block"` auf oberster Ebene blockieren die Antwort ebenfalls. Unter [Andere Möglichkeiten, eine Elicitation abzulehnen](#other-ways-to-decline-an-elicitation) erfahren Sie, welche Variante wirksam wird, wenn ein Hook sie kombiniert, was der Benutzer sieht und welche Versionen `decision` ignoriert haben.
3967
3968Claude Code verwirft `reason`, `systemMessage` und `continue` aus der JSON-Ausgabe eines ElicitationResult-Hooks, unabhängig davon, welche `action` Sie zurückgeben.
3802 3969
3803<h2 id="prompt-based-hooks">3970<h2 id="prompt-based-hooks">
3804 Prompt-basierte Hooks3971 Prompt-basierte Hooks
3862 4029
3863Setzen Sie `type` auf `"prompt"` und geben Sie eine `prompt`-Zeichenkette anstelle eines `command` an. Verwenden Sie den Platzhalter `$ARGUMENTS`, um die Hook-Eingabedaten in Ihren Prompt-Text einzufügen.4030Setzen Sie `type` auf `"prompt"` und geben Sie eine `prompt`-Zeichenkette anstelle eines `command` an. Verwenden Sie den Platzhalter `$ARGUMENTS`, um die Hook-Eingabedaten in Ihren Prompt-Text einzufügen.
3864 4031
4032In einem Prompt- oder [Agent-Hook](#agent-based-hooks) können Sie den `prompt` als Regel formulieren, was blockiert oder zugelassen werden soll, etwa „Blockiere jeden Bash-Befehl, der `.env`-Dateien liest“, oder als Bedingung, die erfüllt sein muss, etwa „Alle Unit-Tests bestehen“.
4033
3865Dieser `Stop`-Hook fragt das LLM, ob Claude stoppen sollte, bevor Claude beendet wird:4034Dieser `Stop`-Hook fragt das LLM, ob Claude stoppen sollte, bevor Claude beendet wird:
3866 4035
3867```json theme={null}4036```json theme={null}