827 827
828Der Exit-Code Ihres Hooks teilt Claude Code mit, ob die Aktion, die den Hook ausgelöst hat, etwa ein Tool-Aufruf oder ein Prompt, fortgesetzt werden soll. Ein abgeschlossener Lauf hat eines von drei Ergebnissen:828Der Exit-Code Ihres Hooks teilt Claude Code mit, ob die Aktion, die den Hook ausgelöst hat, etwa ein Tool-Aufruf oder ein Prompt, fortgesetzt werden soll. Ein abgeschlossener Lauf hat eines von drei Ergebnissen:
829 829
830* **Erfolg**: Ihr Hook wird mit 0 beendet. Claude Code wendet alle [JSON-Ausgabe](#json-output)-Felder an, die Ihr Hook ausgegeben hat, und die Aktion wird fortgesetzt, sofern diese Felder sie nicht blockieren oder verweigern.830* **Erfolg**: Ihr Hook wird mit 0 beendet. Claude Code wendet alle [JSON-Ausgabe](#json-output)-Felder an, die Ihr Hook ausgegeben hat, und die Aktion wird fortgesetzt, sofern diese Felder sie nicht blockieren oder verweigern. [Hooks, die einen Hintergrundprozess starten](#hooks-that-start-a-background-process) behandelt die Ausnahme.
831* **Blockierender Fehler**: Ihr Hook wird mit 2 beendet. Bei [Events, die blockieren können](#exit-code-2-behavior-per-event), stoppt Claude Code die Aktion.831* **Blockierender Fehler**: Ihr Hook wird mit 2 beendet. Bei [Events, die blockieren können](#exit-code-2-behavior-per-event), stoppt Claude Code die Aktion.
832* **Nicht blockierender Fehler**: Ihr Hook wird mit einem anderen Code beendet oder schlägt auf andere Weise fehl, etwa weil er nicht startet oder ungültiges JSON ausgibt. Die Aktion wird fortgesetzt, und bei Events wie `PreToolUse` sehen Sie einen `<hook name> hook error`-Hinweis im Transkript. Wenn ein fehlgeschlagener Hook die Aktion blockieren soll, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails).832* **Nicht blockierender Fehler**: Ihr Hook wird mit einem anderen Code beendet oder schlägt auf andere Weise fehl, etwa weil er nicht startet oder ungültiges JSON ausgibt. Die Aktion wird fortgesetzt, und bei Events wie `PreToolUse` sehen Sie einen `<hook name> hook error`-Hinweis im Transkript. Wenn ein fehlgeschlagener Hook die Aktion blockieren soll, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails).
833 833
932* Ein abgelaufener `command`-, `http`- oder `mcp_tool`-Hook blockiert den Tool-Aufruf nicht. Der Aufruf wird durch den normalen [Berechtigungsfluss](/docs/de/permissions) fortgesetzt, verlassen Sie sich also nicht auf einen steckengebliebenen Hook, um als Gate zu fungieren. Um den Aufruf zu blockieren, wenn ein `command`- oder `http`-Hook in ein Timeout läuft, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails).932* Ein abgelaufener `command`-, `http`- oder `mcp_tool`-Hook blockiert den Tool-Aufruf nicht. Der Aufruf wird durch den normalen [Berechtigungsfluss](/docs/de/permissions) fortgesetzt, verlassen Sie sich also nicht auf einen steckengebliebenen Hook, um als Gate zu fungieren. Um den Aufruf zu blockieren, wenn ein `command`- oder `http`-Hook in ein Timeout läuft, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails).
933* Ein [Agent SDK Callback Hook](/docs/de/agent-sdk/hooks), der sein Timeout überschreitet, [blockiert den Tool-Aufruf](#pretooluse).933* Ein [Agent SDK Callback Hook](/docs/de/agent-sdk/hooks), der sein Timeout überschreitet, [blockiert den Tool-Aufruf](#pretooluse).
934 934
935<h4 id="hooks-that-start-a-background-process">
936 Hooks, die einen Hintergrundprozess starten
937</h4>
938
939Wenn Ihr Command Hook seine Entscheidung in einem Hintergrundprozess trifft und sich dann beendet, blockiert eine Verweigerung, die dieser Prozess ausgibt, nachdem Claude Code das Lesen beendet hat, den Tool-Aufruf nicht. Bei einem Hook, der nicht [async](#run-hooks-in-the-background) ist, beendet Claude Code das Lesen der Hook-Ausgabe kurz nachdem der eigene Prozess des Hooks beendet wurde.
940
941Geben Sie die Entscheidung aus, bevor Sie einen Hintergrundprozess starten, und leiten Sie stdout und stderr dieses Prozesses um. Wenn Ihr Skript eine Erlaubnis ausgibt und dann einen Hintergrundprozess startet, ohne dessen stdout und stderr umzuleiten, blockiert Claude Code den Tool-Aufruf. Der Hook-Fehler enthält `refusing to honor the suspect capture`.
942
943Dieses `PreToolUse`-Hook-Skript gibt die Entscheidung mit `policy-check.sh` aus und lädt dann Metriken im Hintergrund hoch:
944
945```bash theme={null}
946#!/bin/bash
947"$CLAUDE_PROJECT_DIR"/.claude/hooks/policy-check.sh || exit $?
948"$CLAUDE_PROJECT_DIR"/.claude/hooks/upload-metrics.sh >/dev/null 2>&1 &
949```
950
951Der Rest des Skripts bewirkt Folgendes:
952
953* **`|| exit $?`**: macht den Exit-Code der Prüfung zum eigenen Exit-Code des Hooks, sodass eine Prüfung, die zum Verweigern mit 2 beendet wird, trotzdem blockiert. Andernfalls wird der Hook mit dem Code der letzten Zeile beendet, also 0.
954* **`>/dev/null 2>&1 &`**: führt `upload-metrics.sh` im Hintergrund mit umgeleiteter Ausgabe aus, sodass es die Ausgabe des Hooks nicht offen hält.
955
956Um das Skript zu testen, lassen Sie `policy-check.sh` mit 2 beenden und lösen Sie dann einen Tool-Aufruf aus, auf den der Hook zutrifft. Der Tool-Aufruf wird blockiert.
957
935<h4 id="block-the-action-when-a-hook-fails">958<h4 id="block-the-action-when-a-hook-fails">
936 Die Aktion blockieren, wenn ein Hook fehlschlägt959 Die Aktion blockieren, wenn ein Hook fehlschlägt
937</h4>960</h4>
1242Für erweiterte Beispiele einschließlich Bash-Befehlsvalidierung, Prompt-Filterung und Auto-Approval-Skripte, siehe [Was Sie automatisieren können](/docs/de/hooks-guide#what-you-can-automate) im Leitfaden und die [Bash-Befehlsvalidierungs-Referenzimplementierung](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py).1265Für erweiterte Beispiele einschließlich Bash-Befehlsvalidierung, Prompt-Filterung und Auto-Approval-Skripte, siehe [Was Sie automatisieren können](/docs/de/hooks-guide#what-you-can-automate) im Leitfaden und die [Bash-Befehlsvalidierungs-Referenzimplementierung](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py).
1243 1266
1244<h2 id="hook-events">1267<h2 id="hook-events">
1245 Hook-Ereignisse1268 Hook-Events
1246</h2>1269</h2>
1247 1270
1248Jedes 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.1271Jedes Event entspricht einem Punkt im Lebenszyklus von Claude Code, an dem Hooks ausgeführt werden können. Die folgenden Abschnitte sind nach diesem Lebenszyklus geordnet: von der Einrichtung der Sitzung über die Agentenschleife bis zum Ende der Sitzung. Jeder Abschnitt beschreibt, wann das Event ausgelöst wird, welche Matcher es unterstützt, welche JSON-Eingabe es erhält und wie Sie das Verhalten über die Ausgabe steuern.
1249 1272
1250<h3 id="sessionstart">1273<h3 id="sessionstart">
1251 SessionStart1274 SessionStart
1252</h3>1275</h3>
1253 1276
1254Wird 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).1277Wird ausgeführt, wenn Claude Code eine neue Sitzung startet oder eine bestehende Sitzung fortsetzt. Nützlich, um Entwicklungskontext wie bestehende Issues oder aktuelle Ä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).
1255 1278
1256SessionStart 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.1279SessionStart 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.
1257 1280
1258Der Matcher-Wert entspricht der Art, wie die Sitzung eingeleitet wurde:1281Der Matcher-Wert entspricht der Art, wie die Sitzung gestartet wurde:
1259 1282
1260| Matcher | Wann er ausgelöst wird |1283| Matcher | Wann er ausgelöst wird |
1261| :- | :- |1284| :- | :- |
1267 1290
1268Vor v2.1.214 meldeten abgezweigte Sitzungen die Quelle `"resume"`.1291Vor v2.1.214 meldeten abgezweigte Sitzungen die Quelle `"resume"`.
1269 1292
1270Wenn 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.1293Wenn 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. Die erste Antwort von Claude wartet dennoch, bis die Hooks fertig sind, damit ihr Kontext Claude erreicht.
1271 1294
1272Wenn 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.1295Wenn Sie innerhalb einer Sitzung mit `/resume` die Konversation wechseln, wartet der Wechsel stattdessen, bis die Hooks fertig 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.
1273 1296
1274Dasselbe 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.1297Dasselbe Warten gilt beim Start, auch bei einer fortgesetzten Sitzung: Ein Prompt, den Sie senden, während SessionStart-Hooks noch laufen, erreicht Claude erst, wenn diese fertig sind.
1275 1298
1276Drü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.1299Während beider Wartezeiten können Sie `Esc` drücken, um den Prompt zurück in die Eingabe zu holen, ohne ihn zu senden. Die Hooks laufen weiter.
1277 1300
1278<h4 id="sessionstart-input">1301<h4 id="sessionstart-input">
1279 SessionStart-Eingabe1302 SessionStart-Eingabe
1286| `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 |1309| `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 |
1287| `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 |1310| `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 |
1288| `agent_type` | Der Agentenname, vorhanden, wenn Sie Claude Code mit `claude --agent <name>` starten |1311| `agent_type` | Der Agentenname, vorhanden, wenn Sie Claude Code mit `claude --agent <name>` starten |
1289| `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 |1312| `session_title` | Der benutzerdefinierte Titel der Sitzung, vorhanden, wenn einer gesetzt ist, zum Beispiel mit `--name`, `/rename`, der `sessionTitle`-Ausgabe eines Hooks oder `renameSession()` aus dem Agent SDK. Ein Hook, der `sessionTitle` ausgibt, kann zuerst dieses Feld prüfen, um einen bestehenden benutzerdefinierten Titel nicht zu überschreiben |
1290 1313
1291Eine 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`.1314Eine 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`.
1292 1315
1293Wenn `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.1316Wenn `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 veralteten Konversation kostet, zum Beispiel in einer [`systemMessage`](#json-output). Diese Felder erfordern Claude Code v2.1.251 oder höher.
1294 1317
1295| Feld | Beschreibung |1318| Feld | Beschreibung |
1296| :- | :- |1319| :- | :- |
1297| `seconds_since_last_response` | Verstrichene Echtzeit in Sekunden seit der letzten Antwort im fortgesetzten Transkript |1320| `seconds_since_last_response` | Echtzeit in Sekunden seit der letzten Antwort im fortgesetzten Transkript |
1298| `context_tokens` | Token, die die erste Anfrage der fortgesetzten Sitzung erneut als Prompt sendet |1321| `context_tokens` | Token, die die erste Anfrage der fortgesetzten Sitzung erneut als Prompt sendet |
1299| `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 |1322| `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 |
1300| `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 |1323| `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 |
1301 1324
1302Dieses Beispiel zeigt die Eingabe für eine Sitzung, die 90 Minuten nach ihrer letzten Antwort fortgesetzt wurde:1325Dieses Beispiel zeigt die Eingabe für eine Sitzung, die 90 Minuten nach ihrer letzten Antwort fortgesetzt wurde:
1320 SessionStart-Entscheidungssteuerung1343 SessionStart-Entscheidungssteuerung
1321</h4>1344</h4>
1322 1345
1323Ein SessionStart-Hook kann Kontext für Claude hinzufügen, die erste Benutzernachricht liefern, den Sitzungstitel setzen, Dateien überwachen und Skills neu laden. Geben Sie dafür jeweils das entsprechende Feld zurück, zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen:1346Ein SessionStart-Hook kann Kontext für Claude hinzufügen, die erste Benutzernachricht liefern, den Sitzungstitel setzen, Dateien überwachen und Skills neu laden. Geben Sie dazu jeweils das entsprechende Feld zurück, zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen:
1324 1347
1325| Feld | Beschreibung |1348| Feld | Beschreibung |
1326| :- | :- |1349| :- | :- |
1327| `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 |1350| `additionalContext` | String, der zu Beginn der Konversation vor dem ersten Prompt zum 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 Sie hineinschreiben sollten |
1328| `initialUserMessage` | Zeichenkette, die im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p` als erste Benutzernachricht der Sitzung verwendet wird. Sie wird zum ersten Turn, auch wenn Sie keinen Prompt übergeben. Ein Prompt, den Sie übergeben, folgt als nächster Turn |1351| `initialUserMessage` | String, der im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p` als erste Benutzernachricht der Sitzung verwendet wird. Er wird zum ersten Turn, auch wenn Sie keinen Prompt übergeben. Ein Prompt, den Sie übergeben, folgt als nächster Turn |
1329| `sessionTitle` | Setzt den Sitzungstitel, mit derselben Wirkung wie `/rename`. Gilt, wenn `source` den Wert `"startup"`, `"resume"` oder `"fork"` hat |1352| `sessionTitle` | Setzt den Sitzungstitel, mit derselben Wirkung wie `/rename`. Gilt, wenn `source` den Wert `"startup"`, `"resume"` oder `"fork"` hat |
1330| `watchPaths` | Array absoluter Pfade, die während dieser Sitzung auf [FileChanged](#filechanged)-Ereignisse überwacht werden sollen |1353| `watchPaths` | Array absoluter Pfade, die während dieser Sitzung auf [FileChanged](#filechanged)-Events überwacht werden |
1331| `reloadSkills` | Boolescher Wert. Bei `true` durchsucht Claude Code die [Skill](/docs/de/skills)- und Befehlsverzeichnisse erneut, nachdem die SessionStart-Hooks abgeschlossen sind. Siehe [Skills neu laden, die ein Hook installiert](#reload-skills-that-a-hook-installs) |1354| `reloadSkills` | Boolean. Bei `true` durchsucht Claude Code die [Skill](/docs/de/skills)- und Befehlsverzeichnisse erneut, nachdem die SessionStart-Hooks abgeschlossen sind. Siehe [Skills neu laden, die ein Hook installiert](#reload-skills-that-a-hook-installs) |
1332 1355
1333Diese Ausgabe fügt Kontext hinzu und benennt die Sitzung:1356Diese Ausgabe fügt Kontext hinzu und benennt die Sitzung:
1334 1357
1344 1367
1345Ein Hook, der nur Kontext hinzufügt, kann diesen ausgeben, ohne JSON zu erstellen, da Claude Code die [Klartext-Ausgabe auf stdout](#exit-code-0) eines SessionStart-Hooks zum Kontext von Claude hinzufügt.1368Ein Hook, der nur Kontext hinzufügt, kann diesen ausgeben, ohne JSON zu erstellen, da Claude Code die [Klartext-Ausgabe auf stdout](#exit-code-0) eines SessionStart-Hooks zum Kontext von Claude hinzufügt.
1346 1369
1347Wenn der SessionStart-Hook Ihres Plugins `initialUserMessage` oder `sessionTitle` liefert, installieren Sie das Plugin, bevor die Sitzung startet. Claude Code ignoriert beide Felder von einem Plugin, dessen Installation erst abgeschlossen wird, nachdem die SessionStart-Hooks ausgeführt wurden.1370Wenn der SessionStart-Hook Ihres Plugins `initialUserMessage` oder `sessionTitle` liefert, installieren Sie das Plugin, bevor die Sitzung startet. Claude Code ignoriert beide Felder von einem Plugin, dessen Installation erst abgeschlossen wird, nachdem die SessionStart-Hooks gelaufen sind.
1348 1371
1349<h4 id="reload-skills-that-a-hook-installs">1372<h4 id="reload-skills-that-a-hook-installs">
1350 Skills neu laden, die ein Hook installiert1373 Skills neu laden, die ein Hook installiert
1351</h4>1374</h4>
1352 1375
1353Damit Skills, die ein SessionStart-Hook installiert, in derselben Sitzung verfügbar sind, geben Sie `reloadSkills` zurück. Die Skill-Erkennung läuft normalerweise, bevor SessionStart-Hooks abgeschlossen sind; ohne dieses Feld können Dateien, die ein Hook in `~/.claude/skills/` oder `.claude/skills/` schreibt, beim ersten Prompt fehlen.1376Damit Skills, die ein SessionStart-Hook installiert, in derselben Sitzung verfügbar sind, geben Sie `reloadSkills` zurück. Die Skill-Erkennung läuft normalerweise, bevor die SessionStart-Hooks fertig sind. Ohne dieses Feld können daher Dateien, die ein Hook in `~/.claude/skills/` oder `.claude/skills/` schreibt, fehlen, wenn der erste Prompt ausgeführt wird.
1354 1377
1355Dieses Beispiel synchronisiert ein gemeinsames Skills-Repository und fordert das erneute Durchsuchen an:1378Dieses Beispiel synchronisiert ein gemeinsames Skills-Repository und fordert die erneute Durchsuchung an:
1356 1379
1357```bash theme={null}1380```bash theme={null}
1358#!/bin/bash1381#!/bin/bash
1366Die Repository-URL ist ein Platzhalter. Ersetzen Sie sie durch Ihr eigenes Skills-Repository.1389Die Repository-URL ist ein Platzhalter. Ersetzen Sie sie durch Ihr eigenes Skills-Repository.
1367 1390
1368<h4 id="persist-environment-variables">1391<h4 id="persist-environment-variables">
1369 Umgebungsvariablen beibehalten1392 Umgebungsvariablen dauerhaft setzen
1370</h4>1393</h4>
1371 1394
1372SessionStart-Hooks haben Zugriff auf die Umgebungsvariable `CLAUDE_ENV_FILE`, die einen Dateipfad bereitstellt, in dem Sie Umgebungsvariablen für die Shell-Befehle speichern können, die Claude später in der Sitzung ausführt.1395SessionStart-Hooks haben Zugriff auf die Umgebungsvariable `CLAUDE_ENV_FILE`, die einen Dateipfad bereitstellt, in dem Sie Umgebungsvariablen für die Shell-Befehle dauerhaft speichern können, die Claude später in der Sitzung ausführt.
1373 1396
1374Um einzelne Umgebungsvariablen zu setzen, schreiben Sie `export`-Anweisungen in `CLAUDE_ENV_FILE`. Verwenden Sie Anhängen (`>>`), um von anderen Hooks gesetzte Variablen zu erhalten:1397Um einzelne Umgebungsvariablen zu setzen, schreiben Sie `export`-Anweisungen in `CLAUDE_ENV_FILE`. Verwenden Sie Anhängen (`>>`), um Variablen zu erhalten, die von anderen Hooks gesetzt wurden:
1375 1398
1376```bash theme={null}1399```bash theme={null}
1377#!/bin/bash1400#!/bin/bash
1404exit 01427exit 0
1405```1428```
1406 1429
1407Jeder Bash-Befehl führt den Inhalt der Datei als Shell-Code vor dem eigentlichen Befehl aus. Eine Zeile darin kann daher alles verwenden, was Bash auswertet, etwa die Referenz `$PATH` in `export PATH="$PATH:./node_modules/.bin"`.1430Jeder Bash-Befehl führt den Inhalt der Datei vor dem eigentlichen Befehl als Shell-Code aus. Eine Zeile darin kann daher alles verwenden, was Bash auswertet, etwa den `$PATH`-Verweis in `export PATH="$PATH:./node_modules/.bin"`.
1408 1431
1409<a id="persisted-variables-in-powershell-commands" />1432<a id="persisted-variables-in-powershell-commands" />
1410 1433
1411<h5 id="persisted-variables-in-powershell-commands">1434<h5 id="persisted-variables-in-powershell-commands">
1412 Gespeicherte Variablen in PowerShell-Befehlen1435 Dauerhaft gesetzte Variablen in PowerShell-Befehlen
1413</h5>1436</h5>
1414 1437
1415[PowerShell](/docs/de/tools-reference#powershell-tool)-Befehle erhalten die Variablen aus `CLAUDE_ENV_FILE` in Claude Code v2.1.296 oder höher ebenfalls, PowerShell führt die Datei jedoch nie aus. Stattdessen liest Claude Code die Zuweisungen aus der Datei und kopiert sie in die Umgebung des PowerShell-Befehls. Dies geschieht nur, wenn jede Zeile einer der folgenden Arten entspricht, und zwar über alles hinweg, was jeder Hook in dieser Sitzung geschrieben hat, sowie in jedem Skript, auf das Sie [`CLAUDE_ENV_FILE` gesetzt haben](/docs/de/env-vars), bevor Sie Claude Code gestartet haben:1438[PowerShell](/docs/de/tools-reference#powershell-tool)-Befehle erhalten die Variablen aus `CLAUDE_ENV_FILE` ebenfalls, in Claude Code v2.1.296 oder höher, aber PowerShell führt die Datei nie aus. Stattdessen liest Claude Code die Zuweisungen aus der Datei aus und kopiert sie in die Umgebung des PowerShell-Befehls. Das geschieht nur, wenn jede Zeile einer der folgenden Arten entspricht, und zwar über alles hinweg, was jeder Hook in dieser Sitzung geschrieben hat, sowie über jedes Skript, auf das Sie [`CLAUDE_ENV_FILE` vor dem Start gesetzt haben](/docs/de/env-vars):
1416 1439
1417* Eine Leerzeile oder ein `#`-Kommentar1440* Eine Leerzeile oder ein `#`-Kommentar
1418* Eine Zuweisung am Zeilenanfang, geschrieben als `export NAME=value`, `declare -x NAME=value` oder `NAME=value`, mit einem Wert, den Bash genau so verwenden würde, wie er geschrieben ist, und der aus einer beliebigen Kombination dieser Teile besteht: Text ohne Anführungszeichen, der nur Buchstaben, Ziffern und die Zeichen `_ @ % + = : , . / -` enthält, Text in einfachen Anführungszeichen und Text in doppelten Anführungszeichen, in dem jedes `$`, jeder Backtick und jedes `"` mit einem Backslash maskiert ist1441* Eine einzelne Zuweisung am Zeilenanfang, geschrieben als `export NAME=value`, `declare -x NAME=value` oder `NAME=value`, mit einem Wert, den Bash exakt so verwenden würde, wie er geschrieben ist, bestehend aus einer beliebigen Kombination dieser Bestandteile: Text ohne Anführungszeichen, der nur Buchstaben, Ziffern und die Zeichen `_ @ % + = : , . / -` verwendet, Text in einfachen Anführungszeichen und Text in doppelten Anführungszeichen, in dem jedes `$`, jeder Backtick und jedes `"` mit einem Backslash maskiert ist
1419 1442
1420Wenn eine Zeile einer anderen Art entspricht, etwa `export PATH="$PATH:./node_modules/.bin"` mit seinem nicht maskierten `$PATH`, ein `source`-Befehl oder die `$'...'`-Zeichenketten, die `direnv export bash` ausgibt, erhalten PowerShell-Befehle keine der Variablen, und `claude --debug` protokolliert `Session environment is not all plain assignments`. Bash-Befehle erhalten trotzdem alle Variablen. Unter Windows erhalten PowerShell-Befehle außerdem keine Variable, deren Wert `/` oder `\` enthält, da Git Bash und Windows Pfade unterschiedlich schreiben. Ein PowerShell-Befehl, der [in einer Sandbox](/docs/de/sandboxing) ausgeführt wird, erhält keine der Variablen.1443Wenn irgendeine Zeile von anderer Art ist, etwa `export PATH="$PATH:./node_modules/.bin"` mit seinem nicht maskierten `$PATH`, ein `source`-Befehl oder die `$'...'`-Strings, die `direnv export bash` ausgibt, erhalten PowerShell-Befehle keine der Variablen, und `claude --debug` protokolliert `Session environment is not all plain assignments`. Bash-Befehle erhalten weiterhin alle Variablen. Unter Windows erhalten PowerShell-Befehle außerdem keine Variable, deren Wert `/` oder `\` enthält, weil Git Bash und Windows Pfade unterschiedlich schreiben. Ein PowerShell-Befehl, der [in einer Sandbox](/docs/de/sandboxing) ausgeführt wird, erhält keine der Variablen.
1421 1444
1422<Note>1445<Note>
1423 `CLAUDE_ENV_FILE` ist für SessionStart-, [Setup](#setup)-, [CwdChanged](#cwdchanged)- und [FileChanged](#filechanged)-Hooks verfügbar. Andere Hook-Events haben keinen Zugriff auf diese Variable, ebenso wenig ein Hook, der in PowerShell läuft, ob über [`"shell": "powershell"`](#command-hook-fields) oder standardmäßig unter Windows ohne Git Bash.1446 `CLAUDE_ENV_FILE` ist für SessionStart-, [Setup](#setup)-, [CwdChanged](#cwdchanged)- und [FileChanged](#filechanged)-Hooks verfügbar. Andere Hook-Events haben keinen Zugriff auf diese Variable, ebenso wenig ein Hook, der in PowerShell läuft, sei es über [`"shell": "powershell"`](#command-hook-fields) oder standardmäßig unter Windows ohne Git Bash.
1424</Note>1447</Note>
1425 1448
1426<h3 id="setup">1449<h3 id="setup">
1427 Setup1450 Setup
1428</h3>1451</h3>
1429 1452
1430Wird 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).1453Wird nur ausgelöst, wenn Sie Claude Code mit `--init-only` starten oder mit `--init` oder `--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 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).
1431 1454
1432Der Matcher-Wert entspricht dem CLI-Flag, das den Hook ausgelöst hat:1455Der Matcher-Wert entspricht dem CLI-Flag, das den Hook ausgelöst hat:
1433 1456
1438 1461
1439Wenn 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.1462Wenn 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.
1440 1463
1441Wenn 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.1464Wenn Sie mit `-p` eine Konversation starten oder fortsetzen, müssen Sie auch 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.
1442 1465
1443Bei 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.1466Bei Erfolg gibt `--init-only` nichts im Terminal aus. Um zu bestätigen, dass die Hooks gelaufen sind, 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.
1444 1467
1445Da 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.1468Da 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 bei Fehlen `npm install` ausführt. Unter [persistentes Datenverzeichnis](/docs/de/plugins/components#path-variables-and-persistent-data) erfahren Sie, wo Sie installierte Abhängigkeiten speichern. Wenn Sie Ihr Plugin über einen Marketplace verteilen, benötigen Sie dieses Muster möglicherweise nicht: Claude Code [installiert berechtigte Node.js-Paketabhängigkeiten automatisch](/docs/de/plugins/loading#node-js-package-dependencies), wenn es das Plugin zwischenspeichert.
1446 1469
1447<h4 id="setup-input">1470<h4 id="setup-input">
1448 Setup-Eingabe1471 Setup-Eingabe
1464 Setup-Entscheidungssteuerung1487 Setup-Entscheidungssteuerung
1465</h4>1488</h4>
1466 1489
1467Setup-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.1490Setup-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`-Events](/docs/de/headless#read-session-metadata), wenn Sie mit `--output-format stream-json --verbose` starten.
1468 1491
1469Setup-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.1492Setup-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). Nur Hooks vom Typ `type: "command"` werden bei `Setup` 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.
1470 1493
1471<h3 id="instructionsloaded">1494<h3 id="instructionsloaded">
1472 InstructionsLoaded1495 InstructionsLoaded
1473</h3>1496</h3>
1474 1497
1475Wird 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.1498Wird ausgelöst, wenn eine `CLAUDE.md`- oder `.claude/rules/*.md`-Datei in den Kontext geladen wird. Dieses Event 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.
1476 1499
1477Dieses 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`.1500Dieses Event wird nicht ausgelöst, wenn Claude [`AGENTS.md` direkt liest](/docs/de/memory#agents-md), über die Einstellung **Project instructions**. Es wird ausgelöst, wenn eine `CLAUDE.md` Ihre `AGENTS.md` importiert, mit `load_reason` auf `include` gesetzt wie bei jeder anderen importierten Datei, und wenn `CLAUDE.md` ein Symlink darauf ist, als normaler Ladevorgang von `CLAUDE.md`.
1478 1501
1479Der 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.1502Der Matcher wird gegen `load_reason` ausgewertet. Verwenden Sie zum Beispiel `"matcher": "session_start"`, um nur für Dateien auszulösen, die beim Sitzungsstart geladen werden, oder `"matcher": "path_glob_match|nested_traversal"`, um nur bei verzögertem Laden auszulösen.
1480 1503
1481<h4 id="instructionsloaded-input">1504<h4 id="instructionsloaded-input">
1482 InstructionsLoaded-Eingabe1505 InstructionsLoaded-Eingabe
1488| :- | :- |1511| :- | :- |
1489| `file_path` | Absoluter Pfad zur geladenen Anweisungsdatei |1512| `file_path` | Absoluter Pfad zur geladenen Anweisungsdatei |
1490| `memory_type` | Geltungsbereich der Datei: `"User"`, `"Project"`, `"Local"` oder `"Managed"` |1513| `memory_type` | Geltungsbereich der Datei: `"User"`, `"Project"`, `"Local"` oder `"Managed"` |
1491| `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 |1514| `load_reason` | Warum die Datei geladen wurde: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` oder `"compact"`. Der Wert `"compact"` wird ausgelöst, wenn Anweisungsdateien nach einer Komprimierung erneut geladen werden |
1492| `globs` | Pfad-Glob-Muster aus dem `paths:`-Frontmatter der Datei, falls vorhanden. Nur bei `path_glob_match`-Ladevorgängen vorhanden |1515| `globs` | Pfad-Glob-Muster aus dem `paths:`-Frontmatter der Datei, falls vorhanden. Nur bei `path_glob_match`-Ladevorgängen vorhanden |
1493| `trigger_file_path` | Pfad zu der Datei, deren Zugriff diesen Ladevorgang ausgelöst hat, bei verzögertem Laden |1516| `trigger_file_path` | Pfad zu der Datei, deren Zugriff diesen Ladevorgang ausgelöst hat, bei verzögertem Laden |
1494| `parent_file_path` | Pfad zur übergeordneten Anweisungsdatei, die diese eingebunden hat, bei `include`-Ladevorgängen |1517| `parent_file_path` | Pfad zur übergeordneten Anweisungsdatei, die diese eingebunden hat, bei `include`-Ladevorgängen |
1509 InstructionsLoaded-Entscheidungssteuerung1532 InstructionsLoaded-Entscheidungssteuerung
1510</h4>1533</h4>
1511 1534
1512InstructionsLoaded-Hooks haben keine Entscheidungssteuerung. Sie können das Laden von Anweisungen weder blockieren noch verändern. Claude Code verwirft ihre [JSON-Ausgabefelder](#json-output), etwa `systemMessage` und `continue`. Verwenden Sie dieses Ereignis für Audit-Logging, Compliance-Nachverfolgung oder Beobachtbarkeit.1535InstructionsLoaded-Hooks haben keine Entscheidungssteuerung. Sie können das Laden von Anweisungen weder blockieren noch ändern. Claude Code verwirft ihre [JSON-Ausgabefelder](#json-output), etwa `systemMessage` und `continue`. Verwenden Sie dieses Event für Audit-Logs, Compliance-Nachverfolgung oder Beobachtbarkeit.
1513 1536
1514<h3 id="userpromptsubmit">1537<h3 id="userpromptsubmit">
1515 UserPromptSubmit1538 UserPromptSubmit
1516</h3>1539</h3>
1517 1540
1518Wird ausgeführt, wenn ein Prompt übermittelt wird, bevor Claude ihn verarbeitet. So können Sie1541Wird ausgeführt, wenn ein Prompt abgesendet wird, bevor Claude ihn verarbeitet. Damit können Sie
1519zusätzlichen Kontext basierend auf dem Prompt bzw. der Konversation hinzufügen, Prompts validieren oder1542basierend auf dem Prompt bzw. der Konversation zusätzlichen Kontext hinzufügen, Prompts validieren oder
1520bestimmte Arten von Prompts blockieren.1543bestimmte Arten von Prompts blockieren.
1521 1544
1522`UserPromptSubmit`-Hooks werden nicht nur bei Prompts ausgelöst, die Sie eingeben. Claude Code führt sie auch in folgenden Fällen aus:1545`UserPromptSubmit`-Hooks werden nicht nur bei Prompts ausgelöst, die Sie eingeben. Claude Code führt sie auch aus, wenn:
1523 1546
1524* Eine [geplante Aufgabe](/docs/de/scheduled-tasks) wird ausgelöst, einschließlich einer `/loop`-Iteration1547* eine [geplante Aufgabe](/docs/de/scheduled-tasks) ausgelöst wird, einschließlich einer `/loop`-Iteration
1525* Ein [Hintergrund-Subagent](/docs/de/sub-agents#run-subagents-in-foreground-or-background) meldet sich bei der Sitzung zurück, die ihn gestartet hat1548* ein [Subagent im Hintergrund](/docs/de/sub-agents#run-subagents-in-foreground-or-background) an die Sitzung zurückmeldet, die ihn gestartet hat
1526* Eine [Nachricht, die eine andere Sitzung](/docs/de/cross-session-messaging) an Ihre Hauptkonversation sendet1549* eine [andere Sitzung eine Nachricht](/docs/de/cross-session-messaging) an Ihre Hauptkonversation sendet
1527 1550
1528`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.1551`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 Events. Da dieser Hook vor jedem Prompt läuft und die Modellverarbeitung blockiert, bis er abgeschlossen ist, bringt ein hängender Hook die Sitzung zum Stillstand. Wenn Ihr Hook mehr Zeit benötigt, setzen Sie das Feld `timeout` im Hook-Eintrag.
1529 1552
1530Abgesehen von einem Befehls-Hook, den Sie mit [`async: true`](#run-hooks-in-the-background) ausführen, wird ein `UserPromptSubmit`-Befehls-, HTTP- oder MCP-Tool-Hook, der seinen Timeout erreicht, abgebrochen, und seine Ausgabe, einschließlich `additionalContext`, wird verworfen. Der Prompt erreicht Claude trotzdem, nur ohne diesen Kontext. Um den Prompt stattdessen zu blockieren, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails) für einen Befehls- oder HTTP-Hook. Das Transkript zeigt einen Hinweis, der den Hook, den ausgelösten Timeout und das Verwerfen der Ausgabe nennt.1553Abgesehen 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, ohne diesen Kontext. Um den Prompt stattdessen zu blockieren, setzen Sie [`onFailure: "block"`](#block-the-action-when-a-hook-fails) bei einem Befehls- oder HTTP-Hook. Das Transkript zeigt einen Hinweis, der den Hook und den ausgelösten Timeout nennt und angibt, dass die Ausgabe verworfen wurde.
1531 1554
1532Ein [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.1555Ein [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 Richtlinienprüfung dienen kann, die bei einem Fehler nicht einfach durchlassen darf. Die Sitzung wird fortgesetzt. Vor v2.1.208 beendete ein Callback-Timeout bei diesem Event den Turn mit einem Ausführungsfehler.
1533 1556
1534<h4 id="userpromptsubmit-input">1557<h4 id="userpromptsubmit-input">
1535 UserPromptSubmit-Eingabe1558 UserPromptSubmit-Eingabe
1536</h4>1559</h4>
1537 1560
1538Zusä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.1561Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten UserPromptSubmit-Hooks das Feld `prompt` mit dem abgesendeten 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.
1539 1562
1540UserPromptSubmit-Hooks erhalten außerdem `session_title`, wenn die Sitzung einen benutzerdefinierten Titel hat, mit derselben Bedeutung wie das [SessionStart-Feld `session_title`](#sessionstart-input).1563UserPromptSubmit-Hooks erhalten außerdem `session_title`, wenn die Sitzung einen benutzerdefinierten Titel hat, mit derselben Bedeutung wie das [SessionStart-Feld `session_title`](#sessionstart-input).
1541 1564
1554 UserPromptSubmit-Entscheidungssteuerung1577 UserPromptSubmit-Entscheidungssteuerung
1555</h4>1578</h4>
1556 1579
1557`UserPromptSubmit`-Hooks können steuern, ob ein übermittelter Prompt verarbeitet wird, und Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.1580`UserPromptSubmit`-Hooks können steuern, ob ein abgesendeter Prompt verarbeitet wird, und Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.
1558 1581
1559Es gibt zwei Möglichkeiten, bei Exit-Code 0 Kontext zur Konversation hinzuzufügen:1582Es gibt zwei Möglichkeiten, bei Exit-Code 0 Kontext zur Konversation hinzuzufügen:
1560 1583
1561* **Reiner Text auf stdout**: Claude Code fügt stdout, das es [als reinen Text behandelt](#exit-code-0), dem Kontext von Claude hinzu1584* **Klartext auf stdout**: Claude Code fügt stdout, das es [als Klartext behandelt](#exit-code-0), zum Kontext von Claude hinzu
1562* **JSON mit `additionalContext`**: Verwenden Sie das folgende JSON-Format für mehr Kontrolle. Das Feld `additionalContext` wird als Kontext hinzugefügt1585* **JSON mit `additionalContext`**: Verwenden Sie das unten stehende JSON-Format für mehr Kontrolle. Das Feld `additionalContext` wird als Kontext hinzugefügt
1563 1586
1564Keiner 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).1587Keiner 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).
1565 1588
1566Um einen Prompt zu blockieren, geben Sie ein JSON-Objekt zurück, in dem `decision` auf `"block"` gesetzt ist:1589Um einen Prompt zu blockieren, geben Sie ein JSON-Objekt zurück, bei dem `decision` auf `"block"` gesetzt ist:
1567 1590
1568| Feld | Beschreibung |1591| Feld | Beschreibung |
1569| :- | :- |1592| :- | :- |
1570| `decision` | `"block"` stoppt den Prompt, bevor er Claude erreicht. Weglassen, um den Prompt fortfahren zu lassen |1593| `decision` | `"block"` stoppt den Prompt, bevor er Claude erreicht. Lassen Sie es weg, damit der Prompt fortgesetzt wird |
1571| `reason` | Wird dem Benutzer angezeigt, wenn `decision` den Wert `"block"` hat. Wird nicht dem Kontext hinzugefügt |1594| `reason` | Wird dem Benutzer angezeigt, wenn `decision` den Wert `"block"` hat. Wird nicht zum Kontext hinzugefügt |
1572| `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) |1595| `additionalContext` | String, der zusammen mit dem abgesendeten Prompt zum Kontext von Claude hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
1573| `sessionTitle` | Legt den Sitzungstitel fest. Verwenden Sie dies, um Sitzungen automatisch anhand des Prompt-Inhalts zu benennen |1596| `sessionTitle` | Setzt den Sitzungstitel. Verwenden Sie es, um Sitzungen automatisch anhand des Prompt-Inhalts zu benennen |
1574| `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) |1597| `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) |
1575 1598
1576Ein 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.1599Ein Hook, der durch Beenden mit Exit-Code 2 blockiert, wird genauso behandelt wie `reason`: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text, und dieser wird nicht zum Kontext hinzugefügt.
1577 1600
1578```json theme={null}1601```json theme={null}
1579{1602{
1592 Was ein blockierter Prompt hinterlässt1615 Was ein blockierter Prompt hinterlässt
1593</h4>1616</h4>
1594 1617
1595Ein 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.1618Ein 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 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 Exit-Code 2 blockiert.
1596 1619
1597`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).1620`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 daher kein Weg, ein Geheimnis von der Festplatte fernzuhalten. Um diese Dateien zu begrenzen oder zu entfernen, siehe [Klartextspeicherung](/docs/de/claude-directory#plaintext-storage) und [Lokale Daten löschen](/docs/de/claude-directory#clear-local-data).
1598 1621
1599<h3 id="userpromptexpansion">1622<h3 id="userpromptexpansion">
1600 UserPromptExpansion1623 UserPromptExpansion
1601</h3>1624</h3>
1602 1625
1603Wird 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.1626Wird ausgeführt, wenn ein vom Benutzer eingegebener Befehl zu einem Prompt erweitert wird, bevor er Claude erreicht. Verwenden Sie dies, um bestimmte Befehle vom direkten Aufruf auszuschließen, Kontext für einen bestimmten Skill einzufügen oder zu protokollieren, welche Befehle Benutzer aufrufen. Zum Beispiel kann ein Hook, der auf `deploy` zutrifft, `/deploy` blockieren, sofern keine Genehmigungsdatei vorhanden ist, oder ein Hook, der auf einen Review-Skill zutrifft, die Review-Checkliste des Teams als `additionalContext` anhängen.
1604 1627
1605Dieses 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.1628Dieses Event deckt den Weg ab, den `PreToolUse` nicht abdeckt: Ein `PreToolUse`-Hook, der auf das Tool `Skill` zutrifft, wird nur ausgelöst, wenn Claude das Tool aufruft, aber das direkte Eingeben von `/skillname` umgeht `PreToolUse`. `UserPromptExpansion` wird auf diesem direkten Weg ausgelöst.
1606 1629
1607Gleicht auf `command_name` ab. Lassen Sie den Matcher leer, um bei jedem Befehl vom Typ Prompt auszulösen.1630Matcht auf `command_name`. Lassen Sie den Matcher leer, um bei jedem Befehl vom Typ Prompt auszulösen.
1608 1631
1609<h4 id="userpromptexpansion-input">1632<h4 id="userpromptexpansion-input">
1610 UserPromptExpansion-Eingabe1633 UserPromptExpansion-Eingabe
1611</h4>1634</h4>
1612 1635
1613Zusä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.1636Zusä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` hat den Wert `slash_command` für Skills und benutzerdefinierte Befehle oder `mcp_prompt` für Prompts von MCP-Servern.
1614 1637
1615```json theme={null}1638```json theme={null}
1616{1639{
1635 1658
1636| Feld | Beschreibung |1659| Feld | Beschreibung |
1637| :- | :- |1660| :- | :- |
1638| `decision` | `"block"` verhindert die Erweiterung des Befehls. Weglassen, um fortzufahren |1661| `decision` | `"block"` verhindert, dass der Befehl erweitert wird. Lassen Sie es weg, damit er fortgesetzt wird |
1639| `reason` | Wird dem Benutzer angezeigt, wenn `decision` den Wert `"block"` hat |1662| `reason` | Wird dem Benutzer angezeigt, wenn `decision` den Wert `"block"` hat |
1640| `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) |1663| `additionalContext` | String, der zusammen mit dem erweiterten Prompt zum Kontext von Claude hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
1641 1664
1642Ein Hook, der durch Beenden mit Exit-Code 2 blockiert, wird genauso behandelt wie `reason`: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text.1665Ein Hook, der durch Beenden mit Exit-Code 2 blockiert, wird genauso behandelt wie `reason`: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text.
1643 1666
1656 MessageDisplay1679 MessageDisplay
1657</h3>1680</h3>
1658 1681
1659Wird 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.1682Wird ausgeführt, während eine Assistentennachricht auf den Bildschirm gestreamt wird. Claude Code zeigt die Nachricht schrittweise an: Jedes Mal, wenn ein Stapel neu abgeschlossener Zeilen zur Darstellung bereit ist, läuft der Hook einmal mit diesen Zeilen, und Claude Code stellt an ihrer Stelle den Ersatztext des Hooks dar. Eine lange Nachricht erzeugt mehrere Aufrufe; eine kurze Nachricht erzeugt möglicherweise nur einen.
1660 1683
1661Verwenden Sie MessageDisplay, um:1684Verwenden Sie MessageDisplay, um:
1662 1685
1663* Markdown für eine minimalistische Anzeige zu entfernen1686* Markdown für eine minimalistische Anzeige zu entfernen
1664* den Text umzuwandeln, den eine Agent-SDK-Anwendung ihren Benutzern anzeigt1687* den Text umzuwandeln, den eine Agent SDK-Anwendung ihren Benutzern anzeigt
1665* API-Schlüssel oder interne Hostnamen aus den Antworten von Claude zu schwärzen1688* API-Schlüssel oder interne Hostnamen aus den Antworten von Claude zu schwärzen
1666 1689
1667Claude 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.1690Claude 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 Event beträgt 10 Sekunden; wenn Ihr Hook mehr Zeit benötigt, setzen Sie das Feld `timeout` im Hook-Eintrag.
1668 1691
1669MessageDisplay 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.1692MessageDisplay 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, daher werden Tool-Ergebnisse und der von Ihnen eingegebene Text unverändert dargestellt.
1670 1693
1671MessageDisplay 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.1694MessageDisplay 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.
1672 1695
1673In 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.1696In nicht interaktiven Läufen, einschließlich Agent SDK-Abfragen und `claude -p`, läuft MessageDisplay einmal pro Assistentennachricht statt einmal pro Zeilenstapel. Der einzelne Aufruf erfolgt, nachdem die Nachricht abgeschlossen ist, 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.
1674 1697
1675<h4 id="messagedisplay-input">1698<h4 id="messagedisplay-input">
1676 MessageDisplay-Eingabe1699 MessageDisplay-Eingabe
1677</h4>1700</h4>
1678 1701
1679Zusä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.1702Zusä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 innerhalb einer Nachricht zu verfolgen, statt eine bestimmte Gruppierung der Zeilen zu erwarten.
1680 1703
1681| Feld | Beschreibung |1704| Feld | Beschreibung |
1682| :- | :- |1705| :- | :- |
1683| `turn_id` | UUID des aktuellen Turns |1706| `turn_id` | UUID des aktuellen Turns |
1684| `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 |1707| `message_id` | UUID der angezeigten Assistentennachricht. Über alle Stapel derselben Nachricht hinweg stabil. Dies ist nicht die `msg_…`-ID der API und kann daher nicht mit Nachrichten-IDs im Transkript abgeglichen werden |
1685| `index` | Nullbasierter Index dieses Stapels innerhalb der Nachricht |1708| `index` | Nullbasierter Index dieses Stapels innerhalb der Nachricht |
1686| `final` | `true` beim letzten Stapel der Nachricht. Jede Nachricht hat genau einen letzten Stapel |1709| `final` | `true` beim letzten Stapel der Nachricht. Jede Nachricht hat genau einen letzten Stapel |
1687| `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 |1710| `delta` | Die seit dem vorherigen Stapel neu abgeschlossenen Zeilen, einschließlich abschließender Zeilenumbrüche. Immer vollständige 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 |
1688 1711
1689```json theme={null}1712```json theme={null}
1690{1713{
1708 1731
1709| Feld | Beschreibung |1732| Feld | Beschreibung |
1710| :- | :- |1733| :- | :- |
1711| `displayContent` | Text, der anstelle des Deltas angezeigt wird. Weglassen, um das Original anzuzeigen |1734| `displayContent` | Text, der anstelle des Deltas angezeigt wird. Lassen Sie es weg, um das Original anzuzeigen |
1712 1735
1713MessageDisplay-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`.1736MessageDisplay-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 verarbeitet `displayContent` aus ihrer JSON-Ausgabe und verwirft `systemMessage` und `continue`.
1714 1737
1715Dieses 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.1738Dieses 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.
1716 1739
1717<Tabs>1740<Tabs>
1718 <Tab title="macOS/Linux">1741 <Tab title="macOS/Linux">
1719 Registrieren Sie in Ihrer Einstellungsdatei einen Befehls-Hook für das Ereignis:1742 Registrieren Sie in Ihrer Einstellungsdatei einen Befehls-Hook für das Event:
1720 1743
1721 ```json theme={null}1744 ```json theme={null}
1722 {1745 {
1736 }1759 }
1737 ```1760 ```
1738 1761
1739 Speichern Sie dieses Skript unter `.claude/hooks/plain-display.sh` in Ihrem Projekt und machen Sie es mit `chmod +x` ausführbar:1762 Speichern Sie dieses Skript als `.claude/hooks/plain-display.sh` in Ihrem Projekt und machen Sie es mit `chmod +x` ausführbar:
1740 1763
1741 ```bash theme={null}1764 ```bash theme={null}
1742 #!/bin/bash1765 #!/bin/bash
1773 1796
1774 Das Flag `-NoProfile` überspringt das Laden Ihres PowerShell-Profils, damit der Hook schnell startet, und `-ExecutionPolicy Bypass` erlaubt PowerShell, die lokale Skriptdatei auszuführen.1797 Das Flag `-NoProfile` überspringt das Laden Ihres PowerShell-Profils, damit der Hook schnell startet, und `-ExecutionPolicy Bypass` erlaubt PowerShell, die lokale Skriptdatei auszuführen.
1775 1798
1776 Speichern Sie dieses Skript unter `.claude/hooks/plain-display.ps1` in Ihrem Projekt:1799 Speichern Sie dieses Skript als `.claude/hooks/plain-display.ps1` in Ihrem Projekt:
1777 1800
1778 ```powershell theme={null}1801 ```powershell theme={null}
1779 $batch = [Console]::In.ReadToEnd() | ConvertFrom-Json1802 $batch = [Console]::In.ReadToEnd() | ConvertFrom-Json
1794 PreToolUse1817 PreToolUse
1795</h3>1818</h3>
1796 1819
1797Wird 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).1820Wird 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).
1798 1821
1799Um 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.1822Um einen Hook auszuführen, wenn sich eine bestimmte Datei auf der Festplatte ändert, unabhängig davon, wer 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.
1800 1823
1801<Warning>1824<Warning>
1802 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).1825 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 standardmäßig 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` matchen. PreToolUse wird außerdem nicht für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgelöst.
1826
1827 Sie können bestimmte Pfade für `@`-Referenzen sperren oder das Einfügen abschalten:
1803 1828
1804 PreToolUse wird auch nicht für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgelöst.1829 * **Bestimmte Pfade sperren**: Fügen Sie eine [`Read`-deny-Regel](/docs/de/permissions#read-and-edit) für sie hinzu
1830 * **Das Einfügen abschalten**: Setzen Sie [`CLAUDE_CODE_DISABLE_FILE_MENTIONS=1`](/docs/de/env-vars#variables) in Ihrer Shell, Ihren Benutzereinstellungen oder verwalteten Einstellungen. Claude erhält dann die erwähnten Pfade mit dem Hinweis, sie mit seinen Datei-Tools zu lesen. Tut es das, werden Ihre passenden PreToolUse-Hooks ausgeführt. Die Variable erfordert Claude Code v2.1.299 oder höher, und Claude Code ignoriert sie in Projekt- und lokalen Einstellungen.
1805</Warning>1831</Warning>
1806 1832
1807Verwenden Sie die [PreToolUse-Entscheidungssteuerung](#pretooluse-decision-control), um den Tool-Aufruf zu erlauben, abzulehnen, nachzufragen oder zurückzustellen.1833Verwenden Sie die [PreToolUse-Entscheidungssteuerung](#pretooluse-decision-control), um den Tool-Aufruf zu erlauben, abzulehnen, nachzufragen oder zurückzustellen.
1808 1834
1809Ein [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.1835Ein [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.
1810 1836
1811<h4 id="pretooluse-input">1837<h4 id="pretooluse-input">
1812 PreToolUse-Eingabe1838 PreToolUse-Eingabe
1814 1840
1815Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreToolUse-Hooks `tool_name`, `tool_input` und `tool_use_id`.1841Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreToolUse-Hooks `tool_name`, `tool_input` und `tool_use_id`.
1816 1842
1817Bei 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.1843Bei 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` und Konfigurations-Geltungsbereiche wie `user` und `project`. [`McpServerProvenance`](/docs/de/agent-sdk/typescript#mcpserverprovenance) in der Agent SDK-Referenz listet alle Werte auf und beschreibt, wie Sie mit einem Wert umgehen, den Sie nicht kennen. Stützen Sie Vertrauensentscheidungen auf `source` und nicht auf `name` oder das Tool-Namenspräfix `mcp__<server>__`. Das Feld `mcp_server` erfordert Claude Code v2.1.274 oder höher.
1818 1844
1819Bei den Datei-Tools `Write`, `Edit` und `Read` ist `tool_input.file_path` immer absolut:1845Bei den Datei-Tools `Write`, `Edit` und `Read` ist `tool_input.file_path` immer absolut:
1820 1846
1821* 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 kann1847* Claude Code erweitert `~` und relative Pfade, bevor Hooks laufen, sodass ein Hook, der auf Pfade matcht, nicht über `~` oder eine relative Schreibweise desselben Pfads umgangen werden kann
1822* Unter Windows kommt der Pfad mit Backslash-Trennzeichen an, auch wenn Ihr Hook unter Git Bash läuft, wo `$PWD` wie `/c/project` aussieht1848* Unter Windows kommt der Pfad mit Backslashes als Trennzeichen an, selbst wenn Ihr Hook unter Git Bash läuft, wo `$PWD` wie `/c/project` aussieht
1823* 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 blockieren1849* Ein Vergleich mit Schrägstrichen, etwa eine Prüfung auf `/src/`, trifft nie auf einen Pfad mit Backslashes zu, und der Tool-Aufruf wird fortgesetzt, als hätte der Hook nichts zu blockieren gehabt
1824* 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 ist1850* Normalisieren Sie die Trennzeichen vor dem Vergleich: `FILE_PATH="${FILE_PATH//\\//}"` in Bash oder `file_path.replace("\\", "/")` in Python, und matchen Sie dann auf ein Pfadsegment wie `/src/`, statt mit `^` zu verankern, da der Pfad absolut ist
1825 1851
1826Ein `Write`-Aufruf unter Windows liefert:1852Ein `Write`-Aufruf unter Windows liefert:
1827 1853
1851| :- | :- | :- | :- |1877| :- | :- | :- | :- |
1852| `command` | string | `"npm test"` | Der auszuführende Shell-Befehl |1878| `command` | string | `"npm test"` | Der auszuführende Shell-Befehl |
1853| `description` | string | `"Run test suite"` | Optionale Beschreibung dessen, was der Befehl tut |1879| `description` | string | `"Run test suite"` | Optionale Beschreibung dessen, was der Befehl tut |
1854| `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 |1880| `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 |
1855| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |1881| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |
1856 1882
1857Wenn 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.1883Wenn 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 einschaltet; 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, 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.
1858 1884
1859Ihr [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.1885Ihr [PostToolUse-Hook](#posttooluse) erhält die geänderten Dateien dann in `tool_response.bashEditDiff`. Die Liste umfasst, was sich während der Ausführung des Befehls im Repository geändert hat. Dateien, die Git ignoriert, und Dateien in Submodulen werden nicht aufgeführt. Erfordert Claude Code v2.1.269 oder höher.
1860 1886
1861<Note>1887<Note>
1862 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.1888 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 gleichzeitig ein anderer Prozess geändert hat, oder an seinen Größenlimits abbrechen. Die Struktur des Felds kann sich ändern. Verwenden Sie die Liste, um herauszufinden, was Sie prüfen sollten, nicht um eine Richtlinie durchzusetzen.
1863</Note>1889</Note>
1864 1890
1865`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.1891`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.
1866 1892
1867| Feld | Typ | Beispiel | Beschreibung |1893| Feld | Typ | Beispiel | Beschreibung |
1868| :- | :- | :- | :- |1894| :- | :- | :- | :- |
1869| `changedFiles` | array | `["/path/to/src/app.ts"]` | Absolute Pfade der Dateien, die der Befehl geändert hat, höchstens 200. Vorhanden, sobald `files` einen Diff enthält oder `moreFiles` größer als null ist |1895| `changedFiles` | array | `["/path/to/src/app.ts"]` | Absolute Pfade der Dateien, die der Befehl geändert hat, höchstens 200. Vorhanden, wann immer `files` einen Diff enthält oder `moreFiles` größer als null ist |
1870| `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 |1896| `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 |
1871| `moreFiles` | number | `2` | Anzahl geänderter Dateien ohne Diff in `files` |1897| `moreFiles` | number | `2` | Anzahl der geänderten Dateien ohne Diff in `files` |
1872| `unavailable` | boolean | `true` | Gesetzt, wenn der Diff unvollständig ist oder nicht erstellt werden konnte |1898| `unavailable` | boolean | `true` | Gesetzt, wenn der Diff unvollständig ist oder nicht erstellt werden konnte |
1873| `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 |1899| `skipped` | boolean | `true` | Gesetzt bei einem Git-Befehl, der den Arbeitsbaum verschiebt, etwa `git checkout` oder `git stash`, sodass Claude Code keinen Diff erstellt |
1874| `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 |1900| `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 |
1875 1901
1876<a id="powershell" />1902<a id="powershell" />
1879 PowerShell1905 PowerShell
1880</h5>1906</h5>
1881 1907
1882Führt PowerShell-Befehle aus. Informationen zur Verfügbarkeit je Plattform finden Sie beim [PowerShell-Tool](/docs/de/tools-reference#powershell-tool).1908Führt PowerShell-Befehle aus. Zur Verfügbarkeit nach Plattform siehe das [PowerShell-Tool](/docs/de/tools-reference#powershell-tool).
1883 1909
1884Die Felder entsprechen denen des Bash-Tools, mit dem Befehlsstring in `command`:1910Die Felder entsprechen denen des Bash-Tools, mit dem Befehlsstring in `command`:
1885 1911
1890| `timeout` | number | `120000` | Optionaler Timeout in Millisekunden |1916| `timeout` | number | `120000` | Optionaler Timeout in Millisekunden |
1891| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |1917| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |
1892 1918
1893Gleichen Sie in Hooks, die Shell-Befehle prüfen, auf `Bash|PowerShell` ab, damit sie beide Tools abdecken:1919Matchen Sie in Hooks, die Shell-Befehle prüfen, auf `Bash|PowerShell`, damit sie beide Tools abdecken:
1894 1920
1895* Unter Windows behandelt Claude PowerShell überall dort, wo das PowerShell-Tool aktiviert ist, als primäre Shell und leitet Shell-Befehle darüber.1921* Unter Windows behandelt Claude PowerShell überall dort, wo das PowerShell-Tool aktiviert ist, als primäre Shell und leitet Shell-Befehle darüber.
1896* Unter Windows ohne Git Bash wird das Tool automatisch aktiviert, und Claude Code registriert das Bash-Tool überhaupt nicht.1922* Unter Windows ohne Git Bash wird das Tool automatisch aktiviert, und Claude Code registriert das Bash-Tool überhaupt nicht.
1897* Ein Hook, der nur auf `Bash` abgleicht, wird dort nie ausgelöst.1923* Ein Hook, der nur auf `Bash` matcht, wird dort nie ausgelöst.
1898 1924
1899<h5 id="write">1925<h5 id="write">
1900 Write1926 Write
1917| :- | :- | :- | :- |1943| :- | :- | :- | :- |
1918| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu bearbeitenden Datei |1944| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu bearbeitenden Datei |
1919| `old_string` | string | `"original text"` | Zu suchender und zu ersetzender Text |1945| `old_string` | string | `"original text"` | Zu suchender und zu ersetzender Text |
1920| `new_string` | string | `"replacement text"` | Ersetzungstext |1946| `new_string` | string | `"replacement text"` | Ersatztext |
1921| `replace_all` | boolean | `false` | Ob alle Vorkommen ersetzt werden sollen |1947| `replace_all` | boolean | `false` | Ob alle Vorkommen ersetzt werden sollen |
1922 1948
1923<h5 id="read">1949<h5 id="read">
1929| Feld | Typ | Beispiel | Beschreibung |1955| Feld | Typ | Beispiel | Beschreibung |
1930| :- | :- | :- | :- |1956| :- | :- | :- | :- |
1931| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu lesenden Datei |1957| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu lesenden Datei |
1932| `offset` | number | `10` | Optionale Zeilennummer, ab der gelesen werden soll |1958| `offset` | number | `10` | Optionale Zeilennummer, ab der gelesen wird |
1933| `limit` | number | `50` | Optionale Anzahl zu lesender Zeilen |1959| `limit` | number | `50` | Optionale Anzahl zu lesender Zeilen |
1934 1960
1935<h5 id="glob">1961<h5 id="glob">
1940 1966
1941| Feld | Typ | Beispiel | Beschreibung |1967| Feld | Typ | Beispiel | Beschreibung |
1942| :- | :- | :- | :- |1968| :- | :- | :- | :- |
1943| `pattern` | string | `"**/*.ts"` | Glob-Muster, mit dem Dateien abgeglichen werden |1969| `pattern` | string | `"**/*.ts"` | Glob-Muster, gegen das Dateien abgeglichen werden |
1944| `path` | string | `"/path/to/dir"` | Optionales Verzeichnis für die Suche. Standardmäßig das aktuelle Arbeitsverzeichnis |1970| `path` | string | `"/path/to/dir"` | Optionales Verzeichnis, in dem gesucht wird. Standardmäßig das aktuelle Arbeitsverzeichnis |
1945 1971
1946<h5 id="grep">1972<h5 id="grep">
1947 Grep1973 Grep
1951 1977
1952| Feld | Typ | Beispiel | Beschreibung |1978| Feld | Typ | Beispiel | Beschreibung |
1953| :- | :- | :- | :- |1979| :- | :- | :- | :- |
1954| `pattern` | string | `"TODO.*fix"` | Zu suchendes Muster eines regulären Ausdrucks |1980| `pattern` | string | `"TODO.*fix"` | Muster eines regulären Ausdrucks, nach dem gesucht wird |
1955| `path` | string | `"/path/to/dir"` | Optionale Datei oder optionales Verzeichnis für die Suche |1981| `path` | string | `"/path/to/dir"` | Optionale Datei oder optionales Verzeichnis, in dem gesucht wird |
1956| `glob` | string | `"*.ts"` | Optionales Glob-Muster zum Filtern von Dateien |1982| `glob` | string | `"*.ts"` | Optionales Glob-Muster zum Filtern von Dateien |
1957| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` oder `"count"`. Standardmäßig `"files_with_matches"` |1983| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` oder `"count"`. Standardmäßig `"files_with_matches"` |
1958| `-i` | boolean | `true` | Suche ohne Beachtung der Groß-/Kleinschreibung |1984| `-i` | boolean | `true` | Suche ohne Beachtung der Groß-/Kleinschreibung |
1959| `multiline` | boolean | `false` | Mehrzeiligen Abgleich aktivieren |1985| `multiline` | boolean | `false` | Mehrzeiliges Matching aktivieren |
1960 1986
1961<h5 id="webfetch">1987<h5 id="webfetch">
1962 WebFetch1988 WebFetch
1968| :- | :- | :- | :- |1994| :- | :- | :- | :- |
1969| `url` | string | `"https://example.com/api"` | URL, von der Inhalte abgerufen werden |1995| `url` | string | `"https://example.com/api"` | URL, von der Inhalte abgerufen werden |
1970| `prompt` | string | `"Extract the API endpoints"` | Prompt, der auf den abgerufenen Inhalt angewendet wird |1996| `prompt` | string | `"Extract the API endpoints"` | Prompt, der auf den abgerufenen Inhalt angewendet wird |
1971| `offset` | number | `100000` | Optionale Anzahl von Zeichen, die ab dem Seitenanfang übersprungen werden. Claude setzt diesen Wert, um eine lange Seite weiterzulesen. Erfordert Claude Code v2.1.290 oder höher |1997| `offset` | number | `100000` | Optionale Anzahl von Zeichen, die vom Anfang der Seite übersprungen werden. Claude setzt dies, um eine lange Seite weiterzulesen. Erfordert Claude Code v2.1.290 oder höher |
1972 1998
1973<h5 id="websearch">1999<h5 id="websearch">
1974 WebSearch2000 WebSearch
1979| Feld | Typ | Beispiel | Beschreibung |2005| Feld | Typ | Beispiel | Beschreibung |
1980| :- | :- | :- | :- |2006| :- | :- | :- | :- |
1981| `query` | string | `"react hooks best practices"` | Suchanfrage |2007| `query` | string | `"react hooks best practices"` | Suchanfrage |
1982| `allowed_domains` | array | `["docs.example.com"]` | Optional: nur Ergebnisse von diesen Domains einschließen |2008| `allowed_domains` | array | `["docs.example.com"]` | Optional: nur Ergebnisse von diesen Domains einbeziehen |
1983| `blocked_domains` | array | `["spam.example.com"]` | Optional: Ergebnisse von diesen Domains ausschließen |2009| `blocked_domains` | array | `["spam.example.com"]` | Optional: Ergebnisse von diesen Domains ausschließen |
1984 2010
1985<h5 id="agent">2011<h5 id="agent">
1995| `subagent_type` | string | `"Explore"` | Typ des zu verwendenden spezialisierten Agenten |2021| `subagent_type` | string | `"Explore"` | Typ des zu verwendenden spezialisierten Agenten |
1996| `model` | string | `"sonnet"` | Optionaler Modell-Alias, der den Standard überschreibt |2022| `model` | string | `"sonnet"` | Optionaler Modell-Alias, der den Standard überschreibt |
1997 2023
1998Wenn 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:2024Wenn 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 prüfen; 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:
1999 2025
2000| Feld | Typ | Beispiel | Beschreibung |2026| Feld | Typ | Beispiel | Beschreibung |
2001| :- | :- | :- | :- |2027| :- | :- | :- | :- |
2002| `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"` |2028| `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, der `run_in_background` weglässt, `"async_launched"` |
2003| `agentId` | string | `"a4d2c8f1e0b3a297"` | Kennung des Subagenten-Laufs |2029| `agentId` | string | `"a4d2c8f1e0b3a297"` | Kennung des Subagenten-Laufs |
2004| `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 |2030| `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 |
2005| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modell, mit dem der Subagent gestartet wurde; kann vom angeforderten Modell abweichen |2031| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modell, mit dem der Subagent gestartet ist und das vom angeforderten Modell abweichen kann |
2006| `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 |2032| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Verwendete Modelle in Reihenfolge, wobei aufeinanderfolgende Wiederholungen zusammengefasst sind; nur gesetzt, wenn das Modell während des Laufs gewechselt wurde. Erfordert Claude Code v2.1.212 oder höher |
2007| `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 |2033| `totalTokens` | number | `12450` | Token-Anzahl aus der letzten API-Anfrage des Subagenten: Eingabe-, Ausgabe- und Cache-Token zusammen. Dies ist keine Gesamtzahl über den ganzen Lauf |
2008| `totalDurationMs` | number | `48211` | Echtzeitdauer des Subagenten-Laufs |2034| `totalDurationMs` | number | `48211` | Echtzeitdauer des Subagenten-Laufs |
2009| `totalToolUseCount` | number | `7` | Anzahl der Tool-Aufrufe, die der Subagent durchgeführt hat |2035| `totalToolUseCount` | number | `7` | Anzahl der Tool-Aufrufe, die der Subagent ausgeführt hat |
2010| `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` |2036| `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` |
2011 2037
2012Ab 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`.2038Ab Claude Code v2.1.271 übermittelt 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, matchen Sie einen `PreToolUse`- oder `PostToolUse`-Hook auf `SubagentHandback` und lesen `tool_input.message`.
2013 2039
2014Bei 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`.2040Bei 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. Die Antwort enthält `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` und `resolvedModel`.
2015 2041
2016Bei 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.2042Bei einer `completed`-Antwort nennt `resolvedModel` das Modell, mit dem der Subagent gestartet ist, das vom Wert `model` 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 sich ein Wechsel vor diesem Zeitpunkt dort widerspiegelt. `modelsUsed` und das Verhalten von `resolvedModel` zum Zeitpunkt des Wechsels in den Hintergrund erfordern Claude Code v2.1.212 oder höher.
2017 2043
2018<a id="askuserquestion" />2044<a id="askuserquestion" />
2019 2045
2021 AskUserQuestion2047 AskUserQuestion
2022</h5>2048</h5>
2023 2049
2024Stellt dem Benutzer ein bis vier Multiple-Choice-Fragen.2050Stellt dem Benutzer eine bis vier Multiple-Choice-Fragen.
2025 2051
2026| Feld | Typ | Beispiel | Beschreibung |2052| Feld | Typ | Beispiel | Beschreibung |
2027| :- | :- | :- | :- |2053| :- | :- | :- | :- |
2028| `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 |2054| `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 |
2029| `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 |2055| `answers` | object | `{"Which framework?": "React"}` | Optional. Ordnet Fragetexte der Bezeichnung der gewählten Option zu. Antworten bei Mehrfachauswahl verbinden die Bezeichnungen mit Kommas. Claude setzt dieses Feld nicht; liefern Sie es über `updatedInput`, um programmatisch zu antworten |
2030 2056
2031<h5 id="exitplanmode">2057<h5 id="exitplanmode">
2032 ExitPlanMode2058 ExitPlanMode
2033</h5>2059</h5>
2034 2060
2035Prä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.2061Prä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` vom Modell typischerweise leer. Claude Code fügt den Planinhalt und den Dateipfad ein, bevor die Eingabe an Hooks übergeben wird.
2036 2062
2037| Feld | Typ | Beispiel | Beschreibung |2063| Feld | Typ | Beispiel | Beschreibung |
2038| :- | :- | :- | :- |2064| :- | :- | :- | :- |
2039| `plan` | string | `"## Refactor auth\n1. Extract..."` | Planinhalt in Markdown. Aus der Plandatei auf dem Datenträger eingefügt |2065| `plan` | string | `"## Refactor auth\n1. Extract..."` | Planinhalt in Markdown. Aus der Plandatei auf der Festplatte eingefügt |
2040| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Pfad zur Plandatei. Eingefügt |2066| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Pfad zur Plandatei. Eingefügt |
2041| `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 |2067| `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 |
2042 2068
2043In `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.2069In `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.
2044 2070
2045<h4 id="pretooluse-decision-control">2071<h4 id="pretooluse-decision-control">
2046 PreToolUse-Entscheidungssteuerung2072 PreToolUse-Entscheidungssteuerung
2047</h4>2073</h4>
2048 2074
2049`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.2075`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.
2050 2076
2051| Feld | Beschreibung |2077| Feld | Beschreibung |
2052| :- | :- |2078| :- | :- |
2053| `permissionDecision` | `"allow"` überspringt die Berechtigungsabfrage, außer bei den [Aktionen, die kein Modus automatisch genehmigt](/docs/de/permission-modes#actions-no-mode-auto-approves), bei [Lesezugriffen auf Netzwerkpfade](/docs/de/permissions#network-paths) sowie bei `AskUserQuestion` und `ExitPlanMode`, die [`updatedInput` in Kombination damit](#allow-with-updatedinput) benötigen. `"deny"` verhindert den Tool-Aufruf. `"ask"` bittet den Benutzer um Bestätigung. `"defer"` beendet sich geordnet, damit das Tool später fortgesetzt werden kann. [deny- und ask-Regeln](/docs/de/permissions#manage-permissions) werden unabhängig von der Rückgabe des Hooks weiterhin ausgewertet |2079| `permissionDecision` | `"allow"` überspringt die Berechtigungsabfrage, außer bei den [Aktionen, die kein Modus automatisch genehmigt](/docs/de/permission-modes#actions-no-mode-auto-approves), bei [Lesezugriffen auf Netzwerkpfade](/docs/de/permissions#network-paths) sowie bei `AskUserQuestion` und `ExitPlanMode`, die [zusätzlich `updatedInput` benötigen](#allow-with-updatedinput). `"deny"` verhindert den Tool-Aufruf. `"ask"` bittet den Benutzer um Bestätigung. `"defer"` beendet den Lauf geordnet, damit das Tool später fortgesetzt werden kann. [deny- und ask-Regeln](/docs/de/permissions#manage-permissions) werden unabhängig davon ausgewertet, was der Hook zurückgibt |
2054| `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 |2080| `permissionDecisionReason` | Bei `"ask"` wird es dem Benutzer in der Berechtigungsabfrage angezeigt. Wenn Claude Code in einem `-p`-Lauf, in dem niemand die Abfrage beantworten kann, [den Aufruf ablehnt](/docs/de/headless#turn-off-permission-prompts-in-unattended-runs), liest Claude den Grund stattdessen im Tool-Ergebnis. Bei `"deny"` wird es Claude angezeigt. Bei `"allow"` und `"defer"` wird es nur in das [Debug-Log](#debug-hooks) geschrieben |
2055| `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 |2081| `updatedInput` | Ändert die Eingabeparameter des Tools vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, fügen Sie daher unveränderte Felder zusammen mit den geänderten ein. Claude Code wertet Berechtigungsregeln und die [Eignung eines Bash-Befehls für den automatischen Wechsel in den Hintergrund](/docs/de/tools-reference#foreground-commands-that-move-to-the-background) anhand der Eingabe aus, die Ihr Hook zurückgibt, nicht anhand der Eingabe, die Claude gesendet hat. Kombinieren Sie es mit `"allow"` für eine automatische Genehmigung oder mit `"ask"`, um dem Benutzer die geänderte Eingabe anzuzeigen. Bei `"defer"` wird es ignoriert |
2056| `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) |2082| `additionalContext` | String, der zusammen mit dem Tool-Ergebnis zum Kontext von Claude hinzugefügt wird. Wird ignoriert, wenn `permissionDecision` den Wert `"defer"` hat. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
2057 2083
2058Wenn mehrere PreToolUse-Hooks unterschiedliche Entscheidungen zurückgeben, gilt die Rangfolge `deny` > `defer` > `ask` > `allow`.2084Wenn mehrere PreToolUse-Hooks unterschiedliche Entscheidungen zurückgeben, gilt die Rangfolge `deny` > `defer` > `ask` > `allow`.
2059 2085
2060Ein Hook, der durch Beenden mit Exit-Code 2 blockiert, wird genauso behandelt wie `"deny"`: Claude sieht die stderr-Meldung als Ablehnungsgrund.2086Ein Hook, der durch Beenden mit Exit-Code 2 blockiert, wird genauso behandelt wie `"deny"`: Claude sieht die stderr-Meldung als Ablehnungsgrund.
2061 2087
2062Wenn 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.2088Wenn ein Hook `"ask"` zurückgibt, enthält die dem Benutzer angezeigte Berechtigungsabfrage eine Bezeichnung, die 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.
2063 2089
2064Das `"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.2090Ein `"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 beachtet.
2065 2091
2066```json theme={null}2092```json theme={null}
2067{2093{
2078```2104```
2079 2105
2080<Note>2106<Note>
2081 PreToolUse verwendete früher die Felder `decision` und `reason` auf oberster Ebene, diese sind für dieses Ereignis jedoch veraltet. Verwenden Sie stattdessen `hookSpecificOutput.permissionDecision` und `hookSpecificOutput.permissionDecisionReason`. Die veralteten Werte `"approve"` und `"block"` entsprechen `"allow"` bzw. `"deny"`. Andere Ereignisse wie PostToolUse und Stop verwenden weiterhin `decision` und `reason` auf oberster Ebene als aktuelles Format.2107 PreToolUse verwendete früher die Felder `decision` und `reason` auf oberster Ebene, diese sind für dieses Event jedoch veraltet. Verwenden Sie stattdessen `hookSpecificOutput.permissionDecision` und `hookSpecificOutput.permissionDecisionReason`. Die veralteten Werte `"approve"` und `"block"` entsprechen `"allow"` bzw. `"deny"`. Andere Events wie PostToolUse und Stop verwenden weiterhin `decision` und `reason` auf oberster Ebene als aktuelles Format.
2082</Note>2108</Note>
2083 2109
2084<h4 id="allow-with-updatedinput">2110<h4 id="allow-with-updatedinput">
2090Ein `PreToolUse`-Hook erfüllt diese Anforderung, wenn er Folgendes tut:2116Ein `PreToolUse`-Hook erfüllt diese Anforderung, wenn er Folgendes tut:
2091 2117
20921. Er liest die Eingabe des Tools von stdin21181. Er liest die Eingabe des Tools von stdin
20932. Er sammelt die Antwort über Ihre eigene Oberfläche21192. Er sammelt die Antwort über Ihre eigene Benutzeroberfläche
20943. Er gibt `permissionDecision: "allow"` zusammen mit `updatedInput` zurück, das die Antwort enthält, sodass das Tool ohne Abfrage ausgeführt wird21203. Er gibt `permissionDecision: "allow"` zusammen mit einem `updatedInput` zurück, das die Antwort enthält, sodass das Tool ohne Abfrage ausgeführt wird
2095 2121
2096Die Rückgabe von `"allow"` allein reicht für diese Tools nicht aus.2122Die alleinige Rückgabe von `"allow"` reicht für diese Tools nicht aus.
2097 2123
2098Geben 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`:2124Geben 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`:
2099 2125
2117}2143}
2118```2144```
2119 2145
2120Ein 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.2146Ein 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`, da Claude Code nicht bestätigen kann, dass der Hook die vom Tool benötigte Interaktion eingeholt hat.
2121 2147
2122<h4 id="defer-a-tool-call-for-later">2148<h4 id="defer-a-tool-call-for-later">
2123 Einen Tool-Aufruf auf später zurückstellen2149 Einen Tool-Aufruf zurückstellen
2124</h4>2150</h4>
2125 2151
2126`"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.2152`"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 benutzerdefinierte Benutzeroberfläche, die auf Claude Code aufbaut. Es ermöglicht dem aufrufenden Prozess, Claude bei einem Tool-Aufruf anzuhalten, Eingaben über die eigene Oberfläche zu sammeln und an derselben Stelle fortzufahren. 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.
2127 2153
2128Das 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:2154Das Tool `AskUserQuestion` ist der typische Fall: Claude möchte dem Benutzer eine Frage stellen, aber es gibt kein Terminal, in dem geantwortet werden könnte. 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:
2129 2155
21301. Claude ruft `AskUserQuestion` auf. Der `PreToolUse`-Hook wird ausgelöst.21561. Claude ruft `AskUserQuestion` auf. Der `PreToolUse`-Hook wird ausgelöst.
21312. Der Hook gibt `permissionDecision: "defer"` zurück. Das Tool wird nicht ausgeführt. Der Prozess wird mit `stop_reason: "tool_deferred"` beendet, und der ausstehende Tool-Aufruf bleibt im Transkript erhalten.21572. Der Hook gibt `permissionDecision: "defer"` zurück. Das Tool wird nicht ausgeführt. Der Prozess beendet sich mit `stop_reason: "tool_deferred"`, und der ausstehende Tool-Aufruf bleibt im Transkript erhalten.
21323. Der aufrufende Prozess liest `deferred_tool_use` aus dem SDK-Ergebnis, zeigt die Frage in seiner eigenen Oberfläche an und wartet auf eine Antwort.21583. Der aufrufende Prozess liest `deferred_tool_use` aus dem SDK-Ergebnis, zeigt die Frage in seiner eigenen Benutzeroberfläche an und wartet auf eine Antwort.
21334. Der aufrufende Prozess führt `claude -p --resume <session-id>` mit demselben Berechtigungs-Host aus. Derselbe Tool-Aufruf löst `PreToolUse` erneut aus.21594. Der aufrufende Prozess führt `claude -p --resume <session-id>` mit demselben Berechtigungs-Host aus. Derselbe Tool-Aufruf löst `PreToolUse` erneut aus.
21345. Der Hook gibt `permissionDecision: "allow"` mit der Antwort in `updatedInput` zurück. Das Tool wird ausgeführt, und Claude fährt fort.21605. Der Hook gibt `permissionDecision: "allow"` mit der Antwort in `updatedInput` zurück. Das Tool wird ausgeführt, und Claude fährt fort.
2135 2161
2136Das 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:2162Das Feld `deferred_tool_use` enthält `id`, `name` und `input` des Tools. `input` sind die Parameter, die Claude für den Tool-Aufruf generiert hat, erfasst vor der Ausführung:
2137 2163
2138```json theme={null}2164```json theme={null}
2139{2165{
2149}2175}
2150```2176```
2151 2177
2152Es 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.2178Es 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 beendet sich auf dieselbe Weise. Der aufrufende Prozess bestimmt, wann die Schleife endet, indem er schließlich `"allow"` oder `"deny"` aus dem Hook zurückgibt.
2153 2179
2154`"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.2180`"defer"` funktioniert nur, wenn Claude im Turn einen einzigen Tool-Aufruf ausführt. Wenn Claude mehrere Tool-Aufrufe gleichzeitig ausfü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 ungelöst zu lassen.
2155 2181
2156Wenn 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.2182Wenn das zurückgestellte Tool beim Fortsetzen nicht mehr verfügbar ist, beendet sich der Prozess mit `stop_reason: "tool_deferred_unavailable"` und `is_error: true`, 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 dennoch enthalten, sodass Sie erkennen können, welches Tool fehlt.
2157 2183
2158<Note>2184<Note>
2159 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. Die übrigen Bedingungen finden Sie unter [Im Plan-Modus mit `-p` fortsetzen](/docs/de/sessions#resume-in-plan-mode-with-p). Erfordert Claude Code v2.1.246 oder höher.2185 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. Die weiteren Bedingungen finden Sie unter [Im Plan-Modus mit `-p` fortsetzen](/docs/de/sessions#resume-in-plan-mode-with-p). Erfordert Claude Code v2.1.246 oder höher.
2160 2186
2161 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.2187 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.
2162</Note>2188</Note>
2165 PermissionRequest2191 PermissionRequest
2166</h3>2192</h3>
2167 2193
2168Wird 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.2194Wird ausgeführt, wenn Claude Code Sie gleich um Erlaubnis zur Verwendung eines Tools bitten wird. In Sitzungen, die keine Abfrage anzeigen können, etwa Subagenten im Hintergrund im [nicht interaktiven Modus](/docs/de/headless), führt Claude Code diese Hooks dennoch 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 die Entscheidung, die zuerst getroffen wird, gilt.
2169Verwenden Sie die [PermissionRequest-Entscheidungssteuerung](#permissionrequest-decision-control), um im Namen des Benutzers zu erlauben oder abzulehnen.2195Verwenden Sie die [PermissionRequest-Entscheidungssteuerung](#permissionrequest-decision-control), um im Namen des Benutzers zu erlauben oder abzulehnen.
2170 2196
2171Verwenden 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.2197Verwenden Sie dieses Event, 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.
2172 2198
2173Claude 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`.2199Claude 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`.
2174 2200
2175Gleicht auf den Tool-Namen ab, mit denselben Werten wie PreToolUse.2201Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.
2176 2202
2177<h4 id="permissionrequest-input">2203<h4 id="permissionrequest-input">
2178 PermissionRequest-Eingabe2204 PermissionRequest-Eingabe
2180 2206
2181PermissionRequest-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.2207PermissionRequest-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.
2182 2208
2183Das 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.2209Das Array `permission_suggestions` ist keine exakte Liste der Optionen, die Sie sehen, da jeder Berechtigungsdialog seine eigenen Optionen erstellt. Manche Dialoge, etwa der für Dateibearbeitungen, lesen das Array gar 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, beispielsweise 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.
2184 2210
2185PreToolUse-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.2211PreToolUse-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 eine Berechtigung bitten würde oder 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.
2186 2212
2187```json theme={null}2213```json theme={null}
2188{2214{
2215 2241
2216| Feld | Beschreibung |2242| Feld | Beschreibung |
2217| :- | :- |2243| :- | :- |
2218| `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 |2244| `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 |
2219| `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 |2245| `updatedInput` | Nur für `"allow"`: Ändert die Eingabeparameter des Tools vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, daher müssen unveränderte Felder zusammen mit den geänderten enthalten sein. Die geänderte Eingabe wird erneut gegen deny- und ask-Regeln ausgewertet |
2220| `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 |2246| `updatedPermissions` | Nur für `"allow"`: Array von anzuwendenden [Einträgen zur Berechtigungsaktualisierung](#permission-update-entries), etwa zum Hinzufügen einer allow-Regel oder zum Ändern des Berechtigungsmodus der Sitzung |
2221| `message` | Nur für `"deny"`: teilt Claude mit, warum die Berechtigung verweigert wurde |2247| `message` | Nur für `"deny"`: Teilt Claude mit, warum die Berechtigung abgelehnt wurde |
2222| `interrupt` | Nur für `"deny"`: bei `true` wird Claude gestoppt |2248| `interrupt` | Nur für `"deny"`: Bei `true` wird Claude gestoppt |
2223 2249
2224Ein Hook, der ohne `decision`-Objekt mit Exit-Code 2 endet, lässt den Berechtigungsablauf unverändert, und sein stderr wird verworfen. Um die Anfrage zu erlauben oder abzulehnen, geben Sie das `decision`-Objekt zurück.2250Ein Hook, der ohne `decision`-Objekt mit Exit-Code 2 beendet wird, lässt den Berechtigungsablauf unverändert, und seine stderr-Ausgabe wird verworfen. Um die Anfrage zu erlauben oder abzulehnen, geben Sie das `decision`-Objekt zurück.
2225 2251
2226```json theme={null}2252```json theme={null}
2227{2253{
2238```2264```
2239 2265
2240<h4 id="permission-update-entries">2266<h4 id="permission-update-entries">
2241 Einträge für Berechtigungsaktualisierungen2267 Einträge zur Berechtigungsaktualisierung
2242</h4>2268</h4>
2243 2269
2244Das Ausgabefeld `updatedPermissions` und das [Eingabefeld `permission_suggestions`](#permissionrequest-input) verwenden beide dasselbe Array von Eintragsobjekten. Jeder Eintrag hat einen `type`, der seine übrigen Felder bestimmt, und eine `destination`, die steuert, wohin die Änderung geschrieben wird.2270Das Ausgabefeld `updatedPermissions` und das [Eingabefeld `permission_suggestions`](#permissionrequest-input) verwenden beide dasselbe Array von Eintragsobjekten. Jeder Eintrag hat einen `type`, der seine übrigen Felder bestimmt, und eine `destination`, die festlegt, wohin die Änderung geschrieben wird.
2245 2271
2246| `type` | Felder | Wirkung |2272| `type` | Felder | Wirkung |
2247| :- | :- | :- |2273| :- | :- | :- |
2248| `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"` |2274| `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"` |
2249| `replaceRules` | `rules`, `behavior`, `destination` | Ersetzt alle Regeln des angegebenen `behavior` an der `destination` durch die angegebenen `rules` |2275| `replaceRules` | `rules`, `behavior`, `destination` | Ersetzt alle Regeln des angegebenen `behavior` an der `destination` durch die angegebenen `rules` |
2250| `removeRules` | `rules`, `behavior`, `destination` | Entfernt übereinstimmende Regeln des angegebenen `behavior` |2276| `removeRules` | `rules`, `behavior`, `destination` | Entfernt passende Regeln des angegebenen `behavior` |
2251| `setMode` | `mode`, `destination` | Ändert den Berechtigungsmodus. Gültige Modi sind `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` und `manual` als Alias für `default` |2277| `setMode` | `mode`, `destination` | Ändert den Berechtigungsmodus. Gültige Modi sind `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` sowie `manual` als Alias für `default` |
2252| `addDirectories` | `directories`, `destination` | Fügt Arbeitsverzeichnisse hinzu. `directories` ist ein Array von Pfad-Strings |2278| `addDirectories` | `directories`, `destination` | Fügt Arbeitsverzeichnisse hinzu. `directories` ist ein Array von Pfad-Strings |
2253| `removeDirectories` | `directories`, `destination` | Entfernt Arbeitsverzeichnisse |2279| `removeDirectories` | `directories`, `destination` | Entfernt Arbeitsverzeichnisse |
2254 2280
2255<Note>2281<Note>
2256 `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.2282 `setMode` mit `bypassPermissions` wirkt nur, 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 die Sitzung im [eingeschränkten Modus](/docs/de/cli-reference#cli-flags) startet.
2257 2283
2258 `bypassPermissions` wird unabhängig von `destination` nie als `defaultMode` gespeichert.2284 `bypassPermissions` wird unabhängig von `destination` nie als `defaultMode` gespeichert.
2259</Note>2285</Note>
2260 2286
2261Das Feld `destination` jedes Eintrags bestimmt, ob die Änderung nur im Arbeitsspeicher bleibt oder dauerhaft in eine Einstellungsdatei geschrieben wird.2287Das Feld `destination` jedes Eintrags bestimmt, ob die Änderung im Arbeitsspeicher bleibt oder in einer Einstellungsdatei gespeichert wird.
2262 2288
2263| `destination` | Schreibt in |2289| `destination` | Schreibt nach |
2264| :- | :- |2290| :- | :- |
2265| `session` | nur im Arbeitsspeicher, wird beim Ende der Sitzung verworfen |2291| `session` | nur im Arbeitsspeicher, wird beim Ende der Sitzung verworfen |
2266| `localSettings` | `.claude/settings.local.json` |2292| `localSettings` | `.claude/settings.local.json` |
2273 PostToolUse2299 PostToolUse
2274</h3>2300</h3>
2275 2301
2276Wird unmittelbar ausgeführt, nachdem ein Tool erfolgreich abgeschlossen wurde.2302Läuft unmittelbar, nachdem ein Tool erfolgreich abgeschlossen wurde.
2277 2303
2278Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.2304Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.
2279 2305
2280Matchen Sie breiter, wenn der Tool-Name nicht der richtige Filter ist:2306Matchen Sie breiter, wenn der Tool-Name nicht der richtige Filter ist:
2281 2307
2282* 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.2308* 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, etwa 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.
2283* 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.2309* 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.
2284 2310
2285<h4 id="posttooluse-input">2311<h4 id="posttooluse-input">
2286 PostToolUse-Eingabe2312 PostToolUse-Eingabe
2287</h4>2313</h4>
2288 2314
2289`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).2315`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 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).
2290 2316
2291```json theme={null}2317```json theme={null}
2292{2318{
2322| Feld | Beschreibung |2348| Feld | Beschreibung |
2323| :- | :- |2349| :- | :- |
2324| `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` |2350| `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` |
2325| `reason` | Erklärung, die Claude angezeigt wird, wenn `decision` `"block"` ist |2351| `reason` | Erklärung, die Claude angezeigt wird, wenn `decision` den Wert `"block"` hat |
2326| `additionalContext` | String, der Claudes Kontext zusammen mit dem Tool-Ergebnis hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |2352| `additionalContext` | String, der Claudes Kontext zusammen mit dem Tool-Ergebnis hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
2327| `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 |2353| `classifierContext` | Kurzer Hinweis 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 |
2328| `updatedToolOutput` | Ersetzt die Ausgabe des Tools durch den angegebenen Wert, bevor sie an Claude gesendet wird. Der Wert muss der Ausgabestruktur des Tools entsprechen |2354| `updatedToolOutput` | Ersetzt die Ausgabe des Tools durch den angegebenen Wert, bevor sie an Claude gesendet wird. Der Wert muss der Ausgabestruktur des Tools entsprechen |
2329| `updatedMCPToolOutput` | Ersetzt die Ausgabe nur für [MCP-Tools](#match-mcp-tools). Bevorzugen Sie `updatedToolOutput`, das für alle Tools funktioniert |2355| `updatedMCPToolOutput` | Ersetzt die Ausgabe nur für [MCP-Tools](#match-mcp-tools). Verwenden Sie bevorzugt `updatedToolOutput`, das für alle Tools funktioniert |
2330 2356
2331Das folgende Beispiel ersetzt die Ausgabe eines `Bash`-Aufrufs. Der Ersatzwert entspricht der Ausgabestruktur des `Bash`-Tools:2357Das folgende Beispiel ersetzt die Ausgabe eines `Bash`-Aufrufs. Der Ersatzwert entspricht der Ausgabestruktur des `Bash`-Tools:
2332 2358
2348<Warning>2374<Warning>
2349 `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.2375 `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.
2350 2376
2351 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.2377 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 einer falschen Annahme weiterarbeitet.
2352</Warning>2378</Warning>
2353 2379
2354<h4 id="annotate-a-result-for-the-auto-mode-classifier">2380<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2355 Ein Ergebnis für den Klassifikator des Auto-Modus annotieren2381 Ein Ergebnis für den Klassifikator des Auto-Modus annotieren
2356</h4>2382</h4>
2357 2383
2358Geben 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.2384Geben Sie `classifierContext` zurück, um einen kurzen Hinweis 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.
2359 2385
2360Das folgende Beispiel teilt dem Klassifikator mit, woher die Ausgabe einer Abfrage stammt:2386Das folgende Beispiel teilt dem Klassifikator mit, woher die Ausgabe einer Abfrage stammt:
2361 2387
2368}2394}
2369```2395```
2370 2396
2371Wie viel Gewicht der Klassifikator der Notiz beimisst, hängt davon ab, wo Sie den Hook konfiguriert haben:2397Wie viel Gewicht der Klassifikator dem Hinweis beimisst, hängt davon ab, wo Sie den Hook konfiguriert haben:
2372 2398
2373* **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 Konversation2399* **In Claude Code konfigurierte Hooks**: Bei Hooks aus Einstellungsdateien, Plugins, Skills und Agenten-Frontmatter behandelt der Klassifikator den Hinweis als nicht verifizierten, von der Anwendung bereitgestellten Kontext. Der Hinweis begründet nie eine Benutzerabsicht, und wenn er behauptet, Sie hätten etwas genehmigt oder angefordert, prüft der Klassifikator diese Behauptung anhand Ihrer eigenen Nachrichten in der Konversation
2374* **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 unverifiziert2400* **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 den Hinweis während der laufenden Sitzung zurückgibt, kann der Klassifikator eine im Hinweis übermittelte Benutzeraussage als Benutzerabsicht werten. Eine solche Aussage kann eine Zustimmungsanforderung erfüllen, die der Klassifikator auch von einer Nachricht von Ihnen 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 Hinweise als nicht verifizierten Kontext. Wenn Hooks aus beiden Gruppen denselben Aufruf annotieren, behandelt der Klassifikator den kombinierten Hinweis als nicht verifiziert
2375 2401
2376Claude Code wendet beim Zustellen der Notiz diese Grenzen an:2402Claude Code wendet bei der Zustellung des Hinweises diese Grenzen an:
2377 2403
2378* **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 antworten2404* **Länge**: Claude Code begrenzt die Hinweise 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
2379* **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 hat2405* **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 aufgezeichnet hat
2380* **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 ist2406* **Aufrufe, die der Klassifikator nicht aufzeichnet**: Das Transkript des Klassifikators lässt nur lesende Abfragen wie Dateilesevorgänge und Suchen aus. Claude Code verwirft einen Hinweis, der an einen dieser Aufrufe angehängt ist
2381* **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 umschreibt2407* **Zusammenspiel mit Umschreibungen**: Wenn der Hinweis eine Ausgabe beschreibt, die Sie mit `updatedToolOutput` ersetzen, geben Sie beide Felder in derselben Hook-Antwort zurück. Claude Code verwirft den Hinweis, wenn diese Umschreibung abgelehnt wird oder die Umschreibung eines anderen Hooks sie ersetzt. Claude Code stellt einen Hinweis, den Sie ohne Umschreibung zurückgeben, auch dann zu, wenn ein anderer Hook die Ausgabe umschreibt
2382 2408
2383<Warning>2409<Warning>
2384 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.2410 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 den Hinweis auf eine kurze Aussage über diesen einen Aufruf, etwa eine Tatsache über seine Herkunft oder eine Benutzeraussage dazu; verwenden Sie das Feld nicht, um sachfremde Nachrichten oder einen Ereignisstrom zu übermitteln.
2385</Warning>2411</Warning>
2386 2412
2387<h3 id="posttoolusefailure">2413<h3 id="posttoolusefailure">
2388 PostToolUseFailure2414 PostToolUseFailure
2389</h3>2415</h3>
2390 2416
2391Wird ausgeführt, wenn ein Tool, dessen Ausführung begonnen hat, fehlschlägt: Das Tool hat einen Fehler ausgelöst, oder ein MCP-Tool hat ein Fehlerergebnis zurückgegeben. Verwenden Sie dies, um Fehler zu protokollieren, Warnungen zu senden oder Claude korrigierendes Feedback zu geben.2417Läuft, wenn ein Tool, dessen Ausführung begonnen hat, fehlschlägt: Das Tool hat einen Fehler ausgelöst, oder ein MCP-Tool hat ein Fehlerergebnis zurückgegeben. Verwenden Sie dies, um Fehler zu protokollieren, Warnungen zu senden oder Claude korrigierendes Feedback zu geben.
2392 2418
2393Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.2419Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.
2394 2420
2395<Note>2421<Note>
2396 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).2422 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 Schemavalidierung oder toolspezifische Validierung nicht besteht, oder eine Berechtigungsablehnung. Validierungsablehnungen werden als `tool_use_error`-Ergebnisse zurückgegeben und erfolgen, bevor Hooks laufen, sodass sie weder `PreToolUse` noch `PostToolUseFailure` auslösen. Berechtigungsablehnungen lösen `PreToolUse` aus, aber nicht dieses Ereignis; siehe [PermissionDenied](#permissiondenied).
2397</Note>2423</Note>
2398 2424
2399<h4 id="posttoolusefailure-input">2425<h4 id="posttoolusefailure-input">
2400 PostToolUseFailure-Eingabe2426 PostToolUseFailure-Eingabe
2401</h4>2427</h4>
2402 2428
2403PostToolUseFailure-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:2429PostToolUseFailure-Hooks erhalten dieselben Felder `tool_name` und `tool_input` wie PostToolUse sowie Fehlerinformationen als Felder auf oberster 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:
2404 2430
2405```json theme={null}2431```json theme={null}
2406{2432{
2424| Feld | Beschreibung |2450| Feld | Beschreibung |
2425| :- | :- |2451| :- | :- |
2426| `error` | String, der beschreibt, was schiefgelaufen ist. Das Format hängt vom fehlgeschlagenen Tool ab |2452| `error` | String, der beschreibt, was schiefgelaufen ist. Das Format hängt vom fehlgeschlagenen Tool ab |
2427| `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 |2453| `is_interrupt` | Optionaler Boolean. 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 Unterbrechungsmeldung |
2428| `duration_ms` | Optional. Ausführungszeit des Tools in Millisekunden. Ohne die Zeit in Berechtigungsabfragen und PreToolUse-Hooks |2454| `duration_ms` | Optional. Ausführungszeit des Tools in Millisekunden. Ohne die Zeit in Berechtigungsabfragen und PreToolUse-Hooks |
2429 2455
2430Der `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.2456Der `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.
2431 2457
2432* 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 sind2458* Bei Bash und PowerShell erzeugt ein Befehl, der gelaufen und beendet ist, eine erste Zeile `Exit code N`, gefolgt von der Ausgabe des Befehls als ein Block, in dem stdout und stderr verschränkt sind
2433* Eine Payload kann auch eine reine Fehlermeldung ohne Exit-Code-Zeile enthalten, wenn Claude Code den Shell-Prozess selbst nicht starten konnte2459* Eine Payload kann auch eine reine Fehlermeldung ohne Exit-Code-Zeile enthalten, wenn Claude Code den Shell-Prozess selbst nicht starten konnte
2434* 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`2460* 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`
2435 2461
2456 PostToolBatch2482 PostToolBatch
2457</h3>2483</h3>
2458 2484
2459Wird 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.2485Läuft einmal, nachdem jeder Tool-Aufruf in einem Batch abgeschlossen ist, bevor Claude Code die nächste Anfrage an das Modell sendet. `PostToolUse` wird einmal pro Tool ausgelöst, also parallel, 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.
2460 2486
2461<h4 id="posttoolbatch-input">2487<h4 id="posttoolbatch-input">
2462 PostToolBatch-Eingabe2488 PostToolBatch-Eingabe
2463</h4>2489</h4>
2464 2490
2465Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PostToolBatch-Hooks `tool_calls`, ein Array, das jeden Tool-Aufruf im Batch beschreibt:2491Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten PostToolBatch-Hooks `tool_calls`, ein Array, das jeden Tool-Aufruf im Batch beschreibt:
2466 2492
2467```json theme={null}2493```json theme={null}
2468{2494{
2488}2514}
2489```2515```
2490 2516
2491`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.2517`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. Bei `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.
2492 2518
2493<Note>2519<Note>
2494 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.2520 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.
2502 2528
2503| Feld | Beschreibung |2529| Feld | Beschreibung |
2504| :- | :- |2530| :- | :- |
2505| `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 |2531| `additionalContext` | Kontext-String, der einmal vor dem nächsten Modellaufruf eingefügt wird. Unter [Kontext für Claude hinzufügen](#add-context-for-claude) finden Sie Details zur Zustellung, zum geeigneten Inhalt und dazu, wie fortgesetzte Sitzungen mit früheren Werten umgehen |
2506 2532
2507```json theme={null}2533```json theme={null}
2508{2534{
2513}2539}
2514```2540```
2515 2541
2516Die 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.2542Die 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.
2517 2543
2518<h3 id="permissiondenied">2544<h3 id="permissiondenied">
2519 PermissionDenied2545 PermissionDenied
2520</h3>2546</h3>
2521 2547
2522Wird 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.2548Läuft, 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 eigene Anfrage des Klassifikators abgelehnt hat](/docs/de/errors#auto-mode-cannot-determine-the-safety-of-an-action) oder dessen 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 Ablehnungen zu protokollieren, die Konfiguration anzupassen oder dem Modell mitzuteilen, dass es den Tool-Aufruf erneut versuchen darf.
2523 2549
2524Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.2550Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.
2525 2551
2527 PermissionDenied-Eingabe2553 PermissionDenied-Eingabe
2528</h4>2554</h4>
2529 2555
2530Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PermissionDenied-Hooks `tool_name`, `tool_input`, `tool_use_id` und `reason`. Bei einem MCP-Tool erhalten sie außerdem das Objekt [`mcp_server`](#pretooluse-input).2556Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten PermissionDenied-Hooks `tool_name`, `tool_input`, `tool_use_id` und `reason`. Bei einem MCP-Tool erhalten sie außerdem das Objekt [`mcp_server`](#pretooluse-input).
2531 2557
2532```json theme={null}2558```json theme={null}
2533{2559{
2548 2574
2549| Feld | Beschreibung |2575| Feld | Beschreibung |
2550| :- | :- |2576| :- | :- |
2551| `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` |2577| `reason` | Der Ablehnungsgrund. Bei einem Urteil des Klassifikators nennt er in den meisten Sitzungen die zutreffende Regel in eckigen Klammern, etwa `[Data Exfiltration]`; die anderen Formen finden Sie unter [Ablehnungen prüfen](/docs/de/auto-mode-config#review-denials). 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` |
2552 2578
2553<h4 id="permissiondenied-decision-control">2579<h4 id="permissiondenied-decision-control">
2554 PermissionDenied-Entscheidungssteuerung2580 PermissionDenied-Entscheidungssteuerung
2555</h4>2581</h4>
2556 2582
2557PermissionDenied-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:2583PermissionDenied-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:
2558 2584
2559```json theme={null}2585```json theme={null}
2560{2586{
2565}2591}
2566```2592```
2567 2593
2568Wenn `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.2594Wenn `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 macht die Ablehnung selbst nicht rückgängig. Wenn Ihr Hook kein JSON zurückgibt oder `retry: false` zurückgibt, bleibt die Ablehnung bestehen, und das Modell erhält die ursprüngliche Ablehnungsmeldung.
2569 2595
2570Claude 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.2596Claude 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 eigene Anfrage des Klassifikators abgelehnt. Bei diesen Ablehnungen teilt Claude Code dem Modell bereits in der Ablehnungsmeldung mit, ob es später erneut versuchen oder weitermachen soll.
2571 2597
2572<h3 id="notification">2598<h3 id="notification">
2573 Notification2599 Notification
2574</h3>2600</h3>
2575 2601
2576Wird ausgeführt, wenn Claude Code Benachrichtigungen sendet. Matcht auf den Benachrichtigungstyp. Lassen Sie den Matcher weg, um Hooks für alle Benachrichtigungstypen auszuführen.2602Läuft, wenn Claude Code Benachrichtigungen sendet. Matcht auf den Benachrichtigungstyp. Lassen Sie den Matcher weg, um Hooks für alle Benachrichtigungstypen auszuführen.
2577 2603
2578Sie 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.2604Sie 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 läuft.
2579 2605
2580| Matcher | Wann er ausgelöst wird |2606| Matcher | Wann er ausgelöst wird |
2581| :- | :- |2607| :- | :- |
2582| `permission_prompt` | Claude benötigt Ihre Genehmigung für eine Tool-Nutzung oder die [Netzwerkanfrage](/docs/de/sandboxing#network-isolation) eines in einer Sandbox ausgeführten Befehls, und die Abfrage wartet seit etwa sechs Sekunden |2608| `permission_prompt` | Claude benötigt Ihre Genehmigung für eine Tool-Nutzung oder die [Netzwerkanfrage](/docs/de/sandboxing#network-isolation) eines in einer Sandbox ausgeführten Befehls, und die Abfrage wartet seit etwa sechs Sekunden |
2583| `idle_prompt` | Claude hat vor etwa 60 Sekunden die Antwort beendet, und Sie haben seitdem nichts eingegeben |2609| `idle_prompt` | Claude hat vor etwa 60 Sekunden seine Antwort beendet, und Sie haben seitdem nichts eingegeben |
2584| `auth_success` | Die Authentifizierung ist abgeschlossen |2610| `auth_success` | Die Authentifizierung ist abgeschlossen |
2585| `elicitation_dialog` | Ein MCP-Server öffnet ein Elicitation-Formular, und Sie haben seit etwa sechs Sekunden nichts eingegeben |2611| `elicitation_dialog` | Ein MCP-Server öffnet ein Elicitation-Formular, und Sie haben seit etwa sechs Sekunden nichts eingegeben |
2586| `elicitation_url_dialog` | Ein MCP-Server bittet Sie, eine Browser-URL zu öffnen, und Sie haben seit etwa sechs Sekunden nichts eingegeben |2612| `elicitation_url_dialog` | Ein MCP-Server bittet Sie, eine Browser-URL zu öffnen, und Sie haben seit etwa sechs Sekunden nichts eingegeben |
2587| `elicitation_complete` | Ein MCP-Server meldet, dass eine [Elicitation im URL-Modus](#elicitation-input) abgeschlossen ist |2613| `elicitation_complete` | Ein MCP-Server meldet, dass eine [Elicitation im URL-Modus](#elicitation-input) abgeschlossen ist |
2588| `elicitation_response` | Eine MCP-Elicitation-Antwort wird an den Server zurückgesendet |2614| `elicitation_response` | Eine MCP-Elicitation-Antwort wird an den Server zurückgesendet |
2589| `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 |2615| `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 Terminalsitzung Ihnen die [Frage zur Terminal-Einrichtung eines Teammitglieds in einem Agent-Team](/docs/de/agent-teams#choose-a-display-mode) oder den Hinweis des Auto-Modus zu [Kosten für Klassifikatoranfragen](/docs/de/auto-mode-classifier-billing) anzeigt und Sie seit etwa sechs Sekunden nichts eingegeben haben |
2590| `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 |2616| `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 |
2591| `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) |2617| `quota_auto_resume_fired` | Claude Code setzt Ihre Aufgabe fort, nachdem ein claude.ai-Nutzungslimit sie pausiert hatte: 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) |
2592| `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 |2618| `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 |
2593| `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 |2619| `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 Wartezeit, die Claude Code selbst begonnen hat, 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 erreichte. Wird nicht ausgelöst, wenn Sie `Esc` oder `Ctrl+C` drücken oder **Don't continue automatically** wählen |
2594 2620
2595Die Typen `quota_auto_resume_fired`, `quota_auto_resume_stale` und `quota_auto_resume_disabled` erfordern Claude Code v2.1.234 oder höher.2621Die Typen `quota_auto_resume_fired`, `quota_auto_resume_stale` und `quota_auto_resume_disabled` erfordern Claude Code v2.1.234 oder höher.
2596 2622
2597In Terminal-Sitzungen erfordert `permission_prompt` für die Netzwerkanfrage eines in einer Sandbox ausgeführten Befehls Claude Code v2.1.246 oder höher.2623In Terminalsitzungen erfordert `permission_prompt` für die Netzwerkanfrage eines in einer Sandbox ausgeführten Befehls Claude Code v2.1.246 oder höher.
2598 2624
2599`agent_needs_input` für die Frage eines Teammitglieds zur Terminal-Einrichtung erfordert Claude Code v2.1.248 oder höher.2625`agent_needs_input` für die Frage zur Terminal-Einrichtung eines Teammitglieds erfordert Claude Code v2.1.248 oder höher.
2600 2626
2601<Note>2627<Note>
2602 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:2628 Die Typen `permission_prompt`, `idle_prompt`, `elicitation_dialog` und `elicitation_url_dialog` teilen ihr Timing mit Desktop-Benachrichtigungen, sodass Sie sie in Terminalsitzungen nur sehen, wenn Sie scheinbar nicht am Terminal sind:
2603 2629
2604 * 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).2630 * Rechnen Sie mit `permission_prompt`, sobald Sie seit etwa sechs Sekunden nichts eingegeben haben. Der Timer beginnt, wenn die Berechtigungsabfrage erscheint, und jeder Tastendruck verschiebt ihn. Um einen Hook sofort auszuführen, wenn Claude um Berechtigung für die Nutzung eines Tools bittet, verwenden Sie stattdessen [PermissionRequest](#permissionrequest).
2605 * 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.2631 * Rechnen Sie mit `idle_prompt` etwa 60 Sekunden, nachdem Claude seine 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 darauf wartet, dass ein claude.ai-Nutzungslimit zurückgesetzt wird. Wenn die Wartezeit von selbst endet, wird stattdessen einer der Typen `quota_auto_resume_*` ausgelöst.
2606 * 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.2632 * Rechnen Sie mit `elicitation_dialog` für ein Elicitation-Formular oder `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 beginnt, wenn der Dialog erscheint, und jeder Tastendruck verschiebt ihn.
2607 2633
2608 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.2634 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.
2609</Note>2635</Note>
2610 2636
2611Claude 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:2637Claude 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, so wie Claude Desktop und die VS Code-Erweiterung Claude Code hosten:
2612 2638
2613* Rechnen Sie mit `permission_prompt` etwa sechs Sekunden, nachdem Claude um Erlaubnis bittet. Claude Code schiebt es nicht auf, während Sie tippen.2639* Rechnen Sie mit `permission_prompt` etwa sechs Sekunden, nachdem Claude um Berechtigung gebeten hat. Claude Code verschiebt es nicht, während Sie tippen.
2614* Wenn Sie oder ein [PermissionRequest](#permissionrequest)-Hook früher antworten, führt Claude Code `permission_prompt` nicht aus.2640* Wenn Sie oder ein [PermissionRequest](#permissionrequest)-Hook früher antworten, führt Claude Code `permission_prompt` nicht aus.
2615* Setzen Sie [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/de/env-vars) auf `1`, um `permission_prompt` in diesen Sitzungen auszuschalten.2641* Setzen Sie [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/de/env-vars) auf `1`, um `permission_prompt` in diesen Sitzungen auszuschalten.
2616 2642
2617Vor v2.1.233 wurde `permission_prompt` in diesen Sitzungen nicht ausgelöst.2643Vor v2.1.233 wurde `permission_prompt` in diesen Sitzungen nicht ausgelöst.
2618 2644
2619Verwenden 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:2645Verwenden 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:
2620 2646
2621```json theme={null}2647```json theme={null}
2622{2648{
2649 Notification-Eingabe2675 Notification-Eingabe
2650</h4>2676</h4>
2651 2677
2652Zusä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.2678Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten Notification-Hooks `message` mit dem Benachrichtigungstext, einen optionalen `title` und `notification_type`, das angibt, welcher Typ ausgelöst wurde.
2653 2679
2654```json theme={null}2680```json theme={null}
2655{2681{
2669 SubagentStart2695 SubagentStart
2670</h3>2696</h3>
2671 2697
2672Wird 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.2698Läuft, 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, um nach dem Namen des Agententyps zu filtern. 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.
2673 2699
2674Bei 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$`.2700Bei 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$`.
2675 2701
2677 SubagentStart-Eingabe2703 SubagentStart-Eingabe
2678</h4>2704</h4>
2679 2705
2680Zusä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.2706Zusätzlich zu den [allgemeinen 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.
2681 2707
2682```json theme={null}2708```json theme={null}
2683{2709{
2690}2716}
2691```2717```
2692 2718
2693SubagentStart-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:2719SubagentStart-Hooks können die Erstellung von 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:
2694 2720
2695| Feld | Beschreibung |2721| Feld | Beschreibung |
2696| :- | :- |2722| :- | :- |
2705}2731}
2706```2732```
2707 2733
2708Wenn 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.2734Wenn 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, 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 Laufs erneut ein.
2709 2735
2710<h3 id="subagentstop">2736<h3 id="subagentstop">
2711 SubagentStop2737 SubagentStop
2712</h3>2738</h3>
2713 2739
2714Wird ausgeführt, wenn ein Claude Code-Subagent seine Antwort beendet hat. Matcht auf den Agententyp, mit denselben Werten wie SubagentStart.2740Läuft, wenn ein Subagent von Claude Code seine Antwort beendet hat. Matcht auf den Agententyp, mit denselben Werten wie SubagentStart.
2715 2741
2716<h4 id="subagentstop-input">2742<h4 id="subagentstop-input">
2717 SubagentStop-Eingabe2743 SubagentStop-Eingabe
2718</h4>2744</h4>
2719 2745
2720Zusä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.2746Zusätzlich zu den [allgemeinen 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, nach dem der Matcher filtert. `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.
2721 2747
2722Nicht 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.2748Nicht 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 dieser Agenten fertig ist. 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 ein leerer String, wenn die Sitzung ohne einen solchen läuft.
2723 2749
2724Ein `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`.2750Ein `matcher`, der Agententypen nennt, passt nicht auf einen leeren `agent_type`. Ein Hook, dessen Matcher weggelassen wurde, `""` oder `"*"` ist oder ein regulärer Ausdruck ist, der auf einen leeren String passt, läuft auch für Ereignisse mit leerem `agent_type`.
2725 2751
2726Ab 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.2752Ab 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, und nicht den gelieferten Bericht. Der Bericht ist die `message`-Eingabe dieses Aufrufs, die ein `PreToolUse`- oder `PostToolUse`-Hook mit dem Matcher `SubagentHandback` als `tool_input.message` erhält.
2727 2753
2728SubagentStop-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.2754SubagentStop-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.
2729 2755
2744}2770}
2745```2771```
2746 2772
2747SubagentStop-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`.2773SubagentStop-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 übergibt `reason` als nächste Anweisung an den Subagenten. Ein Hook, der durch Exit-Code 2 blockiert, übergibt seine stderr-Meldung 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`.
2748 2774
2749<h3 id="taskcreated">2775<h3 id="taskcreated">
2750 TaskCreated2776 TaskCreated
2751</h3>2777</h3>
2752 2778
2753Wird ausgeführt, wenn eine Aufgabe über das Tool `TaskCreate` erstellt wird. Verwenden Sie dies, um Namenskonventionen durchzusetzen, Aufgabenbeschreibungen zu verlangen oder die Erstellung bestimmter Aufgaben zu verhindern. In einer [Sitzung ohne die Task-Tools](/docs/de/tools-reference#task-tool-availability) wird dieses Ereignis nicht ausgelöst.2779Läuft, wenn eine Aufgabe über das Tool `TaskCreate` erstellt wird. Verwenden Sie dies, um Namenskonventionen durchzusetzen, Aufgabenbeschreibungen zu verlangen oder das Erstellen bestimmter Aufgaben zu verhindern. In einer [Sitzung ohne die Task-Tools](/docs/de/tools-reference#task-tool-availability) wird dieses Ereignis nicht ausgelöst.
2754 2780
2755TaskCreated-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.2781TaskCreated-Hooks unterstützen keine Matcher und werden bei jedem Auftreten ausgelöst.
2756 2782
2757<h4 id="taskcreated-input">2783<h4 id="taskcreated-input">
2758 TaskCreated-Eingabe2784 TaskCreated-Eingabe
2759</h4>2785</h4>
2760 2786
2761Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten TaskCreated-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.2787Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten TaskCreated-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.
2762 2788
2763```json theme={null}2789```json theme={null}
2764{2790{
2776 2802
2777| Feld | Beschreibung |2803| Feld | Beschreibung |
2778| :- | :- |2804| :- | :- |
2779| `task_id` | Bezeichner der zu erstellenden Aufgabe |2805| `task_id` | Bezeichner der Aufgabe, die erstellt wird |
2780| `task_subject` | Titel der Aufgabe |2806| `task_subject` | Titel der Aufgabe |
2781| `task_description` | Ausführliche Beschreibung der Aufgabe. Kann fehlen |2807| `task_description` | Ausführliche Beschreibung der Aufgabe. Kann fehlen |
2782| `teammate_name` | Name des Teammitglieds, das die Aufgabe erstellt. Kann fehlen |2808| `teammate_name` | Name des Teammitglieds, das die Aufgabe erstellt. Kann fehlen |
2783| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einem zukünftigen Release entfernt |2809| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einem zukünftigen Release entfernt |
2784| `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 |2810| `agent_id` | Bei diesem Ereignis identifiziert das [allgemeine 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 |
2785 2811
2786<h4 id="taskcreated-decision-control">2812<h4 id="taskcreated-decision-control">
2787 TaskCreated-Entscheidungssteuerung2813 TaskCreated-Entscheidungssteuerung
2788</h4>2814</h4>
2789 2815
2790Ein TaskCreated-Hook kann die Erstellung mit Exit-Code 2 oder mit einer JSON-Entscheidung blockieren. In beiden Fällen löscht Claude Code die Aufgabe und gibt Ihre Nachricht als Fehler des Tools an Claude zurück. Claude Code ignoriert `continue: false` bei diesem Ereignis, und Claude arbeitet weiter.2816Ein TaskCreated-Hook kann die Erstellung mit Exit-Code 2 oder mit einer JSON-Entscheidung blockieren. In beiden Fällen löscht Claude Code die Aufgabe und gibt Ihre Meldung als Fehler des Tools an Claude zurück. Claude Code ignoriert `continue: false` bei diesem Ereignis, und Claude arbeitet weiter.
2791 2817
2792* **Exit-Code 2**: Claude Code gibt den stderr-Text als Nachricht zurück.2818* **Exit-Code 2**: Claude Code gibt den stderr-Text als Meldung zurück.
2793* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code gibt `reason` als Nachricht zurück.2819* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code gibt `reason` als Meldung zurück.
2794 2820
2795Dieses Beispiel blockiert Aufgaben, deren Betreff nicht dem erforderlichen Format entspricht:2821Dieses Beispiel blockiert Aufgaben, deren Betreff nicht dem erforderlichen Format entspricht:
2796 2822
2811 TaskCompleted2837 TaskCompleted
2812</h3>2838</h3>
2813 2839
2814Wird 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.2840Läuft, wenn eine Aufgabe als abgeschlossen markiert wird. Dies wird in zwei Situationen ausgelöst: 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.
2815 2841
2816TaskCompleted-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.2842TaskCompleted-Hooks unterstützen keine Matcher und werden bei jedem Auftreten ausgelöst.
2817 2843
2818<h4 id="taskcompleted-input">2844<h4 id="taskcompleted-input">
2819 TaskCompleted-Eingabe2845 TaskCompleted-Eingabe
2820</h4>2846</h4>
2821 2847
2822Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten TaskCompleted-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.2848Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten TaskCompleted-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.
2823 2849
2824```json theme={null}2850```json theme={null}
2825{2851{
2838 2864
2839| Feld | Beschreibung |2865| Feld | Beschreibung |
2840| :- | :- |2866| :- | :- |
2841| `task_id` | Bezeichner der abzuschließenden Aufgabe |2867| `task_id` | Bezeichner der Aufgabe, die abgeschlossen wird |
2842| `task_subject` | Titel der Aufgabe |2868| `task_subject` | Titel der Aufgabe |
2843| `task_description` | Ausführliche Beschreibung der Aufgabe. Kann fehlen |2869| `task_description` | Ausführliche Beschreibung der Aufgabe. Kann fehlen |
2844| `teammate_name` | Name des Teammitglieds, das die Aufgabe abschließt. Kann fehlen |2870| `teammate_name` | Name des Teammitglieds, das die Aufgabe abschließt. Kann fehlen |
2845| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einem zukünftigen Release entfernt |2871| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einem zukünftigen Release entfernt |
2846| `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 |2872| `agent_id` | Bei diesem Ereignis identifiziert das [allgemeine 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 |
2847 2873
2848<h4 id="taskcompleted-decision-control">2874<h4 id="taskcompleted-decision-control">
2849 TaskCompleted-Entscheidungssteuerung2875 TaskCompleted-Entscheidungssteuerung
2850</h4>2876</h4>
2851 2877
2852TaskCompleted-Hooks unterstützen zwei Arten, den Abschluss einer Aufgabe zu steuern:2878TaskCompleted-Hooks unterstützen zwei Möglichkeiten, den Aufgabenabschluss zu steuern:
2853 2879
2854* **Exit-Code 2**: Die Aufgabe wird nicht als abgeschlossen markiert, und die stderr-Nachricht wird dem Modell als Feedback zurückgegeben.2880* **Exit-Code 2**: Die Aufgabe wird nicht als abgeschlossen markiert, und die stderr-Meldung wird dem Modell als Feedback zurückgegeben.
2855* **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.2881* **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.
2856 2882
2857Dieses Beispiel führt Tests aus und blockiert den Abschluss der Aufgabe, wenn sie fehlschlagen:2883Dieses Beispiel führt Tests aus und blockiert den Aufgabenabschluss, wenn sie fehlschlagen:
2858 2884
2859```bash theme={null}2885```bash theme={null}
2860#!/bin/bash2886#!/bin/bash
2874 Stop2900 Stop
2875</h3>2901</h3>
2876 2902
2877Wird ausgeführt, wenn der Haupt-Agent von Claude Code seine Antwort beendet hat. Wird nicht ausgeführt, wenn2903Läuft, wenn der Hauptagent von Claude Code seine Antwort beendet hat. Läuft nicht, wenn
2878das Anhalten durch eine Unterbrechung des Benutzers erfolgte. API-Fehler lösen stattdessen2904der Stopp durch eine Unterbrechung des Benutzers erfolgte. API-Fehler lösen
2879[StopFailure](#stopfailure) aus.2905stattdessen [StopFailure](#stopfailure) aus.
2880 2906
2881<Tip>2907<Tip>
2882 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.2908 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.
2886 Stop-Eingabe2912 Stop-Eingabe
2887</h4>2913</h4>
2888 2914
2889Zusä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.2915Zusä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 aufgrund eines Stop-Hooks fortfährt. Prüfen Sie diesen Wert oder verarbeiten Sie das Transkript, um nicht auf eine Bedingung hin zu blockieren, die sich nie auflöst.
2890 2916
2891Claude 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).2917Claude Code wendet eine Obergrenze von 8 aufeinanderfolgenden Fortsetzungen an: Nachdem Stop-Hooks den Turn achtmal in Folge fortgesetzt haben, überschreibt Claude Code die nächste Blockierung und beendet den Turn. Der Zähler 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).
2892 2918
2893Das 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.2919Das 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.
2894 2920
2895Mit 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.2921Mit den Arrays `background_tasks` und `session_crons` können Hooks zwischen „Sitzung ist fertig“ und „Sitzung ist pausiert und wartet darauf, dass Hintergrundarbeit sie wieder aufweckt“ unterscheiden. Beide Arrays sind vorhanden, wenn die Aufgabenregistrierung erreichbar ist, und leer, wenn nichts läuft oder geplant ist.
2896 2922
2897Jeder Eintrag in `background_tasks` beschreibt eine laufende Aufgabe und verwendet diese Felder:2923Jeder Eintrag in `background_tasks` beschreibt eine laufende Aufgabe und verwendet diese Felder:
2898 2924
2899| Feld | Beschreibung |2925| Feld | Beschreibung |
2900| :- | :- |2926| :- | :- |
2901| `id` | Aufgabenbezeichner |2927| `id` | Aufgabenbezeichner |
2902| `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 |2928| `type` | Lesbare Bezeichnung des Aufgabentyps wie `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` oder `MCP task`. Jede Bezeichnung gibt an, welche Funktion von Claude Code die Aufgabe erstellt hat. Bei nicht erkannten Typen wird auf den rohen Diskriminator zurückgegriffen |
2903| `status` | Aktueller Aufgabenstatus |2929| `status` | Aktueller Aufgabenstatus |
2904| `description` | Freitextbeschreibung, begrenzt auf 1000 Zeichen, mit einer Markierung `… [+N chars]` im String, wenn gekürzt |2930| `description` | Freitextbeschreibung, auf 1000 Zeichen begrenzt, mit einer Markierung `… [+N chars]` im String, wenn gekürzt |
2905| `command` | Shell-Befehlszeile, begrenzt auf 1000 Zeichen. Nur bei `shell`-Aufgaben vorhanden |2931| `command` | Shell-Befehlszeile, auf 1000 Zeichen begrenzt. Nur bei `shell`-Aufgaben vorhanden |
2906| `agent_type` | Name des Subagententyps. Nur bei `subagent`-Aufgaben vorhanden |2932| `agent_type` | Name des Subagententyps. Nur bei `subagent`-Aufgaben vorhanden |
2907| `server` | Name des MCP-Servers. Nur bei `monitor`- und `MCP task`-Aufgaben vorhanden |2933| `server` | Name des MCP-Servers. Nur bei `monitor`- und `MCP task`-Aufgaben vorhanden |
2908| `tool` | Name des MCP-Tools. Nur bei `monitor`- und `MCP task`-Aufgaben vorhanden |2934| `tool` | Name des MCP-Tools. Nur bei `monitor`- und `MCP task`-Aufgaben vorhanden |
2909| `name` | Name des Workflows. Nur bei `workflow`-Aufgaben vorhanden |2935| `name` | Workflow-Name. Nur bei `workflow`-Aufgaben vorhanden |
2910 2936
2911Jeder Eintrag in `session_crons` beschreibt ein sitzungsbezogenes, geplantes Aufwecken, das aus `CronCreate`, `ScheduleWakeup` und `/loop` stammt:2937Jeder Eintrag in `session_crons` beschreibt ein sitzungsbezogenes geplantes Aufwecken, das aus `CronCreate`, `ScheduleWakeup` und `/loop` stammt:
2912 2938
2913| Feld | Beschreibung |2939| Feld | Beschreibung |
2914| :- | :- |2940| :- | :- |
2915| `id` | Bezeichner der Cron-Aufgabe |2941| `id` | Bezeichner der Cron-Aufgabe |
2916| `schedule` | Cron-Ausdruck, zum Beispiel `0 9 * * 1-5` |2942| `schedule` | Cron-Ausdruck, zum Beispiel `0 9 * * 1-5` |
2917| `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 |2943| `recurring` | `false` für einmalige Aufweckvorgänge, deren Zeitplan einen einzigen Auslösezeitpunkt kodiert, `true` für Aufgaben, die bei jeder Übereinstimmung erneut ausgelöst werden |
2918| `prompt` | Prompt, der beim Auslösen des Cron übermittelt wird, begrenzt auf 1000 Zeichen mit derselben Markierung `… [+N chars]` |2944| `prompt` | Prompt, der beim Auslösen des Cron-Jobs gesendet wird, auf 1000 Zeichen begrenzt, mit derselben Markierung `… [+N chars]` |
2919 2945
2920Dieses Beispiel zeigt eine Stop-Eingabe mit einer laufenden Shell-Aufgabe und einem wiederkehrenden Cron:2946Dieses Beispiel zeigt eine Stop-Eingabe mit einer laufenden Shell-Aufgabe und einem wiederkehrenden Cron-Job:
2921 2947
2922```json theme={null}2948```json theme={null}
2923{2949{
2957| Feld | Beschreibung |2983| Feld | Beschreibung |
2958| :- | :- |2984| :- | :- |
2959| `decision` | `"block"` verhindert, dass Claude stoppt. Weglassen, um Claude stoppen zu lassen |2985| `decision` | `"block"` verhindert, dass Claude stoppt. Weglassen, um Claude stoppen zu lassen |
2960| `reason` | Erforderlich, wenn `decision` `"block"` ist. Teilt Claude mit, warum es fortfahren soll |2986| `reason` | Erforderlich, wenn `decision` den Wert `"block"` hat. Teilt Claude mit, warum es fortfahren soll |
2961| `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 |2987| `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 |
2962 2988
2963Ein 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.2989Ein Hook, der durch Exit-Code 2 blockiert, wird genauso behandelt wie `reason`: Claude erhält die stderr-Meldung als Erklärung, warum es fortfahren soll.
2964 2990
2965```json theme={null}2991```json theme={null}
2966{2992{
2969}2995}
2970```2996```
2971 2997
2972Verwenden 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:2998Verwenden Sie `additionalContext`, wenn der Hook wie vorgesehen arbeitet und Claude Hinweise gibt, etwa „Führe die Testsuite aus, bevor du fertig bist“. Es hält die Konversation mit denselben Schleifenschutzmechanismen wie `decision: "block"` am Laufen, nämlich der Eingabe `stop_hook_active` und der Obergrenze von 8 aufeinanderfolgenden Fortsetzungen, aber das Transkript kennzeichnet es als `Stop hook feedback`, und es wird keine Hook-Fehlerbenachrichtigung angezeigt:
2973 2999
2974```json theme={null}3000```json theme={null}
2975{3001{
2984 StopFailure3010 StopFailure
2985</h3>3011</h3>
2986 3012
2987Wird anstelle von [Stop](#stop) ausgeführt, wenn der Turn aufgrund eines API-Fehlers endet. Claude Code ignoriert die Ausgabe und den Exit-Code des Hooks, abgesehen von [`terminalSequence`](#emit-terminal-notifications). Verwenden Sie dies, um Fehler zu protokollieren, Warnungen zu senden oder Wiederherstellungsmaßnahmen zu ergreifen, wenn Claude eine Antwort aufgrund von Rate-Limits, Authentifizierungsproblemen oder anderen API-Fehlern nicht abschließen kann.3013Läuft anstelle von [Stop](#stop), wenn der Turn aufgrund eines API-Fehlers endet. Claude Code ignoriert die Ausgabe und den Exit-Code des Hooks, abgesehen von [`terminalSequence`](#emit-terminal-notifications). Verwenden Sie dies, um Fehler zu protokollieren, Warnungen zu senden oder Wiederherstellungsmaßnahmen zu ergreifen, wenn Claude eine Antwort aufgrund von Rate-Limits, Authentifizierungsproblemen oder anderen API-Fehlern nicht abschließen kann.
2988 3014
2989<h4 id="stopfailure-input">3015<h4 id="stopfailure-input">
2990 StopFailure-Eingabe3016 StopFailure-Eingabe
2991</h4>3017</h4>
2992 3018
2993Zusä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.3019Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten StopFailure-Hooks `error`, optional `error_details` und optional `last_assistant_message`. Das Feld `error` identifiziert den Fehlertyp und wird für die Filterung durch den Matcher verwendet.
2994 3020
2995| Feld | Beschreibung |3021| Feld | Beschreibung |
2996| :- | :- |3022| :- | :- |
2997| `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` |3023| `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` |
2998| `error_details` | Zusätzliche Details zum Fehler, sofern verfügbar |3024| `error_details` | Zusätzliche Details zum Fehler, sofern verfügbar |
2999| `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"` |3025| `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-Fehlerstring selbst, etwa `"API Error: Rate limit reached"` |
3000 3026
3001```json theme={null}3027```json theme={null}
3002{3028{
3010}3036}
3011```3037```
3012 3038
3013StopFailure-Hooks haben keine Entscheidungssteuerung. Sie dienen ausschließlich Benachrichtigungs- und Protokollierungszwecken.3039StopFailure-Hooks haben keine Entscheidungssteuerung. Sie laufen nur zu Benachrichtigungs- und Protokollierungszwecken.
3014 3040
3015<h3 id="teammateidle">3041<h3 id="teammateidle">
3016 TeammateIdle3042 TeammateIdle
3017</h3>3043</h3>
3018 3044
3019Wird 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.3045Läuft, wenn ein Teammitglied eines [Agent-Teams](/docs/de/agent-teams) nach Beenden seines Turns gleich in den Leerlauf wechselt. Verwenden Sie dies, um Qualitätsschranken durchzusetzen, bevor ein Teammitglied aufhört zu arbeiten, etwa bestandene Lint-Prüfungen zu verlangen oder zu prüfen, ob Ausgabedateien existieren.
3020 3046
3021TeammateIdle-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.3047TeammateIdle-Hooks unterstützen keine Matcher und werden bei jedem Auftreten ausgelöst.
3022 3048
3023<h4 id="teammateidle-input">3049<h4 id="teammateidle-input">
3024 TeammateIdle-Eingabe3050 TeammateIdle-Eingabe
3025</h4>3051</h4>
3026 3052
3027Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten TeammateIdle-Hooks `teammate_name` und `team_name`.3053Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten TeammateIdle-Hooks `teammate_name` und `team_name`.
3028 3054
3029```json theme={null}3055```json theme={null}
3030{3056{
3040 3066
3041| Feld | Beschreibung |3067| Feld | Beschreibung |
3042| :- | :- |3068| :- | :- |
3043| `teammate_name` | Name des Teammitglieds, das kurz davor ist, inaktiv zu werden |3069| `teammate_name` | Name des Teammitglieds, das gleich in den Leerlauf wechselt |
3044| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einem zukünftigen Release entfernt |3070| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einem zukünftigen Release entfernt |
3045| `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 |3071| `agent_id` | Bei diesem Ereignis identifiziert das [allgemeine Eingabefeld](#common-input-fields) das [In-Process-Teammitglied](/docs/de/agent-teams#choose-a-display-mode), das gleich in den Leerlauf wechselt. Kann fehlen. Erfordert Claude Code v2.1.290 oder höher |
3046 3072
3047<h4 id="teammateidle-decision-control">3073<h4 id="teammateidle-decision-control">
3048 TeammateIdle-Entscheidungssteuerung3074 TeammateIdle-Entscheidungssteuerung
3049</h4>3075</h4>
3050 3076
3051TeammateIdle-Hooks unterstützen zwei Arten, das Verhalten von Teammitgliedern zu steuern:3077TeammateIdle-Hooks unterstützen zwei Möglichkeiten, das Verhalten von Teammitgliedern zu steuern:
3052 3078
3053* **Exit-Code 2**: Das Teammitglied erhält die stderr-Nachricht als Feedback und arbeitet weiter, statt inaktiv zu werden.3079* **Exit-Code 2**: Das Teammitglied erhält die stderr-Meldung als Feedback und arbeitet weiter, statt in den Leerlauf zu wechseln.
3054* **JSON `{"continue": false, "stopReason": "..."}`**: Stoppt das Teammitglied vollständig, entsprechend dem Verhalten des `Stop`-Hooks. Der `stopReason` wird dem Benutzer angezeigt.3080* **JSON `{"continue": false, "stopReason": "..."}`**: Stoppt das Teammitglied vollständig, entsprechend dem Verhalten des `Stop`-Hooks. Der `stopReason` wird dem Benutzer angezeigt.
3055 3081
3056Dieses Beispiel prüft, ob ein Build-Artefakt existiert, bevor ein Teammitglied inaktiv werden darf:3082Dieses Beispiel prüft, ob ein Build-Artefakt existiert, bevor ein Teammitglied in den Leerlauf wechseln darf:
3057 3083
3058```bash theme={null}3084```bash theme={null}
3059#!/bin/bash3085#!/bin/bash
3070 ConfigChange3096 ConfigChange
3071</h3>3097</h3>
3072 3098
3073Wird 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.3099Läuft, wenn sich während einer Sitzung eine Konfigurationsdatei ändert. Verwenden Sie dies, um Änderungen an Einstellungen zu prüfen, Sicherheitsrichtlinien durchzusetzen oder nicht autorisierte Änderungen an Konfigurationsdateien zu blockieren.
3074 3100
3075Claude 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.3101Claude 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. [Servergesteuerte Einstellungen](/docs/de/server-managed-settings) sowie Änderungen an verwalteten macOS-Einstellungen oder Windows-Registry-Richtlinien übernimmt es, ohne die Hooks auszuführen. Unter WSL mit [`wslInheritsWindowsSettings`](/docs/de/settings-reference#wslinheritswindowssettings) übernimmt es außerdem eine geänderte Windows-seitige verwaltete Einstellungsdatei bei seiner Richtlinienabfrage, ohne die Hooks auszuführen.
3076 3102
3077Der Matcher filtert nach der Konfigurationsquelle:3103Der Matcher filtert nach der Konfigurationsquelle:
3078 3104
3108 ConfigChange-Eingabe3134 ConfigChange-Eingabe
3109</h4>3135</h4>
3110 3136
3111Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten ConfigChange-Hooks `source` und optional `file_path`. Das Feld `source` gibt an, welcher Konfigurationstyp sich geändert hat, und `file_path` liefert den Pfad zur konkret geänderten Datei.3137Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten ConfigChange-Hooks `source` und optional `file_path`. Das Feld `source` gibt an, welcher Konfigurationstyp sich geändert hat, und `file_path` liefert den Pfad zur konkret geänderten Datei.
3112 3138
3113```json theme={null}3139```json theme={null}
3114{3140{
3139}3165}
3140```3166```
3141 3167
3142`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.3168Änderungen an `policy_settings` können nicht blockiert werden. Hooks werden für `policy_settings`-Quellen weiterhin ausgelöst, wenn sich eine verwaltete Einstellungsdatei 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 [servergesteuerte Einstellungen](/docs/de/server-managed-settings) eintreffen oder aktualisiert werden.
3143 3169
3144Claude 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.3170Claude Code reagiert auf die Blockierungsentscheidung aus der JSON-Ausgabe eines ConfigChange-Hooks und verwirft `systemMessage` und `continue`. Eine blockierte Änderung zeigt weder Ihnen noch Claude eine Meldung 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.
3145 3171
3146<h3 id="cwdchanged">3172<h3 id="cwdchanged">
3147 CwdChanged3173 CwdChanged
3148</h3>3174</h3>
3149 3175
3150Wird 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.3176Läuft, wenn ein Shell-Befehl in der Hauptkonversation das Arbeitsverzeichnis ändert, etwa 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, etwa für Tools wie [direnv](https://direnv.net/), die Umgebungen pro Verzeichnis verwalten.
3151 3177
3152CwdChanged-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.3178CwdChanged-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.
3153 3179
3154CwdChanged unterstützt keine Matcher und wird bei jedem Vorkommen ausgelöst.3180CwdChanged unterstützt keine Matcher und wird bei jedem Auftreten ausgelöst.
3155 3181
3156<h4 id="cwdchanged-input">3182<h4 id="cwdchanged-input">
3157 CwdChanged-Eingabe3183 CwdChanged-Eingabe
3158</h4>3184</h4>
3159 3185
3160Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten CwdChanged-Hooks `old_cwd` und `new_cwd`.3186Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten CwdChanged-Hooks `old_cwd` und `new_cwd`.
3161 3187
3162```json theme={null}3188```json theme={null}
3163{3189{
3182 3208
3183CwdChanged-Hooks haben keine Entscheidungssteuerung. Sie können den Verzeichniswechsel nicht blockieren.3209CwdChanged-Hooks haben keine Entscheidungssteuerung. Sie können den Verzeichniswechsel nicht blockieren.
3184 3210
3185Claude Code liest `watchPaths` und `systemMessage` aus ihrer JSON-Ausgabe und verwirft `continue`. In interaktiven Sitzungen zeigt es die `systemMessage` als kurze Terminal-Benachrichtigung an. Die Nachricht erreicht den SDK-Nachrichtenstrom nicht.3211Claude Code liest `watchPaths` und `systemMessage` aus ihrer JSON-Ausgabe und verwirft `continue`. In interaktiven Sitzungen zeigt es die `systemMessage` als kurze Terminal-Benachrichtigung an. Die Meldung erreicht den SDK-Nachrichtenstrom nicht.
3186 3212
3187<h3 id="directoryadded">3213<h3 id="directoryadded">
3188 DirectoryAdded3214 DirectoryAdded
3189</h3>3215</h3>
3190 3216
3191Wird 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.3217Läuft, 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, etwa durch Installieren seiner Abhängigkeiten.
3192 3218
3193Claude Code löst dieses Ereignis nicht aus, wenn:3219Claude Code löst dieses Ereignis nicht aus, wenn:
3194 3220
3195* Sie ein Verzeichnis mit dem Start-Flag `--add-dir` übergeben; [SessionStart](#sessionstart) deckt diese Verzeichnisse ab3221* Sie ein Verzeichnis mit dem Start-Flag `--add-dir` übergeben; [SessionStart](#sessionstart) deckt diese Verzeichnisse ab
3196* Sie ein Verzeichnis auf dem Tab „Workspace“ von `/permissions` hinzufügen3222* Sie ein Verzeichnis auf dem Tab „Workspace“ von `/permissions` hinzufügen
3197* Sie ein Verzeichnis hinzufügen, das bereits ein Arbeitsverzeichnis ist oder in einem liegt3223* Sie ein Verzeichnis hinzufügen, das bereits ein Arbeitsverzeichnis ist oder sich innerhalb eines solchen befindet
3198 3224
3199Claude 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.3225Claude 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 läuft. Hook-Befehle selbst laufen ohne Sandbox.
3200 3226
3201Claude 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.3227Claude 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.
3202 3228
3205| Matcher | Wann er ausgelöst wird |3231| Matcher | Wann er ausgelöst wird |
3206| :- | :- |3232| :- | :- |
3207| `slash_command` | Sie fügen ein Verzeichnis mit `/add-dir` hinzu |3233| `slash_command` | Sie fügen ein Verzeichnis mit `/add-dir` hinzu |
3208| `register_repo_root` | Ein SDK-Client fügt ein Verzeichnis mit der Steueranfrage `register_repo_root` hinzu |3234| `register_repo_root` | Ein SDK-Client fügt ein Verzeichnis mit der Steuerungsanfrage `register_repo_root` hinzu |
3209 3235
3210<h4 id="directoryadded-input">3236<h4 id="directoryadded-input">
3211 DirectoryAdded-Eingabe3237 DirectoryAdded-Eingabe
3212</h4>3238</h4>
3213 3239
3214Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten DirectoryAdded-Hooks `directory` und `source`.3240Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten DirectoryAdded-Hooks `directory` und `source`.
3215 3241
3216| Feld | Beschreibung |3242| Feld | Beschreibung |
3217| :- | :- |3243| :- | :- |
3218| `directory` | Absoluter Pfad des hinzugefügten Verzeichnisses |3244| `directory` | Absoluter Pfad des hinzugefügten Verzeichnisses |
3219| `source` | Wie das Verzeichnis hinzugefügt wurde: `"slash_command"` für `/add-dir` oder `"register_repo_root"` für die SDK-Steueranfrage |3245| `source` | Wie das Verzeichnis hinzugefügt wurde: `"slash_command"` für `/add-dir` oder `"register_repo_root"` für die SDK-Steuerungsanfrage |
3220 3246
3221```json theme={null}3247```json theme={null}
3222{3248{
3231 3257
3232DirectoryAdded-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:3258DirectoryAdded-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:
3233 3259
3234* `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-Log3260* `slash_command`: Claude Code übergibt die `systemMessage` des Hooks im nächsten Konversations-Turn als Kontext an Claude, statt sie Ihnen anzuzeigen. Die Anzahl fehlgeschlagener Hooks erscheint im Transkript. Die vollständige Fehlerausgabe wird in das Debug-Log geschrieben
3235* `register_repo_root`: Claude Code schreibt die `systemMessage`-Ausgabe und die Fehlerausgabe nur in das Debug-Log3261* `register_repo_root`: Claude Code schreibt die `systemMessage`-Ausgabe und die Fehlerausgabe nur in das Debug-Log
3236 3262
3237<h3 id="filechanged">3263<h3 id="filechanged">
3238 FileChanged3264 FileChanged
3239</h3>3265</h3>
3240 3266
3241Wird 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.3267Wird ausgeführt, wenn sich eine überwachte Datei auf dem Datenträger ändert. Claude Code erkennt Änderungen mit einem Dateisystem-Watcher und nicht durch Prüfen von Tool-Aufrufen. Daher führt es den Hook 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.
3242 3268
3243Der `matcher` für dieses Ereignis erfüllt zwei Aufgaben:3269Der `matcher` für dieses Ereignis erfüllt zwei Aufgaben:
3244 3270
3245* **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.3271* **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 buchstäblich `^\.env` heißt.
3246* **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.3272* **Filtern, welche Hooks ausgeführt werden**: Wenn sich eine überwachte Datei ändert, filtert derselbe Wert anhand der Standard-[Matcher-Regeln](#matcher-patterns) und des Basisnamens der geänderten Datei, welche Hook-Gruppen ausgeführt werden.
3247 3273
3248Dieses Beispiel normalisiert die Zeilenenden in `data.csv` nach jeder Änderung, auch wenn ein `Bash`-Befehl oder ein externes Skript die Datei neu schreibt:3274Dieses Beispiel normalisiert die Zeilenenden in `data.csv` nach jeder Änderung, auch wenn ein `Bash`-Befehl oder ein externes Skript die Datei neu schreibt:
3249 3275
3265}3291}
3266```3292```
3267 3293
3268Der 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:3294Der 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, nämlich ein CR am Zeilenende, sodass der Durchlauf 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 nichts ersetzt wird, 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:
3269 3295
3270```bash theme={null}3296```bash theme={null}
3271#!/bin/bash3297#!/bin/bash
3275fi3301fi
3276```3302```
3277 3303
3278Um 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.3304Um zu prüfen, ob 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.
3279 3305
3280Um 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 `*`.3306Um Dateien zu überwachen, die Sie nicht vorab benennen können, geben Sie aus einem Hook [`watchPaths`](#filechanged-output) zurück, um die Überwachungsliste dynamisch zu aktualisieren. Claude Code startet den Watcher erst, 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 den Matcher daher bei der Gruppe weg, die dynamische Pfade verarbeitet: Ein fehlender Matcher passt 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 `*`.
3281 3307
3282FileChanged-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.3308FileChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). In diese Datei geschriebene Variablen bleiben für nachfolgende Bash-Befehle erhalten, bis Claude Code sie beim nächsten [CwdChanged](#cwdchanged)-Ereignis löscht.
3283 3309
3284<h4 id="filechanged-input">3310<h4 id="filechanged-input">
3285 FileChanged-Eingabe3311 FileChanged-Eingabe
3313| :- | :- |3339| :- | :- |
3314| `watchPaths` | Array absoluter Pfade. Ersetzt die aktuelle dynamische Überwachungsliste. Pfade aus Ihrer `matcher`-Konfiguration werden immer überwacht. Verwenden Sie dies, wenn Ihr Hook-Skript anhand der geänderten Datei weitere zu überwachende Dateien ermittelt |3340| `watchPaths` | Array absoluter Pfade. Ersetzt die aktuelle dynamische Überwachungsliste. Pfade aus Ihrer `matcher`-Konfiguration werden immer überwacht. Verwenden Sie dies, wenn Ihr Hook-Skript anhand der geänderten Datei weitere zu überwachende Dateien ermittelt |
3315 3341
3316FileChanged-Hooks haben keine Entscheidungssteuerung. Sie können die Dateiänderung nicht verhindern.3342FileChanged-Hooks haben keine Entscheidungskontrolle. Sie können die Dateiänderung nicht verhindern.
3317 3343
3318Claude Code liest `watchPaths` und `systemMessage` aus ihrer JSON-Ausgabe und verwirft `continue`. In interaktiven Sitzungen zeigt es die `systemMessage` als kurze Terminal-Benachrichtigung an. Die Nachricht erreicht den SDK-Nachrichtenstrom nicht.3344Claude Code liest `watchPaths` und `systemMessage` aus ihrer JSON-Ausgabe und verwirft `continue`. In interaktiven Sitzungen zeigt es die `systemMessage` als kurze Terminal-Benachrichtigung an. Die Nachricht erreicht den SDK-Nachrichtenstream nicht.
3319 3345
3320<h3 id="worktreecreate">3346<h3 id="worktreecreate">
3321 WorktreeCreate3347 WorktreeCreate
3328* Ein [Subagent verwendet `isolation: "worktree"`](/docs/de/sub-agents#choose-the-subagent-scope)3354* Ein [Subagent verwendet `isolation: "worktree"`](/docs/de/sub-agents#choose-the-subagent-scope)
3329* Ein [Workflow](/docs/de/workflows#migrate-many-files-in-parallel) führt einen Agenten in einem eigenen Worktree aus3355* Ein [Workflow](/docs/de/workflows#migrate-many-files-in-parallel) führt einen Agenten in einem eigenen Worktree aus
3330* Claude Code isoliert eine [Hintergrundsitzung](/docs/de/agent-view#how-file-edits-are-isolated) in einem eigenen Worktree3356* Claude Code isoliert eine [Hintergrundsitzung](/docs/de/agent-view#how-file-edits-are-isolated) in einem eigenen Worktree
3331* [`claude remote-control`](/docs/de/remote-control#start-a-remote-control-session) startet im `worktree`-Modus eine Sitzung in einem eigenen Worktree3357* [`claude remote-control`](/docs/de/remote-control#start-a-remote-control-session) im Modus `worktree` startet eine Sitzung in einem eigenen Worktree
3332 3358
3333Wenn Claude `git worktree add` über das Bash-Tool ausführt, statt `EnterWorktree` aufzurufen, wird Ihr WorktreeCreate-Hook nicht ausgeführt. Um diesen Befehl zu prüfen oder zu blockieren, fügen Sie einen [`PreToolUse`](#pretooluse)-Hook mit dem Matcher `Bash` hinzu.3359Wenn Claude `git worktree add` über das Bash-Tool ausführt, statt `EnterWorktree` aufzurufen, wird Ihr WorktreeCreate-Hook nicht ausgeführt. Um diesen Befehl zu prüfen oder zu blockieren, fügen Sie einen [`PreToolUse`](#pretooluse)-Hook mit dem Matcher `Bash` hinzu.
3334 3360
3336 3362
3337Da 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.3363Da 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.
3338 3364
3339Der 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.3365Der 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 jeder Hook-Typ den Pfad zurückgibt.
3340 3366
3341Claude Code berücksichtigt den Erfolg des Hooks und den zurückgegebenen Pfad und verwirft `systemMessage` und `continue`.3367Claude Code reagiert auf den Erfolg des Hooks und den zurückgegebenen Pfad und verwirft `systemMessage` und `continue`.
3342 3368
3343Dieses Beispiel erstellt eine SVN-Arbeitskopie und gibt den Pfad aus, den Claude Code verwenden soll. Ersetzen Sie die Repository-URL durch Ihre eigene:3369Dieses Beispiel erstellt eine SVN-Arbeitskopie und gibt den Pfad aus, den Claude Code verwenden soll. Ersetzen Sie die Repository-URL durch Ihre eigene:
3344 3370
3359}3385}
3360```3386```
3361 3387
3362Der Hook liest den Worktree-`name` aus der JSON-Eingabe auf stdin, checkt eine neue Kopie in ein neues Verzeichnis aus und gibt den Verzeichnispfad aus. Das `echo` in der letzten Zeile ist das, was Claude Code als Worktree-Pfad liest. Leiten Sie jede andere Ausgabe nach stderr um, damit sie den Pfad nicht beeinträchtigt.3388Der Hook liest den Worktree-`name` aus der JSON-Eingabe auf stdin, checkt eine neue Kopie in ein neues Verzeichnis aus und gibt den Verzeichnispfad aus. Das `echo` in der letzten Zeile ist das, was Claude Code als Worktree-Pfad liest. Leiten Sie jede andere Ausgabe nach stderr um, damit sie den Pfad nicht stört.
3363 3389
3364<h4 id="worktreecreate-input">3390<h4 id="worktreecreate-input">
3365 WorktreeCreate-Eingabe3391 WorktreeCreate-Eingabe
3366</h4>3392</h4>
3367 3393
3368Zusä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`.3394Zusä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`.
3369 3395
3370```json theme={null}3396```json theme={null}
3371{3397{
3381 WorktreeCreate-Ausgabe3407 WorktreeCreate-Ausgabe
3382</h4>3408</h4>
3383 3409
3384WorktreeCreate-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:3410WorktreeCreate-Hooks verwenden nicht das standardmäßige Allow/Block-Entscheidungsmodell. Stattdessen bestimmt Erfolg oder Fehlschlag des Hooks das Ergebnis. Der Hook muss den Pfad zum erstellten Worktree-Verzeichnis zurückgeben:
3385 3411
3386* **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.3412* **Command-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 Hook-Ausgabe nach stderr um.
3387* **HTTP-Hooks** (`type: "http"`): Geben Sie `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` im Response-Body zurück.3413* **HTTP-Hooks** (`type: "http"`): Geben Sie `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` im Response-Body zurück.
3388 3414
3389Wenn der Hook fehlschlägt oder keinen Pfad liefert, schlägt die Worktree-Erstellung mit einem Fehler fehl.3415Wenn der Hook fehlschlägt oder keinen Pfad liefert, schlägt die Worktree-Erstellung mit einem Fehler fehl.
3390 3416
3391Claude 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.3417Claude Code löst einen relativen Pfad relativ zu dem Verzeichnis auf, in dem der Hook ausgeführt wurde, und fasst dabei alle `.`- 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.
3392 3418
3393Claude 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.3419Claude 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.
3394 3420
3398 3424
3399Wird ausgeführt, wenn Claude Code einen Worktree bereinigt, den Ihr [`WorktreeCreate`](#worktreecreate)-Hook erstellt hat. Das Ereignis wird ausgelöst, wenn:3425Wird ausgeführt, wenn Claude Code einen Worktree bereinigt, den Ihr [`WorktreeCreate`](#worktreecreate)-Hook erstellt hat. Das Ereignis wird ausgelöst, wenn:
3400 3426
3401* 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 fragt3427* Sie eine interaktive [Worktree-Sitzung](/docs/de/worktrees#start-claude-in-a-worktree) beenden und auf Nachfrage von Claude Code entscheiden, den Worktree zu entfernen
3402* 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 entfernt3428* 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
3403* Sie eine [Hintergrundsitzung](/docs/de/agent-view#what-deleting-a-session-removes) löschen, die im Worktree läuft3429* Sie eine [Hintergrundsitzung](/docs/de/agent-view#what-deleting-a-session-removes) löschen, die im Worktree läuft
3404* Sie Claude während einer Sitzung bitten, den Worktree zu verlassen und zu entfernen, und Claude ihn mit dem Tool [`ExitWorktree`](/docs/de/tools-reference) entfernt3430* Sie Claude während einer Sitzung bitten, den Worktree zu verlassen und zu entfernen, und Claude ihn mit dem Tool [`ExitWorktree`](/docs/de/tools-reference) entfernt
3405* Eine Sitzung, die [`claude remote-control`](/docs/de/remote-control#start-a-remote-control-session) im `worktree`-Modus gestartet hat, ohne Absturz endet und Claude Code in ihrem Worktree keine geänderten oder nicht verfolgten Dateien und keine neuen Commits findet3431* Eine Sitzung, die [`claude remote-control`](/docs/de/remote-control#start-a-remote-control-session) im Modus `worktree` gestartet hat, ohne Absturz endet und Claude Code in ihrem Worktree keine geänderten oder nicht verfolgten Dateien und keine neuen Commits findet
3406* Sie `claude remote-control` stoppen, während von ihm im `worktree`-Modus gestartete Sitzungen noch laufen, und Claude Code in deren Worktrees keine geänderten oder nicht verfolgten Dateien und keine neuen Commits findet3432* Sie `claude remote-control` stoppen, während Sitzungen, die es im Modus `worktree` gestartet hat, noch laufen, und Claude Code in deren Worktrees keine geänderten oder nicht verfolgten Dateien und keine neuen Commits findet
3407 3433
3408Wenn ein Subagent oder ein Workflow-Agent fertig ist, behält Claude Code den Worktree, den Ihr WorktreeCreate-Hook dafür erstellt hat, und führt Ihren WorktreeRemove-Hook nicht aus. Entfernen Sie diese Worktrees selbst, wenn die Arbeit erledigt ist.3434Wenn ein Subagent oder ein Workflow-Agent fertig ist, behält Claude Code den Worktree, den Ihr WorktreeCreate-Hook für ihn erstellt hat, und führt Ihren WorktreeRemove-Hook nicht aus. Entfernen Sie diese Worktrees selbst, wenn die Arbeit erledigt ist.
3409 3435
3410Claude Code fragt Sie nicht, bevor Ihr Hook für einen `ExitWorktree`-Aufruf oder eine Bereinigung durch `claude remote-control` ausgeführt wird. `ExitWorktree` weigert sich, einen vom Hook erstellten Worktree zu entfernen, sofern der Aufruf nicht [`discard_changes: true`](/docs/de/agent-sdk/typescript#exitworktree) übergibt, wodurch Ihr Hook auf diesem Weg die letzte Prüfung ist.3436Claude Code fragt nicht bei Ihnen nach, bevor Ihr Hook für einen `ExitWorktree`-Aufruf oder eine Bereinigung durch `claude remote-control` ausgeführt wird. `ExitWorktree` weigert sich, einen per Hook erstellten Worktree zu entfernen, sofern der Aufruf nicht [`discard_changes: true`](/docs/de/agent-sdk/typescript#exitworktree) übergibt. Damit ist Ihr Hook auf diesem Weg die letzte Prüfung.
3411 3437
3412Claude 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.3438Claude Code sucht mit Git nach geänderten oder nicht verfolgten Dateien. Daher findet es in einem Worktree, der kein Git-Checkout ist und auch nicht in einem liegt, 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.
3413 3439
3414Bei 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 zu steuern:3440Bei 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 zu steuern:
3415 3441
3416* **Kein WorktreeRemove-Hook**: Claude Code greift für ein Entfernen beim Beenden oder über `ExitWorktree` ersatzweise auf Git zurück und behält den Worktree, wenn `claude remote-control` bereinigt:3442* **Kein WorktreeRemove-Hook**: Claude Code greift beim Entfernen beim Beenden oder über `ExitWorktree` auf Git zurück und behält den Worktree, wenn `claude remote-control` bereinigt:
3417 * **Sie beenden eine Worktree-Sitzung, oder Claude ruft `ExitWorktree` auf**: Claude Code entfernt den von Ihrem WorktreeCreate-Hook zurückgegebenen Pfad so, wie `git worktree remove --force` es tun würde, 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.3443 * **Sie beenden eine Worktree-Sitzung, oder Claude ruft `ExitWorktree` auf**: Claude Code entfernt den von Ihrem WorktreeCreate-Hook zurückgegebenen Pfad so, wie es `git worktree remove --force` tun würde, sodass ein Worktree, den Git erkennt, entfernt wird. Ein Worktree, den Git nicht erkennt, etwa einer, den Ihr Hook mit einem Nicht-Git-Versionskontrollsystem erstellt hat, bleibt auf dem Datenträger.
3418 * **`claude remote-control` bereinigt den Worktree einer Sitzung**: Der Worktree bleibt auf dem Datenträger, und das Terminal, in dem `claude remote-control` läuft, zeigt `worktree removal failed, kept: <path>` an.3444 * **`claude remote-control` bereinigt den Worktree einer Sitzung**: Der Worktree bleibt auf dem Datenträger, und das Terminal, in dem `claude remote-control` läuft, zeigt `worktree removal failed, kept: <path>` an.
3419 * **Sie löschen eine Hintergrundsitzung**: siehe [Was das Löschen einer Sitzung entfernt](/docs/de/agent-view#what-deleting-a-session-removes).3445 * **Sie löschen eine Hintergrundsitzung**: siehe [Was das Löschen einer Sitzung entfernt](/docs/de/agent-view#what-deleting-a-session-removes).
3420* **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.3446* **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.
3421* **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).3447* **Hook wird mit einem Wert ungleich 0 beendet**: Das Entfernen schlägt fehl, wenn das Verzeichnis unter `worktree_path` danach noch existiert, und der Worktree bleibt ohne Git-Fallback auf dem Datenträger. Ein Hook, der das Verzeichnis gelöscht hat, bevor er mit einem Wert ungleich 0 beendet wurde, gilt als entfernt. Wie der Fehler gemeldet wird, lesen Sie unter [WorktreeRemove-Eingabe](#worktreeremove-input).
3422 3448
3423Claude 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.3449Claude Code löscht nie einen Branch, der zu einem per Hook erstellten Worktree gehört, weil 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.
3424 3450
3425Claude Code verwirft die [JSON-Ausgabefelder](#json-output) eines WorktreeRemove-Hooks, etwa `systemMessage` und `continue`.3451Claude Code verwirft die [JSON-Ausgabefelder](#json-output) eines WorktreeRemove-Hooks, etwa `systemMessage` und `continue`.
3426 3452
3427Beim 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. Auf diesem Weg wird der Hook für einen Worktree, der noch Dateien enthält, nur ausgeführt, wenn Sie das Löschen in der [Agentenansicht](/docs/de/agent-view#what-deleting-a-session-removes) bestätigen; bei einem solchen Worktree behält [`claude rm`](/docs/de/agent-view#manage-sessions-from-the-shell) stattdessen die Sitzung und den Worktree. Vor v2.1.216 wurde der Hook ohne diese Prüfungen auf dem gespeicherten Pfad ausgeführt.3453Beim Löschen einer Hintergrundsitzung überprüft Claude Code den gespeicherten Worktree-Pfad, bevor es den Hook ausführt, und lehnt einen Pfad ab, der ein Symlink ist oder unterhalb des Repository-Stammverzeichnisses durch einen führt. Auf diesem Weg wird der Hook für einen Worktree, der noch Dateien enthält, 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 Sitzung und Worktree. Vor v2.1.216 wurde der Hook ohne diese Prüfungen auf dem gespeicherten Pfad ausgeführt.
3428 3454
3429Claude Code übergibt den von WorktreeCreate zurückgegebenen Pfad als `worktree_path` in der Hook-Eingabe. Dieses Beispiel liest diesen Pfad und entfernt das Verzeichnis:3455Claude Code übergibt den von WorktreeCreate zurückgegebenen Pfad als `worktree_path` in der Hook-Eingabe. Dieses Beispiel liest diesen Pfad und entfernt das Verzeichnis:
3430 3456
3449 WorktreeRemove-Eingabe3475 WorktreeRemove-Eingabe
3450</h4>3476</h4>
3451 3477
3452Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten WorktreeRemove-Hooks das Feld `worktree_path`, das den absoluten Pfad zum zu entfernenden Worktree enthält.3478Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten WorktreeRemove-Hooks das Feld `worktree_path`, den absoluten Pfad zum Worktree, der entfernt wird.
3453 3479
3454```json theme={null}3480```json theme={null}
3455{3481{
3461}3487}
3462```3488```
3463 3489
3464Der 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:3490Der Exit-Code eines WorktreeRemove-Hooks entscheidet über das Ergebnis. Wenn ein Hook mit einem Wert ungleich 0 beendet wird und das Verzeichnis unter `worktree_path` danach noch existiert, schlägt das Entfernen fehl:
3465 3491
3466* Der Worktree bleibt auf der Festplatte, und der Befehl sowie die stderr-Ausgabe des Hooks werden in das [Debug-Log](#debug-hooks) geschrieben.3492* Der Worktree bleibt auf dem Datenträger, und der Befehl sowie stderr des Hooks werden in das [Debug-Log](#debug-hooks) geschrieben.
3467* 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.3493* Wenn Sie eine Hintergrundsitzung gelöscht haben, bleibt auch die Sitzung bestehen. Die Ablehnungsmeldung in der [Agent-Ansicht](/docs/de/agent-view#what-deleting-a-session-removes) meldet, 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.
3468* Wenn `claude remote-control` den Worktree einer Sitzung bereinigt hat, zeigt das Terminal, in dem es läuft, `worktree removal failed, kept: <path>` an.3494* Wenn `claude remote-control` den Worktree einer Sitzung bereinigt hat, zeigt das Terminal, in dem es läuft, `worktree removal failed, kept: <path>` an.
3469 3495
3470<h3 id="precompact">3496<h3 id="precompact">
3478| Matcher | Wann er ausgelöst wird |3504| Matcher | Wann er ausgelöst wird |
3479| :- | :- |3505| :- | :- |
3480| `manual` | `/compact` |3506| `manual` | `/compact` |
3481| `auto` | Automatische Komprimierung, wenn die Konversation das [Fenster für die automatische Komprimierung](/docs/de/model-config#set-the-auto-compact-window) erreicht |3507| `auto` | Automatische Komprimierung, wenn die Konversation das [Fenster für die automatische Komprimierung](/docs/de/model-config#set-the-auto-compact-window) erreicht, sowie [Leerlauf-Komprimierung](/docs/de/settings-reference#idlecompaction) |
3482 3508
3483Beenden 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.3509Beenden 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.
3484 3510
3485Das 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.3511Das Blockieren der automatischen Komprimierung hat je nach Zeitpunkt unterschiedliche Auswirkungen. Wenn die Komprimierung proaktiv vor Erreichen des Kontextlimits 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.
3486 3512
3487Claude Code verwirft die Felder `systemMessage` und `continue` eines PreCompact-Hooks.3513Claude Code verwirft die Felder `systemMessage` und `continue` eines PreCompact-Hooks.
3488 3514
3490 PreCompact-Eingabe3516 PreCompact-Eingabe
3491</h4>3517</h4>
3492 3518
3493Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreCompact-Hooks `trigger` und `custom_instructions`. Bei `manual` enthält `custom_instructions` das, was der Benutzer an `/compact` übergibt, und ist `null`, wenn nichts übergeben wird. Bei `auto` ist `custom_instructions` `null`.3519Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreCompact-Hooks `trigger` und `custom_instructions`. Bei `manual` enthält `custom_instructions`, was der Benutzer an `/compact` übergibt, und ist `null`, wenn nichts übergeben wird. Bei `auto` ist `custom_instructions` `null`.
3494 3520
3495```json theme={null}3521```json theme={null}
3496{3522{
3507 PostCompact3533 PostCompact
3508</h3>3534</h3>
3509 3535
3510Wird 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.3536Wird ausgeführt, nachdem Claude Code eine Komprimierung 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.
3511 3537
3512Es gelten dieselben Matcher-Werte wie für `PreCompact`:3538Es gelten dieselben Matcher-Werte wie für `PreCompact`:
3513 3539
3514| Matcher | Wann er ausgelöst wird |3540| Matcher | Wann er ausgelöst wird |
3515| :- | :- |3541| :- | :- |
3516| `manual` | Nach `/compact` |3542| `manual` | Nach `/compact` |
3517| `auto` | Nach der automatischen Komprimierung, wenn die Konversation das [Fenster für die automatische Komprimierung](/docs/de/model-config#set-the-auto-compact-window) erreicht |3543| `auto` | Nach der automatischen Komprimierung, wenn die Konversation das [Fenster für die automatische Komprimierung](/docs/de/model-config#set-the-auto-compact-window) erreicht, sowie nach der [Leerlauf-Komprimierung](/docs/de/settings-reference#idlecompaction) |
3518 3544
3519<h4 id="postcompact-input">3545<h4 id="postcompact-input">
3520 PostCompact-Eingabe3546 PostCompact-Eingabe
3521</h4>3547</h4>
3522 3548
3523Zusä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.3549Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PostCompact-Hooks `trigger` und `compact_summary`. Das Feld `compact_summary` enthält die von der Komprimierung generierte Zusammenfassung der Konversation.
3524 3550
3525```json theme={null}3551```json theme={null}
3526{3552{
3533}3559}
3534```3560```
3535 3561
3536PostCompact-Hooks haben keine Entscheidungssteuerung. Sie können das Ergebnis der Komprimierung nicht beeinflussen, aber Folgeaufgaben ausführen.3562PostCompact-Hooks haben keine Entscheidungskontrolle. Sie können das Ergebnis der Komprimierung nicht beeinflussen, aber Folgeaufgaben ausführen.
3537 3563
3538<h3 id="premodelswitch">3564<h3 id="premodelswitch">
3539 PreModelSwitch3565 PreModelSwitch
3540</h3>3566</h3>
3541 3567
3542Wird 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.3568Wird 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 vorab anzuzeigen, was der Wechsel kosten wird.
3543 3569
3544PreModelSwitch erfordert Claude Code v2.1.251 oder höher. Claude Code führt ihn für diese Anfragen aus:3570PreModelSwitch erfordert Claude Code v2.1.251 oder höher. Claude Code führt ihn bei diesen Anfragen aus:
3545 3571
3546* `/model <name>` und die `/model`-Auswahl3572* `/model <name>` und die `/model`-Auswahl
3547* Die Modellauswahl über `Option+P` oder `Alt+P`3573* Die Modellauswahl über `Option+P` oder `Alt+P`
3548* Die Einstellung Model in `/config`3574* Die Einstellung „Model“ in `/config`
3549* Das Einschalten des [Fast-Modus](/docs/de/fast-mode), wenn dies das Modell der Sitzung ändert3575* Das Einschalten des [Fast-Modus](/docs/de/fast-mode), wenn dies das Modell der Sitzung ändert
3550* 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)3576* 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)
3551 3577
3552Claude 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).3578Claude 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 die Wiederherstellung des Modells beim Fortsetzen einer Sitzung. Diese Änderungen erreichen nur [PostModelSwitch](#postmodelswitch).
3553 3579
3554Claude 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.3580Claude 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 passen alle auf den einen kanonischen Namen, zu dem sie aufgelöst werden, sodass `claude-opus-5` jede Schreibweise von Opus 5 abdeckt.
3555 3581
3556Wenn 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.3582Wenn 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.
3557 3583
3558Schreiben 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:3584Schreiben 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. So lehnt es einen Wechsel zu Opus 4.6 ab, indem es mit Code 2 beendet wird, und lässt jedes andere Ziel durch:
3559 3585
3560<Tabs>3586<Tabs>
3561 <Tab title="macOS/Linux">3587 <Tab title="macOS/Linux">
3621 </Tab>3647 </Tab>
3622</Tabs>3648</Tabs>
3623 3649
3624Um 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.3650Um 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 Nachricht als Grund.
3625 3651
3626<h4 id="premodelswitch-input">3652<h4 id="premodelswitch-input">
3627 PreModelSwitch-Eingabe3653 PreModelSwitch-Eingabe
3628</h4>3654</h4>
3629 3655
3630Zusä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.3656Zusä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 vor dem Wechsel anzeigen kann.
3631 3657
3632| Feld | Typ | Beschreibung |3658| Feld | Typ | Beschreibung |
3633| :- | :- | :- |3659| :- | :- | :- |
3634| `from_model` | string | Modell-ID, von der aus gewechselt wird |3660| `from_model` | string | Modell-ID, von der gewechselt wird |
3635| `to_model` | string | Modell-ID, zu der gewechselt wird. Der Matcher wird mit dem kanonischen Namen dieses Modells verglichen |3661| `to_model` | string | Modell-ID, zu der gewechselt wird. Der Matcher wird mit dem kanonischen Namen dieses Modells verglichen |
3636| `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 |3662| `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 |
3637| `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 |3663| `source` | string | Woher die Anfrage stammt: `"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 |
3638| `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 |3664| `context_tokens` | number | Token, die die nächste Anfrage erneut als Prompt sendet: Eingabe-, Cache-Lese-, Cache-Erstellungs- und Ausgabe-Token der letzten Antwort in der Hauptkonversation zusammengenommen. `0` vor der ersten Antwort |
3639| `prompt_cache_warm` | boolean | Ob der Prompt-Cache des aktuellen Modells wahrscheinlich noch warm ist, was bedeutet, dass der Wechsel ihn verwirft |3665| `prompt_cache_warm` | boolean | Ob der Prompt-Cache des aktuellen Modells wahrscheinlich noch warm ist, sodass er durch den Wechsel verloren geht |
3640| `cache_ttl` | string | [Lebensdauer des Prompt-Caches](/docs/de/prompt-caching#cache-lifetime), die Claude Code für diese Sitzung anfordert: `"5m"` oder `"1h"` |3666| `cache_ttl` | string | [Prompt-Cache-Lebensdauer](/docs/de/prompt-caching#cache-lifetime), die Claude Code für diese Sitzung anfordert: `"5m"` oder `"1h"` |
3641| `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 |3667| `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 |
3642| `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 |3668| `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 |
3643 3669
3644Dieses Beispiel zeigt die Eingabe für `/model opus` in einer Sitzung, die Sonnet 5 verwendet:3670Dieses Beispiel zeigt die Eingabe für `/model opus` in einer Sitzung mit Sonnet 5:
3645 3671
3646```json theme={null}3672```json theme={null}
3647{3673{
3662```3688```
3663 3689
3664<h4 id="premodelswitch-decision-control">3690<h4 id="premodelswitch-decision-control">
3665 PreModelSwitch-Entscheidungssteuerung3691 PreModelSwitch-Entscheidungskontrolle
3666</h4>3692</h4>
3667 3693
3668`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.3694`PreModelSwitch`-Hooks können den Wechsel abbrechen, den Benutzer um Bestätigung bitten oder ihn durchführen lassen. Exit-Code 2 oder ein `decision: "block"` auf oberster Ebene bricht den Wechsel ab.
3669 3695
3670Fü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:3696Fü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:
3671 3697
3672| Feld | Beschreibung |3698| Feld | Beschreibung |
3673| :- | :- |3699| :- | :- |
3674| `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 |3700| `permissionDecision` | `"allow"` führt den Wechsel durch 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 |
3675| `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 |3701| `permissionDecisionReason` | Bei `"deny"` wird er dem Benutzer als Grund für die Blockierung 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 |
3676 3702
3677Nur `/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.3703Nur `/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.
3678 3704
3679Dieses Beispiel bittet den Benutzer um Bestätigung und nennt die Anzahl der Token aus `context_tokens`:3705Dieses Beispiel bittet den Benutzer um Bestätigung und nennt die Token-Anzahl aus `context_tokens`:
3680 3706
3681```json theme={null}3707```json theme={null}
3682{3708{
3688}3714}
3689```3715```
3690 3716
3691Wenn mehrere PreModelSwitch-Hooks unterschiedliche Entscheidungen zurückgeben, gilt der Vorrang `deny` > `ask` > `allow`.3717Wenn mehrere PreModelSwitch-Hooks unterschiedliche Entscheidungen zurückgeben, gilt die Rangfolge `deny` > `ask` > `allow`.
3692 3718
3693Claude 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.3719Claude Code zeigt dem Benutzer jede `systemMessage`, die Ihr Hook zurückgibt, unabhängig von der Entscheidung an. Ein Hook, der Kosten meldet, kann also `{"systemMessage": "..."}` zurückgeben und mit 0 beendet werden.
3694 3720
3695Ein PreModelSwitch-Hook, der nicht vor seinem Timeout antwortet, blockiert den Wechsel. Was ein Timeout bei anderen Ereignissen bewirkt, erfahren Sie unter [Timeouts](#timeouts). Der Standard-Timeout für dieses Ereignis beträgt 30 Sekunden. `PreModelSwitch` führt nur `command`-, `http`- und `mcp_tool`-Hooks aus, daher gelten die Standardwerte für `prompt` und `agent` nicht.3721Ein PreModelSwitch-Hook, der nicht vor Ablauf seines Timeouts antwortet, blockiert den Wechsel. Was ein Timeout bei anderen Ereignissen bewirkt, lesen Sie unter [Timeouts](#timeouts). Der Standard-Timeout für dieses Ereignis beträgt 30 Sekunden. `PreModelSwitch` führt nur `command`-, `http`- und `mcp_tool`-Hooks aus, daher gelten die Standardwerte für `prompt` und `agent` nicht.
3696 3722
3697Ein Hook, der mit einem anderen Code als 0 oder 2 beendet wird und keine JSON-Entscheidung ausgibt, ist ein nicht blockierender Fehler, wie unter [Andere Exit-Codes](#other-exit-codes) beschrieben.3723Ein Hook, der mit einem anderen Code als 0 oder 2 beendet wird und keine JSON-Entscheidung ausgibt, ist ein nicht blockierender Fehler, wie unter [Andere Exit-Codes](#other-exit-codes) beschrieben.
3698 3724
3700 PostModelSwitch3726 PostModelSwitch
3701</h3>3727</h3>
3702 3728
3703Wird 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.3729Wird 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, etwa eine organisationsweite Anweisung, die für bestimmte Modelle gilt.
3704 3730
3705PostModelSwitch 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:3731PostModelSwitch 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:
3706 3732
3707* Einem Wechsel, den Sie oder ein Client angefordert haben3733* Ein von Ihnen oder einem Client angeforderter Wechsel
3708* Einem [automatischen Modell-Fallback](/docs/de/model-config#automatic-model-fallback), der das Modell der Sitzung ändert3734* Ein [automatischer Modell-Fallback](/docs/de/model-config#automatic-model-fallback), der das Modell der Sitzung ändert
3709* Einer Einstellung wie [`opusplan`](/docs/de/model-config#opusplan-model-setting), die in den Plan-Modus wechselt oder ihn verlässt3735* Eine Einstellung wie [`opusplan`](/docs/de/model-config#opusplan-model-setting), die den Plan-Modus betritt oder verlässt
3710* Der Wiederherstellung des Modells durch Claude Code, wenn Sie eine Sitzung fortsetzen3736* Claude Code stellt das Modell wieder her, wenn Sie eine Sitzung fortsetzen
3711 3737
3712Claude 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.3738Claude 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.
3713 3739
3714Der Matcher folgt denselben Regeln wie bei [PreModelSwitch](#premodelswitch): Claude Code vergleicht ihn mit dem kanonischen Namen des Modells, zu dem die Sitzung gewechselt hat.3740Der Matcher folgt denselben Regeln wie bei [PreModelSwitch](#premodelswitch): Claude Code vergleicht ihn mit dem kanonischen Namen des Modells, zu dem die Sitzung gewechselt hat.
3715 3741
3733}3759}
3734```3760```
3735 3761
3736Um 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.3762Um zu prüfen, ob der Hook funktioniert, wechseln Sie aus einer Sitzung mit einem anderen Modell zu einem Opus-Modell, führen Sie also zum Beispiel `/model opus` in einer Sonnet-Sitzung aus, und fragen Sie Claude dann, welche Hinweise es zum aktuellen Modell hat.
3737 3763
3738<h4 id="postmodelswitch-input">3764<h4 id="postmodelswitch-input">
3739 PostModelSwitch-Eingabe3765 PostModelSwitch-Eingabe
3740</h4>3766</h4>
3741 3767
3742PostModelSwitch-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.3768PostModelSwitch-Hooks erhalten dieselben Felder wie [PreModelSwitch](#premodelswitch-input), wobei `hook_event_name` auf `"PostModelSwitch"` gesetzt ist, und zwei weitere `source`-Werte: `"auto"` für einen automatischen Fallback oder eine andere Änderung, die Claude Code selbst vorgenommen hat, und `"resume"` für das beim Fortsetzen einer Sitzung wiederhergestellte Modell.
3743 3769
3744`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.3770`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.
3745 3771
3746<h4 id="postmodelswitch-decision-control">3772<h4 id="postmodelswitch-decision-control">
3747 PostModelSwitch-Entscheidungssteuerung3773 PostModelSwitch-Entscheidungskontrolle
3748</h4>3774</h4>
3749 3775
3750Claude 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:3776Claude Code übernimmt bei Exit 0 die [reine Textausgabe auf stdout](#exit-code-0) Ihres Hooks oder `additionalContext` aus der JSON-Ausgabe und übergibt 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:
3751 3777
3752| Feld | Beschreibung |3778| Feld | Beschreibung |
3753| :- | :- |3779| :- | :- |
3754| `additionalContext` | Zeichenfolge, die Claudes Kontext mit der nächsten Anfrage hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |3780| `additionalContext` | String, der Claudes Kontext mit der nächsten Anfrage hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
3755 3781
3756Wenn 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.3782Wenn 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, übergibt Claude Code nur die Ausgabe für das Zielmodell des letzten Wechsels.
3757 3783
3758<h3 id="sessionend">3784<h3 id="sessionend">
3759 SessionEnd3785 SessionEnd
3760</h3>3786</h3>
3761 3787
3762Wird ausgeführt, wenn eine Claude Code-Sitzung endet. Nützlich für Bereinigungsaufgaben, das Protokollieren von Sitzungsstatistiken3788Wird ausgeführt, wenn eine Claude-Code-Sitzung endet. Nützlich für Aufräumarbeiten, das Protokollieren von Sitzungsstatistiken
3763oder das Speichern des Sitzungszustands. Unterstützt Matcher, um nach dem Beendigungsgrund zu filtern.3789oder das Speichern des Sitzungszustands. Unterstützt Matcher zum Filtern nach dem Beendigungsgrund.
3764 3790
3765Das Feld `reason` in der Hook-Eingabe gibt an, warum die Sitzung beendet wurde:3791Das Feld `reason` in der Hook-Eingabe gibt an, warum die Sitzung beendet wurde:
3766 3792
3789}3815}
3790```3816```
3791 3817
3792SessionEnd-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`.3818SessionEnd-Hooks haben keine Entscheidungskontrolle. Sie können das Beenden der Sitzung nicht blockieren, aber Aufräumarbeiten ausführen. Claude Code verwirft ihre [JSON-Ausgabefelder](#json-output), etwa `systemMessage`.
3793 3819
3794SessionEnd-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:3820SessionEnd-Hooks haben einen Standard-Timeout von 1,5 Sekunden. Er gilt, wenn Sie beenden, `/clear` ausführen oder mit interaktivem `/resume` die Sitzung wechseln. Sie können einem Hook auf zwei Arten mehr Zeit geben:
3795 3821
3796* **`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.3822* **`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 gesetzt sind, erhöhen das Budget nicht.
3797* **`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`.3823* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: Setzen Sie diese Umgebungsvariable in Millisekunden, um das Budget explizit zu überschreiben. Der gesetzte Wert wird außerdem zum Timeout für jeden Hook ohne eigenen `timeout`.
3798 3824
3799Dieses Beispiel setzt das Budget auf 5 Sekunden:3825Dieses Beispiel setzt das Budget auf 5 Sekunden:
3800 3826
3808 Elicitation3834 Elicitation
3809</h3>3835</h3>
3810 3836
3811Wird 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.3837Wird ausgeführt, wenn ein MCP-Server mitten in 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.
3812 3838
3813Einen vollständigen Hook mit seinem Einstellungseintrag und Skript finden Sie unter [Eine Formularanfrage über ein Skript beantworten](#answer-a-form-request-from-a-script).3839Einen vollständigen Hook mit Einstellungseintrag und Skript finden Sie unter [Eine Formularanfrage per Skript beantworten](#answer-a-form-request-from-a-script).
3814 3840
3815Das Matcher-Feld wird mit dem Namen des MCP-Servers abgeglichen.3841Das Matcher-Feld wird mit dem Namen des MCP-Servers abgeglichen.
3816 3842
3859 Elicitation-Ausgabe3885 Elicitation-Ausgabe
3860</h4>3886</h4>
3861 3887
3862Ein 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:3888Ein 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 und was der MCP-Server erhält:
3863 3889
3864| Ziel | Rückgabe | Der Server erhält |3890| Ziel | Rückgabe | Der Server erhält |
3865| :- | :- | :- |3891| :- | :- | :- |
3866| Für den Benutzer antworten | `"action": "accept"`, mit den Werten der Formularfelder in `content` | `accept` mit Ihrem `content` |3892| Für den Benutzer antworten | `"action": "accept"`, mit den Formularfeldwerten in `content` | `accept` mit Ihrem `content` |
3867| Die Anfrage ablehnen | `"action": "decline"` | `decline` |3893| Die Anfrage ablehnen | `"action": "decline"` | `decline` |
3868| Die Anfrage abbrechen | `"action": "cancel"` | `cancel` |3894| Die Anfrage abbrechen | `"action": "cancel"` | `cancel` |
3869| 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) |3895| 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) |
3870 3896
3871Diese 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:3897Diese Ausgabe beantwortet die unter [Elicitation-Eingabe](#elicitation-input) gezeigte Anfrage im Formularmodus. Die Schlüssel in `content` sind die Eigenschaftsnamen aus dem `requested_schema` dieser Anfrage:
3872 3898
3873```json theme={null}3899```json theme={null}
3874{3900{
3893}3919}
3894```3920```
3895 3921
3896Im 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.3922Im Dialog sendet die Auswahl von **Decline** `decline` und das Drücken von `Esc` sendet `cancel`. Geben Sie also den Wert zurück, den der Server sehen soll.
3897 3923
3898Bei einer Anfrage im URL-Modus überspringt ein Hook, der `accept` zurückgibt, den Dialog, sodass die URL nie geöffnet wird.3924Bei einer Anfrage im URL-Modus überspringt ein Hook, der `accept` zurückgibt, den Dialog, sodass die URL nie geöffnet wird.
3899 3925
3900Claude Code verwirft `reason`, `systemMessage` und `continue` aus der JSON-Ausgabe eines Elicitation-Hooks, unabhängig davon, welche `action` Sie zurückgeben.3926Claude Code verwirft `reason`, `systemMessage` und `continue` aus der JSON-Ausgabe eines Elicitation-Hooks, unabhängig davon, welche `action` Sie zurückgeben.
3901 3927
3902<h4 id="other-ways-to-decline-an-elicitation">3928<h4 id="other-ways-to-decline-an-elicitation">
3903 Andere Möglichkeiten, eine Elicitation abzulehnen3929 Weitere Möglichkeiten, eine Elicitation abzulehnen
3904</h4>3930</h4>
3905 3931
3906Ihr Hook kann auch auf diese Weise ablehnen. Der Server erhält dasselbe `decline` wie bei `"action": "decline"`:3932Ihr Hook kann auch auf diese Weise ablehnen. Der Server erhält dasselbe `decline` wie bei `"action": "decline"`:
3907 3933
3908* **Beendet mit Code 2**: Claude Code ignoriert ein vom selben Hook ausgegebenes `hookSpecificOutput`3934* **Beenden mit Code 2**: Claude Code ignoriert ein vom selben Hook ausgegebenes `hookSpecificOutput`
3909* **Gibt ein `"decision": "block"` auf oberster Ebene aus**: Die Blockierung überschreibt eine `action` in derselben Ausgabe3935* **Ausgabe eines `"decision": "block"` auf oberster Ebene**: Die Blockierung überschreibt eine `action` in derselben Ausgabe
3910 3936
3911Wenn mehrere Hooks auf dieselbe Anfrage zutreffen, überschreibt eine Ablehnung durch einen von ihnen ein `accept` oder `cancel` eines anderen.3937Wenn mehrere Hooks auf dieselbe Anfrage passen, überschreibt eine Ablehnung durch einen von ihnen ein `accept` oder `cancel` eines anderen.
3912 3938
3913Dieses Skript lehnt Anfragen im URL-Modus ab und überlässt Formularanfragen dem Dialog:3939Dieses Skript lehnt Anfragen im URL-Modus ab und überlässt Formularanfragen dem Dialog:
3914 3940
3921 3947
3922Weder der Benutzer noch der Server sieht, warum Ihr Hook abgelehnt hat, da Claude Code weder Ihre stderr-Ausgabe noch Ihren `reason` anzeigt.3948Weder der Benutzer noch der Server sieht, warum Ihr Hook abgelehnt hat, da Claude Code weder Ihre stderr-Ausgabe noch Ihren `reason` anzeigt.
3923 3949
3924Claude Code ignorierte ein `decision` auf oberster Ebene von `Elicitation`- und `ElicitationResult`-Hooks ab v2.1.105 bis zur Korrektur in v2.1.284.3950Claude Code ignorierte eine `decision` auf oberster Ebene von `Elicitation`- und `ElicitationResult`-Hooks ab v2.1.105 bis zur Korrektur in v2.1.284.
3925 3951
3926<h4 id="answer-a-form-request-from-a-script">3952<h4 id="answer-a-form-request-from-a-script">
3927 Eine Formularanfrage über ein Skript beantworten3953 Eine Formularanfrage per Skript beantworten
3928</h4>3954</h4>
3929 3955
3930Dieses 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.3956Dieses 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.
4012 </Tab>4038 </Tab>
4013</Tabs>4039</Tabs>
4014 4040
4015Um 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.4041Um zu prüfen, ob der Hook funktioniert, starten Sie Claude Code mit `claude --debug` und geben 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.
4016 4042
4017<h3 id="elicitationresult">4043<h3 id="elicitationresult">
4018 ElicitationResult4044 ElicitationResult
4047 ElicitationResult-Ausgabe4073 ElicitationResult-Ausgabe
4048</h4>4074</h4>
4049 4075
4050Ein 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:4076Ein 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 und was der MCP-Server erhält:
4051 4077
4052| Ziel | Rückgabe | Der Server erhält |4078| Ziel | Rückgabe | Der Server erhält |
4053| :- | :- | :- |4079| :- | :- | :- |
4054| Die Antwort durchlassen | Keine Ausgabe, mit Exit-Code 0 | Die Antwort des Benutzers, unverändert |4080| Die Antwort durchlassen | Keine Ausgabe, mit Exit-Code 0 | Die Antwort des Benutzers, unverändert |
4055| Die übermittelten Werte ändern | `"action": "accept"`, mit den neuen Werten in `content` | `accept` mit Ihrem `content` anstelle der Werte des Benutzers |4081| Die übermittelten Werte ändern | `"action": "accept"`, mit den neuen Werten in `content` | `accept` mit Ihrem `content` anstelle der Werte des Benutzers |
4056| Die Antwort blockieren | `"action": "decline"` | `decline`, ohne die Werte des Benutzers |4082| Die Antwort blockieren | `"action": "decline"` | `decline`, ohne die Werte des Benutzers |
4057| Die Anfrage abbrechen | `"action": "cancel"` | `cancel`, zusammen mit den vom Benutzer übermittelten Werten. Um diese zurückzuhalten, geben Sie `"decline"` zurück |4083| Die Anfrage abbrechen | `"action": "cancel"` | `cancel`, zusammen mit den Werten, die der Benutzer übermittelt hat. Um sie zurückzuhalten, geben Sie `"decline"` zurück |
4058 4084
4059Diese Ausgabe ändert die unter [ElicitationResult-Eingabe](#elicitationresult-input) gezeigte Antwort, sodass der Server `alice@example.com` erhält, wo der Benutzer `alice` übermittelt hat:4085Diese Ausgabe ändert die unter [ElicitationResult-Eingabe](#elicitationresult-input) gezeigte Antwort, sodass der Server `alice@example.com` erhält, wo der Benutzer `alice` übermittelt hat:
4060 4086
4070}4096}
4071```4097```
4072 4098
4073Ihr `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.4099Ihr `content` ersetzt das gesamte `content`-Objekt des Benutzers, also fügen Sie auch die Felder ein, die Sie nicht ändern. Geben Sie `action` mit zurück, da Claude Code ein `hookSpecificOutput` ohne `action` ignoriert.
4074 4100
4075ElicitationResult-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:4101ElicitationResult-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 macht Ihr Hook aus einer abgelehnten Anfrage eine akzeptierte. Dieses Skript nimmt dieselbe Änderung vor, wenn der Benutzer akzeptiert hat, behält die anderen Felder bei und gibt andernfalls nichts aus:
4076 4102
4077```bash theme={null}4103```bash theme={null}
4078#!/bin/bash4104#!/bin/bash
4094}4120}
4095```4121```
4096 4122
4097Exit-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.4123Exit-Code 2 und ein `"decision": "block"` auf oberster Ebene blockieren die Antwort ebenfalls. Unter [Weitere 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.
4098 4124
4099Claude Code verwirft `reason`, `systemMessage` und `continue` aus der JSON-Ausgabe eines ElicitationResult-Hooks, unabhängig davon, welche `action` Sie zurückgeben.4125Claude Code verwirft `reason`, `systemMessage` und `continue` aus der JSON-Ausgabe eines ElicitationResult-Hooks, unabhängig davon, welche `action` Sie zurückgeben.
4100 4126
4351* **Allein auf stdout**: Wenn die Antwort der einzige Text auf stdout ist, kann sie sich über mehrere Zeilen erstrecken, etwa bei formatierter `jq`-Ausgabe. Mehrzeilige Antworten erfordern Claude Code v2.1.295 oder höher.4377* **Allein auf stdout**: Wenn die Antwort der einzige Text auf stdout ist, kann sie sich über mehrere Zeilen erstrecken, etwa bei formatierter `jq`-Ausgabe. Mehrzeilige Antworten erfordern Claude Code v2.1.295 oder höher.
4352* **In einer eigenen Zeile**: Ein asynchroner Hook kann anderen Text auf stdout ausgeben, wenn die Antwort allein in eine Zeile passt, zum Beispiel mit `jq -c`.4378* **In einer eigenen Zeile**: Ein asynchroner Hook kann anderen Text auf stdout ausgeben, wenn die Antwort allein in eine Zeile passt, zum Beispiel mit `jq -c`.
4353 4379
4354Claude Code validiert diese JSON-Response gegen das gleiche [Ausgabeschema](#json-output) wie synchrone Hooks und verwirft jedes Feld, dessen Wert den falschen Typ hat, wie z. B. eine `systemMessage`, die keine Zeichenkette ist, anstatt es zu liefern. Führen Sie mit `--debug` aus, um eine Warnung zu sehen, die jedes verworfene Feld benennt. Vor v2.1.202 konnte fehlerhafte JSON-Ausgabe von einem asynchronen Hook die Sitzung zum Absturz bringen, und der Absturz trat jedes Mal auf, wenn die Sitzung fortgesetzt wurde.4380Claude Code validiert diese JSON-Antwort gegen das gleiche [Ausgabeschema](#json-output) wie synchrone Hooks und verwirft jedes Feld, dessen Wert den falschen Typ hat, wie z. B. eine `systemMessage`, die keine Zeichenkette ist, anstatt es zu liefern. Führen Sie mit `--debug` aus, um eine Warnung zu sehen, die jedes verworfene Feld benennt.
4355 4381
4356Benachrichtigungen über den Abschluss asynchroner Hooks werden standardmäßig unterdrückt. Um sie zu sehen, aktivieren Sie den ausführlichen Modus mit `Ctrl+O` oder starten Sie Claude Code mit `--verbose`.4382Benachrichtigungen über den Abschluss asynchroner Hooks werden standardmäßig unterdrückt. Um sie zu sehen, aktivieren Sie den ausführlichen Modus mit `Ctrl+O` oder starten Sie Claude Code mit `--verbose`.
4357 4383