40| :- | :- |40| :- | :- |
41| `SessionStart` | Wenn eine Sitzung beginnt oder fortgesetzt wird |41| `SessionStart` | Wenn eine Sitzung beginnt oder fortgesetzt wird |
42| `Setup` | Wenn Sie Claude Code mit `--init-only` starten oder mit `--init` oder `--maintenance` im `-p`-Modus. Für einmalige Vorbereitung in CI oder Skripten |42| `Setup` | Wenn Sie Claude Code mit `--init-only` starten oder mit `--init` oder `--maintenance` im `-p`-Modus. Für einmalige Vorbereitung in CI oder Skripten |
43| `UserPromptSubmit` | Wenn Sie eine Eingabeaufforderung absenden, bevor Claude sie verarbeitet |43| `UserPromptSubmit` | Wenn ein Prompt abgesendet wird, bevor Claude ihn verarbeitet. Wird auch bei [Turns ausgelöst, die Claude Code selbst startet](/docs/de/hooks#userpromptsubmit) |
44| `UserPromptExpansion` | Wenn ein von Ihnen eingegebener Befehl in eine Eingabeaufforderung erweitert wird, bevor sie Claude erreicht. Kann die Erweiterung blockieren |44| `UserPromptExpansion` | Wenn ein von Ihnen eingegebener Befehl in eine Eingabeaufforderung erweitert wird, bevor sie Claude erreicht. Kann die Erweiterung blockieren |
45| `PreToolUse` | Bevor ein Werkzeugaufruf ausgeführt wird. Kann ihn blockieren |45| `PreToolUse` | Bevor ein Werkzeugaufruf ausgeführt wird. Kann ihn blockieren |
46| `PermissionRequest` | Wenn ein Werkzeugaufruf eine Genehmigungsentscheidung benötigt |46| `PermissionRequest` | Wenn ein Werkzeugaufruf eine Genehmigungsentscheidung benötigt |
1159 Hook-Ereignisse1159 Hook-Ereignisse
1160</h2>1160</h2>
1161 1161
1162Jedes Ereignis entspricht einem Punkt im Lebenszyklus von Claude Code, an dem Hooks ausgeführt werden können. Die folgenden Abschnitte sind in der Reihenfolge des Lebenszyklus angeordnet: von der Sitzungseinrichtung über die agentengesteuerte Schleife bis zum Sitzungsende. Jeder Abschnitt beschreibt, wann das Ereignis ausgelöst wird, welche Matcher es unterstützt, welche JSON-Eingabe es empfängt und wie das Verhalten durch die Ausgabe gesteuert wird.1162Jedes Ereignis entspricht einem Punkt im Lebenszyklus von Claude Code, an dem Hooks ausgeführt werden können. Die folgenden Abschnitte sind in der Reihenfolge des Lebenszyklus angeordnet: von der Einrichtung der Sitzung über die Agentenschleife bis zum Ende der Sitzung. Jeder Abschnitt beschreibt, wann das Ereignis ausgelöst wird, welche Matcher es unterstützt, welche JSON-Eingabe es erhält und wie Sie das Verhalten über die Ausgabe steuern.
1163 1163
1164<h3 id="sessionstart">1164<h3 id="sessionstart">
1165 SessionStart1165 SessionStart
1166</h3>1166</h3>
1167 1167
1168Wird ausgeführt, wenn Claude Code eine neue Sitzung startet oder eine vorhandene Sitzung fortsetzt. Nützlich zum Laden von Entwicklungskontext wie vorhandenen Problemen oder kürzlichen Änderungen an Ihrer Codebasis oder zum Einrichten von Umgebungsvariablen. Für statischen Kontext, der kein Skript erfordert, verwenden Sie stattdessen [CLAUDE.md](/docs/de/memory).1168Wird 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).
1169 1169
1170SessionStart wird bei jeder Sitzung ausgeführt, daher halten Sie diese Hooks schnell. Nur `type: "command"` und `type: "mcp_tool"` Hooks werden unterstützt. Siehe [MCP-Tool-Hook-Felder](#mcp-tool-hook-fields) für den Fall, dass `mcp_tool` Hooks ausgeführt werden.1170SessionStart wird bei jeder Sitzung ausgeführt, halten Sie diese Hooks daher schnell. Nur Hooks vom Typ `type: "command"` und `type: "mcp_tool"` werden unterstützt. Unter [MCP-Tool-Hook-Felder](#mcp-tool-hook-fields) erfahren Sie, wann `mcp_tool`-Hooks ausgeführt werden.
1171 1171
1172Der Matcher-Wert entspricht der Art, wie die Sitzung initiiert wurde:1172Der Matcher-Wert entspricht der Art, wie die Sitzung gestartet wurde:
1173 1173
1174| Matcher | Wann wird es ausgelöst |1174| Matcher | Wann er ausgelöst wird |
1175| :- | :- |1175| :- | :- |
1176| `startup` | Neue Sitzung |1176| `startup` | Neue Sitzung |
1177| `resume` | `--resume`, `--continue` oder `/resume` |1177| `resume` | `--resume`, `--continue` oder `/resume` |
1178| `clear` | `/clear` |1178| `clear` | `/clear` |
1179| `compact` | Automatische oder manuelle Komprimierung |1179| `compact` | Automatische oder manuelle Komprimierung |
1180| `fork` | Eine neue Sitzung, die aus einer vorhandenen abgezweigt wurde: `--fork-session` mit `--resume` oder `--continue`, die `/fork` Hintergrundkopie, `/branch` oder eine Konversation, die Sie [in den Hintergrund verschieben](/docs/de/agent-view#from-inside-a-session) |1180| `fork` | Eine neue Sitzung, die von einer bestehenden abgezweigt wurde: `--fork-session` mit `--resume` oder `--continue`, die Hintergrundkopie von `/fork`, `/branch` oder eine Konversation, die Sie [in den Hintergrund verschieben](/docs/de/agent-view#from-inside-a-session) |
1181 1181
1182Vor v2.1.214 meldeten abgezweigte Sitzungen die Quelle `"resume"`.1182Vor v2.1.214 meldeten abgezweigte Sitzungen die Quelle `"resume"`.
1183 1183
1184Wenn Sie eine interaktive Sitzung starten, eine Konversation beim Start mit `--continue` oder `--resume` fortsetzen oder `/clear` ausführen, werden SessionStart-Hooks im Hintergrund ausgeführt. Sie können sofort tippen, und eine Konversation, die Sie fortgesetzt haben, wird angezeigt, ohne auf die Hooks zu warten. Claudes erste Antwort wartet immer noch darauf, dass die Hooks fertig sind, damit ihr Kontext Claude erreicht.1184Wenn Sie eine interaktive Sitzung starten, beim Start eine Konversation mit `--continue` oder `--resume` fortsetzen oder `/clear` ausführen, laufen SessionStart-Hooks im Hintergrund. Sie können sofort tippen, und eine fortgesetzte Konversation erscheint, ohne auf die Hooks zu warten. Claudes erste Antwort wartet dennoch, bis die Hooks abgeschlossen sind, damit deren Kontext Claude erreicht.
1185 1185
1186Wenn Sie Konversationen mit `/resume` innerhalb einer Sitzung wechseln, wartet der Wechsel darauf, dass die Hooks fertig sind. Wenn Sie `/clear` ausführen oder zu einer anderen Konversation wechseln, während Hintergrund-Hooks noch ausgeführt werden, gilt nichts, was sie zurückgeben, für die Sitzung.1186Wenn Sie innerhalb einer Sitzung mit `/resume` die Konversation wechseln, wartet der Wechsel stattdessen, bis die Hooks abgeschlossen sind. Wenn Sie `/clear` ausführen oder zu einer anderen Konversation wechseln, während Hintergrund-Hooks noch laufen, wird nichts von dem, was sie zurückgeben, auf die Sitzung angewendet.
1187 1187
1188Die gleiche Wartezeit gilt beim Start, einschließlich einer fortgesetzten Sitzung: eine Eingabeaufforderung, die Sie senden, während SessionStart-Hooks noch ausgeführt werden, erreicht Claude erst, wenn sie fertig sind.1188Dieselbe Wartezeit gilt beim Start, auch für eine fortgesetzte Sitzung: Ein Prompt, den Sie senden, während SessionStart-Hooks noch laufen, erreicht Claude erst, wenn diese abgeschlossen sind.
1189 1189
1190Während einer dieser Wartezeiten können Sie `Esc` drücken, um die Eingabeaufforderung ohne Senden zurück in die Eingabe zu nehmen. Die Hooks werden weiterhin ausgeführt.1190Drücken Sie während einer dieser Wartezeiten `Esc`, um den Prompt zurück in die Eingabe zu holen, ohne ihn zu senden. Die Hooks laufen weiter.
1191 1191
1192<h4 id="sessionstart-input">1192<h4 id="sessionstart-input">
1193 SessionStart-Eingabe1193 SessionStart-Eingabe
1194</h4>1194</h4>
1195 1195
1196Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten SessionStart-Hooks `source` und optional `model`, `agent_type` und `session_title`:1196Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SessionStart-Hooks `source` und optional `model`, `agent_type` und `session_title`:
1197 1197
1198| Feld | Beschreibung |1198| Feld | Beschreibung |
1199| :- | :- |1199| :- | :- |
1200| `source` | Wie die Sitzung gestartet wurde: `"startup"` für neue Sitzungen, `"resume"` für fortgesetzte Sitzungen, `"clear"` nach `/clear`, `"compact"` nach Komprimierung oder `"fork"` für eine neue Sitzung, die aus einer vorhandenen abgezweigt wurde |1200| `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 |
1201| `model` | Der aktive Modellbezeichner. Er kann weggelassen werden, z. B. nach `/clear` oder wenn eine Sitzung durch Konversationswiederherstellung wiederhergestellt wird, daher überprüfen Sie das Feld, bevor Sie es lesen |1201| `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 |
1202| `agent_type` | Der Agent-Name, vorhanden, wenn Sie Claude Code mit `claude --agent <name>` starten |1202| `agent_type` | Der Name des Agenten, vorhanden, wenn Sie Claude Code mit `claude --agent <name>` starten |
1203| `session_title` | Der aktuelle Sitzungstitel, falls bereits gesetzt, z. B. über `--name`, `/rename`, einen Hook-`sessionTitle` oder das Agent SDK `renameSession()`. Ein Hook, der `sessionTitle` ausgibt, kann `session_title` zuerst überprüfen, um zu vermeiden, dass ein Titel überschrieben wird, den der Benutzer explizit gesetzt hat |1203| `session_title` | Der benutzerdefinierte Titel der Sitzung, vorhanden, wenn einer gesetzt ist, zum Beispiel mit `--name`, `/rename`, der `sessionTitle`-Ausgabe eines Hooks oder `renameSession()` des Agent SDK. Ein Hook, der `sessionTitle` ausgibt, kann zuerst dieses Feld prüfen, um einen bestehenden benutzerdefinierten Titel nicht zu überschreiben |
1204 1204
1205Eine Sitzung, die Sie nicht benannt haben, kann immer noch einen [generierten Titel](/docs/de/sessions#name-your-sessions) haben. Dieser Titel ist kein benutzerdefinierter Titel und erscheint nicht in `session_title`.1205Eine 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`.
1206 1206
1207Wenn `source` `"resume"` oder `"fork"` ist und das Transkript mindestens eine Antwort von Claude enthält, erhalten SessionStart-Hooks auch die vier folgenden Felder. Ihr Hook kann sie verwenden, um zu melden, welche Kosten das Fortsetzen einer veralteten Konversation vor der ersten Anfrage verursacht, z. B. in einer [`systemMessage`](#json-output). Diese Felder erfordern Claude Code v2.1.251 oder später.1207Wenn `source` den Wert `"resume"` oder `"fork"` hat und das Transkript mindestens eine Antwort von Claude enthält, erhalten SessionStart-Hooks zusätzlich die folgenden vier Felder. Ihr Hook kann damit vor der ersten Anfrage melden, was das Fortsetzen einer veralteten Konversation kostet, zum Beispiel in einer [`systemMessage`](#json-output). Diese Felder erfordern Claude Code v2.1.251 oder höher.
1208 1208
1209| Feld | Beschreibung |1209| Feld | Beschreibung |
1210| :- | :- |1210| :- | :- |
1211| `seconds_since_last_response` | Echtzeit-Sekunden seit der letzten Antwort im fortgesetzten Transkript |1211| `seconds_since_last_response` | Echtzeit in Sekunden seit der letzten Antwort im fortgesetzten Transkript |
1212| `context_tokens` | Token, die die erste Anfrage der fortgesetzten Sitzung als ihre Eingabeaufforderung erneut sendet |1212| `context_tokens` | Token, die die erste Anfrage der fortgesetzten Sitzung erneut als Prompt sendet |
1213| `prompt_cache_likely_expired` | `true`, wenn die letzte Antwort älter ist als die [Prompt-Cache-Lebensdauer](/docs/de/prompt-caching#cache-lifetime) der Sitzung oder eine spätere Komprimierung die zwischengespeicherte Konversation ersetzt hat |1213| `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 |
1214| `estimated_cache_write_usd` | Geschätzte Kosten in US-Dollar für das Schreiben von `context_tokens` in den Prompt-Cache auf dem Modell der Sitzung, ohne die Antwort |1214| `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 |
1215 1215
1216Dieses Beispiel zeigt die Eingabe für eine Sitzung, die 90 Minuten nach ihrer letzten Antwort fortgesetzt wurde:1216Dieses Beispiel zeigt die Eingabe für eine Sitzung, die 90 Minuten nach ihrer letzten Antwort fortgesetzt wurde:
1217 1217
1231```1231```
1232 1232
1233<h4 id="sessionstart-decision-control">1233<h4 id="sessionstart-decision-control">
1234 SessionStart-Entscheidungskontrolle1234 SessionStart-Entscheidungssteuerung
1235</h4>1235</h4>
1236 1236
1237Claude Code fügt stdout, das es [als Klartext behandelt](#exit-code-0), zu Claudes Kontext hinzu. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, können Sie diese ereignisspezifischen Felder zurückgeben:1237Claude Code fügt stdout, das es [als reinen Text behandelt](#exit-code-0), zu Claudes Kontext hinzu. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können Sie diese ereignisspezifischen Felder zurückgeben:
1238 1238
1239| Feld | Beschreibung |1239| Feld | Beschreibung |
1240| :- | :- |1240| :- | :- |
1241| `additionalContext` | String, der zu Claudes Kontext am Anfang der Konversation vor der ersten Eingabeaufforderung hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) für die Lieferweise und was Sie darin einfügen sollten |1241| `additionalContext` | Zeichenkette, die zu Beginn der Konversation vor dem ersten Prompt zu Claudes Kontext hinzugefügt wird. Unter [Kontext für Claude hinzufügen](#add-context-for-claude) erfahren Sie, wie der Text übermittelt wird und was hineingehört |
1242| `initialUserMessage` | String, der als erste Benutzernachricht der Sitzung verwendet wird. Gilt im [nicht-interaktiven Modus](/docs/de/headless) mit dem `-p` Flag, wo es zum ersten Zug wird, auch wenn keine Eingabeaufforderung bereitgestellt wird. Wenn eine Eingabeaufforderung bereitgestellt wird, folgt sie als nächster Zug. Im Gegensatz zu `additionalContext`, das an einen vorhandenen Zug angehängt wird, erstellt dies den Zug |1242| `initialUserMessage` | Zeichenkette, die als erste Benutzernachricht der Sitzung verwendet wird. Gilt im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p`, wo sie zum ersten Turn wird, auch wenn kein Prompt angegeben ist. Wird ein Prompt angegeben, folgt er als nächster Turn. Anders als `additionalContext`, das an einen bestehenden Turn angehängt wird, erzeugt dieses Feld den Turn |
1243| `sessionTitle` | Legt den Sitzungstitel fest, mit der gleichen Wirkung wie `/rename`. Verwenden Sie dies, um Sitzungen automatisch aus dem Start-Ordner, Git-Branch oder Worktree-Namen zu benennen. Gilt, wenn `source` `"startup"`, `"resume"` oder `"fork"` ist; wird bei `"clear"` und `"compact"` ignoriert |1243| `sessionTitle` | Setzt den Sitzungstitel, mit derselben Wirkung wie `/rename`. Verwenden Sie es, um Sitzungen automatisch nach dem Startordner, dem Git-Branch oder dem Worktree-Namen zu benennen. Gilt, wenn `source` den Wert `"startup"`, `"resume"` oder `"fork"` hat; wird bei `"clear"` und `"compact"` ignoriert |
1244| `watchPaths` | Array von absoluten Pfaden zum Überwachen von [FileChanged](#filechanged) Ereignissen während dieser Sitzung |1244| `watchPaths` | Array absoluter Pfade, die während dieser Sitzung auf [FileChanged](#filechanged)-Ereignisse überwacht werden |
1245| `reloadSkills` | Boolean. Wenn `true`, scannt Claude Code die [Skill](/docs/de/skills) und Befehlsverzeichnisse erneut, nachdem die SessionStart-Hooks abgeschlossen sind, damit Skills, die der Hook installiert hat, in der gleichen Sitzung verfügbar sind, beginnend mit der ersten Eingabeaufforderung |1245| `reloadSkills` | Boolescher Wert. Bei `true` durchsucht Claude Code die [Skill](/docs/de/skills)- und Befehlsverzeichnisse erneut, nachdem die SessionStart-Hooks abgeschlossen sind, sodass vom Hook installierte Skills in derselben Sitzung ab dem ersten Prompt verfügbar sind |
1246 1246
1247```json theme={null}1247```json theme={null}
1248{1248{
1254}1254}
1255```1255```
1256 1256
1257Da Klartext-stdout bereits dieses Ereignis für Claude erreicht, kann ein Hook, der nur Kontext lädt, direkt zu stdout drucken, ohne JSON zu erstellen. Verwenden Sie das JSON-Format, wenn Sie Kontext mit anderen Feldern wie `sessionTitle` kombinieren müssen.1257Da reines stdout bei diesem Ereignis Claude bereits erreicht, kann ein Hook, der nur Kontext lädt, direkt auf stdout ausgeben, ohne JSON zu erzeugen. Verwenden Sie die JSON-Form, wenn Sie Kontext mit anderen Feldern wie `sessionTitle` kombinieren müssen.
1258 1258
1259Verwenden Sie `reloadSkills`, wenn ein SessionStart-Hook Skills installiert oder aktualisiert. Die Skill-Erkennung wird normalerweise ausgeführt, bevor SessionStart-Hooks fertig sind, daher würden Dateien, die der Hook in `~/.claude/skills/` oder `.claude/skills/` schreibt, sonst erst in der nächsten Sitzung angezeigt. Dieses Beispiel synchronisiert ein gemeinsames Skills-Repository und fordert die erneute Überprüfung an:1259Verwenden Sie `reloadSkills`, wenn ein SessionStart-Hook Skills installiert oder aktualisiert. Die Skill-Erkennung läuft normalerweise, bevor SessionStart-Hooks abgeschlossen sind, sodass Dateien, die der Hook in `~/.claude/skills/` oder `.claude/skills/` schreibt, sonst erst in der nächsten Sitzung erscheinen würden. Dieses Beispiel synchronisiert ein gemeinsames Skills-Repository und fordert die erneute Durchsuchung an:
1260 1260
1261```bash theme={null}1261```bash theme={null}
1262#!/bin/bash1262#!/bin/bash
1267echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1267echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1268```1268```
1269 1269
1270Die Repository-URL ist ein Platzhalter; ersetzen Sie sie durch Ihr eigenes Skills-Repository. Mit dem Platzhalter schlägt der Klon fehl und druckt eine `fatal:` Nachricht zu stderr. Stderr von einem SessionStart-Hook, der mit 0 beendet wird, ist nur informativ, daher gilt die `reloadSkills` Anfrage immer noch.1270Die Repository-URL ist ein Platzhalter; ersetzen Sie sie durch Ihr eigenes Skills-Repository. Mit dem Platzhalter schlägt das Klonen fehl und gibt eine `fatal:`-Meldung auf stderr aus. Stderr eines SessionStart-Hooks, der mit 0 beendet wird, dient nur zur Information, daher gilt die `reloadSkills`-Anfrage trotzdem.
1271 1271
1272<h4 id="persist-environment-variables">1272<h4 id="persist-environment-variables">
1273 Umgebungsvariablen beibehalten1273 Umgebungsvariablen dauerhaft speichern
1274</h4>1274</h4>
1275 1275
1276SessionStart-Hooks haben Zugriff auf die `CLAUDE_ENV_FILE` Umgebungsvariable, die einen Dateipfad bereitstellt, in dem Sie Umgebungsvariablen für nachfolgende Bash-Befehle beibehalten können.1276SessionStart-Hooks haben Zugriff auf die Umgebungsvariable `CLAUDE_ENV_FILE`, die einen Dateipfad bereitstellt, unter dem Sie Umgebungsvariablen für nachfolgende Bash-Befehle dauerhaft speichern können.
1277 1277
1278Um einzelne Umgebungsvariablen zu setzen, schreiben Sie `export` Anweisungen in `CLAUDE_ENV_FILE`. Verwenden Sie Anhängen (`>>`), um von anderen Hooks gesetzte Variablen zu bewahren:1278Um einzelne Umgebungsvariablen zu setzen, schreiben Sie `export`-Anweisungen in `CLAUDE_ENV_FILE`. Verwenden Sie Anhängen (`>>`), um von anderen Hooks gesetzte Variablen zu erhalten:
1279 1279
1280```bash theme={null}1280```bash theme={null}
1281#!/bin/bash1281#!/bin/bash
1289exit 01289exit 0
1290```1290```
1291 1291
1292Um alle Umgebungsänderungen von Setup-Befehlen zu erfassen, vergleichen Sie die exportierten Variablen vorher und nachher:1292Um alle Umgebungsänderungen durch Einrichtungsbefehle zu erfassen, vergleichen Sie die exportierten Variablen vorher und nachher:
1293 1293
1294```bash theme={null}1294```bash theme={null}
1295#!/bin/bash1295#!/bin/bash
1309```1309```
1310 1310
1311<Note>1311<Note>
1312 `CLAUDE_ENV_FILE` ist für SessionStart, [Setup](#setup), [CwdChanged](#cwdchanged) und [FileChanged](#filechanged) Hooks verfügbar. Andere Hook-Typen haben keinen Zugriff auf diese Variable.1312 `CLAUDE_ENV_FILE` ist für SessionStart-, [Setup](#setup)-, [CwdChanged](#cwdchanged)- und [FileChanged](#filechanged)-Hooks verfügbar. Andere Hook-Typen haben keinen Zugriff auf diese Variable.
1313</Note>1313</Note>
1314 1314
1315<h3 id="setup">1315<h3 id="setup">
1316 Setup1316 Setup
1317</h3>1317</h3>
1318 1318
1319Wird nur ausgeführt, wenn Sie Claude Code mit `--init-only` starten oder mit `--init` oder `--maintenance` im [nicht-interaktiven Modus](/docs/de/headless) mit dem `-p` Flag. Es wird nicht beim normalen Start ausgeführt. Verwenden Sie es für einmalige Abhängigkeitsinstallation oder geplante Bereinigung, die Sie explizit von CI oder Skripten aus auslösen, getrennt vom normalen Sitzungsstart. Für Initialisierung pro Sitzung verwenden Sie stattdessen [SessionStart](#sessionstart).1319Wird nur ausgelöst, wenn Sie Claude Code mit `--init-only` oder mit `--init` bzw. `--maintenance` im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p` starten. Beim normalen Start wird es nicht ausgelöst. Verwenden Sie es für die einmalige Installation von Abhängigkeiten oder für geplante Bereinigungen, die Sie explizit aus CI oder Skripten auslösen, getrennt vom normalen Sitzungsstart. Für die Initialisierung pro Sitzung verwenden Sie stattdessen [SessionStart](#sessionstart).
1320 1320
1321Der Matcher-Wert entspricht dem CLI-Flag, das den Hook ausgelöst hat:1321Der Matcher-Wert entspricht dem CLI-Flag, das den Hook ausgelöst hat:
1322 1322
1323| Matcher | Wann wird es ausgelöst |1323| Matcher | Wann er ausgelöst wird |
1324| :- | :- |1324| :- | :- |
1325| `init` | `claude --init-only` oder `claude -p --init` |1325| `init` | `claude --init-only` oder `claude -p --init` |
1326| `maintenance` | `claude -p --maintenance` |1326| `maintenance` | `claude -p --maintenance` |
1327 1327
1328Wenn Sie `claude --init-only` ausführen, führt Claude Code Setup-Hooks und `SessionStart` Hooks mit dem `startup` Matcher aus und beendet sich dann, ohne eine Konversation zu starten.1328Wenn 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.
1329 1329
1330Wenn Sie eine Konversation mit `-p` starten oder fortsetzen, müssen Sie auch eine Eingabeaufforderung bereitstellen, als Argument oder über stdin weitergeleitet. Sie können die Eingabeaufforderung überspringen, wenn ein `SessionStart` Hook [`initialUserMessage`](#sessionstart-decision-control) bereitstellt oder wenn Sie eine Sitzung mit einem [aufgeschobenen Tool-Aufruf](#defer-a-tool-call-for-later) fortsetzen.1330Wenn Sie eine Konversation mit `-p` starten oder fortsetzen, müssen Sie außerdem einen Prompt angeben, als Argument oder über stdin weitergeleitet. Sie können den Prompt weglassen, wenn ein `SessionStart`-Hook [`initialUserMessage`](#sessionstart-decision-control) liefert oder wenn Sie eine Sitzung mit einem [zurückgestellten Tool-Aufruf](#defer-a-tool-call-for-later) fortsetzen.
1331 1331
1332Bei Erfolg druckt `--init-only` nichts auf das Terminal. Um zu bestätigen, dass die Hooks ausgeführt wurden, starten Sie mit `claude --debug-file <path> --init-only`, ersetzen Sie `<path>` durch einen Protokolldateispeicherort, und überprüfen Sie das Protokoll auf die Setup- und SessionStart-Hook-Einträge.1332Bei Erfolg gibt `--init-only` nichts im Terminal aus. Um zu bestätigen, dass die Hooks ausgeführt wurden, starten Sie mit `claude --debug-file <path> --init-only`, ersetzen `<path>` durch einen Speicherort für die Logdatei und prüfen das Log auf die Einträge der Setup- und SessionStart-Hooks.
1333 1333
1334Da Setup nicht bei jedem Start ausgeführt wird, kann sich ein Plugin, das eine Abhängigkeit installiert haben muss, nicht nur auf Setup verlassen. Das praktische Muster ist, die Abhängigkeit bei der ersten Verwendung zu überprüfen und bei Fehlen zu installieren, z. B. ein Hook oder Skill, der auf `${CLAUDE_PLUGIN_DATA}/node_modules` testet und `npm install` ausführt, wenn nicht vorhanden. Siehe das [persistente Datenverzeichnis](/docs/de/plugins/components#path-variables-and-persistent-data) für den Speicherort installierter Abhängigkeiten. Wenn Sie Ihr Plugin über einen Marketplace verteilen, benötigen Sie möglicherweise dieses Muster nicht: Claude Code [installiert automatisch berechtigte Node.js-Paketabhängigkeiten](/docs/de/plugins/loading#node-js-package-dependencies), wenn es das Plugin zwischenspeichert.1334Da Setup nicht bei jedem Start ausgelöst wird, kann sich ein Plugin, das eine installierte Abhängigkeit benötigt, nicht allein auf Setup verlassen. Das praktikable Muster besteht darin, bei der ersten Verwendung auf die Abhängigkeit zu prüfen und sie bei Fehlen zu installieren, zum Beispiel mit einem Hook oder Skill, der auf `${CLAUDE_PLUGIN_DATA}/node_modules` prüft und `npm install` ausführt, wenn es fehlt. Unter [Persistentes Datenverzeichnis](/docs/de/plugins/components#path-variables-and-persistent-data) erfahren Sie, wo installierte Abhängigkeiten gespeichert werden. Wenn Sie Ihr Plugin über einen Marketplace verteilen, benötigen Sie dieses Muster möglicherweise nicht: Claude Code [installiert geeignete Node.js-Paketabhängigkeiten automatisch](/docs/de/plugins/loading#node-js-package-dependencies), wenn es das Plugin im Cache speichert.
1335 1335
1336<h4 id="setup-input">1336<h4 id="setup-input">
1337 Setup-Eingabe1337 Setup-Eingabe
1338</h4>1338</h4>
1339 1339
1340Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten Setup-Hooks ein `trigger` Feld, das auf `"init"` oder `"maintenance"` gesetzt ist:1340Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten Setup-Hooks ein Feld `trigger`, das entweder auf `"init"` oder `"maintenance"` gesetzt ist:
1341 1341
1342```json theme={null}1342```json theme={null}
1343{1343{
1350```1350```
1351 1351
1352<h4 id="setup-decision-control">1352<h4 id="setup-decision-control">
1353 Setup-Entscheidungskontrolle1353 Setup-Entscheidungssteuerung
1354</h4>1354</h4>
1355 1355
1356Setup-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, wie `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.1356Setup-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.
1357 1357
1358Setup-Hooks haben Zugriff auf `CLAUDE_ENV_FILE`. Variablen, die in diese Datei geschrieben werden, bleiben für nachfolgende Bash-Befehle für die Sitzung bestehen, genau wie in [SessionStart-Hooks](#persist-environment-variables). Nur `type: "command"` Hooks werden auf `Setup` ausgeführt. Ein `type: "mcp_tool"` Hook auf `Setup` wird immer übersprungen, wie unter [MCP-Tool-Hook-Felder](#mcp-tool-hook-fields) beschrieben.1358Setup-Hooks haben Zugriff auf `CLAUDE_ENV_FILE`. In diese Datei geschriebene Variablen bleiben für nachfolgende Bash-Befehle der Sitzung erhalten, genau wie bei [SessionStart-Hooks](#persist-environment-variables). Bei `Setup` werden nur Hooks vom Typ `type: "command"` ausgeführt. Ein Hook vom Typ `type: "mcp_tool"` bei `Setup` wird immer übersprungen, wie unter [MCP-Tool-Hook-Felder](#mcp-tool-hook-fields) beschrieben.
1359 1359
1360<h3 id="instructionsloaded">1360<h3 id="instructionsloaded">
1361 InstructionsLoaded1361 InstructionsLoaded
1362</h3>1362</h3>
1363 1363
1364Wird ausgelöst, wenn eine `CLAUDE.md` oder `.claude/rules/*.md` Datei in den Kontext geladen wird. Dieses Ereignis wird beim Sitzungsstart für eifrig geladene Dateien ausgelöst und später erneut, wenn Dateien träge geladen werden, z. B. wenn Claude auf ein Unterverzeichnis zugreift, das eine verschachtelte `CLAUDE.md` enthält, oder wenn bedingte Regeln mit `paths:` Frontmatter übereinstimmen. Der Hook unterstützt keine Blockierung oder Entscheidungskontrolle. Er wird asynchron zu Beobachtungszwecken ausgeführt.1364Wird 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 wird zu Beobachtungszwecken asynchron ausgeführt.
1365 1365
1366Dieses Ereignis wird nicht ausgelöst, wenn Claude [direkt `AGENTS.md` liest](/docs/de/memory#agents-md) über die Einstellung **Projektanweisungen**. Es wird ausgelöst, wenn eine `CLAUDE.md` Ihre `AGENTS.md` importiert, mit `load_reason` auf `include` wie für jede andere importierte Datei, und wenn `CLAUDE.md` ein Symlink dazu ist, als normale `CLAUDE.md` Ladung.1366Dieses 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`.
1367 1367
1368Der Matcher wird gegen `load_reason` ausgeführt. Verwenden Sie beispielsweise `"matcher": "session_start"`, um nur für Dateien zu aktivieren, die beim Sitzungsstart geladen werden, oder `"matcher": "path_glob_match|nested_traversal"`, um nur für träge Ladevorgänge zu aktivieren.1368Der Matcher wird gegen `load_reason` ausgewertet. Verwenden Sie zum Beispiel `"matcher": "session_start"`, um nur für beim Sitzungsstart geladene Dateien auszulösen, oder `"matcher": "path_glob_match|nested_traversal"`, um nur bei verzögertem Laden auszulösen.
1369 1369
1370<h4 id="instructionsloaded-input">1370<h4 id="instructionsloaded-input">
1371 InstructionsLoaded-Eingabe1371 InstructionsLoaded-Eingabe
1372</h4>1372</h4>
1373 1373
1374Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten InstructionsLoaded-Hooks diese Felder:1374Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten InstructionsLoaded-Hooks diese Felder:
1375 1375
1376| Feld | Beschreibung |1376| Feld | Beschreibung |
1377| :- | :- |1377| :- | :- |
1378| `file_path` | Absoluter Pfad zur Anweisungsdatei, die geladen wurde |1378| `file_path` | Absoluter Pfad zur geladenen Anweisungsdatei |
1379| `memory_type` | Umfang der Datei: `"User"`, `"Project"`, `"Local"` oder `"Managed"` |1379| `memory_type` | Geltungsbereich der Datei: `"User"`, `"Project"`, `"Local"` oder `"Managed"` |
1380| `load_reason` | Warum die Datei geladen wurde: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` oder `"compact"`. Der `"compact"` Wert wird ausgelöst, wenn Anweisungsdateien nach einem Komprimierungsereignis erneut geladen werden |1380| `load_reason` | Warum die Datei geladen wurde: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` oder `"compact"`. Der Wert `"compact"` tritt auf, wenn Anweisungsdateien nach einem Komprimierungsereignis erneut geladen werden |
1381| `globs` | Pfad-Glob-Muster aus dem `paths:` Frontmatter der Datei, falls vorhanden. Nur für `path_glob_match` Ladevorgänge vorhanden |1381| `globs` | Pfad-Glob-Muster aus dem `paths:`-Frontmatter der Datei, falls vorhanden. Nur bei `path_glob_match`-Ladevorgängen vorhanden |
1382| `trigger_file_path` | Pfad zur Datei, deren Zugriff diesen Ladevorgang ausgelöst hat, für träge Ladevorgänge |1382| `trigger_file_path` | Pfad zu der Datei, deren Zugriff dieses Laden ausgelöst hat, bei verzögertem Laden |
1383| `parent_file_path` | Pfad zur übergeordneten Anweisungsdatei, die diese importiert hat, für `include` Ladevorgänge |1383| `parent_file_path` | Pfad zur übergeordneten Anweisungsdatei, die diese eingebunden hat, bei `include`-Ladevorgängen |
1384 1384
1385```json theme={null}1385```json theme={null}
1386{1386{
1395```1395```
1396 1396
1397<h4 id="instructionsloaded-decision-control">1397<h4 id="instructionsloaded-decision-control">
1398 InstructionsLoaded-Entscheidungskontrolle1398 InstructionsLoaded-Entscheidungssteuerung
1399</h4>1399</h4>
1400 1400
1401InstructionsLoaded-Hooks haben keine Entscheidungskontrolle. Sie können das Laden von Anweisungen nicht blockieren oder ändern. Claude Code verwirft ihre [JSON-Ausgabefelder](#json-output), wie `systemMessage` und `continue`. Verwenden Sie dieses Ereignis für Audit-Protokollierung, Compliance-Verfolgung oder Beobachtbarkeit.1401InstructionsLoaded-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.
1402 1402
1403<h3 id="userpromptsubmit">1403<h3 id="userpromptsubmit">
1404 UserPromptSubmit1404 UserPromptSubmit
1405</h3>1405</h3>
1406 1406
1407Wird ausgeführt, wenn der Benutzer eine Eingabeaufforderung einreicht, bevor Claude sie verarbeitet. Dies ermöglicht es Ihnen, zusätzlichen Kontext basierend auf der Eingabeaufforderung/Konversation hinzuzufügen, Eingabeaufforderungen zu validieren oder bestimmte Arten von Eingabeaufforderungen zu blockieren.1407Wird ausgeführt, wenn ein Prompt gesendet wird, bevor Claude ihn verarbeitet. Damit können Sie
1408zusätzlichen Kontext basierend auf dem Prompt bzw. der Konversation hinzufügen, Prompts validieren oder
1409bestimmte Arten von Prompts blockieren.
1408 1410
1409`UserPromptSubmit` Hooks haben ein Standard-Timeout von 30 Sekunden für `command`, `http` und `mcp_tool` Typen, kürzer als das 600-Sekunden-Standard für diese Typen bei den meisten anderen Ereignissen. Da dieser Hook vor jeder Eingabeaufforderung ausgeführt wird und die Modellverarbeitung blockiert, bis er abgeschlossen ist, stellt ein feststeckender Hook die Sitzung still. Wenn Ihr Hook mehr Zeit benötigt, setzen Sie das `timeout` Feld im Hook-Eintrag.1411`UserPromptSubmit`-Hooks werden nicht nur bei Prompts ausgelöst, die Sie eintippen. Claude Code führt sie auch aus, wenn:
1410 1412
1411Abgesehen von einem Command-Hook, den Sie mit [`async: true`](#run-hooks-in-the-background) ausführen, wird ein `UserPromptSubmit` Command-, HTTP- oder MCP-Tool-Hook, der sein Timeout erreicht, abgebrochen und seine Ausgabe, einschließlich `additionalContext`, wird verworfen. Die Eingabeaufforderung erreicht Claude immer noch ohne diesen Kontext. Das Transkript zeigt einen Hinweis, der den Hook, das ausgelöste Timeout und dass die Ausgabe verworfen wurde, benennt.1413* eine [geplante Aufgabe](/docs/de/scheduled-tasks) ausgelöst wird, einschließlich einer `/loop`-Iteration
1414* ein [Hintergrund-Subagent](/docs/de/sub-agents#run-subagents-in-foreground-or-background) an die Sitzung zurückmeldet, die ihn gestartet hat
1415* [eine andere Sitzung eine Nachricht](/docs/de/cross-session-messaging) an Ihre Hauptkonversation sendet
1412 1416
1413Ein [Agent SDK Callback-Hook](/docs/de/agent-sdk/hooks) auf `UserPromptSubmit`, der sein Timeout erreicht, blockiert die Eingabeaufforderung mit einer Nachricht, die den Hook und das Timeout benennt, da ein Callback dort als Richtlinientor fungieren kann, das nicht offen fehlschlagen darf. Die Sitzung wird fortgesetzt. Vor v2.1.208 endete ein Callback-Timeout bei diesem Ereignis mit einem Ausführungsfehler.1417`UserPromptSubmit`-Hooks haben für die Typen `command`, `http` und `mcp_tool` einen Standard-Timeout von 30 Sekunden, kürzer als der Standard von 600 Sekunden für diese Typen bei den meisten anderen Ereignissen. Da dieser Hook vor jedem Prompt ausgeführt wird und die Verarbeitung durch das Modell blockiert, bis er abgeschlossen ist, legt ein hängender Hook die Sitzung lahm. Wenn Ihr Hook mehr Zeit benötigt, setzen Sie das Feld `timeout` im Hook-Eintrag.
1418
1419Abgesehen von einem Befehls-Hook, den Sie mit [`async: true`](#run-hooks-in-the-background) ausführen, wird ein `UserPromptSubmit`-Befehls-, HTTP- oder MCP-Tool-Hook, der seinen Timeout erreicht, abgebrochen, und seine Ausgabe einschließlich eines etwaigen `additionalContext` wird verworfen. Der Prompt erreicht Claude trotzdem, aber ohne diesen Kontext. Das Transkript zeigt einen Hinweis mit dem Namen des Hooks, dem ausgelösten Timeout und der Angabe, dass die Ausgabe verworfen wurde.
1420
1421Ein [Agent SDK-Callback-Hook](/docs/de/agent-sdk/hooks) bei `UserPromptSubmit`, der seinen Timeout erreicht, blockiert den Prompt mit einer Meldung, die den Hook und den Timeout nennt, da ein Callback an dieser Stelle als Richtlinien-Gate fungieren kann, das nicht offen fehlschlagen darf. Die Sitzung wird fortgesetzt. Vor v2.1.208 beendete ein Callback-Timeout bei diesem Ereignis den Turn mit einem Ausführungsfehler.
1414 1422
1415<h4 id="userpromptsubmit-input">1423<h4 id="userpromptsubmit-input">
1416 UserPromptSubmit-Eingabe1424 UserPromptSubmit-Eingabe
1417</h4>1425</h4>
1418 1426
1419Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten UserPromptSubmit-Hooks das `prompt` Feld mit dem Text, den der Benutzer eingereicht hat. Eingefügter Inhalt, der zu einem `[Pasted text #N]` Platzhalter zusammengefallen ist, kommt erweitert an Ort und Stelle an. In Sitzungen, in denen Claude Code [eingefügten Text für Claude markiert](/docs/de/terminal-config#how-claude-treats-pasted-text), sitzt dieser erweiterte Inhalt zwischen einer `<pasted_content id="…">` Zeile und einer `</pasted_content id="…">` Zeile, daher berücksichtigen Sie diese Zeilen, wenn Ihr Hook die Eingabeaufforderung analysiert.1427Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten UserPromptSubmit-Hooks das Feld `prompt` mit dem gesendeten Text. Eingefügter Inhalt, der zu einem Platzhalter `[Pasted text #N]` zusammengeklappt wurde, kommt an Ort und Stelle erweitert an. In Sitzungen, in denen Claude Code [eingefügten Text für Claude kennzeichnet](/docs/de/terminal-config#how-claude-treats-pasted-text), steht dieser erweiterte Inhalt zwischen einer Zeile `<pasted_content id="…">` und einer Zeile `</pasted_content id="…">`; berücksichtigen Sie diese Zeilen, wenn Ihr Hook den Prompt parst.
1420 1428
1421UserPromptSubmit-Hooks erhalten auch `session_title`, wenn die Sitzung einen benutzerdefinierten Titel hat, mit der gleichen Bedeutung wie das [SessionStart `session_title` Feld](#sessionstart-input).1429UserPromptSubmit-Hooks erhalten außerdem `session_title`, wenn die Sitzung einen benutzerdefinierten Titel hat, mit derselben Bedeutung wie das [SessionStart-Feld `session_title`](#sessionstart-input).
1422 1430
1423```json theme={null}1431```json theme={null}
1424{1432{
1432```1440```
1433 1441
1434<h4 id="userpromptsubmit-decision-control">1442<h4 id="userpromptsubmit-decision-control">
1435 UserPromptSubmit-Entscheidungskontrolle1443 UserPromptSubmit-Entscheidungssteuerung
1436</h4>1444</h4>
1437 1445
1438`UserPromptSubmit` Hooks können steuern, ob eine Benutzereingabeaufforderung verarbeitet wird und Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.1446`UserPromptSubmit`-Hooks können steuern, ob ein gesendeter Prompt verarbeitet wird, und Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.
1439 1447
1440Es gibt zwei Möglichkeiten, Kontext zur Konversation beim Exit-Code 0 hinzuzufügen:1448Es gibt zwei Möglichkeiten, bei Exit-Code 0 Kontext zur Konversation hinzuzufügen:
1441 1449
1442* **Klartext-stdout**: Claude Code fügt stdout, das es [als Klartext behandelt](#exit-code-0), zu Claudes Kontext hinzu1450* **Reiner Text auf stdout**: Claude Code fügt stdout, das es [als reinen Text behandelt](#exit-code-0), zu Claudes Kontext hinzu
1443* **JSON mit `additionalContext`**: Verwenden Sie das JSON-Format unten für mehr Kontrolle. Das `additionalContext` Feld wird als Kontext hinzugefügt1451* **JSON mit `additionalContext`**: Verwenden Sie das unten gezeigte JSON-Format für mehr Kontrolle. Das Feld `additionalContext` wird als Kontext hinzugefügt
1444 1452
1445Keiner der Kanäle erzeugt einen sichtbaren Transkript-Eintrag. Klartext-stdout und der `additionalContext` Wert werden jeweils als Systemerinnerung eingefügt, die mit dem Namen des Hooks beginnt; Claude liest beide. Um die Lieferung zu bestätigen, überprüfen Sie das [Debug-Protokoll](#debug-hooks).1453Keiner 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).
1446 1454
1447Um eine Eingabeaufforderung zu blockieren, geben Sie ein JSON-Objekt mit `decision` auf `"block"` zurück:1455Um einen Prompt zu blockieren, geben Sie ein JSON-Objekt zurück, in dem `decision` auf `"block"` gesetzt ist:
1448 1456
1449| Feld | Beschreibung |1457| Feld | Beschreibung |
1450| :- | :- |1458| :- | :- |
1451| `decision` | `"block"` verhindert, dass die Eingabeaufforderung verarbeitet wird. Weglassen, um die Eingabeaufforderung fortzufahren |1459| `decision` | `"block"` hält den Prompt auf, bevor er Claude erreicht. Weglassen, damit der Prompt fortgesetzt wird |
1452| `reason` | Wird dem Benutzer angezeigt, wenn `decision` `"block"` ist. Nicht zum Kontext hinzugefügt |1460| `reason` | Wird dem Benutzer angezeigt, wenn `decision` den Wert `"block"` hat. Wird nicht zum Kontext hinzugefügt |
1453| `additionalContext` | String, der zu Claudes Kontext neben der eingereichten Eingabeaufforderung hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |1461| `additionalContext` | Zeichenkette, die neben dem abgesendeten Prompt zu Claudes Kontext hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
1454| `sessionTitle` | Legt den Sitzungstitel fest. Verwenden Sie dies, um Sitzungen automatisch basierend auf dem Inhalt der Eingabeaufforderung zu benennen |1462| `sessionTitle` | Setzt den Sitzungstitel. Verwenden Sie es, um Sitzungen automatisch anhand des Prompt-Inhalts zu benennen |
1455| `suppressOriginalPrompt` | Wenn `true`, wenn der Hook die Eingabeaufforderung blockiert, wird der ursprüngliche Eingabeaufforderungstext aus der Blockierungsmeldung weggelassen. Siehe [Was eine blockierte Eingabeaufforderung hinterlässt](#what-a-blocked-prompt-leaves-behind) |1463| `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) |
1456 1464
1457Ein Hook, der durch Beendigung mit 2 blockiert, leitet auf die gleiche Weise wie `reason` weiter: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text an und wird nicht zum Kontext hinzugefügt.1465Ein Hook, der durch Beenden mit 2 blockiert, wird genauso behandelt wie `reason`: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text, und dieser wird nicht zum Kontext hinzugefügt.
1458 1466
1459```json theme={null}1467```json theme={null}
1460{1468{
1470```1478```
1471 1479
1472<h4 id="what-a-blocked-prompt-leaves-behind">1480<h4 id="what-a-blocked-prompt-leaves-behind">
1473 Was eine blockierte Eingabeaufforderung hinterlässt1481 Was ein blockierter Prompt hinterlässt
1474</h4>1482</h4>
1475 1483
1476Eine blockierte Eingabeaufforderung erreicht Claude nie, aber ihr Text wird nicht überall entfernt. Standardmäßig endet die Blockierungsmeldung, die dem Benutzer angezeigt wird, mit `Original prompt:` gefolgt vom eingereichten Text, und Claude Code schreibt diese Nachricht in die Transkript-Datei der Sitzung auf der Festplatte. Um den Text aus der Nachricht wegzulassen, drucken Sie JSON mit `"suppressOriginalPrompt": true` in `hookSpecificOutput`. Dies funktioniert, ob der Hook mit `decision: "block"` oder durch Beendigung mit 2 blockiert. Ein Exit-2-Hook, der kein JSON druckt, erhält immer den Eingabeaufforderungstext in seiner Blockierungsmeldung.1484Ein 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 herauszulassen, geben Sie JSON mit `"suppressOriginalPrompt": true` innerhalb von `hookSpecificOutput` aus. Das funktioniert unabhängig davon, ob der Hook mit `decision: "block"` oder durch Beenden mit 2 blockiert. Ein Hook mit Exit-Code 2, der kein JSON ausgibt, enthält in seiner Blockierungsmeldung immer den Prompt-Text.
1477 1485
1478`suppressOriginalPrompt` ändert nur die Blockierungsmeldung. Der eingereichte Text kann immer noch in lokalen Dateien wie der Sitzungs-Transkript und Ihrer Eingabeaufforderungs-Historie angezeigt werden, daher ist ein blockierender Hook keine Möglichkeit, ein Geheimnis von der Festplatte zu halten. Um diese Dateien zu begrenzen oder zu entfernen, siehe [Klartext-Speicherung](/docs/de/claude-directory#plaintext-storage) und [Lokale Daten löschen](/docs/de/claude-directory#clear-local-data).1486`suppressOriginalPrompt` ändert nur die Blockierungsmeldung. Der abgesendete Text kann weiterhin in lokalen Dateien wie dem Sitzungstranskript und Ihrem Prompt-Verlauf erscheinen, ein blockierender Hook ist also kein Mittel, um ein Geheimnis von der Festplatte fernzuhalten. Informationen zum Begrenzen oder Entfernen dieser Dateien finden Sie unter [Klartextspeicherung](/docs/de/claude-directory#plaintext-storage) und [Lokale Daten löschen](/docs/de/claude-directory#clear-local-data).
1479 1487
1480<h3 id="userpromptexpansion">1488<h3 id="userpromptexpansion">
1481 UserPromptExpansion1489 UserPromptExpansion
1482</h3>1490</h3>
1483 1491
1484Wird ausgeführt, wenn ein vom Benutzer eingegebener Befehl vor dem Erreichen von Claude in eine Eingabeaufforderung erweitert wird. Verwenden Sie dies, um bestimmte Befehle von direkter Aufrufen zu blockieren, Kontext für einen bestimmten Skill einzufügen oder zu protokollieren, welche Befehle Benutzer aufrufen. Beispielsweise kann ein Hook, der `deploy` abgleicht, `/deploy` blockieren, es sei denn, eine Genehmigungsdatei ist vorhanden, oder ein Hook, der einen Review-Skill abgleicht, kann die Review-Checkliste des Teams als `additionalContext` anhängen.1492Wird ausgeführt, wenn ein vom Benutzer eingegebener Befehl zu einem Prompt expandiert wird, bevor er Claude erreicht. Verwenden Sie dies, um bestimmte Befehle am direkten Aufruf zu hindern, Kontext für einen bestimmten Skill einzufügen oder zu protokollieren, welche Befehle Benutzer aufrufen. Zum Beispiel kann ein Hook, der auf `deploy` matcht, `/deploy` blockieren, sofern keine Genehmigungsdatei vorhanden ist, oder ein Hook, der auf einen Review-Skill matcht, die Review-Checkliste des Teams als `additionalContext` anhängen.
1485 1493
1486Dieses Ereignis deckt den Pfad ab, den `PreToolUse` nicht abdeckt: Ein `PreToolUse` Hook, der das `Skill` Tool abgleicht, wird nur ausgelöst, wenn Claude das Tool aufruft, aber das direkte Eingeben von `/skillname` umgeht `PreToolUse`. `UserPromptExpansion` wird auf diesem direkten Pfad ausgelöst.1494Dieses Ereignis deckt den Weg ab, den `PreToolUse` nicht abdeckt: Ein `PreToolUse`-Hook, der auf das Tool `Skill` matcht, wird nur ausgelöst, wenn Claude das Tool aufruft, aber die direkte Eingabe von `/skillname` umgeht `PreToolUse`. `UserPromptExpansion` wird auf diesem direkten Weg ausgelöst.
1487 1495
1488Gleicht `command_name` ab. Lassen Sie den Matcher leer, um bei jeder Eingabeaufforderungs-Typ-Befehl ausgelöst zu werden.1496Matcht auf `command_name`. Lassen Sie den Matcher leer, um bei jedem Befehl vom Typ Prompt auszulösen.
1489 1497
1490<h4 id="userpromptexpansion-input">1498<h4 id="userpromptexpansion-input">
1491 UserPromptExpansion-Eingabe1499 UserPromptExpansion-Eingabe
1492</h4>1500</h4>
1493 1501
1494Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten UserPromptExpansion-Hooks `expansion_type`, `command_name`, `command_args`, `command_source` und die ursprüngliche `prompt` Zeichenkette. Das `expansion_type` Feld ist `slash_command` für Skill- und benutzerdefinierte Befehle oder `mcp_prompt` für MCP-Server-Eingabeaufforderungen.1502Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten UserPromptExpansion-Hooks `expansion_type`, `command_name`, `command_args`, `command_source` und die ursprüngliche Zeichenkette `prompt`. Das Feld `expansion_type` ist `slash_command` für Skills und benutzerdefinierte Befehle oder `mcp_prompt` für Prompts von MCP-Servern.
1495 1503
1496```json theme={null}1504```json theme={null}
1497{1505{
1509```1517```
1510 1518
1511<h4 id="userpromptexpansion-decision-control">1519<h4 id="userpromptexpansion-decision-control">
1512 UserPromptExpansion-Entscheidungskontrolle1520 UserPromptExpansion-Entscheidungssteuerung
1513</h4>1521</h4>
1514 1522
1515`UserPromptExpansion` Hooks können die Erweiterung blockieren oder Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.1523`UserPromptExpansion`-Hooks können die Expansion blockieren oder Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.
1516 1524
1517| Feld | Beschreibung |1525| Feld | Beschreibung |
1518| :- | :- |1526| :- | :- |
1519| `decision` | `"block"` verhindert, dass der Befehl erweitert wird. Weglassen, um ihn fortzufahren |1527| `decision` | `"block"` verhindert die Expansion des Befehls. Weglassen, damit er fortgesetzt wird |
1520| `reason` | Wird dem Benutzer angezeigt, wenn `decision` `"block"` ist |1528| `reason` | Wird dem Benutzer angezeigt, wenn `decision` den Wert `"block"` hat |
1521| `additionalContext` | String, der zu Claudes Kontext neben der erweiterten Eingabeaufforderung hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |1529| `additionalContext` | Zeichenkette, die neben dem expandierten Prompt zu Claudes Kontext hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
1522 1530
1523Ein Hook, der durch Beendigung mit 2 blockiert, leitet auf die gleiche Weise wie `reason` weiter: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text an.1531Ein Hook, der durch Beenden mit 2 blockiert, wird genauso behandelt wie `reason`: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text.
1524 1532
1525```json theme={null}1533```json theme={null}
1526{1534{
1537 MessageDisplay1545 MessageDisplay
1538</h3>1546</h3>
1539 1547
1540Wird ausgeführt, während eine Assistenten-Nachricht auf den Bildschirm gestreamt wird. Claude Code zeigt die Nachricht in Inkrementen an: Jedes Mal, wenn ein Batch neu abgeschlossener Zeilen zum Rendern bereit ist, wird der Hook einmal mit diesen Zeilen ausgeführt und Claude Code rendert den Ersatztext des Hooks an ihrer Stelle. Eine lange Nachricht erzeugt mehrere Aufrufe; eine kurze Nachricht kann nur einen erzeugen.1548Wird ausgeführt, während eine Assistentennachricht auf den Bildschirm gestreamt wird. Claude Code zeigt die Nachricht in Schritten an: Jedes Mal, wenn ein Stapel neu abgeschlossener Zeilen zur Darstellung bereit ist, wird der Hook einmal mit diesen Zeilen ausgeführt, und Claude Code stellt an ihrer Stelle den Ersatztext des Hooks dar. Eine lange Nachricht erzeugt mehrere Aufrufe; eine kurze Nachricht möglicherweise nur einen.
1541 1549
1542Verwenden Sie MessageDisplay für:1550Verwenden Sie MessageDisplay, um:
1543 1551
1544* Markdown für eine minimale Anzeige entfernen1552* Markdown für eine minimale Anzeige zu entfernen
1545* Den Text transformieren, den eine Agent SDK Anwendung ihren Benutzern zeigt1553* den Text umzuwandeln, den eine Agent SDK-Anwendung ihren Benutzern anzeigt
1546* API-Schlüssel oder interne Hostnamen aus Claudes Antworten redigieren1554* API-Schlüssel oder interne Hostnamen aus Claudes Antworten zu schwärzen
1547 1555
1548Claude Code hält jeden Batch, bis Ihr Hook zurückkehrt, daher halten Sie den Hook schnell. Wenn der Hook fehlschlägt oder das Timeout überschreitet, zeigt Claude Code den ursprünglichen Text an. Das Standard-Timeout für dieses Ereignis beträgt 10 Sekunden; wenn Ihr Hook mehr Zeit benötigt, setzen Sie das `timeout` Feld im Hook-Eintrag.1556Claude 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.
1549 1557
1550MessageDisplay ist nur für die Anzeige: Der Ersatztext ändert nur das, was auf dem Bildschirm gerendert wird. Das Transkript und was Claude sieht, behalten den ursprünglichen Text, daher sieht Claude den Ersatz nie, und der ausführliche Modus zeigt das Original. Der Hook empfängt nur Assistenten-Nachrichtentext, daher werden Tool-Ergebnisse und der Text, den Sie eingeben, unverändert gerendert.1558MessageDisplay 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.
1551 1559
1552MessageDisplay unterstützt keine Matcher und wird für jede Assistenten-Nachricht ausgelöst, die Text streamt; Nachrichten ohne Text, wie nur Tool-Aufruf-Antworten, lösen es nicht aus.1560MessageDisplay 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.
1553 1561
1554In nicht-interaktiven Läufen, einschließlich Agent SDK Abfragen und `claude -p`, wird MessageDisplay einmal pro Assistenten-Nachricht statt einmal pro Batch von Zeilen ausgeführt. Der einzelne Aufruf kommt nach Abschluss der Nachricht und trägt den vollständigen Nachrichtentext: `index` ist `0`, `final` ist `true` und `delta` enthält die gesamte Nachricht. Ein Hook, der den `delta` Text für jede Nachricht sammelt, empfängt den gleichen Gesamttext in beiden Modi.1562In 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.
1555 1563
1556<h4 id="messagedisplay-input">1564<h4 id="messagedisplay-input">
1557 MessageDisplay-Eingabe1565 MessageDisplay-Eingabe
1558</h4>1566</h4>
1559 1567
1560Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten MessageDisplay-Hooks Bezeichner für den Zug und die Nachricht, die Position dieses Aufrufs innerhalb der Nachricht und den neuen Text in `delta`. Batch-Grenzen hängen davon ab, wie der Text streamt, daher verwenden Sie `index` und `final`, um den Fortschritt durch eine Nachricht zu verfolgen, anstatt zu erwarten, dass Zeilen auf eine bestimmte Weise gruppiert werden.1568Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten MessageDisplay-Hooks Kennungen für den Turn und die Nachricht, die Position dieses Aufrufs innerhalb der Nachricht und den neuen Text in `delta`. Die Stapelgrenzen hängen davon ab, wie der Text gestreamt wird. Verwenden Sie daher `index` und `final`, um den Fortschritt durch eine Nachricht zu verfolgen, statt zu erwarten, dass Zeilen auf eine bestimmte Weise gruppiert sind.
1561 1569
1562| Feld | Beschreibung |1570| Feld | Beschreibung |
1563| :- | :- |1571| :- | :- |
1564| `turn_id` | UUID des aktuellen Zugs |1572| `turn_id` | UUID des aktuellen Turns |
1565| `message_id` | UUID der Assistenten-Nachricht, die angezeigt wird. Stabil über jeden Batch der gleichen Nachricht. Dies ist nicht die API `msg_…` ID, daher kann sie nicht mit Transkript-Nachrichten-IDs korreliert werden |1573| `message_id` | UUID der angezeigten Assistentennachricht. Über alle Stapel derselben Nachricht hinweg stabil. Dies ist nicht die API-ID `msg_…`, daher kann sie nicht mit den Nachrichten-IDs im Transkript abgeglichen werden |
1566| `index` | Nullbasierter Index dieses Batches innerhalb der Nachricht |1574| `index` | Nullbasierter Index dieses Stapels innerhalb der Nachricht |
1567| `final` | `true` beim letzten Batch der Nachricht. Jede Nachricht hat genau einen finalen Batch |1575| `final` | `true` beim letzten Stapel der Nachricht. Jede Nachricht hat genau einen letzten Stapel |
1568| `delta` | Die neu abgeschlossenen Zeilen seit dem vorherigen Batch, einschließlich Zeilenumbrüchen. Immer ganze Zeilen, außer dem finalen Batch, der möglicherweise mitten in einer Zeile endet. In interaktiven Läufen ist das Delta des finalen Batches leer, wenn die Nachricht mit einem Zeilenumbruch endet, daher behandeln Sie `final`, nicht ein nicht-leeres Delta, als das End-of-Message-Signal. In Agent SDK und `claude -p` Läufen trägt der einzelne Aufruf die gesamte Nachricht |1576| `delta` | Die seit dem vorherigen Stapel neu abgeschlossenen Zeilen, einschließlich abschließender Zeilenumbrüche. Immer ganze Zeilen, außer beim letzten Stapel, der mitten in einer Zeile enden kann. In interaktiven Läufen ist das Delta des letzten Stapels leer, wenn die Nachricht mit einem Zeilenumbruch endet. Behandeln Sie daher `final` und nicht ein nicht leeres Delta als Signal für das Nachrichtenende. In Agent SDK- und `claude -p`-Läufen enthält der einzelne Aufruf die gesamte Nachricht |
1569 1577
1570```json theme={null}1578```json theme={null}
1571{1579{
1585 MessageDisplay-Ausgabe1593 MessageDisplay-Ausgabe
1586</h4>1594</h4>
1587 1595
1588Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, können MessageDisplay-Hooks `displayContent` zurückgeben, um das Delta auf dem Bildschirm zu ersetzen:1596Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können MessageDisplay-Hooks `displayContent` zurückgeben, um das Delta auf dem Bildschirm zu ersetzen:
1589 1597
1590| Feld | Beschreibung |1598| Feld | Beschreibung |
1591| :- | :- |1599| :- | :- |
1592| `displayContent` | Text, der anstelle des Delta angezeigt wird. Weglassen, um das Original anzuzeigen |1600| `displayContent` | Text, der anstelle des Deltas angezeigt wird. Weglassen, um das Original anzuzeigen |
1593 1601
1594MessageDisplay-Hooks haben keine Entscheidungskontrolle. Sie können die Nachricht nicht blockieren oder ändern, was im Transkript gespeichert oder an Claude gesendet wird. Claude Code handelt auf `displayContent` aus ihrer JSON-Ausgabe und verwirft `systemMessage` und `continue`.1602MessageDisplay-Hooks haben keine Entscheidungssteuerung. Sie können die Nachricht weder blockieren noch ändern, was im Transkript gespeichert oder an Claude gesendet wird. Claude Code verarbeitet `displayContent` aus ihrer JSON-Ausgabe und verwirft `systemMessage` und `continue`.
1595 1603
1596Dieses Beispiel entfernt Markdown-Formatierung aus Claudes Antworten für eine Klartext-Anzeige. Das Skript liest jeden Batch von stdin, entfernt fette Marker und Inline-Code-Backticks aus `delta` und gibt das Ergebnis als `displayContent` zurück.1604Dieses Beispiel entfernt Markdown-Formatierung aus Claudes Antworten für eine reine Textanzeige. Das Skript liest jeden Stapel von stdin, entfernt Fettdruck-Markierungen und Backticks für Inline-Code aus `delta` und gibt das Ergebnis als `displayContent` zurück.
1597 1605
1598<Tabs>1606<Tabs>
1599 <Tab title="macOS/Linux">1607 <Tab title="macOS/Linux">
1600 Registrieren Sie einen Command-Hook für das Ereignis in Ihrer Einstellungsdatei:1608 Registrieren Sie in Ihrer Einstellungsdatei einen Befehls-Hook für das Ereignis:
1601 1609
1602 ```json theme={null}1610 ```json theme={null}
1603 {1611 {
1626 </Tab>1634 </Tab>
1627 1635
1628 <Tab title="Windows (PowerShell)">1636 <Tab title="Windows (PowerShell)">
1629 Registrieren Sie einen Command-Hook, der das Skript durch PowerShell ausführt:1637 Registrieren Sie einen Befehls-Hook, der das Skript über PowerShell ausführt:
1630 1638
1631 ```json theme={null}1639 ```json theme={null}
1632 {1640 {
1652 }1660 }
1653 ```1661 ```
1654 1662
1655 Das `-NoProfile` Flag überspringt das Laden Ihres PowerShell-Profils, damit der Hook schnell startet, und `-ExecutionPolicy Bypass` ermöglicht PowerShell, die lokale Skriptdatei auszuführen.1663 Das Flag `-NoProfile` überspringt das Laden Ihres PowerShell-Profils, damit der Hook schnell startet, und `-ExecutionPolicy Bypass` erlaubt PowerShell, die lokale Skriptdatei auszuführen.
1656 1664
1657 Speichern Sie dieses Skript unter `.claude/hooks/plain-display.ps1` in Ihrem Projekt:1665 Speichern Sie dieses Skript unter `.claude/hooks/plain-display.ps1` in Ihrem Projekt:
1658 1666
1669 </Tab>1677 </Tab>
1670</Tabs>1678</Tabs>
1671 1679
1672Batches ohne Markdown werden unverändert durchgelassen. Wenn das Skript fehlschlägt, z. B. weil `jq` fehlt, zeigt Claude Code den ursprünglichen Text an und notiert den Fehler nur in der [Debug-Ausgabe](#debug-hooks), nicht in der Sitzung.1680Stapel ohne Markdown werden unverändert durchgereicht. Wenn das Skript fehlschlägt, zum Beispiel weil `jq` fehlt, zeigt Claude Code den ursprünglichen Text an und vermerkt den Fehler nur in der [Debug-Ausgabe](#debug-hooks), nicht in der Sitzung.
1673 1681
1674<h3 id="pretooluse">1682<h3 id="pretooluse">
1675 PreToolUse1683 PreToolUse
1676</h3>1684</h3>
1677 1685
1678Wird ausgeführt, nachdem Claude Tool-Parameter erstellt hat und bevor der Tool-Aufruf verarbeitet wird. Gleicht jeden Tool-Namen außer `EndConversation` ab: integrierte Tools wie `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` und `ExitPlanMode`, und alle [MCP-Tool-Namen](#match-mcp-tools).1686Wird 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).
1679 1687
1680Um einen Hook auszuführen, wenn sich eine bestimmte Datei auf der Festplatte ändert, verwenden Sie stattdessen [FileChanged](#filechanged), unabhängig davon, was sie geschrieben hat. Im Gegensatz zu PreToolUse führt Claude Code FileChanged-Hooks nach der Änderung aus und sie haben keine Entscheidungskontrolle, daher können sie den Schreibvorgang nicht blockieren.1688Um einen Hook auszuführen, wenn sich eine bestimmte Datei auf der Festplatte ändert, unabhängig davon, was sie geschrieben hat, verwenden Sie [FileChanged](#filechanged), statt dateibearbeitende Tools nach Namen zu matchen. Anders als PreToolUse führt Claude Code FileChanged-Hooks nach der Änderung aus, und sie haben keine Entscheidungssteuerung, können den Schreibvorgang also nicht blockieren.
1681 1689
1682<Warning>1690<Warning>
1683 PreToolUse wird nur ausgeführt, wenn Claude ein Tool aufruft. Dateien, die Sie [mit `@` in Ihrer Eingabeaufforderung referenzieren](/docs/de/common-workflows#reference-files-and-directories), werden hinzugefügt, ohne dass ein Tool-Aufruf erfolgt: Claude Code fügt ihren Inhalt beim Erstellen der Eingabeaufforderung ein, daher wird kein PreToolUse-Hook für sie ausgelöst, einschließlich Hooks, die `Read` abgleichen. Um bestimmte Pfade von `@` Referenzen zu blockieren, verwenden Sie stattdessen eine [`Read` Ablehnungsregel](/docs/de/permissions#read-and-edit).1691 PreToolUse wird nur ausgeführt, wenn Claude ein Tool aufruft. Dateien, die Sie [mit `@` in Ihrem Prompt referenzieren](/docs/de/common-workflows#reference-files-and-directories), werden ohne Tool-Aufruf hinzugefügt: Claude Code fügt ihren Inhalt beim Aufbau des Prompts ein, sodass für sie kein PreToolUse-Hook ausgelöst wird, auch keine Hooks, die auf `Read` matchen. Um bestimmte Pfade für `@`-Referenzen zu sperren, verwenden Sie stattdessen eine [`Read`-deny-Regel](/docs/de/permissions#read-and-edit).
1684 1692
1685 PreToolUse wird auch nicht für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgelöst.1693 PreToolUse wird außerdem nicht für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgelöst.
1686</Warning>1694</Warning>
1687 1695
1688Verwenden Sie [PreToolUse-Entscheidungskontrolle](#pretooluse-decision-control), um den Tool-Aufruf zuzulassen, zu verweigern, zu fragen oder aufzuschieben.1696Verwenden Sie die [PreToolUse-Entscheidungssteuerung](#pretooluse-decision-control), um den Tool-Aufruf zuzulassen, abzulehnen, nachzufragen oder zurückzustellen.
1689 1697
1690Ein [Agent SDK Callback-Hook](/docs/de/agent-sdk/hooks) auf `PreToolUse`, der sein Timeout überschreitet, blockiert den Tool-Aufruf und Claude erhält ein Fehlerergebnis, das das Timeout benennt. Eine explizite Ablehnung, die von einem anderen Hook zurückgegeben wird, hat immer noch Vorrang.1698Ein [Agent SDK-Callback-Hook](/docs/de/agent-sdk/hooks) bei `PreToolUse`, der seinen Timeout überschreitet, blockiert den Tool-Aufruf, und Claude erhält ein Fehlerergebnis, das den Timeout nennt. Eine explizite Ablehnung durch einen anderen Hook hat weiterhin Vorrang.
1691 1699
1692<h4 id="pretooluse-input">1700<h4 id="pretooluse-input">
1693 PreToolUse-Eingabe1701 PreToolUse-Eingabe
1694</h4>1702</h4>
1695 1703
1696Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten PreToolUse-Hooks `tool_name`, `tool_input` und `tool_use_id`.1704Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreToolUse-Hooks `tool_name`, `tool_input` und `tool_use_id`.
1697 1705
1698Für ein [MCP-Tool](#match-mcp-tools) trägt die Eingabe auch `mcp_server`, ein Objekt mit dem Namen des Servers und einer `source`, die angibt, woher die Definition des Servers stammt. Die `source` Werte umfassen `plugin`, `sdk` und Konfigurationsbereiche wie `user` und `project`. [`McpServerProvenance`](/docs/de/agent-sdk/typescript#mcpserverprovenance) in der Agent SDK Referenz listet sie alle auf und sagt, wie man eine behandelt, die man nicht erkennt. Treffen Sie Vertrauensentscheidungen basierend auf `source` statt auf `name` oder dem `mcp__<server>__` Tool-Namen-Präfix. Das `mcp_server` Feld erfordert Claude Code v2.1.274 oder später.1706Bei einem [MCP-Tool](#match-mcp-tools) enthält die Eingabe zusätzlich `mcp_server`, ein Objekt mit dem `name` des Servers und einer `source`, die angibt, woher die Definition des Servers stammt. Zu den `source`-Werten gehören `plugin`, `sdk` und Konfigurations-Geltungsbereiche wie `user` und `project`. [`McpServerProvenance`](/docs/de/agent-sdk/typescript#mcpserverprovenance) in der Agent SDK-Referenz listet alle auf und erklärt, wie Sie mit einem Wert umgehen, den Sie nicht kennen. Stützen Sie Vertrauensentscheidungen auf `source` statt auf `name` oder das Tool-Namenspräfix `mcp__<server>__`. Das Feld `mcp_server` erfordert Claude Code v2.1.274 oder höher.
1699 1707
1700Für die Datei-Tools `Write`, `Edit` und `Read` ist `tool_input.file_path` immer absolut:1708Für die Datei-Tools `Write`, `Edit` und `Read` ist `tool_input.file_path` immer absolut:
1701 1709
1702* Claude Code erweitert `~` und relative Pfade, bevor Hooks ausgeführt werden, daher kann ein Hook, der auf Pfade abgleicht, nicht durch `~` oder eine relative Schreibweise des gleichen Pfads umgangen werden1710* Claude Code expandiert `~` und relative Pfade, bevor Hooks ausgeführt werden, sodass ein Hook, der auf Pfade matcht, nicht über `~` oder eine relative Schreibweise desselben Pfads umgangen werden kann
1703* Unter Windows kommt der Pfad mit Backslash-Trennzeichen an, auch wenn Ihr Hook unter Git Bash ausgeführt wird, wo `$PWD` wie `/c/project` aussieht1711* Unter Windows kommt der Pfad mit Backslash-Trennzeichen an, auch wenn Ihr Hook unter Git Bash läuft, wo `$PWD` wie `/c/project` aussieht
1704* Ein Vergleich mit Schrägstrichen, wie eine `/src/` Überprüfung, gleicht niemals einen Backslash-Pfad ab, und der Tool-Aufruf wird fortgesetzt, als hätte der Hook nichts zu blockieren1712* Ein Vergleich mit Schrägstrichen, etwa eine Prüfung auf `/src/`, matcht nie einen Backslash-Pfad, und der Tool-Aufruf wird fortgesetzt, als hätte der Hook nichts zu blockieren
1705* Normalisieren Sie Trennzeichen vor dem Vergleich: `FILE_PATH="${FILE_PATH//\\//}"` in Bash oder `file_path.replace("\\", "/")` in Python, dann gleichen Sie ein Pfad-Segment wie `/src/` ab, anstatt mit `^` zu verankern, da der Pfad absolut ist1713* Normalisieren Sie die Trennzeichen vor dem Vergleich: `FILE_PATH="${FILE_PATH//\\//}"` in Bash oder `file_path.replace("\\", "/")` in Python, und matchen Sie dann ein Pfadsegment wie `/src/`, statt mit `^` zu verankern, da der Pfad absolut ist
1706 1714
1707Ein `Write` Aufruf unter Windows liefert:1715Ein `Write`-Aufruf unter Windows liefert:
1708 1716
1709```json theme={null}1717```json theme={null}
1710{1718{
1718}1726}
1719```1727```
1720 1728
1721Die `tool_input` Felder hängen vom Tool ab:1729Die Felder von `tool_input` hängen vom Tool ab:
1722 1730
1723<a id="bash" />1731<a id="bash" />
1724 1732
1731| Feld | Typ | Beispiel | Beschreibung |1739| Feld | Typ | Beispiel | Beschreibung |
1732| :- | :- | :- | :- |1740| :- | :- | :- | :- |
1733| `command` | string | `"npm test"` | Der auszuführende Shell-Befehl |1741| `command` | string | `"npm test"` | Der auszuführende Shell-Befehl |
1734| `description` | string | `"Run test suite"` | Optionale Beschreibung, was der Befehl tut |1742| `description` | string | `"Run test suite"` | Optionale Beschreibung dessen, was der Befehl tut |
1735| `timeout` | number | `120000` | Optionales Timeout in Millisekunden. Werte über dem [Maximum](/docs/de/tools-reference#bash-tool-behavior) werden auf das Maximum reduziert, anstatt abgelehnt zu werden |1743| `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 |
1736| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |1744| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |
1737 1745
1738Wenn 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 [`bashEditDiffEnabled`](/docs/de/settings-reference#basheditdiffenabled) Einstellung die Aufzeichnung aktiviert; der Eintrag dieser Einstellung sagt, welche Dateien sie setzen können. Andernfalls zeichnet es sie nur im Auto-Modus und `bypassPermissions` Modus auf und nur, wenn Claude Code Claude anweist, Dateien über Bash zu bearbeiten. Hintergrund-Befehle und schreibgeschützte Befehle tragen keinen Diff.1746Wenn ein Bash-Befehl Dateien in einem Git-Repository ändert, kann Claude Code aufzeichnen, was sich geändert hat. Es zeichnet die Änderungen in jedem Berechtigungsmodus auf, wenn die Einstellung [`bashEditDiffEnabled`](/docs/de/settings-reference#basheditdiffenabled) die Aufzeichnung aktiviert; der Eintrag dieser Einstellung gibt an, welche Dateien sie setzen können. Andernfalls zeichnet es sie nur im Auto-Modus und im Modus `bypassPermissions` auf, und nur dann, wenn Claude Code Claude anweist, Dateien über Bash zu bearbeiten. Setzen Sie `bashEditDiffEnabled` auf `false`, um die Aufzeichnung auszuschalten. Hintergrundbefehle und nur lesende Befehle enthalten keinen Diff.
1739 1747
1740Ihr [PostToolUse-Hook](#posttooluse) empfängt dann die geänderten Dateien in `tool_response.bashEditDiff`. Die Liste deckt ab, was sich im Repository geändert hat, während der Befehl ausgeführt wurde. Dateien, die Git ignoriert, und Dateien in Submodulen werden nicht aufgelistet. Erfordert Claude Code v2.1.269 oder später.1748Ihr [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.
1741 1749
1742<Note>1750<Note>
1743 Die Liste ist Best-Effort und in öffentlicher Beta. Claude Code kann eine Änderung verpassen, eine Datei einschließen, die ein anderer Prozess gleichzeitig geändert hat, oder bei seinen Größenlimits stoppen. Die Feldform kann sich ändern. Verwenden Sie die Liste, um zu finden, was zu überprüfen ist, nicht um eine Richtlinie durchzusetzen.1751 Die Liste wird nach bestem Bemühen erstellt und befindet sich in der öffentlichen Beta. Claude Code kann eine Änderung übersehen, eine Datei aufnehmen, die ein anderer Prozess gleichzeitig geändert hat, oder an seinen Größenlimits abbrechen. Die Struktur des Felds kann sich ändern. Verwenden Sie die Liste, um herauszufinden, was überprüft werden sollte, nicht um eine Richtlinie durchzusetzen.
1744</Note>1752</Note>
1745 1753
1746`changedFiles` und `files` listen auf, was der Befehl geändert hat; die verbleibenden Felder sagen, wie vollständig und wie zuverlässig diese Liste ist.1754`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.
1747 1755
1748| Feld | Typ | Beispiel | Beschreibung |1756| Feld | Typ | Beispiel | Beschreibung |
1749| :- | :- | :- | :- |1757| :- | :- | :- | :- |
1750| `changedFiles` | array | `["/path/to/src/app.ts"]` | Absolute Pfade der Dateien, die der Befehl geändert hat, maximal 200. Vorhanden, wenn `files` einen Diff enthält oder `moreFiles` über Null liegt |1758| `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 |
1751| `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 |1759| `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 |
1752| `moreFiles` | number | `2` | Anzahl der geänderten Dateien ohne Diff in `files` |1760| `moreFiles` | number | `2` | Anzahl geänderter Dateien ohne Diff in `files` |
1753| `unavailable` | boolean | `true` | Gesetzt, wenn der Diff unvollständig ist oder nicht genommen werden konnte |1761| `unavailable` | boolean | `true` | Gesetzt, wenn der Diff unvollständig ist oder nicht erstellt werden konnte |
1754| `skipped` | boolean | `true` | Gesetzt für einen Git-Befehl, der den Arbeitsbaum verschiebt, wie `git checkout` oder `git stash`, daher nimmt Claude Code keinen Diff |1762| `skipped` | boolean | `true` | Gesetzt für einen Git-Befehl, der den Arbeitsbaum verschiebt, etwa `git checkout` oder `git stash`, sodass Claude Code keinen Diff erstellt |
1755| `shared` | boolean | `true` | Gesetzt, wenn ein anderer Bash-Tool-Aufruf, wie der eines Subagenten, im gleichen Repository zur gleichen Zeit ausgeführt wurde, daher können einige aufgelistete Änderungen von diesem Befehl sein |1763| `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 |
1756 1764
1757<a id="powershell" />1765<a id="powershell" />
1758 1766
1760 PowerShell1768 PowerShell
1761</h5>1769</h5>
1762 1770
1763Führt PowerShell-Befehle aus. Siehe das [PowerShell-Tool](/docs/de/tools-reference#powershell-tool) für Verfügbarkeit nach Plattform.1771Führt PowerShell-Befehle aus. Informationen zur Verfügbarkeit je nach Plattform finden Sie unter [PowerShell-Tool](/docs/de/tools-reference#powershell-tool).
1764 1772
1765Die Felder entsprechen dem Bash-Tool, mit der Befehlszeichenkette in `command`:1773Die Felder entsprechen denen des Bash-Tools, mit der Befehlszeichenkette in `command`:
1766 1774
1767| Feld | Typ | Beispiel | Beschreibung |1775| Feld | Typ | Beispiel | Beschreibung |
1768| :- | :- | :- | :- |1776| :- | :- | :- | :- |
1769| `command` | string | `"Get-ChildItem -Recurse"` | Der auszuführende PowerShell-Befehl |1777| `command` | string | `"Get-ChildItem -Recurse"` | Der auszuführende PowerShell-Befehl |
1770| `description` | string | `"List files recursively"` | Optionale Beschreibung, was der Befehl tut |1778| `description` | string | `"List files recursively"` | Optionale Beschreibung dessen, was der Befehl tut |
1771| `timeout` | number | `120000` | Optionales Timeout in Millisekunden |1779| `timeout` | number | `120000` | Optionaler Timeout in Millisekunden |
1772| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |1780| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |
1773 1781
1774Gleichen Sie `Bash|PowerShell` in Hooks ab, die Shell-Befehle überprüfen, damit sie beide Tools abdecken:1782Matchen Sie in Hooks, die Shell-Befehle prüfen, auf `Bash|PowerShell`, damit sie beide Tools abdecken:
1775 1783
1776* Unter Windows, überall dort, wo das PowerShell-Tool aktiviert ist, behandelt Claude PowerShell als die primäre Shell und leitet Shell-Befehle durch sie.1784* Unter Windows behandelt Claude PowerShell überall dort, wo das PowerShell-Tool aktiviert ist, als primäre Shell und leitet Shell-Befehle darüber.
1777* Unter Windows ohne Git Bash ist das Tool automatisch aktiviert und Claude Code registriert das Bash-Tool überhaupt nicht.1785* Unter Windows ohne Git Bash wird das Tool automatisch aktiviert, und Claude Code registriert das Bash-Tool überhaupt nicht.
1778* Ein Hook, der nur `Bash` abgleicht, wird dort nie ausgelöst.1786* Ein Hook, der nur auf `Bash` matcht, wird dort nie ausgelöst.
1779 1787
1780<h5 id="write">1788<h5 id="write">
1781 Write1789 Write
1786| Feld | Typ | Beispiel | Beschreibung |1794| Feld | Typ | Beispiel | Beschreibung |
1787| :- | :- | :- | :- |1795| :- | :- | :- | :- |
1788| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu schreibenden Datei |1796| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu schreibenden Datei |
1789| `content` | string | `"file content"` | Inhalt zum Schreiben in die Datei |1797| `content` | string | `"file content"` | In die Datei zu schreibender Inhalt |
1790 1798
1791<h5 id="edit">1799<h5 id="edit">
1792 Edit1800 Edit
1793</h5>1801</h5>
1794 1802
1795Ersetzt eine Zeichenkette in einer vorhandenen Datei.1803Ersetzt eine Zeichenkette in einer bestehenden Datei.
1796 1804
1797| Feld | Typ | Beispiel | Beschreibung |1805| Feld | Typ | Beispiel | Beschreibung |
1798| :- | :- | :- | :- |1806| :- | :- | :- | :- |
1799| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu bearbeitenden Datei |1807| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu bearbeitenden Datei |
1800| `old_string` | string | `"original text"` | Text zum Suchen und Ersetzen |1808| `old_string` | string | `"original text"` | Zu suchender und zu ersetzender Text |
1801| `new_string` | string | `"replacement text"` | Ersatztext |1809| `new_string` | string | `"replacement text"` | Ersatztext |
1802| `replace_all` | boolean | `false` | Ob alle Vorkommen ersetzt werden sollen |1810| `replace_all` | boolean | `false` | Ob alle Vorkommen ersetzt werden sollen |
1803 1811
1810| Feld | Typ | Beispiel | Beschreibung |1818| Feld | Typ | Beispiel | Beschreibung |
1811| :- | :- | :- | :- |1819| :- | :- | :- | :- |
1812| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu lesenden Datei |1820| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu lesenden Datei |
1813| `offset` | number | `10` | Optionale Zeilennummer zum Starten des Lesens |1821| `offset` | number | `10` | Optionale Zeilennummer, ab der gelesen wird |
1814| `limit` | number | `50` | Optionale Anzahl der zu lesenden Zeilen |1822| `limit` | number | `50` | Optionale Anzahl zu lesender Zeilen |
1815 1823
1816<h5 id="glob">1824<h5 id="glob">
1817 Glob1825 Glob
1821 1829
1822| Feld | Typ | Beispiel | Beschreibung |1830| Feld | Typ | Beispiel | Beschreibung |
1823| :- | :- | :- | :- |1831| :- | :- | :- | :- |
1824| `pattern` | string | `"**/*.ts"` | Glob-Muster zum Abgleich von Dateien |1832| `pattern` | string | `"**/*.ts"` | Glob-Muster, gegen das Dateien abgeglichen werden |
1825| `path` | string | `"/path/to/dir"` | Optionales Verzeichnis zum Durchsuchen. Standardmäßig das aktuelle Arbeitsverzeichnis |1833| `path` | string | `"/path/to/dir"` | Optionales Verzeichnis, in dem gesucht wird. Standardmäßig das aktuelle Arbeitsverzeichnis |
1826 1834
1827<h5 id="grep">1835<h5 id="grep">
1828 Grep1836 Grep
1832 1840
1833| Feld | Typ | Beispiel | Beschreibung |1841| Feld | Typ | Beispiel | Beschreibung |
1834| :- | :- | :- | :- |1842| :- | :- | :- | :- |
1835| `pattern` | string | `"TODO.*fix"` | Muster für reguläre Ausdrücke zum Suchen |1843| `pattern` | string | `"TODO.*fix"` | Zu suchendes Muster als regulärer Ausdruck |
1836| `path` | string | `"/path/to/dir"` | Optionale Datei oder Verzeichnis zum Durchsuchen |1844| `path` | string | `"/path/to/dir"` | Optionale Datei oder optionales Verzeichnis, in dem gesucht wird |
1837| `glob` | string | `"*.ts"` | Optionales Glob-Muster zum Filtern von Dateien |1845| `glob` | string | `"*.ts"` | Optionales Glob-Muster zum Filtern von Dateien |
1838| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` oder `"count"`. Standardmäßig `"files_with_matches"` |1846| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` oder `"count"`. Standardmäßig `"files_with_matches"` |
1839| `-i` | boolean | `true` | Groß-/Kleinschreibung ignorieren |1847| `-i` | boolean | `true` | Suche ohne Berücksichtigung der Groß-/Kleinschreibung |
1840| `multiline` | boolean | `false` | Mehrzeilige Übereinstimmung aktivieren |1848| `multiline` | boolean | `false` | Mehrzeiliges Matching aktivieren |
1841 1849
1842<h5 id="webfetch">1850<h5 id="webfetch">
1843 WebFetch1851 WebFetch
1844</h5>1852</h5>
1845 1853
1846Ruft Web-Inhalte ab und verarbeitet sie.1854Ruft Webinhalte ab und verarbeitet sie.
1847 1855
1848| Feld | Typ | Beispiel | Beschreibung |1856| Feld | Typ | Beispiel | Beschreibung |
1849| :- | :- | :- | :- |1857| :- | :- | :- | :- |
1850| `url` | string | `"https://example.com/api"` | URL zum Abrufen von Inhalten |1858| `url` | string | `"https://example.com/api"` | URL, von der Inhalte abgerufen werden |
1851| `prompt` | string | `"Extract the API endpoints"` | Eingabeaufforderung zum Ausführen auf dem abgerufenen Inhalt |1859| `prompt` | string | `"Extract the API endpoints"` | Prompt, der auf den abgerufenen Inhalt angewendet wird |
1852 1860
1853<h5 id="websearch">1861<h5 id="websearch">
1854 WebSearch1862 WebSearch
1859| Feld | Typ | Beispiel | Beschreibung |1867| Feld | Typ | Beispiel | Beschreibung |
1860| :- | :- | :- | :- |1868| :- | :- | :- | :- |
1861| `query` | string | `"react hooks best practices"` | Suchanfrage |1869| `query` | string | `"react hooks best practices"` | Suchanfrage |
1862| `allowed_domains` | array | `["docs.example.com"]` | Optional: Nur Ergebnisse von diesen Domains einschließen |1870| `allowed_domains` | array | `["docs.example.com"]` | Optional: nur Ergebnisse von diesen Domains einschließen |
1863| `blocked_domains` | array | `["spam.example.com"]` | Optional: Ergebnisse von diesen Domains ausschließen |1871| `blocked_domains` | array | `["spam.example.com"]` | Optional: Ergebnisse von diesen Domains ausschließen |
1864 1872
1865<h5 id="agent">1873<h5 id="agent">
1866 Agent1874 Agent
1867</h5>1875</h5>
1868 1876
1869Erzeugt einen [Subagenten](/docs/de/sub-agents).1877Startet einen [Subagenten](/docs/de/sub-agents).
1870 1878
1871| Feld | Typ | Beispiel | Beschreibung |1879| Feld | Typ | Beispiel | Beschreibung |
1872| :- | :- | :- | :- |1880| :- | :- | :- | :- |
1873| `prompt` | string | `"Find all API endpoints"` | Die Aufgabe für den Agenten |1881| `prompt` | string | `"Find all API endpoints"` | Die Aufgabe, die der Agent ausführen soll |
1874| `description` | string | `"Find API endpoints"` | Kurze Beschreibung der Aufgabe |1882| `description` | string | `"Find API endpoints"` | Kurze Beschreibung der Aufgabe |
1875| `subagent_type` | string | `"Explore"` | Typ des zu verwendenden spezialisierten Agenten |1883| `subagent_type` | string | `"Explore"` | Typ des zu verwendenden spezialisierten Agenten |
1876| `model` | string | `"sonnet"` | Optionaler Modellalias zum Überschreiben des Standards |1884| `model` | string | `"sonnet"` | Optionaler Modell-Alias, um den Standard zu überschreiben |
1877 1885
1878Wenn ein Vordergrund-Agent-Aufruf abgeschlossen ist, empfängt Ihr [PostToolUse-Hook](#posttooluse) das Ergebnis des Subagenten und die Telemetrie des Laufs in `tool_response`. Lesen Sie diese Felder, um den Lauf zu überprüfen; für Token- und Kostenrollups über Subagenten verwenden Sie die [Token- und Kostenzähler](/docs/de/monitoring-usage#token-counter), gefiltert nach `query_source` `"subagent"`, da `totalTokens` und `usage` nur die letzte Anfrage abdecken:1886Wenn ein Agent-Aufruf im Vordergrund abgeschlossen ist, erhält Ihr [PostToolUse-Hook](#posttooluse) das Ergebnis des Subagenten und die Telemetrie des Laufs in `tool_response`. Lesen Sie diese Felder, um den Lauf zu untersuchen; für Token- und Kostenzusammenfassungen über Subagenten hinweg verwenden Sie die [Token- und Kostenzähler](/docs/de/monitoring-usage#token-counter), gefiltert auf `query_source` `"subagent"`, da `totalTokens` und `usage` nur die letzte Anfrage abdecken:
1879 1887
1880| Feld | Typ | Beispiel | Beschreibung |1888| Feld | Typ | Beispiel | Beschreibung |
1881| :- | :- | :- | :- |1889| :- | :- | :- | :- |
1882| `status` | string | `"completed"` | `"completed"` für Subagenten im Vordergrund, `"async_launched"` für Subagenten im Hintergrund. Subagenten laufen standardmäßig im Hintergrund, sodass ein Agent-Aufruf, der `run_in_background` weglässt, ebenfalls `"async_launched"` ergibt |1890| `status` | string | `"completed"` | `"completed"` für Subagenten im Vordergrund, `"async_launched"` für Subagenten im Hintergrund. Subagenten laufen standardmäßig im Hintergrund, daher erzeugt auch ein Agent-Aufruf ohne `run_in_background` den Wert `"async_launched"` |
1883| `agentId` | string | `"a4d2c8f1e0b3a297"` | Bezeichner für den Subagenten-Lauf |1891| `agentId` | string | `"a4d2c8f1e0b3a297"` | Kennung des Subagenten-Laufs |
1884| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Die finalen Textblöcke des Subagenten oder, für einen Subagenten, dessen Bericht durch `SubagentHandback` geht, eine kurze Notiz über diesen Handback an ihrer Stelle |1892| `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 |
1885| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modell, auf dem der Subagent gestartet wurde, das sich vom angeforderten Modell unterscheiden kann |1893| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modell, mit dem der Subagent gestartet ist, das vom angeforderten Modell abweichen kann |
1886| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Verwendete Modelle in Reihenfolge, mit aufeinanderfolgenden Wiederholungen zusammengefasst; nur gesetzt, wenn das Modell während des Laufs gewechselt wurde. Erfordert Claude Code v2.1.212 oder später |1894| `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 |
1887| `totalTokens` | number | `12450` | Token-Anzahl aus der letzten API-Anfrage des Subagenten: Eingabe-, Ausgabe- und Cache-Token kombiniert. Dies ist keine Gesamtsumme über den gesamten Lauf |1895| `totalTokens` | number | `12450` | Token-Anzahl aus der letzten API-Anfrage des Subagenten: Eingabe-, Ausgabe- und Cache-Token zusammen. Dies ist keine Summe über den gesamten Lauf |
1888| `totalDurationMs` | number | `48211` | Echtzeit-Dauer des Subagenten-Laufs |1896| `totalDurationMs` | number | `48211` | Echtzeitdauer des Subagenten-Laufs |
1889| `totalToolUseCount` | number | `7` | Anzahl der Tool-Aufrufe, die der Subagent gemacht hat |1897| `totalToolUseCount` | number | `7` | Anzahl der Tool-Aufrufe, die der Subagent durchgeführt hat |
1890| `usage` | object | `{"input_tokens": 8320, ...}` | Pro-Typ Token-Aufschlüsselung der letzten API-Anfrage: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1898| `usage` | object | `{"input_tokens": 8320, ...}` | Token-Aufschlüsselung nach Typ für die letzte API-Anfrage: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1891 1899
1892Auf Claude Code v2.1.271 oder später liefert ein Subagent, der mit dem [`SubagentHandback`](/docs/de/tools-reference) Tool 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 `content` Feld seines `completed` Ergebnisses trägt dann eine kurze Notiz über diesen Handback statt des Berichts selbst. Um den Bericht zu lesen, gleichen Sie einen `PreToolUse` oder `PostToolUse` Hook auf `SubagentHandback` ab und lesen Sie `tool_input.message`.1900Ab Claude Code v2.1.271 liefert ein Subagent, der mit dem Tool [`SubagentHandback`](/docs/de/tools-reference) läuft, das Claude Code im [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) bereitstellt, seinen Bericht über dieses Tool, statt ihn als Text zurückzugeben. Das Feld `content` seines `completed`-Ergebnisses enthält dann einen kurzen Hinweis auf diese Übergabe statt des Berichts selbst. Um den Bericht zu lesen, lassen Sie einen `PreToolUse`- oder `PostToolUse`-Hook auf `SubagentHandback` matchen und lesen `tool_input.message`.
1893 1901
1894Für Hintergrund-Subagenten gibt das Tool zurück, wenn die Aufgabe in den Hintergrund geht, daher trägt `tool_response` keine Nutzungsfelder: Ein Hintergrund-Start gibt sofort zurück und eine Vordergrund-Aufgabe, die Claude Code während des Laufs in den Hintergrund verschiebt, gibt an diesem Übergang zurück. Es hat `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` und `resolvedModel`.1902Bei Subagenten im Hintergrund kehrt das Tool zurück, wenn die Aufgabe in den Hintergrund wechselt, daher enthält `tool_response` keine Nutzungsfelder: Ein Start im Hintergrund kehrt sofort zurück, und eine Vordergrundaufgabe, die Claude Code während des Laufs in den Hintergrund verschiebt, kehrt bei diesem Übergang zurück. Sie hat `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` und `resolvedModel`.
1895 1903
1896Bei einem `completed` Ergebnis benennt `resolvedModel` das Modell, auf dem der Subagent gestartet wurde, das sich vom `model` Wert in `tool_input` unterscheiden kann, wie wenn `availableModels` oder eine andere Überschreibung gilt. Bei einem `async_launched` Ergebnis benennt `resolvedModel` das Modell in Verwendung, wenn der Agent in den Hintergrund geht, daher wird ein Wechsel, der vor dem Hintergrund-Verschieben stattfand, dort widergespiegelt. `modelsUsed` und das Hintergrund-Verschiebungs-Zeit-`resolvedModel` Verhalten erfordern Claude Code v2.1.212 oder später.1904Bei einer `completed`-Antwort nennt `resolvedModel` das Modell, mit dem der Subagent gestartet ist, das vom `model`-Wert in `tool_input` abweichen kann, etwa wenn `availableModels` oder eine andere Überschreibung greift. Bei einer `async_launched`-Antwort nennt `resolvedModel` das Modell, das verwendet wurde, als der Agent in den Hintergrund wechselte, sodass ein Wechsel vor dem Verschieben in den Hintergrund dort berücksichtigt ist. `modelsUsed` und das Verhalten von `resolvedModel` zum Zeitpunkt des Verschiebens in den Hintergrund erfordern Claude Code v2.1.212 oder höher.
1897 1905
1898<a id="askuserquestion" />1906<a id="askuserquestion" />
1899 1907
1901 AskUserQuestion1909 AskUserQuestion
1902</h5>1910</h5>
1903 1911
1904Stellt dem Benutzer eine bis vier Multiple-Choice-Fragen.1912Stellt dem Benutzer ein bis vier Multiple-Choice-Fragen.
1905 1913
1906| Feld | Typ | Beispiel | Beschreibung |1914| Feld | Typ | Beispiel | Beschreibung |
1907| :- | :- | :- | :- |1915| :- | :- | :- | :- |
1908| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Zu präsentierende Fragen, jeweils mit einer `question` Zeichenkette, kurzem `header`, `options` Array und optionalem `multiSelect` Flag |1916| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Anzuzeigende Fragen, jeweils mit einer `question`-Zeichenkette, einem kurzen `header`, einem `options`-Array und einem optionalen `multiSelect`-Flag |
1909| `answers` | object | `{"Which framework?": "React"}` | Optional. Ordnet Fragetext der ausgewählten Optionsbeschriftung zu. Multi-Select-Antworten verbinden Beschriftungen mit Kommas. Claude setzt dieses Feld nicht; liefern Sie es über `updatedInput`, um programmatisch zu antworten |1917| `answers` | object | `{"Which framework?": "React"}` | Optional. Ordnet den Fragetext dem ausgewählten Optionslabel zu. Antworten mit Mehrfachauswahl verbinden Labels mit Kommas. Claude setzt dieses Feld nicht; liefern Sie es über `updatedInput`, um programmatisch zu antworten |
1910 1918
1911<h5 id="exitplanmode">1919<h5 id="exitplanmode">
1912 ExitPlanMode1920 ExitPlanMode
1913</h5>1921</h5>
1914 1922
1915Präsentiert einen Plan und fragt den Benutzer, ihn zu genehmigen, bevor Claude den [Plan-Modus](/docs/de/permission-modes#analyze-before-you-edit-with-plan-mode) verlässt. Claude schreibt den Plan vor dem Aufrufen des Tools in eine Datei auf der Festplatte, daher ist die wörtliche `tool_input` vom Modell typischerweise leer. Claude Code injiziert den Plan-Inhalt und Dateipfad, bevor die Eingabe an Hooks übergeben wird.1923Präsentiert einen Plan und bittet den Benutzer um Genehmigung, bevor Claude den [Plan-Modus](/docs/de/permission-modes#analyze-before-you-edit-with-plan-mode) verlässt. Claude schreibt den Plan vor dem Aufruf des Tools in eine Datei auf der Festplatte, daher ist das wörtliche `tool_input` des Modells in der Regel leer. Claude Code fügt den Planinhalt und den Dateipfad ein, bevor die Eingabe an Hooks übergeben wird.
1916 1924
1917| Feld | Typ | Beispiel | Beschreibung |1925| Feld | Typ | Beispiel | Beschreibung |
1918| :- | :- | :- | :- |1926| :- | :- | :- | :- |
1919| `plan` | string | `"## Refactor auth\n1. Extract..."` | Plan-Inhalt in Markdown. Injiziert aus der Plan-Datei auf der Festplatte |1927| `plan` | string | `"## Refactor auth\n1. Extract..."` | Planinhalt in Markdown. Aus der Plandatei auf der Festplatte eingefügt |
1920| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Pfad zur Plan-Datei. Injiziert |1928| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Pfad zur Plandatei. Eingefügt |
1921| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Veraltet. Claude Code akzeptiert das Feld, ignoriert es aber. Vor v2.1.205 trug es prompt-basierte Berechtigungen, die Claude anforderte, um den Plan zu implementieren |1929| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Veraltet. Claude Code akzeptiert das Feld, ignoriert es aber. Vor v2.1.205 enthielt es promptbasierte Berechtigungen, die Claude zur Umsetzung des Plans angefordert hat |
1922 1930
1923In `PostToolUse` ist `tool_response` ein Objekt mit `plan` und `filePath` Feldern, die den genehmigten Plan enthalten, plus interne Status-Flags. Lesen Sie `tool_response.plan` für den Plan-Inhalt, anstatt die Datei von der Festplatte erneut zu lesen.1931In `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.
1924 1932
1925<h4 id="pretooluse-decision-control">1933<h4 id="pretooluse-decision-control">
1926 PreToolUse-Entscheidungskontrolle1934 PreToolUse-Entscheidungssteuerung
1927</h4>1935</h4>
1928 1936
1929`PreToolUse` Hooks können steuern, ob ein Tool-Aufruf fortgesetzt wird. Im Gegensatz zu anderen Hooks, die ein Top-Level-`decision` Feld verwenden, gibt PreToolUse seine Entscheidung in einem `hookSpecificOutput` Objekt zurück. Dies gibt ihm reichere Kontrolle: vier Ergebnisse (zulassen, verweigern, fragen oder aufschieben) plus die Möglichkeit, Tool-Eingabe vor der Ausführung zu ändern.1937`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.
1930 1938
1931| Feld | Beschreibung |1939| Feld | Beschreibung |
1932| :- | :- |1940| :- | :- |
1933| `permissionDecision` | `"allow"` überspringt die Berechtigungsaufforderung, außer für die [Aktionen, die kein Modus automatisch genehmigt](/docs/de/permission-modes#actions-no-mode-auto-approves) und für `AskUserQuestion` und `ExitPlanMode`, die [`updatedInput` gepaart damit benötigen](#allow-with-updatedinput). `"deny"` verhindert den Tool-Aufruf. `"ask"` fordert den Benutzer zur Bestätigung auf. `"defer"` beendet ordnungsgemäß, damit das Tool später fortgesetzt werden kann. [Ablehnungs- und Frage-Regeln](/docs/de/permissions#manage-permissions) werden immer noch ausgewertet, unabhängig davon, was der Hook zurückgibt |1941| `permissionDecision` | `"allow"` überspringt die Berechtigungsabfrage, außer bei den [Aktionen, die kein Modus automatisch genehmigt](/docs/de/permission-modes#actions-no-mode-auto-approves), sowie bei `AskUserQuestion` und `ExitPlanMode`, die [`updatedInput` zusammen damit](#allow-with-updatedinput) benötigen. `"deny"` verhindert den Tool-Aufruf. `"ask"` bittet den Benutzer um Bestätigung. `"defer"` beendet sauber, sodass das Tool später fortgesetzt werden kann. [Deny- und ask-Regeln](/docs/de/permissions#manage-permissions) werden unabhängig davon ausgewertet, was der Hook zurückgibt |
1934| `permissionDecisionReason` | Für `"ask"`, dem Benutzer angezeigt, aber nicht Claude. Für `"deny"`, Claude angezeigt. Für `"allow"` und `"defer"`, nur ins [Debug-Protokoll](#debug-hooks) geschrieben |1942| `permissionDecisionReason` | Bei `"ask"` wird er dem Benutzer in der Berechtigungsabfrage angezeigt. Wenn Claude Code [den Aufruf ablehnt](/docs/de/headless#turn-off-permission-prompts-in-unattended-runs), in einem `-p`-Lauf, in dem niemand diese Abfrage beantworten kann, liest Claude den Grund stattdessen im Tool-Ergebnis. Bei `"deny"` wird er Claude angezeigt. Bei `"allow"` und `"defer"` wird er nur in das [Debug-Log](#debug-hooks) geschrieben |
1935| `updatedInput` | Ändert die Tool-Eingabeparameter vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, daher schließen Sie unveränderte Felder neben geänderten ein. Claude Code wertet Berechtigungsregeln und die [Auto-Hintergrund-Berechtigung](/docs/de/tools-reference#background-commands) eines Bash-Befehls gegen die Eingabe aus, die Ihr Hook zurückgibt, nicht die Eingabe, die Claude gesendet hat. Kombinieren Sie mit `"allow"`, um automatisch zu genehmigen, oder `"ask"`, um die geänderte Eingabe dem Benutzer zu zeigen. Für `"defer"`, ignoriert |1943| `updatedInput` | Ändert die Eingabeparameter des Tools vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, nehmen Sie daher unveränderte Felder zusammen mit den geänderten auf. Claude Code wertet Berechtigungsregeln und die [Eignung eines Bash-Befehls für das automatische Verschieben in den Hintergrund](/docs/de/tools-reference#foreground-commands-that-move-to-the-background) anhand der Eingabe aus, die Ihr Hook zurückgibt, nicht anhand der Eingabe, die Claude gesendet hat. Kombinieren Sie es mit `"allow"` für automatische Genehmigung oder mit `"ask"`, um dem Benutzer die geänderte Eingabe anzuzeigen. Bei `"defer"` wird es ignoriert |
1936| `additionalContext` | String, der zu Claudes Kontext neben dem Tool-Ergebnis hinzugefügt wird. Ignoriert, wenn `permissionDecision` `"defer"` ist. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |1944| `additionalContext` | Zeichenkette, die neben dem Tool-Ergebnis zu Claudes Kontext hinzugefügt wird. Wird ignoriert, wenn `permissionDecision` den Wert `"defer"` hat. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
1937 1945
1938Wenn mehrere PreToolUse-Hooks unterschiedliche Entscheidungen zurückgeben, ist die Priorität `deny` > `defer` > `ask` > `allow`.1946Wenn mehrere PreToolUse-Hooks unterschiedliche Entscheidungen zurückgeben, gilt die Rangfolge `deny` > `defer` > `ask` > `allow`.
1939 1947
1940Ein Hook, der durch Beendigung mit 2 blockiert, leitet auf die gleiche Weise wie `"deny"` weiter: Claude sieht die stderr-Nachricht als Ablehnungsgrund.1948Ein Hook, der durch Beenden mit 2 blockiert, wird genauso behandelt wie `"deny"`: Claude sieht die stderr-Meldung als Ablehnungsgrund.
1941 1949
1942Wenn ein Hook `"ask"` zurückgibt, enthält die dem Benutzer angezeigte Berechtigungsaufforderung ein Label, das angibt, woher der Hook stammt: `[settings]` für einen Hook aus einer beliebigen Einstellungsdatei oder Agent-Frontmatter, `[plugin:<name>]` für einen Plugin-Hook oder `[skill]` für einen Hook aus Skill-Frontmatter. Dies hilft Benutzern zu verstehen, welche Konfigurationsquelle eine Bestätigung anfordert.1950Wenn ein Hook `"ask"` zurückgibt, enthält die dem Benutzer angezeigte Berechtigungsabfrage ein Label, das angibt, woher der Hook stammt: `[settings]` für einen Hook aus einer beliebigen Einstellungsdatei oder aus Agenten-Frontmatter, `[plugin:<name>]` für den Hook eines Plugins oder `[skill]` für einen Hook aus Skill-Frontmatter. So können Benutzer nachvollziehen, welche Konfigurationsquelle die Bestätigung anfordert.
1943 1951
1944Ein Hook-`"ask"` erzwingt auch eine Berechtigungsaufforderung im [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode): Der Klassifizierer kann den Tool-Aufruf immer noch verweigern, kann ihn aber nicht stillschweigend genehmigen. Vor v2.1.211 konnte der Klassifizierer einen Bash-Befehl, der außerhalb der [Sandbox](/docs/de/sandboxing) läuft, ohne die Aufforderung zu zeigen, die der Hook anforderte, genehmigen; der Klassifizierer wendete immer noch seine eigenen Sicherheitsregeln auf diesen Befehl an, und ein Hook `"deny"` wurde immer berücksichtigt.1952Ein `"ask"` eines Hooks erzwingt auch im [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) eine Berechtigungsabfrage: Der Klassifikator kann den Tool-Aufruf weiterhin ablehnen, ihn aber nicht stillschweigend genehmigen. Vor v2.1.211 konnte der Klassifikator einen Bash-Befehl, der außerhalb der [Sandbox](/docs/de/sandboxing) lief, genehmigen, ohne die vom Hook angeforderte Abfrage anzuzeigen; der Klassifikator wendete dabei weiterhin seine eigenen Sicherheitsregeln auf diesen Befehl an, und ein `"deny"` eines Hooks wurde immer beachtet.
1945 1953
1946```json theme={null}1954```json theme={null}
1947{1955{
1959 1967
1960<span id="allow-with-updatedinput" />1968<span id="allow-with-updatedinput" />
1961 1969
1962Im [nicht-interaktiven Modus](/docs/de/headless) mit dem `-p` Flag bietet Claude Code `AskUserQuestion` und `ExitPlanMode` nur an, wenn der Lauf einen [Berechtigungshost](/docs/de/headless#turn-off-permission-prompts-in-unattended-runs) hat, um die Aufforderung zu empfangen, wie einen Agent SDK `canUseTool` Callback. Diese Tools erfordern Benutzerinteraktion. Das Zurückgeben von `permissionDecision: "allow"` zusammen mit `updatedInput` erfüllt diese Anforderung: Der Hook liest die Tool-Eingabe von stdin, sammelt die Antwort über Ihre eigene Benutzeroberfläche und gibt sie in `updatedInput` zurück, damit das Tool ohne Aufforderung ausgeführt wird. Das Zurückgeben von `"allow"` allein ist nicht ausreichend für diese Tools. Für `AskUserQuestion` geben Sie das ursprüngliche `questions` Array zurück und fügen Sie ein [`answers`](#askuserquestion) Objekt hinzu, das jede Frage auf die gewählte Antwort abbildet.1970Im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p` bietet Claude Code `AskUserQuestion` und `ExitPlanMode` nur an, wenn der Lauf einen [Berechtigungs-Host](/docs/de/headless#turn-off-permission-prompts-in-unattended-runs) hat, der die Abfrage entgegennimmt, etwa einen `canUseTool`-Callback des Agent SDK. Diese Tools erfordern Benutzerinteraktion. Die Rückgabe von `permissionDecision: "allow"` zusammen mit `updatedInput` erfüllt diese Anforderung: Der Hook liest die Eingabe des Tools von stdin, erfasst die Antwort über Ihre eigene Oberfläche und gibt sie in `updatedInput` zurück, sodass das Tool ohne Abfrage ausgeführt wird. Die Rückgabe von `"allow"` allein reicht für diese Tools nicht aus. Für `AskUserQuestion` geben Sie das ursprüngliche `questions`-Array zurück und fügen ein [`answers`](#askuserquestion)-Objekt hinzu, das den Text jeder Frage der gewählten Antwort zuordnet.
1963 1971
1964Ab v2.1.199 ist ein MCP-Tool, dessen Server es mit [`_meta["anthropic/requiresUserInteraction"]`](/docs/de/mcp#require-approval-for-a-specific-tool) markiert, strenger: Ein Hook kann seine Genehmigungsaufforderung nicht mit `"allow"` überspringen, mit oder ohne `updatedInput`, da Claude Code nicht bestätigen kann, dass der Hook die Interaktion gesammelt hat, die das Tool benötigt.1972Ein MCP-Tool, das sein Server mit [`_meta["anthropic/requiresUserInteraction"]`](/docs/de/mcp#require-approval-for-a-specific-tool) kennzeichnet, ist strenger: Ein Hook kann dessen Genehmigungsabfrage mit `"allow"` nicht überspringen, weder mit noch ohne `updatedInput`, da Claude Code nicht bestätigen kann, dass der Hook die vom Tool benötigte Interaktion erfasst hat.
1965 1973
1966<Note>1974<Note>
1967 PreToolUse verwendete zuvor Top-Level-`decision` und `reason` Felder, aber diese sind für dieses Ereignis veraltet. Verwenden Sie stattdessen `hookSpecificOutput.permissionDecision` und `hookSpecificOutput.permissionDecisionReason`. Die veralteten Werte `"approve"` und `"block"` werden auf `"allow"` und `"deny"` abgebildet. Andere Ereignisse wie PostToolUse und Stop verwenden weiterhin Top-Level-`decision` und `reason` als ihr aktuelles Format.1975 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.
1968</Note>1976</Note>
1969 1977
1970<h4 id="defer-a-tool-call-for-later">1978<h4 id="defer-a-tool-call-for-later">
1971 Einen Tool-Aufruf für später aufschieben1979 Einen Tool-Aufruf für später zurückstellen
1972</h4>1980</h4>
1973 1981
1974`"defer"` ist für Integrationen, die `claude -p` als Unterprozess ausführen und seine JSON-Ausgabe lesen, wie eine Agent SDK App oder eine benutzerdefinierte Benutzeroberfläche auf Claude Code. Es ermöglicht diesem aufrufenden Prozess, Claude bei einem Tool-Aufruf zu pausieren, Eingabe über seine eigene Schnittstelle zu sammeln und dort fortzufahren, wo er aufgehört hat. Claude Code berücksichtigt diesen Wert nur im [nicht-interaktiven Modus](/docs/de/headless) mit dem `-p` Flag. In interaktiven Sitzungen protokolliert es eine Warnung und ignoriert das Hook-Ergebnis.1982`"defer"` ist für Integrationen gedacht, die `claude -p` als Subprozess ausführen und dessen JSON-Ausgabe lesen, etwa eine Agent SDK-App oder eine auf Claude Code aufbauende benutzerdefinierte Oberfläche. Damit kann der aufrufende Prozess Claude bei einem Tool-Aufruf anhalten, Eingaben über seine eigene Oberfläche erfassen und dort weitermachen, wo er aufgehört hat. Claude Code berücksichtigt diesen Wert nur im [nicht interaktiven Modus](/docs/de/headless) mit dem Flag `-p`. In interaktiven Sitzungen protokolliert es eine Warnung und ignoriert das Hook-Ergebnis.
1975 1983
1976Das `AskUserQuestion` Tool ist der typische Fall: Claude möchte den Benutzer etwas fragen, aber es gibt kein Terminal zum Antworten. Ein `-p` Lauf bietet `AskUserQuestion` nur an, wenn er einen [Berechtigungshost](/docs/de/headless#turn-off-permission-prompts-in-unattended-runs) hat, wie ein MCP-Tool, das Sie mit `--permission-prompt-tool` übergeben, daher starten Sie den Lauf mit einem. Der Roundtrip funktioniert so:1984Das 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:
1977 1985
19781. Claude ruft `AskUserQuestion` auf. Der `PreToolUse` Hook wird ausgelöst.19861. Claude ruft `AskUserQuestion` auf. Der `PreToolUse`-Hook wird ausgelöst.
19792. Der Hook gibt `permissionDecision: "defer"` zurück. Das Tool wird nicht ausgeführt. Der Prozess beendet sich mit `stop_reason: "tool_deferred"` und dem ausstehenden Tool-Aufruf, der im Transkript erhalten bleibt.19872. 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.
19803. 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.19883. 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.
19814. Der aufrufende Prozess führt `claude -p --resume <session-id>` mit dem gleichen Berechtigungshost aus. Der gleiche Tool-Aufruf löst `PreToolUse` erneut aus.19894. Der aufrufende Prozess führt `claude -p --resume <session-id>` mit demselben Berechtigungs-Host aus. Derselbe Tool-Aufruf löst `PreToolUse` erneut aus.
19825. Der Hook gibt `permissionDecision: "allow"` mit der Antwort in `updatedInput` zurück. Das Tool wird ausgeführt und Claude setzt fort.19905. Der Hook gibt `permissionDecision: "allow"` mit der Antwort in `updatedInput` zurück. Das Tool wird ausgeführt, und Claude fährt fort.
1983 1991
1984Das `deferred_tool_use` Feld trägt die `id`, den `name` und die `input` des Tools. Die `input` sind die Parameter, die Claude für den Tool-Aufruf generiert hat, erfasst vor der Ausführung:1992Das Feld `deferred_tool_use` enthält `id`, `name` und `input` des Tools. `input` sind die Parameter, die Claude für den Tool-Aufruf erzeugt hat, erfasst vor der Ausführung:
1985 1993
1986```json theme={null}1994```json theme={null}
1987{1995{
1997}2005}
1998```2006```
1999 2007
2000Es gibt kein Timeout oder Wiederholungslimit. Die Sitzung bleibt auf der Festplatte, bis Sie sie fortsetzen, unterliegt aber der [`cleanupPeriodDays`](/docs/de/settings-reference#cleanupperioddays) Aufbewahrungssweep, die Sitzungsdateien nach 30 Tagen standardmäßig löscht, nach den [Aufbewahrungssweep-Regeln](/docs/de/claude-directory#cleaned-up-automatically). Wenn die Antwort nicht bereit ist, wenn Sie fortsetzen, kann der Hook erneut `"defer"` zurückgeben und der Prozess beendet sich auf die gleiche Weise. Der aufrufende Prozess steuert, wann die Schleife unterbrochen wird, indem er schließlich `"allow"` oder `"deny"` vom Hook zurückgibt.2008Es gibt weder einen Timeout noch ein Limit für Wiederholungsversuche. Die Sitzung bleibt auf der Festplatte, bis Sie sie fortsetzen, vorbehaltlich der Aufbewahrungsbereinigung durch [`cleanupPeriodDays`](/docs/de/settings-reference#cleanupperioddays), die Sitzungsdateien standardmäßig nach 30 Tagen löscht, gemäß den [Regeln der Aufbewahrungsbereinigung](/docs/de/claude-directory#cleaned-up-automatically). Wenn die Antwort beim Fortsetzen noch nicht bereit ist, kann der Hook erneut `"defer"` zurückgeben, und der Prozess wird auf dieselbe Weise beendet. Der aufrufende Prozess bestimmt, wann die Schleife endet, indem er schließlich `"allow"` oder `"deny"` aus dem Hook zurückgibt.
2001 2009
2002`"defer"` funktioniert nur, wenn Claude einen einzelnen Tool-Aufruf im Zug macht. Wenn Claude mehrere Tool-Aufrufe gleichzeitig macht, wird `"defer"` mit einer Warnung ignoriert und das Tool geht durch den normalen Berechtigungsfluss. Die Einschränkung existiert, weil Resume nur ein Tool erneut ausführen kann: Es gibt keine Möglichkeit, einen Aufruf aus einem Batch aufzuschieben, ohne die anderen ungelöst zu lassen.2010`"defer"` funktioniert nur, wenn Claude im Turn einen einzigen Tool-Aufruf durchführt. Wenn Claude mehrere Tool-Aufrufe gleichzeitig durchführt, wird `"defer"` mit einer Warnung ignoriert, und das Tool durchläuft den normalen Berechtigungsablauf. Diese Einschränkung besteht, weil beim Fortsetzen nur ein Tool erneut ausgeführt werden kann: Es gibt keine Möglichkeit, einen Aufruf aus einem Stapel zurückzustellen, ohne die anderen ungeklärt zu lassen.
2003 2011
2004Wenn das aufgeschobene Tool nicht mehr verfügbar ist, wenn Sie fortsetzen, beendet sich der Prozess mit `stop_reason: "tool_deferred_unavailable"` und `is_error: true` bevor der Hook ausgelöst wird. Dies geschieht, wenn ein MCP-Server, der das Tool bereitgestellt hat, für die fortgesetzte Sitzung nicht verbunden ist. Die `deferred_tool_use` Nutzlast ist immer noch enthalten, damit Sie identifizieren können, welches Tool fehlte.2012Wenn das zurückgestellte Tool beim Fortsetzen nicht mehr verfügbar ist, wird der Prozess mit `stop_reason: "tool_deferred_unavailable"` und `is_error: true` beendet, bevor der Hook ausgelöst wird. Das passiert, wenn ein MCP-Server, der das Tool bereitgestellt hat, für die fortgesetzte Sitzung nicht verbunden ist. Die Payload `deferred_tool_use` ist trotzdem enthalten, sodass Sie erkennen können, welches Tool fehlt.
2005 2013
2006<Note>2014<Note>
2007 Um eine aufgeschobene 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 präsentieren kann. Wenn Sie bestimmte andere Start-Flags übergeben, kehrt der fortgesetzte Lauf nicht zum Plan-Modus zurück; siehe [Im Plan-Modus mit `-p` fortsetzen](/docs/de/sessions#resume-in-plan-mode-with-p). Erfordert Claude Code v2.1.246 oder später.2015 Um eine zurückgestellte Sitzung im Plan-Modus fortzusetzen, übergeben Sie [`--permission-prompt-tool`](/docs/de/cli-reference#cli-flags) zusammen mit `--resume`, damit Claude Code den Plan zur Genehmigung vorlegen kann. Wenn Sie bestimmte andere Start-Flags übergeben, kehrt der fortgesetzte Lauf nicht in den Plan-Modus zurück; siehe [Im Plan-Modus mit `-p` fortsetzen](/docs/de/sessions#resume-in-plan-mode-with-p). Erfordert Claude Code v2.1.246 oder höher.
2008 2016
2009 Wenn Sie mit `-p` fortsetzen, stellt Claude Code keinen anderen gespeicherten Berechtigungsmodus wieder her. Es startet den Lauf im Berechtigungsmodus, den ein neuer `claude -p` Lauf starten würde, daher übergeben Sie `--permission-mode` oder `--dangerously-skip-permissions` erneut, wenn die aufgeschobene Sitzung einen verwendet hat. Wenn Sie mit `claude --resume <session-id>` ohne `-p` fortsetzen, stellt Claude Code den gespeicherten Berechtigungsmodus wieder her, mit den Ausnahmen, die in [Berechtigungsmodus beim Fortsetzen](/docs/de/sessions#permission-mode-on-resume) aufgelistet sind.2017 Wenn Sie mit `-p` fortsetzen, stellt Claude Code keinen anderen gespeicherten Berechtigungsmodus wieder her. Es startet den Lauf in dem Berechtigungsmodus, in dem ein neuer `claude -p`-Lauf starten würde. Übergeben Sie daher `--permission-mode` oder `--dangerously-skip-permissions` erneut, wenn die zurückgestellte Sitzung eines davon verwendet hat. Wenn Sie mit `claude --resume <session-id>` ohne `-p` fortsetzen, stellt Claude Code den gespeicherten Berechtigungsmodus wieder her, mit den unter [Berechtigungsmodus beim Fortsetzen](/docs/de/sessions#permission-mode-on-resume) aufgeführten Ausnahmen.
2010</Note>2018</Note>
2011 2019
2012<h3 id="permissionrequest">2020<h3 id="permissionrequest">
2013 PermissionRequest2021 PermissionRequest
2014</h3>2022</h3>
2015 2023
2016Wird ausgeführt, wenn Claude Code Sie gleich um Erlaubnis zur Verwendung eines Tools bitten will. 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 trotzdem aus, und wenn kein Hook eine Entscheidung zurückgibt, verweigert es den Tool-Aufruf. Bei einem Aufruf, der ein `--permission-prompt-tool` oder den [`canUseTool`-Callback](/docs/de/agent-sdk/permissions) des Agent SDK erreicht, laufen die Hooks parallel zu Ihrem Host, und es gilt, wer zuerst entscheidet.2024Wird ausgeführt, wenn Claude Code Sie gleich um Erlaubnis zur Verwendung eines Tools bitten wird. In Sitzungen, die keine Abfrage anzeigen können, etwa bei Subagenten im Hintergrund im [nicht interaktiven Modus](/docs/de/headless), führt Claude Code diese Hooks trotzdem aus, und wenn kein Hook eine Entscheidung zurückgibt, lehnt es den Tool-Aufruf ab. Bei einem Aufruf, der ein `--permission-prompt-tool` oder den [`canUseTool`-Callback](/docs/de/agent-sdk/permissions) des Agent SDK erreicht, laufen die Hooks parallel zu Ihrem Host, und es gilt, wer zuerst entscheidet.
2017Verwenden Sie die [PermissionRequest-Entscheidungssteuerung](#permissionrequest-decision-control), um im Namen des Benutzers zu erlauben oder zu verweigern.2025Verwenden Sie die [PermissionRequest-Entscheidungssteuerung](#permissionrequest-decision-control), um im Namen des Benutzers zuzulassen oder abzulehnen.
2018 2026
2019Verwenden Sie dieses Ereignis, wenn Sie ein Signal benötigen, in dem Moment, in dem Claude um Genehmigung zur Verwendung eines Tools bittet. Claude Code führt einen [Notification](#notification) Hook mit dem `permission_prompt` Typ nur aus, nachdem die Aufforderung etwa sechs Sekunden gewartet hat.2027Verwenden Sie dieses Ereignis, wenn Sie ein Signal in dem Moment benötigen, in dem Claude um Erlaubnis zur Verwendung eines Tools bittet. Claude Code führt einen [Notification](#notification)-Hook mit dem Typ `permission_prompt` erst aus, nachdem die Abfrage etwa sechs Sekunden gewartet hat.
2020 2028
2021Claude Code führt PermissionRequest-Hooks nicht für eine Sandbox-Anfrage einer [Netzwerkanfrage](/docs/de/sandboxing#network-isolation) aus. Um ein Signal für diese Aufforderung zu erhalten, verwenden Sie den `permission_prompt` Benachrichtigungstyp.2029Claude 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`.
2022 2030
2023Gleicht Tool-Namen ab, gleiche Werte wie PreToolUse.2031Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.
2024 2032
2025<h4 id="permissionrequest-input">2033<h4 id="permissionrequest-input">
2026 PermissionRequest-Eingabe2034 PermissionRequest-Eingabe
2027</h4>2035</h4>
2028 2036
2029PermissionRequest-Hooks erhalten `tool_name` und `tool_input` Felder wie PreToolUse-Hooks, aber ohne `tool_use_id`. Für ein MCP-Tool erhalten sie auch das [`mcp_server`](#pretooluse-input) Objekt. Ein optionales `permission_suggestions` Array enthält die [Berechtigungsaktualisierungen](#permission-update-entries), die Claude Code für diese Anfrage vorschlägt, wie das Hinzufügen einer Zulassungsregel oder das Ändern des Berechtigungsmodus.2037PermissionRequest-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.
2030 2038
2031Das `permission_suggestions` Array ist keine genaue Liste der Optionen, die Sie sehen, da jeder Berechtigungsdialog seine eigenen Optionen erstellt. Einige Dialoge, wie der für Dateibearbeitungen, lesen das Array überhaupt nicht und leiten ihre Optionen aus der Anfrage selbst ab. Ein Dialog, der es liest, kann immer noch eine Option zurückhalten, deren Vorschlag im Array bleibt, z. B. wenn [`allowManagedPermissionRulesOnly`](/docs/de/settings-reference#allowmanagedpermissionrulesonly) Regel-Speicheroptionen verbirgt. Es kann auch Optionen anbieten, die keinen Vorschlagseintrag haben, wie [**Ja, und zum Auto-Modus wechseln**](/docs/de/permission-modes#switch-permission-modes), das den Berechtigungsmodus direkt ändert, anstatt durch eine Berechtigungsaktualisierung.2039Das Array `permission_suggestions` ist keine exakte Liste der angezeigten Optionen, da jeder Berechtigungsdialog seine eigenen Optionen aufbaut. Manche Dialoge, etwa der für Dateibearbeitungen, lesen das Array überhaupt nicht und leiten ihre Optionen aus der Anfrage selbst ab. Ein Dialog, der es liest, kann dennoch eine Option zurückhalten, deren Vorschlag im Array verbleibt, zum Beispiel wenn [`allowManagedPermissionRulesOnly`](/docs/de/settings-reference#allowmanagedpermissionrulesonly) Optionen zum Speichern von Regeln ausblendet. Er kann auch Optionen anbieten, für die es keinen Vorschlagseintrag gibt, etwa [**Yes, and switch to auto mode**](/docs/de/permission-modes#switch-permission-modes), das den Berechtigungsmodus direkt ändert statt über eine Berechtigungsaktualisierung.
2032 2040
2033PreToolUse-Hooks werden vor jedem Tool-Aufruf ausgeführt, unabhängig davon, ob er Genehmigung benötigt. PermissionRequest-Hooks werden nur ausgeführt, wenn Claude Code Sie um Genehmigung bitten möchte, oder wenn es sonst einen Aufruf automatisch verweigern würde, der nicht auffordern kann. Keines der Ereignisse wird für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgelöst.2041PreToolUse-Hooks werden vor jedem Tool-Aufruf ausgeführt, unabhängig davon, ob er eine Berechtigung benötigt. PermissionRequest-Hooks werden nur ausgeführt, wenn Claude Code Sie gleich um Erlaubnis bitten wird oder wenn es andernfalls einen Aufruf, der keine Abfrage anzeigen kann, automatisch ablehnen würde. Keines der beiden Ereignisse wird für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgelöst.
2034 2042
2035```json theme={null}2043```json theme={null}
2036{2044{
2056```2064```
2057 2065
2058<h4 id="permissionrequest-decision-control">2066<h4 id="permissionrequest-decision-control">
2059 PermissionRequest-Entscheidungskontrolle2067 PermissionRequest-Entscheidungssteuerung
2060</h4>2068</h4>
2061 2069
2062`PermissionRequest` Hooks können Berechtigungsanfragen zulassen oder verweigern. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, kann Ihr Hook-Skript ein `decision` Objekt mit diesen ereignisspezifischen Feldern zurückgeben:2070`PermissionRequest`-Hooks können Berechtigungsanfragen zulassen oder ablehnen. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, kann Ihr Hook-Skript ein `decision`-Objekt mit diesen ereignisspezifischen Feldern zurückgeben:
2063 2071
2064| Feld | Beschreibung |2072| Feld | Beschreibung |
2065| :- | :- |2073| :- | :- |
2066| `behavior` | `"allow"` gewährt die Genehmigung, `"deny"` verweigert sie. [Ablehnungs- und Frage-Regeln](/docs/de/permissions#manage-permissions) werden immer noch ausgewertet, daher überschreibt ein Hook, der `"allow"` zurückgibt, keine übereinstimmende Ablehnungsregel |2074| `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 |
2067| `updatedInput` | Für `"allow"` nur: ändert die Tool-Eingabeparameter vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, daher schließen Sie unveränderte Felder neben geänderten ein. Die geänderte Eingabe wird erneut gegen Ablehnungs- und Frage-Regeln ausgewertet |2075| `updatedInput` | Nur für `"allow"`: ändert die Eingabeparameter des Tools vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, nehmen Sie daher unveränderte Felder zusammen mit den geänderten auf. Die geänderte Eingabe wird erneut gegen deny- und ask-Regeln ausgewertet |
2068| `updatedPermissions` | Für `"allow"` nur: Array von [Berechtigungsaktualisierungseinträgen](#permission-update-entries) zum Anwenden, wie das Hinzufügen einer Zulassungsregel oder das Ändern des Sitzungsberechtigungsmodus |2076| `updatedPermissions` | Nur für `"allow"`: Array von anzuwendenden [Einträgen für Berechtigungsaktualisierungen](#permission-update-entries), etwa zum Hinzufügen einer allow-Regel oder zum Ändern des Berechtigungsmodus der Sitzung |
2069| `message` | Für `"deny"` nur: sagt Claude, warum die Genehmigung verweigert wurde |2077| `message` | Nur für `"deny"`: teilt Claude mit, warum die Berechtigung abgelehnt wurde |
2070| `interrupt` | Für `"deny"` nur: wenn `true`, stoppt Claude |2078| `interrupt` | Nur für `"deny"`: bei `true` wird Claude gestoppt |
2071 2079
2072Ein Hook, der mit 2 beendet wird, ohne ein `decision` Objekt zu hinterlassen, lässt den Berechtigungsfluss unverändert, und sein stderr wird verworfen. Nur das `decision` Objekt kann die Anfrage gewähren oder verweigern.2080Ein Hook, der ohne `decision`-Objekt mit 2 beendet wird, lässt den Berechtigungsablauf unverändert, und sein stderr wird verworfen. Nur das `decision`-Objekt kann die Anfrage genehmigen oder ablehnen.
2073 2081
2074```json theme={null}2082```json theme={null}
2075{2083{
2086```2094```
2087 2095
2088<h4 id="permission-update-entries">2096<h4 id="permission-update-entries">
2089 Berechtigungsaktualisierungseinträge2097 Einträge für Berechtigungsaktualisierungen
2090</h4>2098</h4>
2091 2099
2092Das `updatedPermissions` Ausgabefeld und das [`permission_suggestions` Eingabefeld](#permissionrequest-input) verwenden beide das gleiche Array von Einträgen. Jeder Eintrag hat einen `type`, der seine anderen Felder bestimmt, und ein `destination`, das steuert, wo die Änderung geschrieben wird.2100Das 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.
2093 2101
2094| `type` | Felder | Effekt |2102| `type` | Felder | Wirkung |
2095| :- | :- | :- |2103| :- | :- | :- |
2096| `addRules` | `rules`, `behavior`, `destination` | Fügt Berechtigungsregeln hinzu. `rules` ist ein Array von `{toolName, ruleContent?}` Objekten. Weglassen Sie `ruleContent`, um das gesamte Tool abzugleichen. `behavior` ist `"allow"`, `"deny"` oder `"ask"` |2104| `addRules` | `rules`, `behavior`, `destination` | Fügt Berechtigungsregeln hinzu. `rules` ist ein Array von `{toolName, ruleContent?}`-Objekten. Lassen Sie `ruleContent` weg, um das gesamte Tool zu matchen. `behavior` ist `"allow"`, `"deny"` oder `"ask"` |
2097| `replaceRules` | `rules`, `behavior`, `destination` | Ersetzt alle Regeln des angegebenen `behavior` am `destination` mit den bereitgestellten `rules` |2105| `replaceRules` | `rules`, `behavior`, `destination` | Ersetzt alle Regeln des angegebenen `behavior` in der `destination` durch die bereitgestellten `rules` |
2098| `removeRules` | `rules`, `behavior`, `destination` | Entfernt übereinstimmende Regeln des angegebenen `behavior` |2106| `removeRules` | `rules`, `behavior`, `destination` | Entfernt passende Regeln des angegebenen `behavior` |
2099| `setMode` | `mode`, `destination` | Ändert den Berechtigungsmodus. Gültige Modi sind `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` und `manual` als Alias für `default`. Der `manual` Alias erfordert Claude Code v2.1.200 oder später |2107| `setMode` | `mode`, `destination` | Ändert den Berechtigungsmodus. Gültige Modi sind `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` und `manual` als Alias für `default`. Der Alias `manual` erfordert Claude Code v2.1.200 oder höher |
2100| `addDirectories` | `directories`, `destination` | Fügt Arbeitsverzeichnisse hinzu. `directories` ist ein Array von Pfad-Zeichenketten |2108| `addDirectories` | `directories`, `destination` | Fügt Arbeitsverzeichnisse hinzu. `directories` ist ein Array von Pfadzeichenketten |
2101| `removeDirectories` | `directories`, `destination` | Entfernt Arbeitsverzeichnisse |2109| `removeDirectories` | `directories`, `destination` | Entfernt Arbeitsverzeichnisse |
2102 2110
2103<Note>2111<Note>
2104 `setMode` mit `bypassPermissions` tritt nur in Kraft, wenn Sie die Sitzung mit Bypass-Modus bereits verfügbar gestartet haben: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions` oder `permissions.defaultMode: "bypassPermissions"` in [Benutzer-, `--settings` oder verwalteten Einstellungen](/docs/de/settings-reference#permissions-defaultmode). Andernfalls ist die Aktualisierung ein No-Op. Die Aktualisierung ist auch ein No-Op, 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.2112 `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.
2105 2113
2106 `bypassPermissions` wird niemals als `defaultMode` beibehalten, unabhängig von `destination`.2114 `bypassPermissions` wird unabhängig von `destination` niemals als `defaultMode` gespeichert.
2107</Note>2115</Note>
2108 2116
2109Das `destination` Feld auf jedem Eintrag bestimmt, ob die Änderung im Speicher bleibt oder in einer Einstellungsdatei beibehalten wird.2117Das Feld `destination` jedes Eintrags bestimmt, ob die Änderung nur im Arbeitsspeicher bleibt oder in eine Einstellungsdatei geschrieben wird.
2110 2118
2111| `destination` | Schreibt zu |2119| `destination` | Schreibt in |
2112| :- | :- |2120| :- | :- |
2113| `session` | Nur im Speicher, verworfen, wenn die Sitzung endet |2121| `session` | nur im Arbeitsspeicher, wird beim Ende der Sitzung verworfen |
2114| `localSettings` | `.claude/settings.local.json` |2122| `localSettings` | `.claude/settings.local.json` |
2115| `projectSettings` | `.claude/settings.json` |2123| `projectSettings` | `.claude/settings.json` |
2116| `userSettings` | `~/.claude/settings.json` |2124| `userSettings` | `~/.claude/settings.json` |
2117 2125
2118Ein Hook kann eines der `permission_suggestions` widerspiegeln, die er als seine eigene `updatedPermissions` Ausgabe erhalten hat.2126Ein Hook kann einen der empfangenen `permission_suggestions` als eigene `updatedPermissions`-Ausgabe zurückgeben.
2119 2127
2120<h3 id="posttooluse">2128<h3 id="posttooluse">
2121 PostToolUse2129 PostToolUse
2122</h3>2130</h3>
2123 2131
2124Wird unmittelbar nach erfolgreichem Abschluss eines Tools ausgeführt.2132Wird unmittelbar ausgeführt, nachdem ein Tool erfolgreich abgeschlossen wurde.
2125 2133
2126Gleicht Tool-Namen ab, gleiche Werte wie PreToolUse.2134Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.
2127 2135
2128Gleichen Sie breiter ab, wenn der Tool-Name nicht der richtige Filter ist:2136Matchen Sie breiter, wenn der Tool-Name nicht der richtige Filter ist:
2129 2137
2130* Um einen Hook nach erfolgreichem Abschluss eines beliebigen Tools auszuführen, weglassen Sie den `matcher` oder setzen Sie ihn auf `"*"`. Ihr Hook kann dann selbst entdecken, was sich geändert hat, z. B. durch Ausführung von `git status --porcelain`, das auch nicht verfolgte Dateien auflistet, die `git diff` verpasst. Für Tool-Aufrufe, die fehlschlagen, fügen Sie den gleichen Hook unter [PostToolUseFailure](#posttoolusefailure) hinzu.2138* Um einen Hook nach jedem erfolgreich abgeschlossenen Tool auszuführen, lassen Sie den `matcher` weg oder setzen Sie ihn auf `"*"`. Ihr Hook kann dann selbst ermitteln, was sich geändert hat, beispielsweise durch Ausführen von `git status --porcelain`, das auch nicht verfolgte Dateien auflistet, die `git diff` übersieht. Für fehlgeschlagene Tool-Aufrufe fügen Sie denselben Hook unter [PostToolUseFailure](#posttoolusefailure) hinzu.
2131* Um einen Hook auszuführen, wenn sich eine bestimmte Datei auf der Festplatte ändert, verwenden Sie [FileChanged](#filechanged). Claude Code führt keinen `PostToolUse` Hook aus, der `Edit|Write` abgleicht, wenn ein `Bash` Befehl oder ein Prozess außerhalb von Claude Code die gleiche Datei umschreibt.2139* 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.
2132 2140
2133<h4 id="posttooluse-input">2141<h4 id="posttooluse-input">
2134 PostToolUse-Eingabe2142 PostToolUse-Eingabe
2135</h4>2143</h4>
2136 2144
2137`PostToolUse` Hooks werden ausgelöst, nachdem ein Tool bereits erfolgreich ausgeführt wurde. Die Eingabe umfasst sowohl `tool_input`, die an das Tool gesendeten Argumente, als auch `tool_response`, das Ergebnis, das es zurückgegeben hat. Das genaue Schema für beide hängt vom Tool ab. Datei-Tool-`tool_input` Pfade kommen im gleichen Format wie für [PreToolUse](#pretooluse-input) an: immer absolut, mit den nativen Trennzeichen der Plattform, daher Backslashes unter Windows. Für ein MCP-Tool trägt die Eingabe auch das [`mcp_server`](#pretooluse-input) Objekt.2145`PostToolUse`-Hooks werden ausgelöst, nachdem ein Tool bereits erfolgreich ausgeführt wurde. Die Eingabe enthält sowohl `tool_input`, die an das Tool gesendeten Argumente, als auch `tool_response`, das vom Tool zurückgegebene Ergebnis. Das genaue Schema beider Felder hängt vom Tool ab. Pfade in `tool_input` von Datei-Tools kommen im selben Format wie bei [PreToolUse](#pretooluse-input) an: immer absolut, mit den nativen Trennzeichen der Plattform, unter Windows also mit Backslashes. Bei einem MCP-Tool enthält die Eingabe außerdem das Objekt [`mcp_server`](#pretooluse-input).
2138 2146
2139```json theme={null}2147```json theme={null}
2140{2148{
2159 2167
2160| Feld | Beschreibung |2168| Feld | Beschreibung |
2161| :- | :- |2169| :- | :- |
2162| `duration_ms` | Optional. Tool-Ausführungszeit in Millisekunden. Schließt Zeit aus, die in Berechtigungsaufforderungen und PreToolUse-Hooks verbracht wird |2170| `duration_ms` | Optional. Ausführungszeit des Tools in Millisekunden. Schließt die Zeit in Berechtigungsabfragen und PreToolUse-Hooks aus |
2163 2171
2164<h4 id="posttooluse-decision-control">2172<h4 id="posttooluse-decision-control">
2165 PostToolUse-Entscheidungskontrolle2173 PostToolUse-Entscheidungssteuerung
2166</h4>2174</h4>
2167 2175
2168`PostToolUse` Hooks können Claude nach der Tool-Ausführung Feedback geben. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, kann Ihr Hook-Skript diese ereignisspezifischen Felder zurückgeben:2176`PostToolUse`-Hooks können Claude nach der Tool-Ausführung Feedback geben. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, kann Ihr Hook-Skript diese ereignisspezifischen Felder zurückgeben:
2169 2177
2170| Feld | Beschreibung |2178| Feld | Beschreibung |
2171| :- | :- |2179| :- | :- |
2172| `decision` | `"block"` fügt den `reason` neben dem Tool-Ergebnis hinzu. Claude sieht immer noch die ursprüngliche Ausgabe; um sie zu ersetzen, verwenden Sie `updatedToolOutput` |2180| `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` |
2173| `reason` | Erklärung, die Claude angezeigt wird, wenn `decision` `"block"` ist |2181| `reason` | Erklärung, die Claude angezeigt wird, wenn `decision` den Wert `"block"` hat |
2174| `additionalContext` | String, der zu Claudes Kontext neben dem Tool-Ergebnis hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |2182| `additionalContext` | Zeichenfolge, die Claudes Kontext zusammen mit dem Tool-Ergebnis hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
2175| `classifierContext` | Kurze Notiz über das Ergebnis dieses Aufrufs für den [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) Klassifizierer statt für Claude. Siehe [Ein Ergebnis für den Auto-Modus Klassifizierer kommentieren](#annotate-a-result-for-the-auto-mode-classifier). Erfordert Claude Code v2.1.236 oder später |2183| `classifierContext` | Kurze Notiz zum Ergebnis dieses Aufrufs, die für den Klassifikator des [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) statt für Claude bestimmt ist. Siehe [Ein Ergebnis für den Klassifikator des Auto-Modus annotieren](#annotate-a-result-for-the-auto-mode-classifier). Erfordert Claude Code v2.1.236 oder höher |
2176| `updatedToolOutput` | Ersetzt die Ausgabe des Tools mit dem bereitgestellten Wert, bevor er an Claude gesendet wird. Der Wert muss der Ausgabeform des Tools entsprechen |2184| `updatedToolOutput` | Ersetzt die Ausgabe des Tools durch den angegebenen Wert, bevor sie an Claude gesendet wird. Der Wert muss der Ausgabestruktur des Tools entsprechen |
2177| `updatedMCPToolOutput` | Ersetzt die Ausgabe für [MCP-Tools](#match-mcp-tools) nur. Bevorzugen Sie `updatedToolOutput`, das für alle Tools funktioniert |2185| `updatedMCPToolOutput` | Ersetzt die Ausgabe nur für [MCP-Tools](#match-mcp-tools). Verwenden Sie vorzugsweise `updatedToolOutput`, das für alle Tools funktioniert |
2178 2186
2179Das Beispiel unten ersetzt die Ausgabe eines `Bash` Aufrufs. Der Ersatzwert entspricht der Ausgabeform des `Bash` Tools:2187Das folgende Beispiel ersetzt die Ausgabe eines `Bash`-Aufrufs. Der Ersatzwert entspricht der Ausgabestruktur des `Bash`-Tools:
2180 2188
2181```json theme={null}2189```json theme={null}
2182{2190{
2194```2202```
2195 2203
2196<Warning>2204<Warning>
2197 `updatedToolOutput` ändert nur das, was Claude sieht. Das Tool hat bereits ausgeführt, wenn der Hook ausgelöst wird, daher haben alle geschriebenen Dateien, ausgeführten Befehle oder gesendeten Netzwerkanfragen bereits Auswirkungen. Telemetrie wie OpenTelemetry-Tool-Spans und Analyseereignisse erfassen auch die ursprüngliche Ausgabe, bevor der Hook ausgeführt wird. Um einen Tool-Aufruf vor der Ausführung zu verhindern oder zu ändern, verwenden Sie stattdessen einen [PreToolUse](#pretooluse) Hook.2205 `updatedToolOutput` ändert nur, was Claude sieht. Das Tool wurde bereits ausgeführt, wenn der Hook ausgelöst wird, sodass geschriebene Dateien, ausgeführte Befehle oder gesendete Netzwerkanfragen bereits wirksam sind. Telemetrie wie OpenTelemetry-Tool-Spans und Analyseereignisse erfasst ebenfalls die ursprüngliche Ausgabe, bevor der Hook ausgeführt wird. Um einen Tool-Aufruf vor seiner Ausführung zu verhindern oder zu ändern, verwenden Sie stattdessen einen [PreToolUse](#pretooluse)-Hook.
2198 2206
2199 Der Ersatzwert muss der Ausgabeform des Tools entsprechen. Integrierte Tools geben strukturierte Objekte statt Klartext zurück. Beispielsweise gibt `Bash` ein Objekt mit `stdout`, `stderr`, `interrupted` und `isImage` Feldern zurück. Für integrierte Tools wird ein Wert, der nicht dem Ausgabeschema des Tools entspricht, ignoriert und die ursprüngliche Ausgabe wird verwendet. MCP-Tool-Ausgabe wird ohne Schema-Validierung durchgelassen. Das Entfernen von Fehlerdetails, die Claude benötigt, kann dazu führen, dass er unter einer falschen Annahme fortfährt.2207 Der Ersatzwert muss der Ausgabestruktur des Tools entsprechen. Integrierte Tools geben strukturierte Objekte statt einfacher Zeichenfolgen zurück. Beispielsweise gibt `Bash` ein Objekt mit den Feldern `stdout`, `stderr`, `interrupted` und `isImage` zurück. Bei integrierten Tools wird ein Wert, der nicht dem Ausgabeschema des Tools entspricht, ignoriert und die ursprüngliche Ausgabe verwendet. Die Ausgabe von MCP-Tools wird ohne Schemavalidierung durchgereicht. Das Entfernen von Fehlerdetails, die Claude benötigt, kann dazu führen, dass Claude auf Basis einer falschen Annahme weiterarbeitet.
2200</Warning>2208</Warning>
2201 2209
2202<h4 id="annotate-a-result-for-the-auto-mode-classifier">2210<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2203 Ein Ergebnis für den Auto-Modus Klassifizierer kommentieren2211 Ein Ergebnis für den Klassifikator des Auto-Modus annotieren
2204</h4>2212</h4>
2205 2213
2206Geben Sie `classifierContext` zurück, um eine kurze Notiz über das Ergebnis des Tool-Aufrufs an den [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) Klassifizierer zu senden, anstatt an Claude. Der Klassifizierer [empfängt niemals Tool-Ergebnisse selbst](/docs/de/permission-modes#how-the-classifier-evaluates-actions), daher ist dieses Feld die unterstützte Methode, um ihm etwas über das, was ein Aufruf zurückgegeben hat, zu sagen, bevor er spätere Aktionen überprüft. Das Feld erfordert Claude Code v2.1.236 oder später.2214Geben Sie `classifierContext` zurück, um eine kurze Notiz zum Ergebnis des Tool-Aufrufs an den Klassifikator des [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) statt an Claude zu senden. Der Klassifikator [erhält niemals die Tool-Ergebnisse selbst](/docs/de/permission-modes#how-the-classifier-evaluates-actions), daher ist dieses Feld der unterstützte Weg, ihm etwas darüber mitzuteilen, was ein Aufruf zurückgegeben hat, bevor er spätere Aktionen prüft. Das Feld erfordert Claude Code v2.1.236 oder höher.
2207 2215
2208Das Beispiel unten sagt dem Klassifizierer, woher die Ausgabe einer Abfrage stammt:2216Das folgende Beispiel teilt dem Klassifikator mit, woher die Ausgabe einer Abfrage stammt:
2209 2217
2210```json theme={null}2218```json theme={null}
2211{2219{
2216}2224}
2217```2225```
2218 2226
2219Wie viel Gewicht der Klassifizierer der Notiz gibt, hängt davon ab, wo Sie den Hook konfiguriert haben:2227Wie stark der Klassifikator die Notiz gewichtet, hängt davon ab, wo Sie den Hook konfiguriert haben:
2220 2228
2221* **Hooks, die in Claude Code konfiguriert sind**: Für Hooks aus Einstellungsdateien, Plugins, Skills und Agent-Frontmatter behandelt der Klassifizierer die Notiz als nicht verifizierten, anwendungsbereitgestellten Kontext. Die Notiz stellt niemals Benutzerabsicht fest, und wenn sie behauptet, Sie hätten etwas genehmigt oder angefordert, überprüft der Klassifizierer diese Behauptung gegen Ihre eigenen Nachrichten in der Konversation2229* **In Claude Code konfigurierte Hooks**: Bei Hooks aus Einstellungsdateien, Plugins, Skills und Agenten-Frontmatter behandelt der Klassifikator die Notiz als nicht verifizierten, von der Anwendung bereitgestellten Kontext. Die Notiz begründet niemals eine Benutzerabsicht, und wenn sie behauptet, Sie hätten etwas genehmigt oder angefordert, prüft der Klassifikator diese Behauptung anhand Ihrer eigenen Nachrichten in der Konversation
2222* **In-Process Agent SDK Callbacks**: 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 Live-Sitzung zurückgibt, kann der Klassifizierer eine Benutzeraussage, die in der Notiz weitergeleitet wird, als Benutzerabsicht gewichten. Eine solche Aussage kann eine Zustimmungsanforderung erfüllen, die der Klassifizierer von einer Nachricht akzeptieren würde, die Sie senden, aber sie hebt niemals eine Blockierung auf, die Ihre eigene Nachricht auch nicht aufheben könnte. Nach einer Sitzungswiederaufnahme behandelt Claude Code wiederhergestellte Notizen als nicht verifizierten Kontext. Wenn Hooks aus beiden Gruppen den gleichen Aufruf kommentieren, behandelt der Klassifizierer die kombinierte Notiz als nicht verifizierten Kontext2230* **In-Process-Callbacks des Agent SDK**: Wenn eine Anwendung, die Claude Code einbettet, den Hook als [TypeScript-SDK-Callback](/docs/de/agent-sdk/hooks) registriert und die Notiz während der laufenden Sitzung zurückgibt, kann der Klassifikator eine in der Notiz weitergegebene Benutzeraussage als Benutzerabsicht werten. Eine solche Aussage kann eine Zustimmungsanforderung erfüllen, die der Klassifikator auch von einer von Ihnen gesendeten Nachricht akzeptieren würde, hebt aber niemals eine Blockierung auf, die auch Ihre eigene Nachricht nicht aufheben könnte. Nach dem Fortsetzen einer Sitzung behandelt Claude Code wiederhergestellte Notizen als nicht verifizierten Kontext. Wenn Hooks aus beiden Gruppen denselben Aufruf annotieren, behandelt der Klassifikator die kombinierte Notiz als nicht verifiziert
2223 2231
2224Claude Code wendet diese Grenzen an, wenn die Notiz geliefert wird:2232Claude Code wendet beim Zustellen der Notiz diese Grenzen an:
2225 2233
2226* **Länge**: Claude Code begrenzt die Notizen für einen Tool-Aufruf auf 2.000 Zeichen und schneidet den Rest ab. Die Grenze wird über jeden Hook geteilt, der auf diesen Aufruf antwortet2234* **Länge**: Claude Code begrenzt die Notizen für einen Tool-Aufruf auf 2.000 Zeichen und schneidet den Rest ab. Die Grenze gilt gemeinsam für alle Hooks, die auf diesen Aufruf antworten
2227* **Nur synchrone Antworten**: Claude Code ignoriert das Feld in der Antwort eines Hooks, der [im Hintergrund ausgeführt wird](#run-hooks-in-the-background), da diese Antwort nach der Aufzeichnung des Tool-Ergebnisses ankommt2235* **Nur synchrone Antworten**: Claude Code ignoriert das Feld in der Antwort eines Hooks, der [im Hintergrund ausgeführt wird](#run-hooks-in-the-background), da diese Antwort eintrifft, nachdem Claude Code das Tool-Ergebnis aufgezeichnet hat
2228* **Aufrufe, die der Klassifizierer nicht aufzeichnet**: Das Transkript des Klassifizierers lässt schreibgeschützte Lookups wie Dateilesevorgänge und Suchen aus. Claude Code verwirft eine Notiz, die an einen dieser Aufrufe angehängt ist2236* **Aufrufe, die der Klassifikator nicht aufzeichnet**: Das Transkript des Klassifikators lässt nur lesende Abfragen wie Dateilesevorgänge und Suchen aus. Claude Code verwirft eine Notiz, die an einen dieser Aufrufe angehängt ist
2229* **Interaktion mit Umschreibungen**: Wenn die Notiz Ausgabe beschreibt, die Sie mit `updatedToolOutput` ersetzen, geben Sie beide Felder in der gleichen Hook-Antwort zurück. Claude Code verwirft die Notiz, wenn diese Umschreibung abgelehnt wird oder eine andere Hook-Umschreibung sie ersetzt. Claude Code liefert eine Notiz, die Sie ohne Umschreibung zurückgeben, auch wenn ein anderer Hook die Ausgabe umschreibt2237* **Zusammenspiel mit Umschreibungen**: Wenn die Notiz eine Ausgabe beschreibt, die Sie mit `updatedToolOutput` ersetzen, geben Sie beide Felder in derselben Hook-Antwort zurück. Claude Code verwirft die Notiz, wenn diese Umschreibung abgelehnt wird oder die Umschreibung eines anderen Hooks sie ersetzt. Eine Notiz, die Sie ohne Umschreibung zurückgeben, stellt Claude Code auch dann zu, wenn ein anderer Hook die Ausgabe umschreibt
2230 2238
2231<Warning>2239<Warning>
2232 Der Klassifizierer liest Inhalte, die Sie in `classifierContext` einfügen, als Informationen von der Anwendung, die die Sitzung hostet, daher kopieren Sie nicht vertrauenswürdige Tool-Ausgabe oder Text von Drittanbietern darin. Halten Sie die Notiz auf eine kurze Aussage über diesen einen Aufruf, wie eine Tatsache über seinen Ursprung oder eine Benutzeraussage darüber; verwenden Sie das Feld nicht, um nicht verwandte Nachrichten oder einen Strom von Ereignissen zu liefern.2240 Der Klassifikator liest Inhalte, die Sie in `classifierContext` ablegen, als Informationen der Anwendung, die die Sitzung hostet. Kopieren Sie daher keine nicht vertrauenswürdige Tool-Ausgabe oder Texte von Drittanbietern hinein. Beschränken Sie die Notiz auf eine kurze Aussage zu diesem einen Aufruf, etwa eine Tatsache über seine Herkunft oder eine Benutzeraussage dazu; verwenden Sie das Feld nicht, um unzusammenhängende Nachrichten oder einen Strom von Ereignissen zu übermitteln.
2233</Warning>2241</Warning>
2234 2242
2235<h3 id="posttoolusefailure">2243<h3 id="posttoolusefailure">
2236 PostToolUseFailure2244 PostToolUseFailure
2237</h3>2245</h3>
2238 2246
2239Wird ausgeführt, wenn ein Tool, das mit der Ausführung begonnen hat, fehlschlägt: Das Tool warf einen Fehler oder ein MCP-Tool gab ein Fehlerergebnis zurück. Verwenden Sie dies, um Fehler zu protokollieren, Warnungen zu senden oder korrektes Feedback an Claude zu geben.2247Wird 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.
2240 2248
2241Gleicht Tool-Namen ab, gleiche Werte wie PreToolUse.2249Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.
2242 2250
2243<Note>2251<Note>
2244 Dieses Ereignis wird nicht für Tool-Aufrufe ausgelöst, die vor der Ausführung abgelehnt werden: Ein unbekannter Tool-Name, Eingabe, die Schema oder Tool-spezifische Validierung nicht besteht, oder eine Berechtigungsverweigerung. Validierungsablehnungen werden als `tool_use_error` Ergebnisse zurückgegeben und treten auf, bevor Hooks ausgeführt werden, daher lösen sie weder `PreToolUse` noch dieses Ereignis aus. Berechtigungsverweigerungen lösen `PreToolUse` aus, aber nicht dieses Ereignis; siehe [PermissionDenied](#permissiondenied).2252 Dieses Ereignis wird nicht für Tool-Aufrufe ausgelöst, die vor der Ausführung abgelehnt werden: ein unbekannter Tool-Name, eine Eingabe, die die Schema- oder tool-spezifische Validierung nicht besteht, oder eine verweigerte Berechtigung. Validierungsablehnungen werden als `tool_use_error`-Ergebnisse zurückgegeben und erfolgen, bevor Hooks ausgeführt werden, sodass sie weder `PreToolUse` noch `PostToolUseFailure` auslösen. Verweigerte Berechtigungen lösen `PreToolUse` aus, nicht aber dieses Ereignis; siehe [PermissionDenied](#permissiondenied).
2245</Note>2253</Note>
2246 2254
2247<h4 id="posttoolusefailure-input">2255<h4 id="posttoolusefailure-input">
2248 PostToolUseFailure-Eingabe2256 PostToolUseFailure-Eingabe
2249</h4>2257</h4>
2250 2258
2251PostToolUseFailure-Hooks erhalten die gleichen `tool_name` und `tool_input` Felder wie PostToolUse, zusammen mit Fehlerinformationen als Top-Level-Felder. Für ein MCP-Tool erhalten sie auch das [`mcp_server`](#pretooluse-input) Objekt. Beispielsweise könnte ein fehlgeschlagener `npm test` Befehl liefern:2259PostToolUseFailure-Hooks erhalten dieselben Felder `tool_name` und `tool_input` wie PostToolUse, zusammen mit Fehlerinformationen als Felder der obersten Ebene. Bei einem MCP-Tool erhalten sie außerdem das Objekt [`mcp_server`](#pretooluse-input). Ein fehlgeschlagener `npm test`-Befehl könnte beispielsweise Folgendes liefern:
2252 2260
2253```json theme={null}2261```json theme={null}
2254{2262{
2271 2279
2272| Feld | Beschreibung |2280| Feld | Beschreibung |
2273| :- | :- |2281| :- | :- |
2274| `error` | String, der beschreibt, was schief gelaufen ist. Das Format hängt vom Tool ab, das fehlgeschlagen ist |2282| `error` | Zeichenfolge, die beschreibt, was schiefgelaufen ist. Das Format hängt vom fehlgeschlagenen Tool ab |
2275| `is_interrupt` | Optionaler Boolean. True, wenn der Fehler Claude Code als Abbruch erreichte, anstatt als Fehler, den das Tool meldete. Das Abbrechen eines laufenden Tools löst diesen Hook nicht aus; das Tool-Ergebnis trägt die Abbruchmeldung statt |2283| `is_interrupt` | Optionaler Boolean. True, wenn der Fehler Claude Code als Abbruch erreicht hat und nicht als vom Tool gemeldeter Fehler. Das Abbrechen eines laufenden Tools löst diesen Hook nicht aus; stattdessen enthält das Tool-Ergebnis die Unterbrechungsmeldung |
2276| `duration_ms` | Optional. Tool-Ausführungszeit in Millisekunden. Schließt Zeit aus, die in Berechtigungsaufforderungen und PreToolUse-Hooks verbracht wird |2284| `duration_ms` | Optional. Ausführungszeit des Tools in Millisekunden. Schließt die Zeit in Berechtigungsabfragen und PreToolUse-Hooks aus |
2277 2285
2278Die `error` Zeichenkette ist im Allgemeinen der gleiche Text, den Claude als Ergebnis des fehlgeschlagenen Tools empfängt. Sein Format variiert je nach Tool und Fehler. Schlüsseln Sie Ihren Hook auf `tool_name`, `is_interrupt` und die erste Zeile `Exit code N`; behandeln Sie den Rest der Zeichenkette als Anzeigetext, nicht als stabiles Format.2286Die Zeichenfolge `error` ist im Allgemeinen derselbe Text, den Claude als Ergebnis des fehlgeschlagenen Tools erhält. Ihr Format variiert je nach Tool und Fehler. Richten Sie Ihren Hook an `tool_name`, `is_interrupt` und der ersten Zeile `Exit code N` aus; behandeln Sie den Rest der Zeichenfolge als Anzeigetext, nicht als stabiles Format.
2279 2287
2280* Für Bash und PowerShell erzeugt ein Befehl, der ausgeführt wurde und beendet wurde, eine erste Zeile `Exit code N`, dann jede Ausgabe, die der Befehl als einen Block mit stdout und stderr vermischt erzeugte2288* Bei Bash und PowerShell erzeugt ein Befehl, der ausgeführt und beendet wurde, eine erste Zeile `Exit code N`, gefolgt von der gesamten Ausgabe des Befehls als ein Block, in dem stdout und stderr verschachtelt sind
2281* Eine Nutzlast kann auch eine bloße Fehlermeldung ohne Exit-Code-Zeile tragen, wenn Claude Code den Shell-Prozess selbst nicht starten konnte2289* Eine Payload kann auch eine reine Fehlermeldung ohne Exit-Code-Zeile enthalten, wenn Claude Code den Shell-Prozess selbst nicht starten konnte
2282* Claude Code schneidet lange Zeichenketten in der Mitte um einen `... [N characters truncated] ...` Marker ab und kann Zeilen einfügen, wie `Command timed out after 2m 0s`2290* Claude Code kürzt lange Zeichenfolgen in der Mitte um eine Markierung `... [N characters truncated] ...` und kann eigene Zeilen einfügen, etwa `Command timed out after 2m 0s`
2283 2291
2284<h4 id="posttoolusefailure-decision-control">2292<h4 id="posttoolusefailure-decision-control">
2285 PostToolUseFailure-Entscheidungskontrolle2293 PostToolUseFailure-Entscheidungssteuerung
2286</h4>2294</h4>
2287 2295
2288`PostToolUseFailure` Hooks können Claude nach einem Tool-Fehler Kontext geben. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, kann Ihr Hook-Skript diese ereignisspezifischen Felder zurückgeben:2296`PostToolUseFailure`-Hooks können Claude nach einem Tool-Fehler Kontext liefern. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, kann Ihr Hook-Skript diese ereignisspezifischen Felder zurückgeben:
2289 2297
2290| Feld | Beschreibung |2298| Feld | Beschreibung |
2291| :- | :- |2299| :- | :- |
2292| `additionalContext` | String, der zu Claudes Kontext neben dem Fehler hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |2300| `additionalContext` | Zeichenfolge, die Claudes Kontext zusammen mit dem Fehler hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
2293 2301
2294```json theme={null}2302```json theme={null}
2295{2303{
2304 PostToolBatch2312 PostToolBatch
2305</h3>2313</h3>
2306 2314
2307Wird einmal ausgeführt, nachdem jeder Tool-Aufruf in einem Batch aufgelöst wurde, bevor Claude Code die nächste Anfrage an das Modell sendet. `PostToolUse` wird einmal pro Tool ausgeführt, was bedeutet, dass es gleichzeitig ausgeführt wird, wenn Claude parallele Tool-Aufrufe macht. `PostToolBatch` wird genau einmal mit dem vollständigen Batch ausgeführt, daher ist es der richtige Ort, um Kontext einzufügen, der von der Menge der Tools abhängt, die ausgeführt wurden, anstatt von einem einzelnen Tool. Es gibt keinen Matcher für dieses Ereignis.2315Wird einmal ausgeführt, nachdem alle Tool-Aufrufe in einem Batch abgeschlossen sind, bevor Claude Code die nächste Anfrage an das Modell sendet. `PostToolUse` wird einmal pro Tool ausgelöst, was bedeutet, dass es parallel ausgelöst wird, wenn Claude parallele Tool-Aufrufe durchführt. `PostToolBatch` wird genau einmal mit dem vollständigen Batch ausgelöst und ist daher der richtige Ort, um Kontext einzufügen, der von der Gesamtheit der ausgeführten Tools abhängt und nicht von einem einzelnen Tool. Für dieses Ereignis gibt es keinen Matcher.
2308 2316
2309<h4 id="posttoolbatch-input">2317<h4 id="posttoolbatch-input">
2310 PostToolBatch-Eingabe2318 PostToolBatch-Eingabe
2311</h4>2319</h4>
2312 2320
2313Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten PostToolBatch-Hooks `tool_calls`, ein Array, das jeden Tool-Aufruf im Batch beschreibt:2321Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PostToolBatch-Hooks `tool_calls`, ein Array, das jeden Tool-Aufruf im Batch beschreibt:
2314 2322
2315```json theme={null}2323```json theme={null}
2316{2324{
2336}2344}
2337```2345```
2338 2346
2339`tool_response` enthält den gleichen Inhalt, den das Modell im entsprechenden `tool_result` Block empfängt. Der Wert ist eine serialisierte Zeichenkette oder ein Content-Block-Array, genau wie das Tool es ausgegeben hat. Für `Read` bedeutet das Zeilennummern-Präfix-Text statt rohe Dateiinhalte. Antworten können groß sein, daher analysieren Sie nur die Felder, die Sie benötigen.2347`tool_response` enthält denselben Inhalt, den das Modell im entsprechenden `tool_result`-Block erhält. Der Wert ist eine serialisierte Zeichenfolge oder ein Content-Block-Array, genau so, wie das Tool ihn ausgegeben hat. Für `Read` bedeutet das Text mit vorangestellten Zeilennummern statt des rohen Dateiinhalts. Antworten können groß sein, parsen Sie daher nur die Felder, die Sie benötigen.
2340 2348
2341<Note>2349<Note>
2342 Die `tool_response` Form unterscheidet sich von der von `PostToolUse`. `PostToolUse` übergibt das strukturierte `Output` Objekt des Tools, wie `{filePath: "...", type: "create"}` für `Write`; `PostToolBatch` übergibt den serialisierten `tool_result` Inhalt, den das Modell sieht.2350 Die Struktur von `tool_response` unterscheidet sich von der in `PostToolUse`. `PostToolUse` übergibt das strukturierte `Output`-Objekt des Tools, etwa `{filePath: "...", type: "create"}` für `Write`; `PostToolBatch` übergibt den serialisierten `tool_result`-Inhalt, den das Modell sieht.
2343</Note>2351</Note>
2344 2352
2345<h4 id="posttoolbatch-decision-control">2353<h4 id="posttoolbatch-decision-control">
2346 PostToolBatch-Entscheidungskontrolle2354 PostToolBatch-Entscheidungssteuerung
2347</h4>2355</h4>
2348 2356
2349`PostToolBatch` Hooks können Kontext für Claude einfügen. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, kann Ihr Hook-Skript diese ereignisspezifischen Felder zurückgeben:2357`PostToolBatch`-Hooks können Kontext für Claude einfügen. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, kann Ihr Hook-Skript diese ereignisspezifischen Felder zurückgeben:
2350 2358
2351| Feld | Beschreibung |2359| Feld | Beschreibung |
2352| :- | :- |2360| :- | :- |
2353| `additionalContext` | Kontext-String, der einmal vor dem nächsten Modell-Aufruf eingefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) für Lieferdetails, was Sie darin einfügen sollten und wie fortgesetzte Sitzungen vergangene Werte handhaben |2361| `additionalContext` | Kontext-Zeichenfolge, die einmal vor dem nächsten Modellaufruf eingefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) für Details zur Zustellung, zum geeigneten Inhalt und dazu, wie fortgesetzte Sitzungen frühere Werte behandeln |
2354 2362
2355```json theme={null}2363```json theme={null}
2356{2364{
2361}2369}
2362```2370```
2363 2371
2364Das Zurückgeben von `decision: "block"` oder `continue: false` stoppt die agentengesteuerte Schleife vor dem nächsten Modell-Aufruf. Die Blockierungsmeldung kommt aus dem JSON `reason` oder `stopReason` oder aus stderr bei Exit 2. Sie sehen sie als Warnung im Transkript und sie bleibt in der Konversation, daher sieht Claude sie, wenn die Konversation fortgesetzt wird.2372Die 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.
2365 2373
2366<h3 id="permissiondenied">2374<h3 id="permissiondenied">
2367 PermissionDenied2375 PermissionDenied
2368</h3>2376</h3>
2369 2377
2370Wird ausgeführt, wenn [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) einen Tool-Aufruf verweigert, einschließlich wenn er ihn verweigert, ohne ein Klassifizierer-Urteil zu haben, weil [eine Sicherheitsprüfung, die vom Auto-Modus getrennt ist, die Anfrage des Klassifizierers selbst verweigerte](/docs/de/errors#auto-mode-cannot-determine-the-safety-of-an-action) oder seine Antwort nicht analysiert wurde. Dieser Hook wird nur im Auto-Modus ausgeführt: Er wird nicht ausgeführt, wenn Sie einen Berechtigungsdialog manuell verweigern, wenn ein `PreToolUse` Hook einen Aufruf blockiert oder wenn eine `deny` Regel übereinstimmt. Verwenden Sie ihn, um Verweigerungen zu protokollieren, die Konfiguration anzupassen oder dem Modell zu sagen, dass es den Tool-Aufruf möglicherweise erneut versuchen kann.2378Wird ausgeführt, wenn der [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) einen Tool-Aufruf ablehnt, auch wenn er ohne Urteil des Klassifikators ablehnt, weil [eine vom Auto-Modus unabhängige Sicherheitsprüfung die Anfrage des Klassifikators selbst abgelehnt hat](/docs/de/errors#auto-mode-cannot-determine-the-safety-of-an-action) oder seine Antwort nicht geparst werden konnte. Dieser Hook wird nur im Auto-Modus ausgelöst: Er wird nicht ausgeführt, wenn Sie einen Berechtigungsdialog manuell ablehnen, wenn ein `PreToolUse`-Hook einen Aufruf blockiert oder wenn eine `deny`-Regel zutrifft. Verwenden Sie ihn, um Ablehnungen zu protokollieren, die Konfiguration anzupassen oder dem Modell mitzuteilen, dass es den Tool-Aufruf erneut versuchen darf.
2371 2379
2372Gleicht Tool-Namen ab, gleiche Werte wie PreToolUse.2380Matcht auf den Tool-Namen, mit denselben Werten wie PreToolUse.
2373 2381
2374<h4 id="permissiondenied-input">2382<h4 id="permissiondenied-input">
2375 PermissionDenied-Eingabe2383 PermissionDenied-Eingabe
2376</h4>2384</h4>
2377 2385
2378Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten PermissionDenied-Hooks `tool_name`, `tool_input`, `tool_use_id` und `reason`. Für ein MCP-Tool erhalten sie auch das [`mcp_server`](#pretooluse-input) Objekt.2386Zusä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).
2379 2387
2380```json theme={null}2388```json theme={null}
2381{2389{
2396 2404
2397| Feld | Beschreibung |2405| Feld | Beschreibung |
2398| :- | :- |2406| :- | :- |
2399| `reason` | Der Ablehnungsgrund. Für ein Klassifizierer-Urteil benennt es in den meisten Sitzungen die übereinstimmende Regel in eckigen Klammern, wie `[Data Exfiltration]`; siehe [Verweigerungen überprüfen](/docs/de/auto-mode-config#review-denials) für die anderen Formen. Für eine [Verweigerung ohne Urteil](#permissiondenied-decision-control) beginnt sie mit `Auto mode could not evaluate this action and is blocking it for safety`. Für eine Verweigerung, weil das Klassifizierer-Modell nicht verfügbar war, ist es der feste Text `Classifier unavailable` |2407| `reason` | Der Ablehnungsgrund. Bei einem Urteil des Klassifikators nennt er in den meisten Sitzungen die zutreffende Regel in eckigen Klammern, etwa `[Data Exfiltration]`; siehe [Ablehnungen prüfen](/docs/de/auto-mode-config#review-denials) für die anderen Formen. Bei einer [Ablehnung ohne Urteil](#permissiondenied-decision-control) beginnt er mit `Auto mode could not evaluate this action and is blocking it for safety`. Bei einer Ablehnung, weil das Klassifikatormodell nicht verfügbar war, ist er der feste Text `Classifier unavailable` |
2400 2408
2401<h4 id="permissiondenied-decision-control">2409<h4 id="permissiondenied-decision-control">
2402 PermissionDenied-Entscheidungskontrolle2410 PermissionDenied-Entscheidungssteuerung
2403</h4>2411</h4>
2404 2412
2405PermissionDenied-Hooks können dem Modell sagen, dass es den verweigerten Tool-Aufruf möglicherweise erneut versuchen kann. Geben Sie ein JSON-Objekt mit `hookSpecificOutput.retry` auf `true` zurück:2413PermissionDenied-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:
2406 2414
2407```json theme={null}2415```json theme={null}
2408{2416{
2413}2421}
2414```2422```
2415 2423
2416Wenn `retry` `true` ist, fügt Claude Code eine Nachricht zur Konversation hinzu, die dem Modell sagt, dass es den Tool-Aufruf möglicherweise erneut versuchen kann. Claude Code kehrt die Verweigerung selbst nicht um. Wenn Ihr Hook kein JSON zurückgibt oder `retry: false` zurückgibt, bleibt die Verweigerung bestehen und das Modell empfängt die ursprüngliche Ablehnungsmeldung.2424Wenn `retry` den Wert `true` hat, fügt Claude Code der Konversation eine Nachricht hinzu, die dem Modell mitteilt, dass es den Tool-Aufruf erneut versuchen darf. Claude Code hebt die Ablehnung selbst nicht auf. Wenn Ihr Hook kein JSON oder `retry: false` zurückgibt, bleibt die Ablehnung bestehen und das Modell erhält die ursprüngliche Ablehnungsnachricht.
2417 2425
2418Claude Code ignoriert `retry: true`, wenn der Klassifizierer [kein Urteil über die Aktion erzeugt hat](/docs/de/errors#auto-mode-cannot-determine-the-safety-of-an-action): Seine Antwort analysierte nicht oder eine Sicherheitsprüfung, die vom Auto-Modus getrennt ist, verweigerte die Anfrage des Klassifizierers. Für diese Verweigerungen sagt Claude Code dem Modell in der Ablehnungsmeldung bereits, ob es später erneut versuchen soll oder weitermachen soll.2426Claude Code ignoriert `retry: true`, wenn der Klassifikator [kein Urteil über die Aktion](/docs/de/errors#auto-mode-cannot-determine-the-safety-of-an-action) gefällt hat: Seine Antwort konnte nicht geparst werden, oder eine vom Auto-Modus unabhängige Sicherheitsprüfung hat die Anfrage des Klassifikators selbst abgelehnt. Bei diesen Ablehnungen teilt Claude Code dem Modell bereits in der Ablehnungsnachricht mit, ob es später erneut versuchen oder weitermachen soll.
2419 2427
2420<h3 id="notification">2428<h3 id="notification">
2421 Notification2429 Notification
2422</h3>2430</h3>
2423 2431
2424Wird ausgeführt, wenn Claude Code Benachrichtigungen sendet. Gleicht Benachrichtigungstyp ab. Weglassen Sie den Matcher, um Hooks für alle Benachrichtigungstypen auszuführen.2432Wird ausgeführt, wenn Claude Code Benachrichtigungen sendet. Matcht auf den Benachrichtigungstyp. Lassen Sie den Matcher weg, um Hooks für alle Benachrichtigungstypen auszuführen.
2425 2433
2426Sie erhalten diese Hook-Ereignisse auch mit ausgeschalteten Desktop-Benachrichtigungen: Die `preferredNotifChannel` Einstellung, einschließlich `notifications_disabled`, ändert nur, wie Sie benachrichtigt werden, nicht ob Ihr Hook ausgeführt wird.2434Sie erhalten diese Hook-Ereignisse auch bei deaktivierten Desktop-Benachrichtigungen: Die Einstellung `preferredNotifChannel`, einschließlich `notifications_disabled`, ändert nur, wie Sie benachrichtigt werden, nicht, ob Ihr Hook ausgeführt wird.
2427 2435
2428| Matcher | Wann wird es ausgelöst |2436| Matcher | Wann er ausgelöst wird |
2429| :- | :- |2437| :- | :- |
2430| `permission_prompt` | Claude benötigt Ihre Genehmigung zur Verwendung eines Tools oder einer Sandbox-Anfrage einer [Netzwerkanfrage](/docs/de/sandboxing#network-isolation), und die Aufforderung hat etwa sechs Sekunden gewartet |2438| `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 |
2431| `idle_prompt` | Claude hat vor etwa 60 Sekunden geantwortet und Sie haben seitdem nicht eingegeben |2439| `idle_prompt` | Claude hat vor etwa 60 Sekunden die Antwort beendet, und Sie haben seitdem nichts eingegeben |
2432| `auth_success` | Authentifizierung wird abgeschlossen |2440| `auth_success` | Die Authentifizierung ist abgeschlossen |
2433| `elicitation_dialog` | Ein MCP-Server öffnet ein Elicitierungsformular und Sie haben etwa sechs Sekunden nicht eingegeben |2441| `elicitation_dialog` | Ein MCP-Server öffnet ein Elicitation-Formular, und Sie haben seit etwa sechs Sekunden nichts eingegeben |
2434| `elicitation_url_dialog` | Ein MCP-Server fordert Sie auf, eine Browser-URL zu öffnen und Sie haben etwa sechs Sekunden nicht eingegeben |2442| `elicitation_url_dialog` | Ein MCP-Server fordert Sie auf, eine Browser-URL zu öffnen, und Sie haben seit etwa sechs Sekunden nichts eingegeben |
2435| `elicitation_complete` | Ein MCP-Server meldet, dass eine [URL-Modus-Elicitierung](#elicitation-input) abgeschlossen ist |2443| `elicitation_complete` | Ein MCP-Server meldet, dass eine [Elicitation im URL-Modus](#elicitation-input) abgeschlossen ist |
2436| `elicitation_response` | Eine MCP-Elicitierungs-Antwort wird an den Server zurückgesendet |2444| `elicitation_response` | Eine MCP-Elicitation-Antwort wird an den Server zurückgesendet |
2437| `agent_needs_input` | Eine Hintergrund-Sitzung beginnt, auf Ihre Eingabe zu warten, während [Agent-Ansicht](/docs/de/agent-view) in einem Terminal offen ist. Wird auch ausgelöst, wenn eine Terminal-Sitzung Ihnen eine [Agent-Team-Teamkollegen-Terminal-Setup-Frage](/docs/de/agent-teams#choose-a-display-mode) oder eine Auto-Modus-Notiz über [Klassifizierer-Anfrage-Gebühren](/docs/de/auto-mode-classifier-billing) zeigt und Sie etwa sechs Sekunden nicht eingegeben haben |2445| `agent_needs_input` | Eine Hintergrundsitzung beginnt, auf Ihre Eingabe zu warten, während die [Agentenansicht](/docs/de/agent-view) in einem Terminal geöffnet ist. Wird auch ausgelöst, wenn eine Terminal-Sitzung Ihnen die [Frage eines Agent-Team-Teammitglieds zur Terminal-Einrichtung](/docs/de/agent-teams#choose-a-display-mode) oder den Hinweis des Auto-Modus zu [Gebühren für Klassifikatoranfragen](/docs/de/auto-mode-classifier-billing) anzeigt und Sie seit etwa sechs Sekunden nichts eingegeben haben |
2438| `agent_completed` | Eine Hintergrund-Sitzung wird abgeschlossen oder schlägt fehl. Wird nur ausgelöst, während [Agent-Ansicht](/docs/de/agent-view) in einem Terminal offen ist |2446| `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 |
2439| `quota_auto_resume_fired` | Claude Code setzt Ihre Aufgabe fort, nachdem ein claude.ai Nutzungslimit sie pausiert hat: beim Reset oder früher, wenn Sie etwas in Claude Code tun, während Sie warten, wie das Hinzufügen von Nutzungsguthaben, das Upgrade Ihres Plans oder das Wechseln von Modellen, was Nutzung wieder verfügbar macht, mit der [Modell-Einstellung Ausnahme](/docs/de/interactive-mode#wait-for-a-usage-limit-to-reset) |2447| `quota_auto_resume_fired` | Claude Code setzt Ihre Aufgabe fort, nachdem ein claude.ai-Nutzungslimit sie pausiert hat: beim Zurücksetzen oder früher, wenn etwas, das Sie während der Wartezeit in Claude Code tun, etwa das Hinzufügen von Nutzungsguthaben, ein Upgrade Ihres Plans oder ein Modellwechsel, die Nutzung wieder verfügbar macht, mit der [Ausnahme für die Modelleinstellung](/docs/de/interactive-mode#wait-for-a-usage-limit-to-reset) |
2440| `quota_auto_resume_stale` | Ein claude.ai Nutzungslimit wurde zurückgesetzt, während Ihr Computer für mehr als etwa 30 Minuten schlief. Claude Code wartet darauf, dass Sie `Enter` drücken, anstatt fortzufahren. Nach einem kürzeren Schlaf wird es fortgesetzt und löst stattdessen `quota_auto_resume_fired` aus |2448| `quota_auto_resume_stale` | Ein claude.ai-Nutzungslimit wurde zurückgesetzt, während Ihr Computer länger als etwa 30 Minuten im Ruhezustand war. Claude Code wartet, bis Sie `Enter` drücken, anstatt fortzufahren. Nach einem kürzeren Ruhezustand fährt es fort und löst stattdessen `quota_auto_resume_fired` aus |
2441| `quota_auto_resume_disabled` | Claude Code beendet sein Warten auf ein claude.ai Nutzungslimit, ohne Ihre Aufgabe fortzusetzen: [`autoContinueAtUsageLimit`](/docs/de/settings-reference#autocontinueatusagelimit) wurde ausgeschaltet oder der Reset rückte während eines Wartens, das Claude Code selbst gestartet hat, mehr als 24 Stunden in die Zukunft, die fortgesetzte Aufgabe traf immer wieder das Limit oder die Fortsetzung wurde blockiert, bevor sie das Modell erreichte. Wird nicht ausgelöst, wenn Sie `Esc` oder `Ctrl+C` drücken oder **Nicht automatisch fortsetzen** wählen |2449| `quota_auto_resume_disabled` | Claude Code beendet seine Wartezeit auf ein claude.ai-Nutzungslimit, ohne Ihre Aufgabe fortzusetzen: [`autoContinueAtUsageLimit`](/docs/de/settings-reference#autocontinueatusagelimit) wurde ausgeschaltet oder das Zurücksetzen wurde während einer Wartezeit, die Claude Code selbst begonnen hat, um mehr als 24 Stunden verschoben, die fortgesetzte Aufgabe stieß wiederholt an das Limit, oder die Fortsetzung wurde blockiert, bevor sie das Modell erreichte. Wird nicht ausgelöst, wenn Sie `Esc` oder `Ctrl+C` drücken oder **Don't continue automatically** wählen |
2442 2450
2443Die `quota_auto_resume_fired`, `quota_auto_resume_stale` und `quota_auto_resume_disabled` Typen erfordern Claude Code v2.1.234 oder später.2451Die Typen `quota_auto_resume_fired`, `quota_auto_resume_stale` und `quota_auto_resume_disabled` erfordern Claude Code v2.1.234 oder höher.
2444 2452
2445In Terminal-Sitzungen erfordert `permission_prompt` für eine Sandbox-Anfrage einer Netzwerkanfrage Claude Code v2.1.246 oder später.2453In Terminal-Sitzungen erfordert `permission_prompt` für die Netzwerkanfrage eines in einer Sandbox ausgeführten Befehls Claude Code v2.1.246 oder höher.
2446 2454
2447`agent_needs_input` für eine Teamkollegen-Terminal-Setup-Frage erfordert Claude Code v2.1.248 oder später.2455`agent_needs_input` für die Frage eines Teammitglieds zur Terminal-Einrichtung erfordert Claude Code v2.1.248 oder höher.
2448 2456
2449<Note>2457<Note>
2450 Die `permission_prompt`, `idle_prompt`, `elicitation_dialog` und `elicitation_url_dialog` Typen teilen ihr Timing mit Desktop-Benachrichtigungen, daher sehen Sie sie in Terminal-Sitzungen nur, wenn Sie vom Terminal entfernt zu sein scheinen:2458 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:
2451 2459
2452 * Erwarten Sie `permission_prompt`, sobald Sie etwa sechs Sekunden nicht eingegeben haben. Der Timer startet, wenn die Berechtigungsaufforderung erscheint, und jeder Tastendruck verschiebt ihn. Um einen Hook sofort auszuführen, wenn Claude um Genehmigung zur Verwendung eines Tools bittet, verwenden Sie stattdessen [PermissionRequest](#permissionrequest).2460 * Rechnen Sie mit `permission_prompt`, sobald Sie etwa sechs Sekunden lang nichts eingegeben haben. Der Timer startet, wenn die Berechtigungsabfrage erscheint, und jeder Tastendruck verzögert ihn. Um einen Hook sofort auszuführen, wenn Claude um Erlaubnis zur Nutzung eines Tools bittet, verwenden Sie stattdessen [PermissionRequest](#permissionrequest).
2453 * Erwarten Sie `idle_prompt` etwa 60 Sekunden, nachdem Claude geantwortet hat, und nur wenn Sie seitdem nicht eingegeben haben. Claude Code sendet `idle_prompt` nicht, während es auf einen claude.ai Nutzungslimit-Reset wartet. Wenn das Warten auf eigene Faust endet, wird stattdessen einer der `quota_auto_resume_*` Typen ausgelöst.2461 * Rechnen Sie mit `idle_prompt` etwa 60 Sekunden, nachdem Claude die Antwort beendet hat, und nur, wenn Sie seitdem nichts eingegeben haben und kein Hintergrundagent, etwa ein [Subagent](/docs/de/sub-agents) im Hintergrund, noch läuft. Claude Code sendet `idle_prompt` nicht, während es auf das Zurücksetzen eines claude.ai-Nutzungslimits wartet. Wenn die Wartezeit von selbst endet, wird stattdessen einer der Typen `quota_auto_resume_*` ausgelöst.
2454 * Erwarten Sie `elicitation_dialog` für ein Elicitierungsformular oder `elicitation_url_dialog` für eine Browser-URL-Anfrage, sobald Sie etwa sechs Sekunden nicht eingegeben haben. Beide teilen das gleiche Sechs-Sekunden-Gate wie `permission_prompt`: Der Timer startet, wenn der Dialog erscheint, und jeder Tastendruck verschiebt ihn.2462 * Rechnen Sie mit `elicitation_dialog` für ein Elicitation-Formular oder `elicitation_url_dialog` für eine Browser-URL-Anfrage, sobald Sie etwa sechs Sekunden lang nichts eingegeben haben. Beide teilen dieselbe Sechs-Sekunden-Schwelle wie `permission_prompt`: Der Timer startet, wenn der Dialog erscheint, und jeder Tastendruck verzögert ihn.
2455 2463
2456 Eine Berechtigungsanfrage oder Elicitierung, die ankommt, während ein anderer Dialog auf dem Bildschirm ist, behält das gleiche Sechs-Sekunden-Gate, zeitlich vom Ankommen der Anfrage. Seine Benachrichtigung kann Sie erreichen, während die Anfrage immer noch hinter dem offenen Dialog wartet.2464 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.
2457</Note>2465</Note>
2458 2466
2459Claude Code zeitlich `permission_prompt` unterschiedlich in Sitzungen, in denen es Berechtigungsanfragen an den Agent SDK [`canUseTool` Callback](/docs/de/agent-sdk/user-input) sendet, was ist, wie Claude Desktop und die VS Code Erweiterung Claude Code hosten:2467Claude Code steuert das Timing von `permission_prompt` anders in Sitzungen, in denen es Berechtigungsanfragen an den [`canUseTool`-Callback](/docs/de/agent-sdk/user-input) des Agent SDK sendet. Auf diese Weise hosten Claude Desktop und die VS Code-Erweiterung Claude Code:
2460 2468
2461* Erwarten Sie `permission_prompt` etwa sechs Sekunden, nachdem Claude um Genehmigung bittet. Claude Code verschiebt es nicht, während Sie eingeben.2469* Rechnen Sie mit `permission_prompt` etwa sechs Sekunden, nachdem Claude um Erlaubnis bittet. Claude Code verzögert es nicht, während Sie tippen.
2462* Wenn Sie oder ein [PermissionRequest](#permissionrequest) Hook früher antworten, führt Claude Code `permission_prompt` nicht aus.2470* Wenn Sie oder ein [PermissionRequest](#permissionrequest)-Hook früher antworten, führt Claude Code `permission_prompt` nicht aus.
2463* Setzen Sie [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/de/env-vars) auf `1`, um `permission_prompt` in diesen Sitzungen auszuschalten.2471* Setzen Sie [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/de/env-vars) auf `1`, um `permission_prompt` in diesen Sitzungen auszuschalten.
2464 2472
2465Vor v2.1.233 wurde `permission_prompt` in diesen Sitzungen nicht ausgelöst.2473Vor v2.1.233 wurde `permission_prompt` in diesen Sitzungen nicht ausgelöst.
2466 2474
2467Verwenden Sie separate Matcher, um verschiedene Handler je nach Benachrichtigungstyp auszuführen. Diese Konfiguration löst ein Berechtigungs-spezifisches Warnungsskript aus, wenn Claude Genehmigung benötigt und eine andere Benachrichtigung, wenn Claude untätig war:2475Verwenden 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:
2468 2476
2469```json theme={null}2477```json theme={null}
2470{2478{
2497 Notification-Eingabe2505 Notification-Eingabe
2498</h4>2506</h4>
2499 2507
2500Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten Notification-Hooks `message` mit dem Benachrichtigungstext, ein optionaler `title` und `notification_type`, der angibt, welcher Typ ausgelöst wurde.2508Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten Notification-Hooks `message` mit dem Benachrichtigungstext, ein optionales `title` und `notification_type`, das angibt, welcher Typ ausgelöst wurde.
2501 2509
2502```json theme={null}2510```json theme={null}
2503{2511{
2511}2519}
2512```2520```
2513 2521
2514Notification-Hooks können Benachrichtigungen nicht blockieren oder ändern. Claude Code verwirft ihre `systemMessage` und `continue` Felder, gibt aber immer noch [`terminalSequence`](#emit-terminal-notifications) aus, auf das sich das Desktop-Benachrichtigungs-Beispiel verlässt. Notification-Hooks sind für Nebenwirkungen wie das Weiterleiten der Benachrichtigung an einen externen Service gedacht.2522Notification-Hooks können Benachrichtigungen weder blockieren noch ändern. Claude Code verwirft ihre Felder `systemMessage` und `continue`, gibt aber weiterhin [`terminalSequence`](#emit-terminal-notifications) aus, worauf das Beispiel für Desktop-Benachrichtigungen beruht. Notification-Hooks sind für Nebeneffekte gedacht, etwa die Weiterleitung der Benachrichtigung an einen externen Dienst.
2515 2523
2516<h3 id="subagentstart">2524<h3 id="subagentstart">
2517 SubagentStart2525 SubagentStart
2518</h3>2526</h3>
2519 2527
2520Wird ausgeführt, wenn Claude einen Subagenten mit dem Agent-Tool erzeugt, wenn Claude [einen Subagenten fortsetzt](/docs/de/sub-agents#resume-subagents) und jedes Mal, wenn ein In-Process [Agent-Team](/docs/de/agent-teams) Teamkollege eine neue Nachricht verarbeitet. Unterstützt Matcher zum Filtern nach Agent-Typ-Name. Für integrierte Agenten ist dies der Agent-Name wie `general-purpose`, `Explore` oder `Plan`. Für [benutzerdefinierte Subagenten](/docs/de/sub-agents) ist dies das `name` Feld aus dem Agent-Frontmatter, nicht der Dateiname.2528Wird ausgeführt, wenn Claude mit dem Agent-Tool einen Subagenten startet, wenn Claude [einen Subagenten fortsetzt](/docs/de/sub-agents#resume-subagents) und jedes Mal, wenn ein In-Process-Teammitglied eines [Agent-Teams](/docs/de/agent-teams) eine neue Nachricht verarbeitet. Unterstützt Matcher zum Filtern nach dem Namen des Agententyps. Bei integrierten Agenten ist dies der Agentenname wie `general-purpose`, `Explore` oder `Plan`. Bei [benutzerdefinierten Subagenten](/docs/de/sub-agents) ist dies das Feld `name` aus dem Frontmatter des Agenten, nicht der Dateiname.
2521 2529
2522Für Subagenten, die von einem [Plugin](/docs/de/plugins/overview) versendet werden, ist der Agent-Typ der Plugin-scoped Bezeichner wie `my-plugin:reviewer`, nicht der bloße Frontmatter-Name. Der Doppelpunkt platziert einen Plugin-scoped Namen auf dem regulären Ausdruckspfad, daher verankern Sie den Matcher mit `^` und `$` für eine genaue Übereinstimmung: `^my-plugin:reviewer$`.2530Bei Subagenten, die von einem [Plugin](/docs/de/plugins/overview) bereitgestellt werden, ist der Agententyp der plugin-bezogene Bezeichner wie `my-plugin:reviewer`, nicht der reine Frontmatter-Name. Der Doppelpunkt führt dazu, dass ein plugin-bezogener Name als regulärer Ausdruck ausgewertet wird. Verankern Sie den Matcher daher für eine exakte Übereinstimmung mit `^` und `$`: `^my-plugin:reviewer$`.
2523 2531
2524<h4 id="subagentstart-input">2532<h4 id="subagentstart-input">
2525 SubagentStart-Eingabe2533 SubagentStart-Eingabe
2526</h4>2534</h4>
2527 2535
2528Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten SubagentStart-Hooks `agent_id` mit dem eindeutigen Bezeichner für den Subagenten und `agent_type` mit dem Agent-Namen, den der Matcher filtert.2536Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SubagentStart-Hooks `agent_id` mit dem eindeutigen Bezeichner des Subagenten und `agent_type` mit dem Agentennamen, auf den der Matcher filtert.
2529 2537
2530```json theme={null}2538```json theme={null}
2531{2539{
2538}2546}
2539```2547```
2540 2548
2541SubagentStart-Hooks können die Subagenten-Erstellung nicht blockieren, aber sie können Kontext in den Subagenten einfügen. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, können Sie zurückgeben:2549SubagentStart-Hooks können die Erstellung eines Subagenten nicht blockieren, aber Kontext in den Subagenten einfügen. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können Sie Folgendes zurückgeben:
2542 2550
2543| Feld | Beschreibung |2551| Feld | Beschreibung |
2544| :- | :- |2552| :- | :- |
2545| `additionalContext` | String, der zu Claudes Kontext am Anfang der Subagenten-Konversation hinzugefügt wird, bevor seine erste Eingabeaufforderung. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |2553| `additionalContext` | Zeichenfolge, die dem Kontext des Subagenten zu Beginn seiner Konversation vor seinem ersten Prompt hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
2546 2554
2547```json theme={null}2555```json theme={null}
2548{2556{
2553}2561}
2554```2562```
2555 2563
2556Wenn der Hook erneut für den gleichen Subagenten ausgeführt wird, injiziert Claude Code den zurückgegebenen Kontext nur, wenn der Kontext des Subagenten nicht bereits die Kopie aus einem früheren Lauf enthält. Die beim Start injizierte Kopie bleibt an Ort und Stelle, wobei der [Prompt-Cache](/docs/de/prompt-caching#subagents-and-the-cache) des Subagenten intakt bleibt. Nach [Auto-Komprimierung](/docs/de/sub-agents#auto-compaction), die diese Kopie verwirft, injiziert Claude Code den Kontext des nächsten Laufs erneut.2564Wenn der Hook für denselben Subagenten erneut ausgeführt wird, fügt Claude Code den zurückgegebenen Kontext nur ein, wenn der Kontext des Subagenten die Kopie aus einem früheren Durchlauf noch nicht enthält. Die beim Start eingefügte Kopie bleibt bestehen, sodass der [Prompt-Cache](/docs/de/prompt-caching#subagents-and-the-cache) des Subagenten intakt bleibt. Nachdem die [automatische Komprimierung](/docs/de/sub-agents#auto-compaction) diese Kopie verworfen hat, fügt Claude Code den Kontext des nächsten Durchlaufs erneut ein.
2557 2565
2558<h3 id="subagentstop">2566<h3 id="subagentstop">
2559 SubagentStop2567 SubagentStop
2560</h3>2568</h3>
2561 2569
2562Wird ausgeführt, wenn ein Claude Code Subagent mit dem Antworten fertig ist. Gleicht Agent-Typ ab, gleiche Werte wie SubagentStart.2570Wird ausgeführt, wenn ein Claude Code-Subagent seine Antwort beendet hat. Matcht auf den Agententyp, mit denselben Werten wie SubagentStart.
2563 2571
2564<h4 id="subagentstop-input">2572<h4 id="subagentstop-input">
2565 SubagentStop-Eingabe2573 SubagentStop-Eingabe
2566</h4>2574</h4>
2567 2575
2568Zusä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 `agent_type` Feld ist der Wert, der zum Filtern des Matchers verwendet wird. Der `transcript_path` ist das Transkript der Hauptsitzung, während `agent_transcript_path` das Transkript des Subagenten selbst ist, das in einem verschachtelten `subagents/` Ordner gespeichert ist. Das `last_assistant_message` Feld enthält den Textinhalt der letzten Antwort des Subagenten, daher können Hooks darauf zugreifen, ohne die Transkript-Datei zu analysieren.2576Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SubagentStop-Hooks `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path` und `last_assistant_message`. Das Feld `agent_type` ist der Wert, der für die Matcher-Filterung verwendet wird. `transcript_path` ist das Transkript der Hauptsitzung, während `agent_transcript_path` das eigene Transkript des Subagenten ist, das in einem verschachtelten Ordner `subagents/` gespeichert wird. Das Feld `last_assistant_message` enthält den Textinhalt der letzten Antwort des Subagenten, sodass Hooks darauf zugreifen können, ohne die Transkriptdatei zu parsen.
2569 2577
2570Nicht jedes SubagentStop-Ereignis kommt von einem Subagenten, den Claude erzeugt hat. Claude Code führt auch interne Agenten für einige seiner eigenen Funktionen aus, wie [Eingabeaufforderungs-Vorschläge](/docs/de/interactive-mode#prompt-suggestions) und [`/btw` Seitenfragen](/docs/de/interactive-mode#side-questions-with-%2Fbtw), und SubagentStop wird ausgelöst, wenn einer davon fertig ist. Für diese Ereignisse ist `agent_type` der Agent-Name, den die Sitzung selbst ausführt, wie einer, der mit [`--agent`](/docs/de/cli-reference#cli-flags) oder der [`agent` Einstellung](/docs/de/settings-reference#agent) gesetzt ist, und eine leere Zeichenkette, wenn die Sitzung ohne einen ausgeführt wird.2578Nicht jedes SubagentStop-Ereignis stammt von einem Subagenten, den Claude gestartet hat. Claude Code führt für einige seiner eigenen Funktionen auch interne Agenten aus, etwa für [Prompt-Vorschläge](/docs/de/interactive-mode#prompt-suggestions) und [`/btw`-Nebenfragen](/docs/de/interactive-mode#side-questions-with-%2Fbtw), und SubagentStop wird auch ausgelöst, wenn einer davon beendet wird. Bei diesen Ereignissen ist `agent_type` der Agentenname, unter dem die Sitzung selbst läuft, etwa einer, der mit [`--agent`](/docs/de/cli-reference#cli-flags) oder der [Einstellung `agent`](/docs/de/settings-reference#agent) festgelegt wurde, und eine leere Zeichenfolge, wenn die Sitzung ohne einen solchen läuft.
2571 2579
2572Ein `matcher`, der Agent-Typen benennt, gleicht kein leeres `agent_type` ab. Ein Hook, dessen Matcher weggelassen, `""` oder `"*"` ist oder ein regulärer Ausdruck, der eine leere Zeichenkette abgleicht, wird auch für Ereignisse mit einem leeren `agent_type` ausgeführt.2580Ein `matcher`, der Agententypen benennt, matcht keinen leeren `agent_type`. Ein Hook, dessen Matcher weggelassen, `""` oder `"*"` ist oder ein regulärer Ausdruck ist, der eine leere Zeichenfolge matcht, wird auch für Ereignisse mit leerem `agent_type` ausgeführt.
2573 2581
2574Auf Claude Code v2.1.271 oder später liefert ein Subagent, der mit dem [`SubagentHandback`](/docs/de/tools-reference) Tool läuft, seinen Bericht über dieses Tool, bevor er stoppt. Das `last_assistant_message` Feld enthält dann den Schließungstext des Subagenten, falls vorhanden, das ist nicht der gelieferte Bericht. Der Bericht ist die `message` Eingabe dieses Aufrufs, die ein `PreToolUse` oder `PostToolUse` Hook, der auf `SubagentHandback` abgleicht, als `tool_input.message` empfängt.2582Ab Claude Code v2.1.271 übermittelt ein Subagent, der mit dem Tool [`SubagentHandback`](/docs/de/tools-reference) läuft, seinen Bericht über dieses Tool, bevor er stoppt. Das Feld `last_assistant_message` enthält dann den abschließenden Text des Subagenten, falls vorhanden, der nicht der übermittelte Bericht ist. Der Bericht ist die `message`-Eingabe dieses Aufrufs, die ein `PreToolUse`- oder `PostToolUse`-Hook mit dem Matcher `SubagentHandback` als `tool_input.message` erhält.
2575 2583
2576SubagentStop-Hooks erhalten auch die `background_tasks` und `session_crons` Arrays, die unter [Stop-Eingabe](#stop-input) beschrieben sind. Beide Arrays sind auf die übergeordnete Sitzung begrenzt, nicht auf den Subagenten.2584SubagentStop-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.
2577 2585
2578```json theme={null}2586```json theme={null}
2579{2587{
2592}2600}
2593```2601```
2594 2602
2595SubagentStop-Hooks verwenden das gleiche Entscheidungskontroll-Format wie [Stop-Hooks](#stop-decision-control), einschließlich `hookSpecificOutput.additionalContext` mit `hookEventName` auf `"SubagentStop"` gesetzt, für Fehler-freies Feedback, das den Subagenten laufen lässt. Das Zurückgeben von `decision: "block"` mit einem `reason` lässt den Subagenten laufen und liefert `reason` an den Subagenten als seine nächste Anweisung. Ein Hook, der durch Beendigung mit 2 blockiert, liefert seine stderr-Nachricht auf die gleiche Weise. Um Kontext in die übergeordnete Sitzung nach der Rückkehr eines Subagenten einzufügen, verwenden Sie stattdessen einen [`PostToolUse`](#posttooluse) Hook auf dem `Agent` Tool.2603SubagentStop-Hooks verwenden dasselbe Format zur Entscheidungssteuerung wie [Stop-Hooks](#stop-decision-control), einschließlich `hookSpecificOutput.additionalContext` mit `hookEventName` auf `"SubagentStop"` gesetzt, für Feedback ohne Fehlercharakter, das den Subagenten weiterlaufen lässt. Die Rückgabe von `decision: "block"` mit einem `reason` lässt den Subagenten weiterlaufen und übermittelt `reason` an den Subagenten als seine nächste Anweisung. Ein Hook, der durch Exit-Code 2 blockiert, übermittelt seine stderr-Meldung auf dieselbe Weise. Um Kontext in die übergeordnete Sitzung einzufügen, nachdem ein Subagent zurückgekehrt ist, verwenden Sie stattdessen einen [`PostToolUse`](#posttooluse)-Hook für das `Agent`-Tool.
2596 2604
2597<h3 id="taskcreated">2605<h3 id="taskcreated">
2598 TaskCreated2606 TaskCreated
2599</h3>2607</h3>
2600 2608
2601Wird ausgeführt, wenn eine Aufgabe über das `TaskCreate` Tool erstellt wird. Verwenden Sie dies, um Benennungskonventionen durchzusetzen, Aufgabenbeschreibungen zu erfordern oder zu verhindern, dass bestimmte Aufgaben erstellt werden. In einer [Sitzung ohne die Task-Tools](/docs/de/tools-reference#task-tool-availability) wird dieses Ereignis nicht ausgelöst.2609Wird 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.
2602 2610
2603TaskCreated-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.2611TaskCreated-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.
2604 2612
2606 TaskCreated-Eingabe2614 TaskCreated-Eingabe
2607</h4>2615</h4>
2608 2616
2609Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten TaskCreated-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.2617Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten TaskCreated-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.
2610 2618
2611```json theme={null}2619```json theme={null}
2612{2620{
2626| :- | :- |2634| :- | :- |
2627| `task_id` | Bezeichner der zu erstellenden Aufgabe |2635| `task_id` | Bezeichner der zu erstellenden Aufgabe |
2628| `task_subject` | Titel der Aufgabe |2636| `task_subject` | Titel der Aufgabe |
2629| `task_description` | Detaillierte Beschreibung der Aufgabe. Kann fehlen |2637| `task_description` | Ausführliche Beschreibung der Aufgabe. Kann fehlen |
2630| `teammate_name` | Name des Teamkollegen, der die Aufgabe erstellt. Kann fehlen |2638| `teammate_name` | Name des Teammitglieds, das die Aufgabe erstellt. Kann fehlen |
2631| `team_name` | Veraltet. Sitzungs-abgeleiteter Team-Name; wird in einer zukünftigen Version entfernt |2639| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einer zukünftigen Version entfernt |
2632 2640
2633<h4 id="taskcreated-decision-control">2641<h4 id="taskcreated-decision-control">
2634 TaskCreated-Entscheidungskontrolle2642 TaskCreated-Entscheidungssteuerung
2635</h4>2643</h4>
2636 2644
2637Ein TaskCreated-Hook kann die Erstellung auf zwei Wegen blockieren. In beiden Fällen löscht Claude Code die Aufgabe und gibt Ihre Nachricht an Claude als Fehler des Tools zurück. Claude Code ignoriert `continue: false` aus diesem Ereignis und Claude arbeitet weiter.2645Ein TaskCreated-Hook kann die Erstellung auf zwei Arten blockieren. In beiden Fällen löscht Claude Code die Aufgabe und gibt Ihre Nachricht als Fehler des Tools an Claude zurück. Claude Code ignoriert `continue: false` bei diesem Ereignis, und Claude arbeitet weiter.
2638 2646
2639* **Exit-Code 2**: Claude Code gibt den stderr-Text als die Nachricht zurück.2647* **Exit-Code 2**: Claude Code gibt den stderr-Text als Nachricht zurück.
2640* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code gibt `reason` als die Nachricht zurück.2648* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code gibt `reason` als Nachricht zurück.
2641 2649
2642Dieses Beispiel blockiert Aufgaben, deren Betreff nicht dem erforderlichen Format folgt:2650Dieses Beispiel blockiert Aufgaben, deren Betreff nicht dem erforderlichen Format entspricht:
2643 2651
2644```bash theme={null}2652```bash theme={null}
2645#!/bin/bash2653#!/bin/bash
2658 TaskCompleted2666 TaskCompleted
2659</h3>2667</h3>
2660 2668
2661Wird ausgeführt, wenn eine Aufgabe als abgeschlossen markiert wird. Dies wird in zwei Situationen ausgelöst: wenn ein Agent eine Aufgabe explizit über das TaskUpdate-Tool als abgeschlossen markiert oder wenn ein [Agent-Team](/docs/de/agent-teams) Teamkollege seinen Zug mit laufenden Aufgaben beendet. Verwenden Sie dies, um Abschluss-Kriterien wie bestandene Tests oder Lint-Überprüfungen durchzusetzen, bevor eine Aufgabe geschlossen werden kann.2669Wird ausgeführt, wenn eine Aufgabe als abgeschlossen markiert wird. Dies wird in zwei Situationen ausgelöst: wenn ein beliebiger Agent eine Aufgabe über das Tool TaskUpdate ausdrücklich als abgeschlossen markiert oder wenn ein Teammitglied eines [Agent-Teams](/docs/de/agent-teams) seinen Turn mit laufenden Aufgaben beendet. Verwenden Sie dies, um Abschlusskriterien wie bestandene Tests oder Lint-Prüfungen durchzusetzen, bevor eine Aufgabe geschlossen werden kann.
2662 2670
2663TaskCompleted-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.2671TaskCompleted-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.
2664 2672
2666 TaskCompleted-Eingabe2674 TaskCompleted-Eingabe
2667</h4>2675</h4>
2668 2676
2669Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten TaskCompleted-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.2677Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten TaskCompleted-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.
2670 2678
2671```json theme={null}2679```json theme={null}
2672{2680{
2685 2693
2686| Feld | Beschreibung |2694| Feld | Beschreibung |
2687| :- | :- |2695| :- | :- |
2688| `task_id` | Bezeichner der zu abschließenden Aufgabe |2696| `task_id` | Bezeichner der abzuschließenden Aufgabe |
2689| `task_subject` | Titel der Aufgabe |2697| `task_subject` | Titel der Aufgabe |
2690| `task_description` | Detaillierte Beschreibung der Aufgabe. Kann fehlen |2698| `task_description` | Ausführliche Beschreibung der Aufgabe. Kann fehlen |
2691| `teammate_name` | Name des Teamkollegen, der die Aufgabe abschließt. Kann fehlen |2699| `teammate_name` | Name des Teammitglieds, das die Aufgabe abschließt. Kann fehlen |
2692| `team_name` | Veraltet. Sitzungs-abgeleiteter Team-Name; wird in einer zukünftigen Version entfernt |2700| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einer zukünftigen Version entfernt |
2693 2701
2694<h4 id="taskcompleted-decision-control">2702<h4 id="taskcompleted-decision-control">
2695 TaskCompleted-Entscheidungskontrolle2703 TaskCompleted-Entscheidungssteuerung
2696</h4>2704</h4>
2697 2705
2698TaskCompleted-Hooks unterstützen zwei Wege zur Steuerung des Aufgaben-Abschlusses:2706TaskCompleted-Hooks unterstützen zwei Möglichkeiten, den Aufgabenabschluss zu steuern:
2699 2707
2700* **Exit-Code 2**: Die Aufgabe wird nicht als abgeschlossen markiert und die stderr-Nachricht wird an das Modell als Feedback zurückgesendet.2708* **Exit-Code 2**: Die Aufgabe wird nicht als abgeschlossen markiert, und die stderr-Meldung wird dem Modell als Feedback zurückgegeben.
2701* **JSON `{"continue": false, "stopReason": "..."}`**: Wenn ein Teamkollege, der seinen Zug beendet, das Ereignis ausgelöst hat, stoppt den Teamkollegen vollständig, was dem `Stop` Hook-Verhalten entspricht. Der `stopReason` wird dem Benutzer angezeigt. Wenn das `TaskUpdate` Tool das Ereignis ausgelöst hat, ignoriert Claude Code `continue: false`; Exit-Code 2 blockiert immer noch den Abschluss.2709* **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.
2702 2710
2703Dieses Beispiel führt Tests aus und blockiert den Aufgaben-Abschluss, wenn sie fehlschlagen:2711Dieses Beispiel führt Tests aus und blockiert den Aufgabenabschluss, wenn sie fehlschlagen:
2704 2712
2705```bash theme={null}2713```bash theme={null}
2706#!/bin/bash2714#!/bin/bash
2720 Stop2728 Stop
2721</h3>2729</h3>
2722 2730
2723Wird ausgeführt, wenn der Haupt-Claude Code Agent mit dem Antworten fertig ist. Wird nicht ausgeführt, wenn der Stopp aufgrund einer Benutzerunterbrechung auftrat. API-Fehler lösen stattdessen [StopFailure](#stopfailure) aus.2731Wird ausgeführt, wenn der Haupt-Agent von Claude Code seine Antwort beendet hat. Wird nicht ausgeführt, wenn
2732das Stoppen durch eine Unterbrechung des Benutzers verursacht wurde. API-Fehler lösen
2733stattdessen [StopFailure](#stopfailure) aus.
2724 2734
2725<Tip>2735<Tip>
2726 Der [`/goal`](/docs/de/goal) Befehl ist eine integrierte Verknüpfung für einen Sitzungs-scoped Eingabeaufforderungs-basierten Stop-Hook. Verwenden Sie ihn, wenn Sie möchten, dass Claude auf eine Bedingung hinarbeitet, ohne Hook-Konfiguration zu schreiben.2736 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.
2727</Tip>2737</Tip>
2728 2738
2729<h4 id="stop-input">2739<h4 id="stop-input">
2730 Stop-Eingabe2740 Stop-Eingabe
2731</h4>2741</h4>
2732 2742
2733Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten Stop-Hooks `stop_hook_active`, `last_assistant_message`, `background_tasks` und `session_crons`. Das `stop_hook_active` Feld ist `true`, wenn Claude Code bereits als Ergebnis eines Stop-Hooks fortgesetzt wird. Überprüfen Sie diesen Wert oder verarbeiten Sie das Transkript, um zu vermeiden, auf einer Bedingung zu blockieren, die sich niemals auflöst. Claude Code wendet eine 8-aufeinanderfolgende-Fortsetzungs-Grenze an: Nach Stop-Hooks, die den Zug achtmal hintereinander fortgesetzt haben, überschreibt Claude Code den nächsten Block und beendet den Zug. Um die Grenze zu erhöhen, setzen Sie [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/de/env-vars).2743Zusä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 weiterarbeitet. Prüfen Sie diesen Wert oder verarbeiten Sie das Transkript, um zu vermeiden, dass auf eine Bedingung blockiert wird, die sich nie auflöst. Claude 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. Um die Obergrenze anzuheben, setzen Sie [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/de/env-vars).
2734 2744
2735Das `last_assistant_message` Feld enthält den Textinhalt von Claudes letzter Antwort, daher können Hooks darauf zugreifen, ohne die Transkript-Datei zu analysieren. Für Hooks, die auf den gerade abgeschlossenen Zug einwirken, wie Vorlese- oder Benachrichtigungs-Hooks, verwenden Sie dieses Feld statt `transcript_path` zu lesen: Die Transkript-Datei ist nicht garantiert, die letzte Nachricht zum Stop-Zeitpunkt auf allen Versionen einzuschließen.2745Das Feld `last_assistant_message` enthält den Textinhalt von Claudes letzter Antwort, sodass Hooks darauf zugreifen können, ohne die Transkriptdatei zu parsen. Für Hooks, die auf den gerade abgeschlossenen Turn reagieren, etwa Vorlese- oder Benachrichtigungs-Hooks, verwenden Sie dieses Feld, anstatt `transcript_path` zu lesen: Es ist nicht in allen Versionen garantiert, dass die Transkriptdatei zum Stop-Zeitpunkt die letzte Nachricht enthält.
2736 2746
2737Die `background_tasks` und `session_crons` Arrays ermöglichen es Hooks, "Sitzung ist fertig" von "Sitzung ist pausiert und wartet auf Hintergrund-Arbeit, um sie aufzuwecken" zu unterscheiden. Beide Arrays sind vorhanden, wenn die Task-Registry erreichbar ist und sind leer, wenn nichts in Flug oder geplant ist.2747Mit den Arrays `background_tasks` und `session_crons` können Hooks unterscheiden zwischen „Sitzung ist beendet" und „Sitzung ist pausiert und wartet darauf, dass Hintergrundarbeit sie wieder aufweckt". Beide Arrays sind vorhanden, wenn die Aufgabenregistrierung erreichbar ist, und leer, wenn nichts läuft oder geplant ist.
2738 2748
2739Jeder Eintrag in `background_tasks` beschreibt eine laufende Aufgabe und verwendet diese Felder:2749Jeder Eintrag in `background_tasks` beschreibt eine laufende Aufgabe und verwendet diese Felder:
2740 2750
2741| Feld | Beschreibung |2751| Feld | Beschreibung |
2742| :- | :- |2752| :- | :- |
2743| `id` | Aufgaben-Bezeichner |2753| `id` | Aufgabenbezeichner |
2744| `type` | Freundlicher Aufgaben-Typ-Label wie `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` oder `MCP task`. Jedes Label identifiziert, welche Claude Code Funktion die Aufgabe erstellt hat. Fällt auf den rohen Diskriminanten für unbekannte Typen zurück |2754| `type` | Lesbare Bezeichnung des Aufgabentyps wie `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` oder `MCP task`. Jede Bezeichnung gibt an, welche Claude Code-Funktion die Aufgabe erstellt hat. Fällt bei nicht erkannten Typen auf den rohen Diskriminator zurück |
2745| `status` | Aktueller Aufgaben-Status |2755| `status` | Aktueller Aufgabenstatus |
2746| `description` | Freitext-Beschreibung, begrenzt auf 1000 Zeichen mit einem In-String-`… [+N chars]` Marker, wenn gekürzt |2756| `description` | Freitextbeschreibung, begrenzt auf 1000 Zeichen, mit einer Markierung `… [+N chars]` in der Zeichenfolge bei Kürzung |
2747| `command` | Shell-Befehlszeile, begrenzt auf 1000 Zeichen. Nur für `shell` Aufgaben vorhanden |2757| `command` | Shell-Befehlszeile, begrenzt auf 1000 Zeichen. Nur bei `shell`-Aufgaben vorhanden |
2748| `agent_type` | Subagenten-Typ-Name. Nur für `subagent` Aufgaben vorhanden |2758| `agent_type` | Name des Subagententyps. Nur bei `subagent`-Aufgaben vorhanden |
2749| `server` | MCP-Server-Name. Nur für `monitor` und `MCP task` Aufgaben vorhanden |2759| `server` | Name des MCP-Servers. Nur bei `monitor`- und `MCP task`-Aufgaben vorhanden |
2750| `tool` | MCP-Tool-Name. Nur für `monitor` und `MCP task` Aufgaben vorhanden |2760| `tool` | Name des MCP-Tools. Nur bei `monitor`- und `MCP task`-Aufgaben vorhanden |
2751| `name` | Workflow-Name. Nur für `workflow` Aufgaben vorhanden |2761| `name` | Name des Workflows. Nur bei `workflow`-Aufgaben vorhanden |
2752 2762
2753Jeder Eintrag in `session_crons` beschreibt einen Sitzungs-scoped geplanten Aufwach-Aufruf, stammt von `CronCreate`, `ScheduleWakeup` und `/loop`:2763Jeder Eintrag in `session_crons` beschreibt ein sitzungsbezogenes geplantes Aufwecken, das aus `CronCreate`, `ScheduleWakeup` und `/loop` stammt:
2754 2764
2755| Feld | Beschreibung |2765| Feld | Beschreibung |
2756| :- | :- |2766| :- | :- |
2757| `id` | Cron-Aufgaben-Bezeichner |2767| `id` | Bezeichner der Cron-Aufgabe |
2758| `schedule` | Cron-Ausdruck, z. B. `0 9 * * 1-5` |2768| `schedule` | Cron-Ausdruck, zum Beispiel `0 9 * * 1-5` |
2759| `recurring` | `false` für einmalige Aufwach-Aufrufe, deren Zeitplan eine einzelne Feuerzeit kodiert, `true` für Aufgaben, die bei jedem Match erneut feuern |2769| `recurring` | `false` für einmalige Aufweckvorgänge, deren Zeitplan einen einzigen Auslösezeitpunkt codiert, `true` für Aufgaben, die bei jeder Übereinstimmung erneut ausgelöst werden |
2760| `prompt` | Eingabeaufforderung, die eingereicht wird, wenn der Cron feuert, begrenzt auf 1000 Zeichen mit dem gleichen `… [+N chars]` Marker |2770| `prompt` | Prompt, der beim Auslösen des Cron-Jobs übermittelt wird, begrenzt auf 1000 Zeichen mit derselben Markierung `… [+N chars]` |
2761 2771
2762Dieses Beispiel zeigt eine Stop-Eingabe mit einer laufenden Shell-Aufgabe und einem wiederkehrenden Cron:2772Dieses Beispiel zeigt eine Stop-Eingabe mit einer laufenden Shell-Aufgabe und einem wiederkehrenden Cron-Job:
2763 2773
2764```json theme={null}2774```json theme={null}
2765{2775{
2791```2801```
2792 2802
2793<h4 id="stop-decision-control">2803<h4 id="stop-decision-control">
2794 Stop-Entscheidungskontrolle2804 Stop-Entscheidungssteuerung
2795</h4>2805</h4>
2796 2806
2797`Stop` und `SubagentStop` Hooks können steuern, ob Claude fortgesetzt wird. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, kann Ihr Hook-Skript diese ereignisspezifischen Felder zurückgeben:2807`Stop`- und `SubagentStop`-Hooks können steuern, ob Claude fortfährt. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, kann Ihr Hook-Skript diese ereignisspezifischen Felder zurückgeben:
2798 2808
2799| Feld | Beschreibung |2809| Feld | Beschreibung |
2800| :- | :- |2810| :- | :- |
2801| `decision` | `"block"` verhindert, dass Claude stoppt. Weglassen, um Claude zu stoppen |2811| `decision` | `"block"` verhindert, dass Claude stoppt. Weglassen, um Claude das Stoppen zu erlauben |
2802| `reason` | Erforderlich, wenn `decision` `"block"` ist. Sagt Claude, warum es fortgesetzt werden sollte |2812| `reason` | Erforderlich, wenn `decision` den Wert `"block"` hat. Teilt Claude mit, warum es fortfahren soll |
2803| `hookSpecificOutput.additionalContext` | Fehler-freies Feedback für Claude. Die Konversation wird fortgesetzt, damit Claude darauf einwirken kann, aber im Gegensatz zu `decision: "block"` wird es im Transkript als Hook-Feedback statt als Hook-Fehler angezeigt |2813| `hookSpecificOutput.additionalContext` | Feedback für Claude ohne Fehlercharakter. Die Konversation wird fortgesetzt, damit Claude darauf reagieren kann, aber anders als bei `decision: "block"` wird es im Transkript als Hook-Feedback und nicht als Hook-Fehler angezeigt |
2804 2814
2805Ein Hook, der durch Beendigung mit 2 blockiert, leitet auf die gleiche Weise wie `reason` weiter: Claude empfängt die stderr-Nachricht als Erklärung, warum es fortgesetzt werden sollte.2815Ein Hook, der durch Exit-Code 2 blockiert, wird genauso weitergeleitet wie `reason`: Claude erhält die stderr-Meldung als Erklärung, warum es fortfahren soll.
2806 2816
2807```json theme={null}2817```json theme={null}
2808{2818{
2811}2821}
2812```2822```
2813 2823
2814Verwenden Sie `additionalContext`, wenn der Hook wie beabsichtigt funktioniert und Claude Anleitung gibt, wie "Führen Sie die Test-Suite aus, bevor Sie fertig sind". Es hält die Konversation durch die gleichen Loop-Schutzmaßnahmen wie `decision: "block"` laufen, nämlich die `stop_hook_active` Eingabe und die 8-aufeinanderfolgende-Fortsetzungs-Grenze, aber das Transkript kennzeichnet es als `Stop hook feedback` und es wird keine Hook-Fehler-Benachrichtigung angezeigt:2824Verwenden Sie `additionalContext`, wenn der Hook wie vorgesehen funktioniert und Claude Orientierung gibt, etwa „führe die Testsuite vor dem Abschluss aus". Es hält die Konversation über dieselben Schleifenschutzmechanismen wie `decision: "block"` am Laufen, nämlich die Eingabe `stop_hook_active` und die Obergrenze von 8 aufeinanderfolgenden Fortsetzungen, aber das Transkript kennzeichnet es als `Stop hook feedback`, und es wird keine Hook-Fehlerbenachrichtigung angezeigt:
2815 2825
2816```json theme={null}2826```json theme={null}
2817{2827{
2826 StopFailure2836 StopFailure
2827</h3>2837</h3>
2828 2838
2829Wird stattdessen von [Stop](#stop) ausgeführt, wenn der Zug 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 aufgrund von Ratenlimits, Authentifizierungsproblemen oder anderen API-Fehlern keine Antwort abschließen kann.2839Wird 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.
2830 2840
2831<h4 id="stopfailure-input">2841<h4 id="stopfailure-input">
2832 StopFailure-Eingabe2842 StopFailure-Eingabe
2833</h4>2843</h4>
2834 2844
2835Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten StopFailure-Hooks `error`, optional `error_details` und optional `last_assistant_message`. Das `error` Feld identifiziert den Fehlertyp und wird zum Filtern des Matchers verwendet.2845Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten StopFailure-Hooks `error`, optional `error_details` und optional `last_assistant_message`. Das Feld `error` gibt den Fehlertyp an und wird für die Matcher-Filterung verwendet.
2836 2846
2837| Feld | Beschreibung |2847| Feld | Beschreibung |
2838| :- | :- |2848| :- | :- |
2839| `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` |2849| `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` |
2840| `error_details` | Zusätzliche Details zum Fehler, wenn verfügbar |2850| `error_details` | Zusätzliche Details zum Fehler, sofern verfügbar |
2841| `last_assistant_message` | Der gerenderte Fehlertext, der in der Konversation angezeigt wird. Im Gegensatz zu `Stop` und `SubagentStop`, wo dieses Feld Claudes Konversations-Ausgabe enthält, enthält es für `StopFailure` die API-Fehler-Zeichenkette selbst, wie `"API Error: Rate limit reached"` |2851| `last_assistant_message` | Der gerenderte Fehlertext, der in der Konversation angezeigt wird. Anders als bei `Stop` und `SubagentStop`, wo dieses Feld Claudes Konversationsausgabe enthält, enthält es bei `StopFailure` die API-Fehlerzeichenfolge selbst, etwa `"API Error: Rate limit reached"` |
2842 2852
2843```json theme={null}2853```json theme={null}
2844{2854{
2852}2862}
2853```2863```
2854 2864
2855StopFailure-Hooks haben keine Entscheidungskontrolle. Sie werden nur zu Benachrichtigungs- und Protokollierungszwecken ausgeführt.2865StopFailure-Hooks haben keine Entscheidungssteuerung. Sie dienen ausschließlich Benachrichtigungs- und Protokollierungszwecken.
2856 2866
2857<h3 id="teammateidle">2867<h3 id="teammateidle">
2858 TeammateIdle2868 TeammateIdle
2859</h3>2869</h3>
2860 2870
2861Wird ausgeführt, wenn ein [Agent-Team](/docs/de/agent-teams) Teamkollege nach Abschluss seines Zugs untätig werden soll. Verwenden Sie dies, um Qualitäts-Gates durchzusetzen, bevor ein Teamkollege die Arbeit einstellt, wie das Erfordern bestandener Lint-Überprüfungen oder das Überprüfen, dass Ausgabe-Dateien existieren.2871Wird ausgeführt, wenn ein Teammitglied eines [Agent-Teams](/docs/de/agent-teams) nach dem Beenden seines Turns kurz davor ist, untätig zu werden. Verwenden Sie dies, um Qualitätsschranken durchzusetzen, bevor ein Teammitglied die Arbeit einstellt, etwa durch das Verlangen bestandener Lint-Prüfungen oder die Überprüfung, ob Ausgabedateien existieren.
2862 2872
2863TeammateIdle-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.2873TeammateIdle-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgelöst.
2864 2874
2866 TeammateIdle-Eingabe2876 TeammateIdle-Eingabe
2867</h4>2877</h4>
2868 2878
2869Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten TeammateIdle-Hooks `teammate_name` und `team_name`.2879Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten TeammateIdle-Hooks `teammate_name` und `team_name`.
2870 2880
2871```json theme={null}2881```json theme={null}
2872{2882{
2882 2892
2883| Feld | Beschreibung |2893| Feld | Beschreibung |
2884| :- | :- |2894| :- | :- |
2885| `teammate_name` | Name des Teamkollegen, der untätig werden soll |2895| `teammate_name` | Name des Teammitglieds, das kurz davor ist, untätig zu werden |
2886| `team_name` | Veraltet. Sitzungs-abgeleiteter Team-Name; wird in einer zukünftigen Version entfernt |2896| `team_name` | Veraltet. Aus der Sitzung abgeleiteter Teamname; wird in einer zukünftigen Version entfernt |
2887 2897
2888<h4 id="teammateidle-decision-control">2898<h4 id="teammateidle-decision-control">
2889 TeammateIdle-Entscheidungskontrolle2899 TeammateIdle-Entscheidungssteuerung
2890</h4>2900</h4>
2891 2901
2892TeammateIdle-Hooks unterstützen zwei Wege zur Steuerung des Teamkollegen-Verhaltens:2902TeammateIdle-Hooks unterstützen zwei Möglichkeiten, das Verhalten von Teammitgliedern zu steuern:
2893 2903
2894* **Exit-Code 2**: Der Teamkollege empfängt die stderr-Nachricht als Feedback und arbeitet weiter, anstatt untätig zu werden.2904* **Exit-Code 2**: Das Teammitglied erhält die stderr-Meldung als Feedback und arbeitet weiter, anstatt untätig zu werden.
2895* **JSON `{"continue": false, "stopReason": "..."}`**: Stoppt den Teamkollegen vollständig, was dem `Stop` Hook-Verhalten entspricht. Der `stopReason` wird dem Benutzer angezeigt.2905* **JSON `{"continue": false, "stopReason": "..."}`**: Stoppt das Teammitglied vollständig, entsprechend dem Verhalten des `Stop`-Hooks. Der `stopReason` wird dem Benutzer angezeigt.
2896 2906
2897Dieses Beispiel überprüft, dass ein Build-Artefakt existiert, bevor ein Teamkollege untätig werden darf:2907Dieses Beispiel prüft, ob ein Build-Artefakt existiert, bevor ein Teammitglied untätig werden darf:
2898 2908
2899```bash theme={null}2909```bash theme={null}
2900#!/bin/bash2910#!/bin/bash
2911 ConfigChange2921 ConfigChange
2912</h3>2922</h3>
2913 2923
2914Wird ausgeführt, wenn sich eine Konfigurationsdatei während einer Sitzung ändert. Verwenden Sie dies, um Einstellungs-Änderungen zu überprüfen, Sicherheits-Richtlinien durchzusetzen oder nicht autorisierte Änderungen an Konfigurationsdateien zu blockieren.2924Wird ausgeführt, wenn sich während einer Sitzung eine Konfigurationsdatei ändert. Verwenden Sie dies, um Einstellungsänderungen zu prüfen, Sicherheitsrichtlinien durchzusetzen oder nicht autorisierte Änderungen an Konfigurationsdateien zu blockieren.
2915 2925
2916Claude Code führt ConfigChange-Hooks aus, wenn sich eine Einstellungsdatei, eine verwaltete Richtlinien-Datei oder eine Skill-Datei ändert. Für verwaltete Richtlinien führt es sie nur aus, wenn sich `managed-settings.json` oder eine Datei in `managed-settings.d/` ändert. Es wendet [Server-verwaltete Einstellungen](/docs/de/server-managed-settings) und Änderungen an macOS verwalteten Einstellungen oder Windows Registry-Richtlinien ohne Ausführung an. Auf WSL mit [`wslInheritsWindowsSettings`](/docs/de/settings-reference#wslinheritswindowssettings) wendet es auch eine geänderte Windows-seitige verwaltete Einstellungsdatei bei seiner Richtlinien-Abfrage ohne Ausführung an.2926Claude Code führt ConfigChange-Hooks aus, wenn sich eine Einstellungsdatei, eine Datei mit verwalteten Richtlinien oder eine Skill-Datei ändert. Bei verwalteten Richtlinien führt es sie nur aus, wenn sich `managed-settings.json` oder eine Datei in `managed-settings.d/` ändert. [Serververwaltete Einstellungen](/docs/de/server-managed-settings) sowie Änderungen an verwalteten macOS-Einstellungen oder Windows-Registrierungsrichtlinien wendet es an, ohne die Hooks auszuführen. Unter WSL mit [`wslInheritsWindowsSettings`](/docs/de/settings-reference#wslinheritswindowssettings) wendet es bei seiner Richtlinienabfrage auch eine geänderte Windows-seitige Datei mit verwalteten Einstellungen an, ohne die Hooks auszuführen.
2917 2927
2918Der Matcher filtert auf die Konfigurationsquelle:2928Der Matcher filtert nach der Konfigurationsquelle:
2919 2929
2920| Matcher | Wann wird es ausgelöst |2930| Matcher | Wann er ausgelöst wird |
2921| :- | :- |2931| :- | :- |
2922| `user_settings` | `~/.claude/settings.json` ändert sich |2932| `user_settings` | `~/.claude/settings.json` ändert sich |
2923| `project_settings` | `.claude/settings.json` ändert sich |2933| `project_settings` | `.claude/settings.json` ändert sich |
2925| `policy_settings` | `managed-settings.json` oder eine Datei in `managed-settings.d/` ändert sich |2935| `policy_settings` | `managed-settings.json` oder eine Datei in `managed-settings.d/` ändert sich |
2926| `skills` | Eine Skill-Datei in `.claude/skills/` ändert sich |2936| `skills` | Eine Skill-Datei in `.claude/skills/` ändert sich |
2927 2937
2928Dieses Beispiel protokolliert alle Konfigurationsänderungen für Sicherheits-Audits:2938Dieses Beispiel protokolliert alle Konfigurationsänderungen für Sicherheitsaudits:
2929 2939
2930```json theme={null}2940```json theme={null}
2931{2941{
2949 ConfigChange-Eingabe2959 ConfigChange-Eingabe
2950</h4>2960</h4>
2951 2961
2952Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten ConfigChange-Hooks `source` und optional `file_path`. Das `source` Feld gibt an, welcher Konfigurationstyp sich geändert hat, und `file_path` stellt den Pfad zur spezifischen Datei bereit, die geändert wurde.2962Zusä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.
2953 2963
2954```json theme={null}2964```json theme={null}
2955{2965{
2963```2973```
2964 2974
2965<h4 id="configchange-decision-control">2975<h4 id="configchange-decision-control">
2966 ConfigChange-Entscheidungskontrolle2976 ConfigChange-Entscheidungssteuerung
2967</h4>2977</h4>
2968 2978
2969ConfigChange-Hooks können Konfigurationsänderungen blockieren, damit sie nicht wirksam werden. Verwenden Sie Exit-Code 2 oder ein JSON `decision`, um die Änderung zu verhindern. Wenn blockiert, werden die neuen Einstellungen nicht auf die laufende Sitzung angewendet.2979ConfigChange-Hooks können verhindern, dass Konfigurationsänderungen wirksam werden. Verwenden Sie Exit-Code 2 oder ein JSON-`decision`, um die Änderung zu verhindern. Bei einer Blockierung werden die neuen Einstellungen nicht auf die laufende Sitzung angewendet.
2970 2980
2971| Feld | Beschreibung |2981| Feld | Beschreibung |
2972| :- | :- |2982| :- | :- |
2973| `decision` | `"block"` verhindert, dass die Konfigurationsänderung angewendet wird. Weglassen, um die Änderung zuzulassen |2983| `decision` | `"block"` verhindert, dass die Konfigurationsänderung angewendet wird. Weglassen, um die Änderung zu erlauben |
2974| `reason` | Akzeptiert, aber nie angezeigt |2984| `reason` | Wird akzeptiert, aber nie angezeigt |
2975 2985
2976```json theme={null}2986```json theme={null}
2977{2987{
2980}2990}
2981```2991```
2982 2992
2983`policy_settings` Änderungen können nicht blockiert werden. Hooks werden immer noch für `policy_settings` Quellen ausgelöst, wenn sich eine verwaltete Einstellungsdatei auf der Maschine ändert, daher können Sie sie verwenden, um diese Bearbeitungen zu protokollieren, aber jede Blockierungs-Entscheidung wird ignoriert. Dies stellt sicher, dass unternehmens-verwaltete Einstellungen immer wirksam werden. Claude Code führt `ConfigChange` Hooks nicht aus, wenn [Server-verwaltete Einstellungen](/docs/de/server-managed-settings) ankommen oder aktualisiert werden.2993Änderungen an `policy_settings` können nicht blockiert werden. Hooks werden für `policy_settings`-Quellen weiterhin ausgelöst, wenn sich eine Datei mit verwalteten Einstellungen auf dem Rechner ändert, sodass Sie sie zum Protokollieren dieser Änderungen verwenden können, aber jede Blockierungsentscheidung wird ignoriert. Dadurch wird sichergestellt, dass unternehmensweit verwaltete Einstellungen immer wirksam werden. Claude Code führt keine `ConfigChange`-Hooks aus, wenn [serververwaltete Einstellungen](/docs/de/server-managed-settings) eintreffen oder aktualisiert werden.
2984 2994
2985Claude Code handelt auf die Blockierungs-Entscheidung aus der JSON-Ausgabe eines ConfigChange-Hooks und verwirft `systemMessage` und `continue`. Eine blockierte Änderung zeigt keine Nachricht für Sie oder Claude, ob Sie mit `reason` oder mit stderr bei Exit 2 blockieren. Claude Code schreibt nur eine Zeile ins Debug-Protokoll.2995Claude 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.
2986 2996
2987<h3 id="cwdchanged">2997<h3 id="cwdchanged">
2988 CwdChanged2998 CwdChanged
2989</h3>2999</h3>
2990 3000
2991Wird ausgeführt, wenn ein Shell-Befehl in der Hauptkonversation das Arbeitsverzeichnis ändert, z. B. wenn Claude einen `cd` Befehl ausführt. Verwenden Sie dies, um auf Verzeichnis-Änderungen zu reagieren: Umgebungsvariablen neu laden, projekt-spezifische Toolchains aktivieren oder Setup-Skripte automatisch ausführen. Paart mit [FileChanged](#filechanged) für Tools wie [direnv](https://direnv.net/), die pro-Verzeichnis-Umgebung verwalten.3001Wird ausgeführt, wenn ein Shell-Befehl in der Hauptkonversation das Arbeitsverzeichnis ändert, beispielsweise wenn Claude einen `cd`-Befehl ausführt. Verwenden Sie dies, um auf Verzeichniswechsel zu reagieren: Umgebungsvariablen neu laden, projektspezifische Toolchains aktivieren oder Einrichtungsskripte automatisch ausführen. Lässt sich mit [FileChanged](#filechanged) kombinieren für Tools wie [direnv](https://direnv.net/), die verzeichnisspezifische Umgebungen verwalten.
2992 3002
2993CwdChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variablen, die in diese Datei geschrieben werden, bleiben für nachfolgende Bash-Befehle bestehen, bis zum nächsten CwdChanged-Ereignis, wenn Claude Code sie löscht.3003CwdChanged-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.
2994 3004
2995CwdChanged unterstützt keine Matcher und wird bei jedem Vorkommen ausgelöst.3005CwdChanged unterstützt keine Matcher und wird bei jedem Vorkommen ausgelöst.
2996 3006
2998 CwdChanged-Eingabe3008 CwdChanged-Eingabe
2999</h4>3009</h4>
3000 3010
3001Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten CwdChanged-Hooks `old_cwd` und `new_cwd`.3011Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten CwdChanged-Hooks `old_cwd` und `new_cwd`.
3002 3012
3003```json theme={null}3013```json theme={null}
3004{3014{
3015 CwdChanged-Ausgabe3025 CwdChanged-Ausgabe
3016</h4>3026</h4>
3017 3027
3018Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, können CwdChanged-Hooks `watchPaths` zurückgeben, um dynamisch zu setzen, welche Dateipfade [FileChanged](#filechanged) überwacht:3028Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können CwdChanged-Hooks `watchPaths` zurückgeben, um dynamisch festzulegen, welche Dateipfade [FileChanged](#filechanged) überwacht:
3019 3029
3020| Feld | Beschreibung |3030| Feld | Beschreibung |
3021| :- | :- |3031| :- | :- |
3022| `watchPaths` | Array von absoluten Pfaden. Ersetzt die aktuelle dynamische Überwachungsliste. Pfade aus Ihrer `matcher` Konfiguration werden immer überwacht. Das Zurückgeben eines leeren Arrays löscht die dynamische Liste, was typisch ist, wenn ein neues Verzeichnis betreten wird |3032| `watchPaths` | Array absoluter Pfade. Ersetzt die aktuelle dynamische Überwachungsliste. Pfade aus Ihrer `matcher`-Konfiguration werden immer überwacht. Die Rückgabe eines leeren Arrays leert die dynamische Liste, was beim Wechsel in ein neues Verzeichnis typisch ist |
3023 3033
3024CwdChanged-Hooks haben keine Entscheidungskontrolle. Sie können die Verzeichnis-Änderung nicht blockieren.3034CwdChanged-Hooks haben keine Entscheidungssteuerung. Sie können den Verzeichniswechsel nicht blockieren.
3025 3035
3026Claude Code liest `watchPaths` und `systemMessage` aus ihrer JSON-Ausgabe und verwirft `continue`. In interaktiven Sitzungen zeigt es die `systemMessage` als kurze Terminal-Benachrichtigung. Die Nachricht erreicht nicht den SDK-Nachrichtenstrom.3036Claude 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.
3027 3037
3028<h3 id="directoryadded">3038<h3 id="directoryadded">
3029 DirectoryAdded3039 DirectoryAdded
3030</h3>3040</h3>
3031 3041
3032Wird ausgeführt, nachdem Sie ein Arbeitsverzeichnis während einer Sitzung mit dem `/add-dir` Befehl hinzufügen oder nachdem ein SDK-Client eines mit der `register_repo_root` Kontroll-Anfrage hinzufügt. Verwenden Sie dies, um ein neu hinzugefügtes Repository vorzubereiten, z. B. durch Installation seiner Abhängigkeiten.3042Wird ausgeführt, nachdem Sie während einer Sitzung mit dem Befehl `/add-dir` ein Arbeitsverzeichnis hinzugefügt haben oder nachdem ein SDK-Client eines mit der Steuerungsanfrage `register_repo_root` hinzugefügt hat. Verwenden Sie dies, um ein neu hinzugefügtes Repository vorzubereiten, beispielsweise durch Installieren seiner Abhängigkeiten.
3033 3043
3034Claude Code löst dieses Ereignis nicht aus, wenn:3044Claude Code löst dieses Ereignis nicht aus, wenn:
3035 3045
3036* Sie ein Verzeichnis mit dem `--add-dir` Start-Flag übergeben; [SessionStart](#sessionstart) deckt diese Verzeichnisse ab3046* Sie ein Verzeichnis mit dem Start-Flag `--add-dir` übergeben; [SessionStart](#sessionstart) deckt diese Verzeichnisse ab
3037* Sie ein Verzeichnis auf der `/permissions` Workspace-Registerkarte hinzufügen3047* Sie ein Verzeichnis auf dem Tab Workspace von `/permissions` hinzufügen
3038* Sie ein Verzeichnis hinzufügen, das bereits ein Arbeitsverzeichnis ist oder sich in einem befindet3048* Sie ein Verzeichnis hinzufügen, das bereits ein Arbeitsverzeichnis ist oder sich in einem befindet
3039 3049
3040Claude Code löst DirectoryAdded aus, nachdem Sandbox- und Berechtigungs-Status aktualisiert wurden, daher sehen Sandbox-Tools das neue Verzeichnis bereits, wenn Ihr Hook ausgeführt wird. Hook-Befehle selbst werden unsandboxed ausgeführt.3050Claude Code löst DirectoryAdded aus, nachdem der Sandbox- und Berechtigungsstatus aktualisiert wurde, sodass in einer Sandbox ausgeführte Tools das neue Verzeichnis bereits sehen, wenn Ihr Hook ausgeführt wird. Hook-Befehle selbst werden außerhalb der Sandbox ausgeführt.
3041 3051
3042Claude Code wartet nicht auf den Hook: Das Hinzufügen wird sofort abgeschlossen und der Hook wird im Hintergrund mit dem 600-Sekunden-Standard-Timeout ausgeführt.3052Claude 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.
3043 3053
3044Der Matcher filtert, wie das Verzeichnis hinzugefügt wurde:3054Der Matcher filtert danach, wie das Verzeichnis hinzugefügt wurde:
3045 3055
3046| Matcher | Wann wird es ausgelöst |3056| Matcher | Wann er ausgelöst wird |
3047| :- | :- |3057| :- | :- |
3048| `slash_command` | Sie fügen ein Verzeichnis mit `/add-dir` hinzu |3058| `slash_command` | Sie fügen ein Verzeichnis mit `/add-dir` hinzu |
3049| `register_repo_root` | Ein SDK-Client fügt ein Verzeichnis mit der `register_repo_root` Kontroll-Anfrage hinzu |3059| `register_repo_root` | Ein SDK-Client fügt ein Verzeichnis mit der Steuerungsanfrage `register_repo_root` hinzu |
3050 3060
3051<h4 id="directoryadded-input">3061<h4 id="directoryadded-input">
3052 DirectoryAdded-Eingabe3062 DirectoryAdded-Eingabe
3053</h4>3063</h4>
3054 3064
3055Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten DirectoryAdded-Hooks `directory` und `source`.3065Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten DirectoryAdded-Hooks `directory` und `source`.
3056 3066
3057| Feld | Beschreibung |3067| Feld | Beschreibung |
3058| :- | :- |3068| :- | :- |
3059| `directory` | Absoluter Pfad des hinzugefügten Verzeichnisses |3069| `directory` | Absoluter Pfad des hinzugefügten Verzeichnisses |
3060| `source` | Wie das Verzeichnis hinzugefügt wurde, `"slash_command"` für `/add-dir` oder `"register_repo_root"` für die SDK-Kontroll-Anfrage |3070| `source` | Wie das Verzeichnis hinzugefügt wurde: `"slash_command"` für `/add-dir` oder `"register_repo_root"` für die SDK-Steuerungsanfrage |
3061 3071
3062```json theme={null}3072```json theme={null}
3063{3073{
3070}3080}
3071```3081```
3072 3082
3073DirectoryAdded-Hooks haben keine Entscheidungskontrolle. Sie können das Hinzufügen nicht blockieren, das bereits abgeschlossen ist, wenn der Hook ausgeführt wird. Claude Code verwirft das `continue` Feld aus ihrer JSON-Ausgabe und zeigt den Rest unterschiedlich pro Quelle:3083DirectoryAdded-Hooks haben keine Entscheidungssteuerung. Sie können das Hinzufügen nicht blockieren, da es bereits abgeschlossen ist, wenn der Hook ausgeführt wird. Claude Code verwirft das Feld `continue` aus ihrer JSON-Ausgabe und behandelt den Rest je nach Quelle unterschiedlich:
3074 3084
3075* `slash_command`: Claude Code liefert den `systemMessage` des Hooks an Claude als Kontext beim nächsten Konversations-Zug, anstatt ihn Ihnen zu zeigen. Eine Anzahl fehlgeschlagener Hooks erscheint im Transkript. Vollständige Fehler-Ausgabe geht ins Debug-Protokoll3085* `slash_command`: Claude Code übermittelt die `systemMessage` des Hooks im nächsten Konversations-Turn als Kontext an Claude, anstatt sie Ihnen anzuzeigen. Die Anzahl fehlgeschlagener Hooks erscheint im Transkript. Die vollständige Fehlerausgabe geht in das Debug-Log
3076* `register_repo_root`: Claude Code schreibt `systemMessage` Ausgabe und Fehler-Ausgabe nur ins Debug-Protokoll3086* `register_repo_root`: Claude Code schreibt die `systemMessage`-Ausgabe und die Fehlerausgabe nur in das Debug-Log
3077 3087
3078<h3 id="filechanged">3088<h3 id="filechanged">
3079 FileChanged3089 FileChanged
3080</h3>3090</h3>
3081 3091
3082Wird ausgeführt, wenn sich eine überwachte Datei auf der Festplatte ändert. Claude Code erkennt Änderungen mit einem Dateisystem-Watcher, nicht durch Überprüfung von Tool-Aufrufen, daher wird der Hook ausgeführt, egal was die Datei geändert hat: Ein `Edit` oder `Write` Tool-Aufruf, ein Skript, das Claude mit `Bash` ausführt, oder ein Prozess außerhalb von Claude Code. Ein häufiger Anwendungsfall ist das Neuladen von Umgebungsvariablen, wenn sich Projekt-Konfigurationsdateien ändern.3092Wird ausgeführt, wenn sich eine überwachte Datei auf der Festplatte ändert. Claude Code erkennt Änderungen mit einem Dateisystem-Watcher, nicht durch Prüfen von Tool-Aufrufen, und führt den Hook daher unabhängig davon aus, was die Datei geändert hat: ein `Edit`- oder `Write`-Tool-Aufruf, ein Skript, das Claude mit `Bash` ausführt, oder ein Prozess vollständig außerhalb von Claude Code. Ein häufiger Anwendungsfall ist das Neuladen von Umgebungsvariablen, wenn sich Projektkonfigurationsdateien ändern.
3083 3093
3084Der `matcher` für dieses Ereignis dient zwei Rollen:3094Der `matcher` für dieses Ereignis erfüllt zwei Aufgaben:
3085 3095
3086* **Erstelle die Überwachungsliste**: Der Wert wird auf `|` aufgeteilt und jedes Segment wird als wörtlicher Dateiname im Arbeitsverzeichnis registriert, daher überwacht `".envrc|.env"` genau diese zwei Dateien. Regex-Muster sind hier nicht nützlich: Ein Wert wie `^\.env` würde eine Datei wörtlich namens `^\.env` überwachen.3096* **Ü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.
3087* **Filtere, welche Hooks ausgeführt werden**: Wenn sich eine überwachte Datei ändert, filtert der gleiche Wert, welche Hook-Gruppen ausgeführt werden, unter Verwendung der Standard-[Matcher-Regeln](#matcher-patterns) gegen den Basis-Namen der geänderten Datei.3097* **Filtern, welche Hooks ausgeführt werden**: Wenn sich eine überwachte Datei ändert, filtert derselbe Wert anhand der Standard-[Matcher-Regeln](#matcher-patterns) gegen den Basisnamen der geänderten Datei, welche Hook-Gruppen ausgeführt werden.
3088 3098
3089Dieses Beispiel normalisiert Zeilenumbrüche in `data.csv` nach jeder Änderung, einschließlich eines `Bash` Befehls oder eines externen Skripts, das die Datei umschreibt:3099Dieses Beispiel normalisiert die Zeilenenden in `data.csv` nach jeder Änderung, auch wenn ein `Bash`-Befehl oder ein externes Skript die Datei neu schreibt:
3090 3100
3091```json theme={null}3101```json theme={null}
3092{3102{
3106}3116}
3107```3117```
3108 3118
3109Der Hook liest den Pfad der geänderten Datei aus dem `file_path` Feld der [JSON-Eingabe](#filechanged-input) von stdin. Seine `grep` Wache testet auf das gleiche, das `perl` entfernt, ein CR am Ende einer Zeile, daher beendet der Lauf nach einer Normalisierung ohne Berührung der Datei. Eine lockerere Wache schleift für immer, weil `perl -i` die Datei umschreibt, auch wenn es nichts ersetzt und Claude Code den Hook nach jedem Umschreiben erneut ausführt. Speichern Sie dieses Skript unter `/path/to/normalize-line-endings.sh` und machen Sie es ausführbar:3119Der Hook liest den absoluten Pfad der geänderten Datei aus dem Feld `file_path` der [JSON-Eingabe](#filechanged-input) auf stdin. Seine `grep`-Prüfung testet auf dasselbe, was `perl` entfernt, nämlich ein CR am Zeilenende, sodass der Durchlauf nach einer Normalisierung beendet wird, ohne die Datei anzurühren. Eine lockerere Prüfung führt zu einer Endlosschleife, weil `perl -i` die Datei auch dann neu schreibt, wenn es nichts ersetzt, und Claude Code den Hook nach jedem Neuschreiben erneut ausführt. Speichern Sie dieses Skript unter `/path/to/normalize-line-endings.sh` und machen Sie es ausführbar:
3110 3120
3111```bash theme={null}3121```bash theme={null}
3112#!/bin/bash3122#!/bin/bash
3116fi3126fi
3117```3127```
3118 3128
3119Um zu bestätigen, dass der Hook funktioniert, bitten Sie Claude, eine CRLF-Zeile mit einem `Bash` Befehl an `data.csv` anzuhängen. Claude Code führt den Hook aus und die Datei endet mit LF-Umbrüchen.3129Um zu bestätigen, dass der Hook funktioniert, bitten Sie Claude, mit einem `Bash`-Befehl eine CRLF-Zeile an `data.csv` anzuhängen. Claude Code führt den Hook aus, und die Datei hat anschließend LF-Zeilenenden.
3120 3130
3121Um Dateien zu überwachen, die Sie nicht im Voraus benennen können, geben Sie [`watchPaths`](#filechanged-output) von einem Hook zurück, um die Überwachungsliste dynamisch zu aktualisieren. Claude Code startet den Watcher nur, wenn etwas eine Datei zum Überwachen benennt, daher seeden Sie die Liste 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 immer noch, welche Hook-Gruppen ausgeführt werden, wenn sich eine überwachte Datei ändert, daher geben Sie der Gruppe, die dynamische Pfade verarbeitet, einen weggelassenen Matcher, der jede überwachte Datei abgleicht und nichts zur Überwachungsliste hinzufügt. Ein `"*"` Matcher gleicht auch jede Datei ab, aber Claude Code registriert ihn in der Überwachungsliste wie jeden anderen Wert, als wörtliche Datei namens `*`.3131Um Dateien zu überwachen, die Sie nicht im Voraus benennen können, geben Sie aus einem Hook [`watchPaths`](#filechanged-output) zurück, um die Überwachungsliste dynamisch zu aktualisieren. Claude Code startet den Watcher nur, wenn etwas eine zu überwachende Datei benennt. Befüllen Sie die Liste daher mit einer FileChanged-Gruppe, deren Matcher mindestens eine Datei benennt, oder mit einem [SessionStart](#sessionstart-decision-control)- oder [CwdChanged](#cwdchanged)-Hook, der `watchPaths` zurückgibt. Der Matcher filtert weiterhin, welche Hook-Gruppen ausgeführt werden, wenn sich eine überwachte Datei ändert. Lassen Sie daher bei der Gruppe, die dynamische Pfade verarbeitet, den Matcher weg; ein weggelassener Matcher matcht jede überwachte Datei und fügt der Überwachungsliste nichts hinzu. Ein `"*"`-Matcher matcht ebenfalls jede Datei, aber Claude Code registriert ihn wie jeden anderen Wert in der Überwachungsliste, als literale Datei namens `*`.
3122 3132
3123FileChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variablen, die in diese Datei geschrieben werden, bleiben für nachfolgende Bash-Befehle bestehen, bis zum nächsten [CwdChanged](#cwdchanged) Ereignis, wenn Claude Code sie löscht.3133FileChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). In diese Datei geschriebene Variablen bleiben für nachfolgende Bash-Befehle bis zum nächsten [CwdChanged](#cwdchanged)-Ereignis erhalten, bei dem Claude Code sie löscht.
3124 3134
3125<h4 id="filechanged-input">3135<h4 id="filechanged-input">
3126 FileChanged-Eingabe3136 FileChanged-Eingabe
3127</h4>3137</h4>
3128 3138
3129Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten FileChanged-Hooks `file_path` und `event`.3139Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten FileChanged-Hooks `file_path` und `event`.
3130 3140
3131| Feld | Beschreibung |3141| Feld | Beschreibung |
3132| :- | :- |3142| :- | :- |
3133| `file_path` | Absoluter Pfad zur Datei, die sich geändert hat |3143| `file_path` | Absoluter Pfad zur geänderten Datei |
3134| `event` | Was passiert ist: `"change"` für eine geänderte Datei, `"add"` für eine erstellte Datei oder `"unlink"` für eine gelöschte Datei |3144| `event` | Was passiert ist: `"change"` für eine geänderte Datei, `"add"` für eine erstellte Datei oder `"unlink"` für eine gelöschte Datei |
3135 3145
3136```json theme={null}3146```json theme={null}
3148 FileChanged-Ausgabe3158 FileChanged-Ausgabe
3149</h4>3159</h4>
3150 3160
3151Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, können FileChanged-Hooks `watchPaths` zurückgeben, um dynamisch zu aktualisieren, welche Dateipfade überwacht werden:3161Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können FileChanged-Hooks `watchPaths` zurückgeben, um dynamisch zu aktualisieren, welche Dateipfade überwacht werden:
3152 3162
3153| Feld | Beschreibung |3163| Feld | Beschreibung |
3154| :- | :- |3164| :- | :- |
3155| `watchPaths` | Array von absoluten Pfaden. Ersetzt die aktuelle dynamische Überwachungsliste. Pfade aus Ihrer `matcher` Konfiguration werden immer überwacht. Verwenden Sie dies, wenn Ihr Hook-Skript basierend auf der geänderten Datei zusätzliche Dateien zum Überwachen entdeckt |3165| `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 |
3156 3166
3157FileChanged-Hooks haben keine Entscheidungskontrolle. Sie können die Datei-Änderung nicht blockieren.3167FileChanged-Hooks haben keine Entscheidungssteuerung. Sie können die Dateiänderung nicht verhindern.
3158 3168
3159Claude Code liest `watchPaths` und `systemMessage` aus ihrer JSON-Ausgabe und verwirft `continue`. In interaktiven Sitzungen zeigt es die `systemMessage` als kurze Terminal-Benachrichtigung. Die Nachricht erreicht nicht den SDK-Nachrichtenstrom.3169Claude 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.
3160 3170
3161<h3 id="worktreecreate">3171<h3 id="worktreecreate">
3162 WorktreeCreate3172 WorktreeCreate
3163</h3>3173</h3>
3164 3174
3165Wird ausgeführt, wenn ein Worktree erstellt wird, ob von `claude --worktree`, von einem [Subagenten mit `isolation: "worktree"`](/docs/de/sub-agents#choose-the-subagent-scope) oder für eine [Hintergrund-Sitzung](/docs/de/agent-view#how-file-edits-are-isolated), die Claude Code in seinem eigenen Worktree isoliert. Standardmäßig erstellt Claude Code die isolierte Arbeitskopie mit `git worktree`. Das Konfigurieren eines WorktreeCreate-Hooks ersetzt dieses Standard-Git-Verhalten und ermöglicht es Ihnen, ein anderes Versionskontroll-System wie SVN, Perforce oder Mercurial zu verwenden.3175Wird ausgeführt, wenn ein Worktree erstellt wird, sei es über `claude --worktree`, durch einen [Subagenten mit `isolation: "worktree"`](/docs/de/sub-agents#choose-the-subagent-scope) oder für eine [Hintergrundsitzung](/docs/de/agent-view#how-file-edits-are-isolated), die Claude Code in einem eigenen Worktree isoliert. Standardmäßig erstellt Claude Code die isolierte Arbeitskopie mit `git worktree`. Das Konfigurieren eines WorktreeCreate-Hooks ersetzt dieses standardmäßige Git-Verhalten, sodass Sie ein anderes Versionskontrollsystem wie SVN, Perforce oder Mercurial verwenden können.
3166 3176
3167Da der Hook das Standard-Verhalten 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.3177Da 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.
3168 3178
3169Der Hook muss den Pfad zum erstellten Worktree-Verzeichnis zurückgeben. Claude Code verwendet diesen Pfad als Arbeitsverzeichnis für die isolierte Sitzung. Siehe [WorktreeCreate-Ausgabe](#worktreecreate-output) für wie jeder Hook-Typ den Pfad zurückgibt.3179Der Hook muss den Pfad zum erstellten Worktree-Verzeichnis zurückgeben. Claude Code verwendet diesen Pfad als Arbeitsverzeichnis für die isolierte Sitzung. Siehe [WorktreeCreate-Ausgabe](#worktreecreate-output) dazu, wie jeder Hook-Typ den Pfad zurückgibt.
3170 3180
3171Claude Code handelt auf den Erfolg des Hooks und den zurückgegebenen Pfad und verwirft `systemMessage` und `continue`.3181Claude Code berücksichtigt den Erfolg des Hooks und den zurückgegebenen Pfad und verwirft `systemMessage` und `continue`.
3172 3182
3173Dieses Beispiel erstellt eine SVN-Arbeitskopie und druckt den Pfad für Claude Code zur Verwendung. Ersetzen Sie die Repository-URL durch Ihre eigene:3183Dieses Beispiel erstellt eine SVN-Arbeitskopie und gibt den Pfad aus, den Claude Code verwenden soll. Ersetzen Sie die Repository-URL durch Ihre eigene:
3174 3184
3175```json theme={null}3185```json theme={null}
3176{3186{
3189}3199}
3190```3200```
3191 3201
3192Der Hook liest den Worktree-`name` aus der JSON-Eingabe von stdin, checkt eine frische Kopie in ein neues Verzeichnis aus und druckt den Verzeichnis-Pfad. Das `echo` auf der letzten Zeile ist das, was Claude Code als Worktree-Pfad liest. Leiten Sie jede andere Ausgabe zu stderr um, damit sie nicht mit dem Pfad interferiert.3202Der 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.
3193 3203
3194<h4 id="worktreecreate-input">3204<h4 id="worktreecreate-input">
3195 WorktreeCreate-Eingabe3205 WorktreeCreate-Eingabe
3196</h4>3206</h4>
3197 3207
3198Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten WorktreeCreate-Hooks das `name` Feld. Dies ist ein Slug-Bezeichner für den neuen Worktree, entweder vom Benutzer angegeben oder automatisch generiert, z. B. `bold-oak-a3f2`.3208Zusä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`.
3199 3209
3200```json theme={null}3210```json theme={null}
3201{3211{
3211 WorktreeCreate-Ausgabe3221 WorktreeCreate-Ausgabe
3212</h4>3222</h4>
3213 3223
3214WorktreeCreate-Hooks verwenden nicht das Standard-Zulassen/Blockieren-Entscheidungsmodell. Stattdessen bestimmt der Erfolg oder Fehler des Hooks das Ergebnis. Der Hook muss den Pfad zum erstellten Worktree-Verzeichnis zurückgeben:3224WorktreeCreate-Hooks verwenden nicht das übliche Entscheidungsmodell aus Zulassen und Blockieren. Stattdessen bestimmt der Erfolg oder Misserfolg des Hooks das Ergebnis. Der Hook muss den Pfad zum erstellten Worktree-Verzeichnis zurückgeben:
3215 3225
3216* **Command-Hooks** (`type: "command"`): Drucken Sie den Pfad als letzte nicht-leere Zeile von stdout. Claude Code entfernt ANSI-Escape-Codes, bevor diese Zeile gelesen wird, daher werden Shell-Start-Banner, die vor Ihrem `echo` gedruckt werden, ignoriert. Leiten Sie jede andere Hook-Ausgabe zu stderr um.3226* **Befehls-Hooks** (`type: "command"`): Geben Sie den Pfad als letzte nicht leere Zeile auf stdout aus. Claude Code entfernt ANSI-Escape-Codes, bevor es diese Zeile liest, sodass Shell-Startbanner, die vor Ihrem `echo` ausgegeben werden, ignoriert werden. Leiten Sie jede andere Ausgabe des Hooks nach stderr um.
3217* **HTTP-Hooks** (`type: "http"`): Geben Sie `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` im Antwort-Body zurück.3227* **HTTP-Hooks** (`type: "http"`): Geben Sie `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` im Response-Body zurück.
3218 3228
3219Wenn der Hook fehlschlägt oder keinen Pfad erzeugt, schlägt die Worktree-Erstellung mit einem Fehler fehl.3229Wenn der Hook fehlschlägt oder keinen Pfad liefert, schlägt die Erstellung des Worktrees mit einem Fehler fehl.
3220 3230
3221Claude Code löst einen relativen Pfad gegen das Verzeichnis auf, in dem der Hook ausgeführt wurde, und bricht alle `.` oder `..` Segmente darin zusammen. Wenn der resultierende Pfad kein Verzeichnis ist, das Claude Code betreten kann, druckt die Sitzung einen Fehler, der den Pfad benennt und beendet sich mit Code 1.3231Claude Code löst einen relativen Pfad relativ zu dem Verzeichnis auf, in dem der Hook ausgeführt wurde, und löst dabei alle `.`- oder `..`-Segmente auf. Wenn der resultierende Pfad kein Verzeichnis ist, das Claude Code betreten kann, gibt die Sitzung einen Fehler mit dem Pfad aus und wird mit Exit-Code 1 beendet.
3222 3232
3223Claude Code lehnt einen absoluten Pfad ab, der `.` oder `..` Segmente enthält, und jeden Pfad, der unter der Repository-Root durch einen Symlink geht, da ein Symlink, der im Repository committed ist, den Worktree außerhalb davon umleiten könnte. Der Fehler benennt die abgelehnte Komponente. Geben Sie einen normalisierten Pfad zurück, der nicht durch einen Symlink im Repository geht. Vor v2.1.216 folgte die Worktree-Erstellung dem Pfad des Hooks ohne diese Überprüfung.3233Claude Code lehnt einen absoluten Pfad ab, der `.`- oder `..`-Segmente enthält, sowie jeden Pfad, der unterhalb des Repository-Stammverzeichnisses durch einen Symlink führt, da ein im Repository committeter Symlink den Worktree aus dem Repository heraus umleiten könnte. Die Fehlermeldung nennt die abgelehnte Komponente. Geben Sie einen normalisierten Pfad zurück, der nicht durch einen Symlink innerhalb des Repositorys führt. Vor v2.1.216 folgte die Worktree-Erstellung dem Pfad des Hooks ohne diese Prüfung.
3224 3234
3225<h3 id="worktreeremove">3235<h3 id="worktreeremove">
3226 WorktreeRemove3236 WorktreeRemove
3227</h3>3237</h3>
3228 3238
3229Wird ausgeführt, wenn ein Worktree entfernt wird. Dies ist das Cleanup-Gegenstück zu [WorktreeCreate](#worktreecreate). Das Ereignis wird ausgelöst, wenn:3239Wird ausgeführt, wenn ein Worktree entfernt wird. Dies ist das Gegenstück zu [WorktreeCreate](#worktreecreate) für die Bereinigung. Das Ereignis wird ausgelöst, wenn:
3230 3240
3231* Sie eine `--worktree` Sitzung beenden und wählen, sie zu entfernen3241* Sie eine `--worktree`-Sitzung beenden und sich für das Entfernen entscheiden
3232* Ein Subagent mit `isolation: "worktree"` beendet3242* ein Subagent mit `isolation: "worktree"` fertig ist
3233* Sie eine [Hintergrund-Sitzung](/docs/de/agent-view#what-deleting-a-session-removes) löschen, deren Worktree der Hook erstellt hat3243* Sie eine [Hintergrundsitzung](/docs/de/agent-view#what-deleting-a-session-removes) löschen, deren Worktree der Hook erstellt hat
3234 3244
3235Für Git-basierte Worktrees verarbeitet Claude Code Cleanup automatisch mit `git worktree remove`. Wenn Sie einen WorktreeCreate-Hook konfiguriert haben, paaren Sie ihn mit einem WorktreeRemove-Hook, um Cleanup der Worktrees zu steuern, die er erstellt:3245Bei Git-basierten Worktrees übernimmt Claude Code die Bereinigung automatisch mit `git worktree remove`. Wenn Sie einen WorktreeCreate-Hook konfiguriert haben, kombinieren Sie ihn mit einem WorktreeRemove-Hook, um die Bereinigung der von ihm erstellten Worktrees zu steuern:
3236 3246
3237* **Kein WorktreeRemove-Hook**: Wenn Sie eine `--worktree` Sitzung beenden und Entfernung wählen, fällt Claude Code auf `git worktree remove --force` auf dem Pfad zurück, den Ihr WorktreeCreate-Hook zurückgegeben hat, daher wird ein Worktree, das Git erkennt, entfernt. Ein Worktree, das Git nicht erkennt, z. B. einer, den Ihr Hook mit einem nicht-Git-Versionskontroll-System erstellt hat, bleibt auf der Festplatte. Für was das Löschen einer [Hintergrund-Sitzung](/docs/de/agent-view#what-deleting-a-session-removes) mit einem Hook-erstellten Worktree tut, siehe die Lösch-Regeln der Agent-Ansicht.3247* **Kein WorktreeRemove-Hook**: Wenn Sie eine `--worktree`-Sitzung beenden und das Entfernen wählen, greift Claude Code ersatzweise auf `git worktree remove --force` für den Pfad zurück, den Ihr WorktreeCreate-Hook zurückgegeben hat, sodass ein Worktree, den Git erkennt, entfernt wird. Ein Worktree, den Git nicht erkennt, etwa einer, den Ihr Hook mit einem anderen Versionskontrollsystem als Git erstellt hat, bleibt auf der Festplatte. Was beim Löschen einer [Hintergrundsitzung](/docs/de/agent-view#what-deleting-a-session-removes) mit einem vom Hook erstellten Worktree geschieht, erfahren Sie in den Löschregeln der Agentenansicht.
3238* **Hook beendet 0**: Der Worktree wird als entfernt gezählt. Claude Code liest nichts anderes vom Hook, daher stellen Sie sicher, dass Ihr Hook das Verzeichnis gelöscht hat.3248* **Hook endet mit 0**: Der Worktree gilt als entfernt. Claude Code liest nichts weiter vom Hook, stellen Sie also sicher, dass Ihr Hook das Verzeichnis gelöscht hat.
3239* **Hook beendet nicht-Null**: Die Entfernung schlägt fehl, wenn das Verzeichnis bei `worktree_path` immer noch danach existiert, und der Worktree bleibt auf der Festplatte mit keinem Git-Fallback. Ein Hook, der das Verzeichnis vor dem Beenden nicht-Null gelöscht hat, wird als entfernt gezählt. Für wie der Fehler gemeldet wird, siehe [WorktreeRemove-Eingabe](#worktreeremove-input).3249* **Hook endet mit einem Wert ungleich 0**: Das Entfernen schlägt fehl, wenn das Verzeichnis unter `worktree_path` danach noch existiert, und der Worktree bleibt ohne Git-Fallback auf der Festplatte. Ein Hook, der das Verzeichnis gelöscht hat, bevor er mit einem Wert ungleich 0 endet, gilt als entfernt. Wie der Fehler gemeldet wird, erfahren Sie unter [WorktreeRemove-Eingabe](#worktreeremove-input).
3240 3250
3241Claude Code löscht niemals einen Branch, der zu einem 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.3251Claude 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.
3242 3252
3243Claude Code verwirft die [JSON-Ausgabefelder](#json-output) eines WorktreeRemove-Hooks, wie `systemMessage` und `continue`.3253Claude Code verwirft die [JSON-Ausgabefelder](#json-output) eines WorktreeRemove-Hooks, etwa `systemMessage` und `continue`.
3244 3254
3245Für ein Hintergrund-Sitzungs-Löschen überprüft Claude Code den gespeicherten Worktree-Pfad, bevor der Hook ausgeführt wird und lehnt einen Pfad ab, der ein Symlink ist oder unter der Repository-Root durch einen geht. Der Hook wird für einen Worktree, der immer 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) die Sitzung und den Worktree statt. Vor v2.1.216 wurde der Hook auf dem gespeicherten Pfad ohne diese Überprüfungen ausgeführt.3255Beim Löschen einer Hintergrundsitzung überprüft Claude Code den gespeicherten Worktree-Pfad, bevor der Hook ausgeführt wird, und lehnt einen Pfad ab, der ein Symlink ist oder unterhalb des Repository-Stammverzeichnisses durch einen Symlink führt. Für einen Worktree, der noch Dateien enthält, wird der Hook nur ausgeführt, wenn Sie das Löschen in der [Agentenansicht](/docs/de/agent-view#what-deleting-a-session-removes) bestätigen; für einen solchen Worktree behält [`claude rm`](/docs/de/agent-view#manage-sessions-from-the-shell) stattdessen die Sitzung und den Worktree bei. Vor v2.1.216 wurde der Hook ohne diese Prüfungen für den gespeicherten Pfad ausgeführt.
3246 3256
3247Claude Code übergibt den von WorktreeCreate zurückgegebenen Pfad als `worktree_path` in der Hook-Eingabe. Dieses Beispiel liest diesen Pfad und entfernt das Verzeichnis:3257Claude Code übergibt den von WorktreeCreate zurückgegebenen Pfad als `worktree_path` in der Hook-Eingabe. Dieses Beispiel liest diesen Pfad und entfernt das Verzeichnis:
3248 3258
3267 WorktreeRemove-Eingabe3277 WorktreeRemove-Eingabe
3268</h4>3278</h4>
3269 3279
3270Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten WorktreeRemove-Hooks das `worktree_path` Feld, das der absolute Pfad zum Worktree ist, der entfernt wird.3280Zusä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.
3271 3281
3272```json theme={null}3282```json theme={null}
3273{3283{
3279}3289}
3280```3290```
3281 3291
3282Der Exit-Code eines WorktreeRemove-Hooks entscheidet das Ergebnis. Wenn ein Hook nicht-Null beendet und das Verzeichnis bei `worktree_path` danach immer noch existiert, schlägt die Entfernung fehl:3292Der Exit-Code eines WorktreeRemove-Hooks bestimmt das Ergebnis. Wenn ein Hook mit einem Wert ungleich 0 endet und das Verzeichnis unter `worktree_path` danach noch existiert, schlägt das Entfernen fehl:
3283 3293
3284* Der Worktree bleibt auf der Festplatte und der Hook-Befehl und stderr gehen ins [Debug-Protokoll](#debug-hooks).3294* Der Worktree bleibt auf der Festplatte, und der Befehl sowie stderr des Hooks werden in das [Debug-Log](#debug-hooks) geschrieben.
3285* Wenn Sie eine Hintergrund-Sitzung löschen, bleibt die Sitzung auch. Die Verweigerungs-Nachricht in der [Agent-Ansicht](/docs/de/agent-view#what-deleting-a-session-removes) meldet, wie der Hook endete, wie `exited 1`, zitiert den Anfang seines stderr und sagt, ob das Löschen der Sitzung erneut das Verzeichnis entfernt.3295* Wenn Sie eine Hintergrundsitzung gelöscht haben, bleibt auch die Sitzung bestehen. Die Ablehnungsmeldung in der [Agentenansicht](/docs/de/agent-view#what-deleting-a-session-removes) gibt an, wie der Hook beendet wurde, etwa `exited 1`, zitiert den Anfang seiner stderr-Ausgabe und gibt an, ob ein erneutes Löschen der Sitzung das Verzeichnis trotzdem entfernt.
3286 3296
3287<h3 id="precompact">3297<h3 id="precompact">
3288 PreCompact3298 PreCompact
3289</h3>3299</h3>
3290 3300
3291Wird ausgeführt, bevor Claude Code eine Komprimierungs-Operation ausführen möchte.3301Wird ausgeführt, bevor Claude Code einen Komprimierungsvorgang startet.
3292 3302
3293Der Matcher-Wert gibt an, ob die Komprimierung manuell oder automatisch ausgelöst wurde:3303Der Matcher-Wert gibt an, ob die Komprimierung manuell oder automatisch ausgelöst wurde:
3294 3304
3295| Matcher | Wann wird es ausgelöst |3305| Matcher | Wann er ausgelöst wird |
3296| :- | :- |3306| :- | :- |
3297| `manual` | `/compact` |3307| `manual` | `/compact` |
3298| `auto` | Auto-Komprimierung, wenn die Konversation das [Auto-Komprimierungs-Fenster](/docs/de/model-config#set-the-auto-compact-window) erreicht |3308| `auto` | Automatische Komprimierung, wenn die Konversation das [Fenster für die automatische Komprimierung](/docs/de/model-config#set-the-auto-compact-window) erreicht |
3299 3309
3300Beenden Sie mit Code 2, um die Komprimierung zu blockieren. Für ein manuelles `/compact` wird die stderr-Nachricht dem Benutzer angezeigt. Sie können auch blockieren, indem Sie JSON mit `"decision": "block"` zurückgeben.3310Beenden Sie mit Exit-Code 2, um die Komprimierung zu blockieren. Bei einem manuellen `/compact` wird die stderr-Meldung dem Benutzer angezeigt. Sie können auch blockieren, indem Sie JSON mit `"decision": "block"` zurückgeben.
3301 3311
3302Das Blockieren der automatischen Komprimierung hat unterschiedliche Auswirkungen, je nachdem, wann es ausgelöst wird. Wenn die Komprimierung proaktiv ausgelöst wurde, bevor das Kontext-Limit erreicht wurde, überspringt Claude Code sie und die Konversation wird unkomprimiert fortgesetzt. Wenn die Komprimierung ausgelöst wurde, um sich von einem Kontext-Limit-Fehler zu erholen, der bereits von der API zurückgegeben wurde, zeigt sich der zugrunde liegende Fehler und die aktuelle Anfrage schlägt fehl.3312Das Blockieren der automatischen Komprimierung hat je nach Zeitpunkt unterschiedliche Auswirkungen. Wurde die Komprimierung vorsorglich vor dem Kontextlimit ausgelöst, überspringt Claude Code sie, und die Konversation wird unkomprimiert fortgesetzt. Wurde die Komprimierung ausgelöst, um sich von einem bereits von der API zurückgegebenen Kontextlimit-Fehler zu erholen, tritt der zugrunde liegende Fehler zutage, und die aktuelle Anfrage schlägt fehl.
3303 3313
3304Claude Code verwirft die `systemMessage` und `continue` Felder eines PreCompact-Hooks.3314Claude Code verwirft die Felder `systemMessage` und `continue` eines PreCompact-Hooks.
3305 3315
3306<h4 id="precompact-input">3316<h4 id="precompact-input">
3307 PreCompact-Eingabe3317 PreCompact-Eingabe
3308</h4>3318</h4>
3309 3319
3310Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten PreCompact-Hooks `trigger` und `custom_instructions`. Für `manual` enthält `custom_instructions` das, was der Benutzer in `/compact` übergibt und ist `null`, wenn sie nichts übergeben. Für `auto` ist `custom_instructions` `null`.3320Zusä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`.
3311 3321
3312```json theme={null}3322```json theme={null}
3313{3323{
3324 PostCompact3334 PostCompact
3325</h3>3335</h3>
3326 3336
3327Wird ausgeführt, nachdem Claude Code eine Komprimierungs-Operation abgeschlossen hat. Verwenden Sie dieses Ereignis, um auf den neuen komprimierten Zustand zu reagieren, z. B. um die generierte Zusammenfassung zu protokollieren oder externen Zustand zu aktualisieren. Claude Code verwirft die `systemMessage` und `continue` Felder eines PostCompact-Hooks.3337Wird ausgeführt, nachdem Claude Code einen Komprimierungsvorgang abgeschlossen hat. Verwenden Sie dieses Ereignis, um auf den neuen komprimierten Zustand zu reagieren, etwa um die generierte Zusammenfassung zu protokollieren oder externen Zustand zu aktualisieren. Claude Code verwirft die Felder `systemMessage` und `continue` eines PostCompact-Hooks.
3328 3338
3329Die gleichen Matcher-Werte gelten wie für `PreCompact`:3339Es gelten dieselben Matcher-Werte wie für `PreCompact`:
3330 3340
3331| Matcher | Wann wird es ausgelöst |3341| Matcher | Wann er ausgelöst wird |
3332| :- | :- |3342| :- | :- |
3333| `manual` | Nach `/compact` |3343| `manual` | Nach `/compact` |
3334| `auto` | Nach Auto-Komprimierung, wenn die Konversation das [Auto-Komprimierungs-Fenster](/docs/de/model-config#set-the-auto-compact-window) erreicht |3344| `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 |
3335 3345
3336<h4 id="postcompact-input">3346<h4 id="postcompact-input">
3337 PostCompact-Eingabe3347 PostCompact-Eingabe
3338</h4>3348</h4>
3339 3349
3340Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten PostCompact-Hooks `trigger` und `compact_summary`. Das `compact_summary` Feld enthält die Konversations-Zusammenfassung, die von der Komprimierungs-Operation generiert wurde.3350Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PostCompact-Hooks `trigger` und `compact_summary`. Das Feld `compact_summary` enthält die vom Komprimierungsvorgang generierte Zusammenfassung der Konversation.
3341 3351
3342```json theme={null}3352```json theme={null}
3343{3353{
3350}3360}
3351```3361```
3352 3362
3353PostCompact-Hooks haben keine Entscheidungskontrolle. Sie können das Komprimierungs-Ergebnis nicht beeinflussen, können aber Folge-Aufgaben ausführen.3363PostCompact-Hooks haben keine Entscheidungssteuerung. Sie können das Ergebnis der Komprimierung nicht beeinflussen, aber Folgeaufgaben ausführen.
3354 3364
3355<h3 id="premodelswitch">3365<h3 id="premodelswitch">
3356 PreModelSwitch3366 PreModelSwitch
3357</h3>3367</h3>
3358 3368
3359Wird ausgeführt, bevor Claude Code einen Modell-Wechsel anwendet, den Sie oder ein Client angefordert haben. Verwenden Sie ihn, um einen Wechsel zu blockieren, eine Bestätigung zu erfordern oder zu zeigen, was der Wechsel kostet, bevor er passiert.3369Wird ausgeführt, bevor Claude Code einen Modellwechsel anwendet, den Sie oder ein Client angefordert haben. Verwenden Sie es, um einen Wechsel zu blockieren, eine Bestätigung zu verlangen oder anzuzeigen, was der Wechsel kosten wird, bevor er erfolgt.
3360 3370
3361PreModelSwitch erfordert Claude Code v2.1.251 oder später. Claude Code führt ihn für diese Anfragen aus:3371PreModelSwitch erfordert Claude Code v2.1.251 oder höher. Claude Code führt es für diese Anfragen aus:
3362 3372
3363* `/model <name>` und der `/model` Picker3373* `/model <name>` und die `/model`-Auswahl
3364* Der `Option+P` oder `Alt+P` Modell-Picker3374* Die Modellauswahl über `Option+P` oder `Alt+P`
3365* Die Model-Einstellung in `/config`3375* Die Einstellung „Model“ in `/config`
3366* Das Aktivieren des [Fast-Modus](/docs/de/fast-mode), wenn das das Modell der Sitzung ändert3376* Das Einschalten des [Fast-Modus](/docs/de/fast-mode), wenn dadurch das Modell der Sitzung geändert wird
3367* 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 [Remote Control](/docs/de/remote-control)3377* Eine `set_model`-Anfrage oder eine Modelländerung in einer `apply_flag_settings`-Anfrage von einem [Agent SDK](/docs/de/agent-sdk/typescript#query-object)-Host oder über [Remote Control](/docs/de/remote-control)
3368 3378
3369Claude Code führt PreModelSwitch-Hooks nicht für Wechsel aus, die es selbst macht, wie ein [automatisches Modell-Fallback](/docs/de/model-config#automatic-model-fallback) oder das Wiederherstellen des Modells, wenn Sie eine Sitzung fortsetzen. Diese Änderungen erreichen [PostModelSwitch](#postmodelswitch) nur.3379Claude Code führt PreModelSwitch-Hooks nicht für Wechsel aus, die es selbst vornimmt, etwa einen [automatischen Modell-Fallback](/docs/de/model-config#automatic-model-fallback) oder das Wiederherstellen des Modells beim Fortsetzen einer Sitzung. Diese Änderungen erreichen nur [PostModelSwitch](#postmodelswitch).
3370 3380
3371Claude Code vergleicht den Matcher gegen den kanonischen Namen des Modells, zu dem die Sitzung wechselt, ignoriert jeden `[1m]` Suffix. Ein Alias wie `opus`, eine datierte Modell-ID und eine Provider-spezifische ID wie eine Amazon Bedrock Modell-ID gleichen alle den einen kanonischen Namen ab, den sie auflösen, daher deckt `claude-opus-5` jede Schreibweise von Opus 5 ab.3381Claude Code vergleicht den Matcher mit dem kanonischen Namen des Modells, zu dem die Sitzung wechselt, und ignoriert dabei ein etwaiges `[1m]`-Suffix. Ein Alias wie `opus`, eine datierte Modell-ID und eine anbieterspezifische ID wie eine Amazon-Bedrock-Modell-ID stimmen alle mit dem einen kanonischen Namen überein, in den sie aufgelöst werden, sodass `claude-opus-5` jede Schreibweise von Opus 5 abdeckt.
3372 3382
3373Wenn Claude Code einen kanonischen Namen für das Ziel nicht bestimmen kann, z. B. eine benutzerdefinierte Modell-ID, die nur Ihr [LLM-Gateway](/docs/de/llm-gateway) kennt, führt es jeden PreModelSwitch-Hook unabhängig vom Matcher aus. Ein Hook, der blockiert, sollte daher `to_model` aus seiner Eingabe überprüfen, anstatt sich nur auf den Matcher zu verlassen.3383Wenn 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.
3374 3384
3375Schreiben Sie den Matcher als genauen Namen, eine `|`-getrennte Liste wie `claude-opus-4-6|claude-opus-5` oder einen regulären Ausdruck wie `.*opus.*`. Dieses Beispiel verwendet einen genauen Namen-Matcher und überprüft auch `to_model` aus der Hook-Eingabe, daher lehnt es einen Wechsel zu Opus 4.6 ab, indem es mit Code 2 beendet und lässt jedes andere Ziel durch:3385Schreiben Sie den Matcher als exakten Namen, als durch `|` getrennte Liste wie `claude-opus-4-6|claude-opus-5` oder als regulären Ausdruck wie `.*opus.*`. Dieses Beispiel verwendet einen Matcher mit exaktem Namen und prüft zusätzlich `to_model` aus der Hook-Eingabe, sodass es einen Wechsel zu Opus 4.6 durch Beenden mit Exit-Code 2 ablehnt und jedes andere Ziel durchlässt:
3376 3386
3377<Tabs>3387<Tabs>
3378 <Tab title="macOS/Linux">3388 <Tab title="macOS/Linux">
3379 Der Befehl überprüft `to_model` mit `jq`:3389 Der Befehl prüft `to_model` mit `jq`:
3380 3390
3381 ```json theme={null}3391 ```json theme={null}
3382 {3392 {
3398 </Tab>3408 </Tab>
3399 3409
3400 <Tab title="Windows (PowerShell)">3410 <Tab title="Windows (PowerShell)">
3401 Registrieren Sie einen Command-Hook, der ein Skript durch PowerShell ausführt:3411 Registrieren Sie einen Befehls-Hook, der ein Skript über PowerShell ausführt:
3402 3412
3403 ```json theme={null}3413 ```json theme={null}
3404 {3414 {
3425 }3435 }
3426 ```3436 ```
3427 3437
3428 Speichern Sie dieses Skript unter `.claude/hooks/block-opus-46.ps1` in Ihrem Projekt:3438 Speichern Sie dieses Skript in Ihrem Projekt unter `.claude/hooks/block-opus-46.ps1`:
3429 3439
3430 ```powershell theme={null}3440 ```powershell theme={null}
3431 $hookInput = [Console]::In.ReadToEnd() | ConvertFrom-Json3441 $hookInput = [Console]::In.ReadToEnd() | ConvertFrom-Json
3438 </Tab>3448 </Tab>
3439</Tabs>3449</Tabs>
3440 3450
3441Um zu bestätigen, dass der Hook funktioniert, führen Sie `/model claude-opus-4-6` aus einer Sitzung aus, die ein anderes Modell ausführt. Claude Code behält das aktuelle Modell und meldet, dass ein PreModelSwitch-Hook den Wechsel blockiert hat, mit Ihrer Nachricht als Grund.3451Um zu prüfen, ob der Hook funktioniert, führen Sie `/model claude-opus-4-6` in einer Sitzung aus, die ein anderes Modell verwendet. Claude Code behält das aktuelle Modell bei und meldet, dass ein PreModelSwitch-Hook den Wechsel blockiert hat, mit Ihrer Meldung als Grund.
3442 3452
3443<h4 id="premodelswitch-input">3453<h4 id="premodelswitch-input">
3444 PreModelSwitch-Eingabe3454 PreModelSwitch-Eingabe
3445</h4>3455</h4>
3446 3456
3447Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten PreModelSwitch-Hooks die Felder in dieser Tabelle. Die letzten fünf beschreiben, was das Erneut-Senden der Konversation zum neuen Modell kostet, daher kann ein Hook diese Zahl zeigen, bevor der Wechsel passiert.3457Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreModelSwitch-Hooks die Felder in dieser Tabelle. Die letzten fünf beschreiben, was das erneute Senden der Konversation an das neue Modell kostet, sodass ein Hook diesen Wert vor dem Wechsel anzeigen kann.
3448 3458
3449| Feld | Typ | Beschreibung |3459| Feld | Typ | Beschreibung |
3450| :- | :- | :- |3460| :- | :- | :- |
3451| `from_model` | string | Modell-ID, von der der Wechsel ändert |3461| `from_model` | string | Modell-ID, von der gewechselt wird |
3452| `to_model` | string | Modell-ID, zu der der Wechsel ändert. Der Matcher vergleicht gegen den kanonischen Namen dieses Modells |3462| `to_model` | string | Modell-ID, zu der gewechselt wird. Der Matcher wird mit dem kanonischen Namen dieses Modells verglichen |
3453| `requested_model` | string oder `null` | Das Modell, das die Anfrage benannt hat: ein Alias wie `opus`, eine vollständige Modell-ID oder `null`, wenn die Anfrage für das Standard-Modell war |3463| `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 |
3454| `source` | string | Woher die Anfrage kam: `"command"` für `/model <name>`, die Model-Einstellung in `/config` oder das Aktivieren des Fast-Modus; `"picker"` für einen Modell-Picker; `"sdk"` für eine `set_model` Anfrage oder eine Modell-Änderung in einer `apply_flag_settings` Anfrage von einem Agent SDK Host oder Remote Control |3464| `source` | string | Woher die Anfrage kam: `"command"` für `/model <name>`, die Einstellung „Model“ in `/config` oder das Einschalten des Fast-Modus; `"picker"` für eine Modellauswahl; `"sdk"` für eine `set_model`-Anfrage oder eine Modelländerung in einer `apply_flag_settings`-Anfrage von einem Agent-SDK-Host oder über Remote Control |
3455| `context_tokens` | number | Token, die die nächste Anfrage erneut sendet als ihre Eingabeaufforderung: die Eingabe-, Cache-Lese-, Cache-Erstellungs- und Ausgabe-Token der letzten Antwort in der Hauptkonversation, kombiniert. `0` vor der ersten Antwort |3465| `context_tokens` | number | Token, die die nächste Anfrage erneut als Prompt sendet: die Eingabe-, Cache-Lese-, Cache-Erstellungs- und Ausgabe-Token der letzten Antwort in der Hauptkonversation zusammengenommen. `0` vor der ersten Antwort |
3456| `prompt_cache_warm` | boolean | Ob der Prompt-Cache des aktuellen Modells wahrscheinlich noch warm ist, was bedeutet, dass der Wechsel ihn aufgibt |3466| `prompt_cache_warm` | boolean | Ob der Prompt-Cache des aktuellen Modells wahrscheinlich noch warm ist, was bedeutet, dass er durch den Wechsel verloren geht |
3457| `cache_ttl` | string | [Prompt-Cache-Lebensdauer](/docs/de/prompt-caching#cache-lifetime), die Claude Code für diese Sitzung anfordert: `"5m"` oder `"1h"` |3467| `cache_ttl` | string | [Lebensdauer des Prompt-Caches](/docs/de/prompt-caching#cache-lifetime), die Claude Code für diese Sitzung anfordert: `"5m"` oder `"1h"` |
3458| `estimated_cache_write_usd` | number | Geschätzte Kosten in US-Dollar für das Schreiben von `context_tokens` in den Prompt-Cache auf `to_model` bei der `cache_ttl` Rate, ohne die nächste Antwort. Der Server muss möglicherweise nicht den ganzen Kontext erneut zwischenspeichern, daher behandeln Sie es als Schätzung |3468| `estimated_cache_write_usd` | number | Geschätzte Kosten in US-Dollar für das Schreiben von `context_tokens` in den Prompt-Cache auf `to_model` zum `cache_ttl`-Tarif, ohne die nächste Antwort. Der Server muss möglicherweise nicht den gesamten Kontext erneut zwischenspeichern, betrachten Sie den Wert daher als Schätzung |
3459| `pricing` | string | Wie Claude Code `estimated_cache_write_usd` bepreist: `"configured"` bei den eigenen Sätzen Ihrer Organisation, wenn sie sie konfiguriert hat, `"catalog"` bei Listenpreis oder `"default"`, wenn `to_model` keinen bekannten Preis hat und Claude Code einen Standard-Satz annahm |3469| `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 |
3460 3470
3461Dieses Beispiel zeigt die Eingabe für `/model opus` in einer Sitzung, die Sonnet 5 ausführt:3471Dieses Beispiel zeigt die Eingabe für `/model opus` in einer Sitzung, die Sonnet 5 verwendet:
3462 3472
3463```json theme={null}3473```json theme={null}
3464{3474{
3479```3489```
3480 3490
3481<h4 id="premodelswitch-decision-control">3491<h4 id="premodelswitch-decision-control">
3482 PreModelSwitch-Entscheidungskontrolle3492 PreModelSwitch-Entscheidungssteuerung
3483</h4>3493</h4>
3484 3494
3485`PreModelSwitch` Hooks können den Wechsel abbrechen, den Benutzer zur Bestätigung auffordern oder ihn fortgesetzt lassen. Exit-Code 2 oder ein Top-Level-`decision: "block"` bricht den Wechsel ab.3495`PreModelSwitch`-Hooks können den Wechsel abbrechen, den Benutzer um Bestätigung bitten oder ihn fortfahren lassen. Exit-Code 2 oder ein `decision: "block"` auf oberster Ebene bricht den Wechsel ab.
3486 3496
3487Für feinere Kontrolle geben Sie `permissionDecision` und `permissionDecisionReason` in einem `hookSpecificOutput` Objekt zurück, wie auf [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` akzeptiert `"allow"`, `"deny"` und `"ask"`. Es akzeptiert nicht `"defer"`, `updatedInput` oder `additionalContext`. Die Tabelle unten beschreibt beide Felder:3497Fü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:
3488 3498
3489| Feld | Beschreibung |3499| Feld | Beschreibung |
3490| :- | :- |3500| :- | :- |
3491| `permissionDecision` | `"allow"` geht weiter und überspringt die [Bestätigung, die Claude Code zeigt, während der Prompt-Cache warm ist](/docs/de/prompt-caching#switching-models). `"deny"` bricht den Wechsel ab. `"ask"` fordert den Benutzer zur Bestätigung auf |3501| `permissionDecision` | `"allow"` fährt fort und überspringt die [Bestätigung, die Claude Code anzeigt, solange der Prompt-Cache warm ist](/docs/de/prompt-caching#switching-models). `"deny"` bricht den Wechsel ab. `"ask"` bittet den Benutzer um Bestätigung |
3492| `permissionDecisionReason` | Für `"deny"`, dem Benutzer als Grund angezeigt, warum der Wechsel blockiert wurde, oder als Fehler für eine `set_model` Anfrage zurückgegeben. Für `"ask"`, in der Bestätigungs-Aufforderung angezeigt. Ignoriert für `"allow"` |3502| `permissionDecisionReason` | Bei `"deny"` wird der Wert dem Benutzer als Grund für das Blockieren des Wechsels angezeigt oder bei einer `set_model`-Anfrage als Fehler zurückgegeben. Bei `"ask"` wird er in der Bestätigungsabfrage angezeigt. Bei `"allow"` wird er ignoriert |
3493 3503
3494Nur `/model` in einer interaktiven Sitzung kann die `"ask"` Aufforderung anzeigen. Auf jeder anderen Oberfläche, einschließlich nicht-interaktivem Modus mit dem `-p` Flag, `/config` und `set_model` Anfragen, behandelt Claude Code `"ask"` als Verweigerung.3504Nur `/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.
3495 3505
3496Dieses Beispiel fordert den Benutzer zur Bestätigung auf und zitiert die Token-Anzahl aus `context_tokens`:3506Dieses Beispiel bittet den Benutzer um Bestätigung und nennt die Token-Anzahl aus `context_tokens`:
3497 3507
3498```json theme={null}3508```json theme={null}
3499{3509{
3505}3515}
3506```3516```
3507 3517
3508Wenn mehrere PreModelSwitch-Hooks unterschiedliche Entscheidungen zurückgeben, ist die Priorität `deny` > `ask` > `allow`.3518Wenn mehrere PreModelSwitch-Hooks unterschiedliche Entscheidungen zurückgeben, gilt die Rangfolge `deny` > `ask` > `allow`.
3509 3519
3510Claude Code zeigt dem Benutzer jede `systemMessage`, die Ihr Hook zurückgibt, unabhängig von der Entscheidung, daher kann ein Kosten-Bericht-Hook `{"systemMessage": "..."}` zurückgeben und mit 0 beenden.3520Claude Code zeigt dem Benutzer jede `systemMessage` an, die Ihr Hook zurückgibt, unabhängig von der Entscheidung, sodass ein Hook zur Kostenanzeige `{"systemMessage": "..."}` zurückgeben und mit 0 enden kann.
3511 3521
3512Ein PreModelSwitch-Hook, der nicht vor seinem Timeout antwortet, blockiert den Wechsel. Bei [PreToolUse](#timeouts) lässt ein Timeout-Command-Hook den Tool-Aufruf dagegen fortgesetzt. Das Standard-Timeout für dieses Ereignis beträgt 30 Sekunden. `PreModelSwitch` führt nur `command`, `http` und `mcp_tool` Hooks aus, daher gelten die `prompt` und `agent` Standards nicht.3522Ein PreModelSwitch-Hook, der nicht vor Ablauf seines Timeouts antwortet, blockiert den Wechsel. Bei [PreToolUse](#timeouts) hingegen lässt ein Befehls-Hook mit Zeitüberschreitung den Tool-Aufruf fortfahren. Der Standard-Timeout für dieses Ereignis beträgt 30 Sekunden. `PreModelSwitch` führt nur `command`-, `http`- und `mcp_tool`-Hooks aus, daher gelten die Standardwerte für `prompt` und `agent` nicht.
3513 3523
3514Ein Hook, der mit einem Code anderen als 0 oder 2 beendet und keine JSON-Entscheidung druckt, blockiert nicht: Claude Code zeigt sein stderr und wendet den Wechsel an, wie unter [Andere Exit-Codes](#other-exit-codes) beschrieben.3524Ein Hook, der mit einem anderen Code als 0 oder 2 endet und keine JSON-Entscheidung ausgibt, blockiert nicht: Claude Code zeigt seine stderr-Ausgabe an und wendet den Wechsel an, wie unter [Andere Exit-Codes](#other-exit-codes) beschrieben.
3515 3525
3516<h3 id="postmodelswitch">3526<h3 id="postmodelswitch">
3517 PostModelSwitch3527 PostModelSwitch
3518</h3>3528</h3>
3519 3529
3520Wird ausgeführt, nachdem sich das Modell der Sitzung geändert hat. Verwenden Sie es, um Claude modell-spezifische Anleitung zu geben, ohne jede CLAUDE.md zu bearbeiten, z. B. eine organisations-weite Anweisung, die auf bestimmten Modellen gilt.3530Wird ausgeführt, nachdem sich das Modell der Sitzung geändert hat. Verwenden Sie es, um Claude modellspezifische Hinweise zu geben, ohne jede CLAUDE.md zu bearbeiten, etwa eine organisationsweite Anweisung, die für bestimmte Modelle gilt.
3521 3531
3522PostModelSwitch erfordert Claude Code v2.1.251 oder später. Es kann nicht blockieren, da sich das Modell bereits geändert hat. Claude Code führt PostModelSwitch-Hooks nach jeder dieser Änderungen aus:3532PostModelSwitch erfordert Claude Code v2.1.251 oder höher. Es kann nicht blockieren, da sich das Modell bereits geändert hat. Claude Code führt PostModelSwitch-Hooks nach jeder dieser Änderungen aus:
3523 3533
3524* Ein Wechsel, den Sie oder ein Client angefordert haben3534* Ein Wechsel, den Sie oder ein Client angefordert haben
3525* Ein [automatisches Modell-Fallback](/docs/de/model-config#automatic-model-fallback), das das Modell der Sitzung ändert3535* Ein [automatischer Modell-Fallback](/docs/de/model-config#automatic-model-fallback), der das Modell der Sitzung ändert
3526* Eine Einstellung wie [`opusplan`](/docs/de/model-config#opusplan-model-setting), die den Plan-Modus betritt oder verlässt3536* Eine Einstellung wie [`opusplan`](/docs/de/model-config#opusplan-model-setting), die den Plan-Modus betritt oder verlässt
3527* Claude Code stellt das Modell wieder her, wenn Sie eine Sitzung fortsetzen3537* Claude Code stellt das Modell wieder her, wenn Sie eine Sitzung fortsetzen
3528 3538
3529Claude Code führt PostModelSwitch-Hooks nicht aus, wenn ein Modell aus einer [Fallback-Modell-Kette](/docs/de/model-config#fallback-model-chains) einen Zug bedient, da diese Substitution einen Zug dauert und das Modell der Sitzung unverändert lässt.3539Claude 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.
3530 3540
3531Der Matcher folgt den gleichen Regeln wie [PreModelSwitch](#premodelswitch): Claude Code vergleicht ihn gegen den kanonischen Namen des Modells, zu dem die Sitzung wechselt.3541Der Matcher folgt denselben Regeln wie bei [PreModelSwitch](#premodelswitch): Claude Code vergleicht ihn mit dem kanonischen Namen des Modells, zu dem die Sitzung gewechselt ist.
3532 3542
3533Dieses Beispiel fügt Anleitung hinzu, wenn sich das Modell der Sitzung zu einem beliebigen Opus-Modell ändert:3543Dieses Beispiel fügt Hinweise hinzu, sobald das Modell der Sitzung zu einem beliebigen Opus-Modell wechselt:
3534 3544
3535```json theme={null}3545```json theme={null}
3536{3546{
3550}3560}
3551```3561```
3552 3562
3553Um zu bestätigen, dass der Hook funktioniert, wechseln Sie zu einem Opus-Modell aus einer Sitzung, die ein anderes Modell ausführt, z. B. führen Sie `/model opus` aus einer Sonnet-Sitzung aus, und fragen Sie Claude dann, welche Anleitung es zum aktuellen Modell hat.3563Um zu prüfen, ob der Hook funktioniert, wechseln Sie in einer Sitzung mit einem anderen Modell zu einem Opus-Modell, führen Sie beispielsweise `/model opus` in einer Sonnet-Sitzung aus, und fragen Sie Claude dann, welche Hinweise es zum aktuellen Modell hat.
3554 3564
3555<h4 id="postmodelswitch-input">3565<h4 id="postmodelswitch-input">
3556 PostModelSwitch-Eingabe3566 PostModelSwitch-Eingabe
3557</h4>3567</h4>
3558 3568
3559PostModelSwitch-Hooks erhalten die gleichen Felder wie [PreModelSwitch](#premodelswitch-input), mit `hook_event_name` auf `"PostModelSwitch"` gesetzt und zwei weitere `source` Werte: `"auto"` für ein automatisches Fallback oder eine andere Änderung, die Claude Code selbst gemacht hat, und `"resume"` für das Modell, das wiederhergestellt wurde, wenn Sie eine Sitzung fortsetzen.3569PostModelSwitch-Hooks erhalten dieselben Felder wie [PreModelSwitch](#premodelswitch-input), wobei `hook_event_name` auf `"PostModelSwitch"` gesetzt ist und es zwei weitere `source`-Werte gibt: `"auto"` für einen automatischen Fallback oder eine andere Änderung, die Claude Code selbst vorgenommen hat, und `"resume"` für das Modell, das beim Fortsetzen einer Sitzung wiederhergestellt wurde.
3560 3570
3561`requested_model` ist `null`, wenn `source` `"auto"` ist. Wenn `source` `"resume"` ist, ist es die gespeicherte Modell-Einstellung, die Claude Code wiederhergestellt hat.3571`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.
3562 3572
3563<h4 id="postmodelswitch-decision-control">3573<h4 id="postmodelswitch-decision-control">
3564 PostModelSwitch-Entscheidungskontrolle3574 PostModelSwitch-Entscheidungssteuerung
3565</h4>3575</h4>
3566 3576
3567Claude Code nimmt Ihren Hook-[Klartext-stdout](#exit-code-0) bei Exit 0 oder `additionalContext` aus JSON-Ausgabe und liefert es an Claude mit der nächsten Anfrage nach dem Wechsel. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, können Sie zurückgeben:3577Claude Code übernimmt die [Klartext-Ausgabe auf stdout](#exit-code-0) Ihres Hooks bei Exit-Code 0 oder `additionalContext` aus der JSON-Ausgabe und übermittelt sie Claude mit der nächsten Anfrage nach dem Wechsel. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die allen Hooks zur Verfügung stehen, können Sie Folgendes zurückgeben:
3568 3578
3569| Feld | Beschreibung |3579| Feld | Beschreibung |
3570| :- | :- |3580| :- | :- |
3571| `additionalContext` | String, der zu Claudes Kontext mit der nächsten Anfrage hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |3581| `additionalContext` | Zeichenfolge, die mit der nächsten Anfrage zu Claudes Kontext hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
3572 3582
3573Wenn der Hook nicht innerhalb von fünf Sekunden nach dem Senden der nächsten Eingabeaufforderung fertig wird, sendet Claude Code diese Anfrage ohne die Ausgabe und hängt sie stattdessen an die folgende Anfrage an. Wenn sich das Modell mehrmals ändert, bevor die nächste Anfrage erfolgt, liefert Claude Code nur die Ausgabe für den letzten Wechsel-Ziel-Modell.3583Wenn der Hook nicht innerhalb von fünf Sekunden nach dem Senden des nächsten Prompts fertig ist, sendet Claude Code diese Anfrage ohne die Ausgabe und hängt sie stattdessen an die darauffolgende Anfrage an. Wenn sich das Modell vor der nächsten Anfrage mehrmals ändert, übermittelt Claude Code nur die Ausgabe für das Zielmodell des letzten Wechsels.
3574 3584
3575<h3 id="sessionend">3585<h3 id="sessionend">
3576 SessionEnd3586 SessionEnd
3577</h3>3587</h3>
3578 3588
3579Wird ausgeführt, wenn eine Claude Code Sitzung endet. Nützlich für Cleanup-Aufgaben, Protokollierung von Sitzungs-Statistiken oder Speicherung von Sitzungs-Zustand. Unterstützt Matcher zum Filtern nach Exit-Grund.3589Wird ausgeführt, wenn eine Claude-Code-Sitzung endet. Nützlich für Bereinigungsaufgaben, das Protokollieren von Sitzungsstatistiken
3590oder das Speichern des Sitzungszustands. Unterstützt Matcher, um nach dem Beendigungsgrund zu filtern.
3580 3591
3581Das `reason` Feld in der Hook-Eingabe gibt an, warum die Sitzung endete:3592Das Feld `reason` in der Hook-Eingabe gibt an, warum die Sitzung beendet wurde:
3582 3593
3583| Grund | Beschreibung |3594| Grund | Beschreibung |
3584| :- | :- |3595| :- | :- |
3585| `clear` | Sitzung mit `/clear` Befehl gelöscht |3596| `clear` | Sitzung mit dem Befehl `/clear` geleert |
3586| `resume` | Sitzung mit interaktivem `/resume` gewechselt |3597| `resume` | Sitzung über das interaktive `/resume` gewechselt |
3587| `logout` | Benutzer hat sich abgemeldet |3598| `logout` | Benutzer hat sich abgemeldet |
3588| `prompt_input_exit` | Benutzer beendet, während Eingabeaufforderungs-Eingabe sichtbar war |3599| `prompt_input_exit` | Benutzer hat beendet, während das Prompt-Eingabefeld sichtbar war |
3589| `other` | Andere Exit-Gründe |3600| `other` | Andere Beendigungsgründe |
3590| `bypass_permissions_disabled` | Entfernt in v2.1.234; Claude Code sendet es nicht. Löschen Sie es aus Ihren `SessionEnd` Matchern |3601| `bypass_permissions_disabled` | In v2.1.234 entfernt; Claude Code sendet diesen Wert nicht. Entfernen Sie ihn aus Ihren `SessionEnd`-Matchern |
3591 3602
3592<h4 id="sessionend-input">3603<h4 id="sessionend-input">
3593 SessionEnd-Eingabe3604 SessionEnd-Eingabe
3594</h4>3605</h4>
3595 3606
3596Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten SessionEnd-Hooks ein `reason` Feld, das angibt, warum die Sitzung endete. Siehe die [Grund-Tabelle](#sessionend) oben für alle Werte.3607Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SessionEnd-Hooks ein Feld `reason`, das angibt, warum die Sitzung beendet wurde. Alle Werte finden Sie in der [Tabelle der Gründe](#sessionend) oben.
3597 3608
3598```json theme={null}3609```json theme={null}
3599{3610{
3605}3616}
3606```3617```
3607 3618
3608SessionEnd-Hooks haben keine Entscheidungskontrolle. Sie können die Sitzungs-Beendigung nicht blockieren, können aber Cleanup-Aufgaben ausführen. Claude Code verwirft ihre [JSON-Ausgabefelder](#json-output), wie `systemMessage`.3619SessionEnd-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`.
3609 3620
3610SessionEnd-Hooks haben ein Standard-Timeout von 1,5 Sekunden. Es gilt, wenn Sie beenden, `/clear` ausführen oder Sitzungen mit interaktivem `/resume` wechseln. Sie können einem Hook auf zwei Wegen mehr Zeit geben:3621SessionEnd-Hooks haben einen Standard-Timeout von 1,5 Sekunden. Er gilt, wenn Sie beenden, `/clear` ausführen oder mit dem interaktiven `/resume` die Sitzung wechseln. Sie können einem Hook auf zwei Arten mehr Zeit geben:
3611 3622
3612* **Pro-Hook `timeout`**: Setzen Sie `timeout` in der Konfiguration dieses Hooks. Das Gesamt-Budget steigt automatisch, um das höchste Pro-Hook-`timeout` in Ihren Einstellungsdateien zu entsprechen, bis zu 60 Sekunden. Wenn Sie das Budget auf diese Weise erhöhen, behält ein Hook ohne sein eigenes `timeout` immer noch den Standard. Timeouts, die auf Plugin-bereitgestellten Hooks gesetzt sind, erhöhen das Budget nicht.3623* **`timeout` pro Hook**: Setzen Sie `timeout` in der Konfiguration des jeweiligen Hooks. Das Gesamtbudget steigt automatisch auf den höchsten `timeout`-Wert pro Hook in Ihren Einstellungsdateien, bis zu 60 Sekunden. Wenn Sie das Budget auf diese Weise erhöhen, behält ein Hook ohne eigenen `timeout` weiterhin den Standardwert. Timeouts, die für von Plugins bereitgestellte Hooks festgelegt sind, erhöhen das Budget nicht.
3613* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: Setzen Sie diese Umgebungsvariable in Millisekunden, um das Budget explizit zu überschreiben. Der Wert, den Sie setzen, wird auch zum Timeout für jeden Hook ohne sein eigenes `timeout`.3624* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: Setzen Sie diese Umgebungsvariable in Millisekunden, um das Budget explizit zu überschreiben. Der von Ihnen festgelegte Wert wird außerdem zum Timeout für jeden Hook ohne eigenen `timeout`.
3614 3625
3615Dieses Beispiel setzt das Budget auf 5 Sekunden:3626Dieses Beispiel setzt das Budget auf 5 Sekunden:
3616 3627
3618CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude3629CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
3619```3630```
3620 3631
3621Vor v2.1.268 erhöhte `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` nur das Gesamt-Budget und ein Hook ohne sein eigenes `timeout` wurde immer noch nach 1,5 Sekunden abgebrochen.3632Vor v2.1.268 erhöhte `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` nur das Gesamtbudget, und ein Hook ohne eigenen `timeout` wurde weiterhin nach 1,5 Sekunden abgebrochen.
3622 3633
3623<h3 id="elicitation">3634<h3 id="elicitation">
3624 Elicitation3635 Elicitation
3625</h3>3636</h3>
3626 3637
3627Wird ausgeführt, wenn ein MCP-Server Benutzer-Eingabe während einer Aufgabe anfordert. Standardmäßig zeigt Claude Code einen interaktiven Dialog für den Benutzer zum Antworten. Hooks können diese Anfrage abfangen und programmatisch antworten, wobei der Dialog vollständig übersprungen wird.3638Wird ausgeführt, wenn ein MCP-Server während einer Aufgabe Benutzereingaben anfordert. Standardmäßig zeigt Claude Code einen interaktiven Dialog an, in dem der Benutzer antworten kann. Hooks können diese Anfrage abfangen und programmatisch beantworten, wodurch der Dialog vollständig übersprungen wird.
3628 3639
3629Das Matcher-Feld gleicht gegen den MCP-Server-Namen ab.3640Das Matcher-Feld wird mit dem Namen des MCP-Servers abgeglichen.
3630 3641
3631<h4 id="elicitation-input">3642<h4 id="elicitation-input">
3632 Elicitation-Eingabe3643 Elicitation-Eingabe
3633</h4>3644</h4>
3634 3645
3635Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten Elicitation-Hooks `mcp_server_name`, `message` und optional `mode`, `url`, `elicitation_id` und `requested_schema` Felder.3646Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten Elicitation-Hooks die Felder `mcp_server_name` und `message` sowie die optionalen Felder `mode`, `url`, `elicitation_id` und `requested_schema`.
3636 3647
3637Für Form-Modus-Elicitierung, der häufigste Fall:3648Für eine Elicitation im Formularmodus, den häufigsten Fall:
3638 3649
3639```json theme={null}3650```json theme={null}
3640{3651{
3654}3665}
3655```3666```
3656 3667
3657Für URL-Modus-Elicitierung, verwendet für Browser-basierte Authentifizierung:3668Für eine Elicitation im URL-Modus, die für browserbasierte Authentifizierung verwendet wird:
3658 3669
3659```json theme={null}3670```json theme={null}
3660{3671{
3673 Elicitation-Ausgabe3684 Elicitation-Ausgabe
3674</h4>3685</h4>
3675 3686
3676Um programmatisch ohne Anzeige des Dialogs zu antworten, geben Sie ein JSON-Objekt mit `hookSpecificOutput` zurück:3687Um programmatisch zu antworten, ohne den Dialog anzuzeigen, geben Sie ein JSON-Objekt mit `hookSpecificOutput` zurück:
3677 3688
3678```json theme={null}3689```json theme={null}
3679{3690{
3689 3700
3690| Feld | Werte | Beschreibung |3701| Feld | Werte | Beschreibung |
3691| :- | :- | :- |3702| :- | :- | :- |
3692| `action` | `accept`, `decline`, `cancel` | Ob die Anfrage akzeptiert, abgelehnt oder abgebrochen werden soll |3703| `action` | `accept`, `decline`, `cancel` | Ob die Anfrage angenommen, abgelehnt oder abgebrochen werden soll |
3693| `content` | object | Formular-Feldwerte zum Einreichen. Nur verwendet, wenn `action` `accept` ist |3704| `content` | object | Zu übermittelnde Werte der Formularfelder. Wird nur verwendet, wenn `action` den Wert `accept` hat |
3694 3705
3695Exit-Code 2 lehnt die Elicitierung ab. Claude Code zeigt Ihre stderr-Nachricht nirgendwo an.3706Exit-Code 2 lehnt die Elicitation ab. Claude Code zeigt Ihre stderr-Meldung nirgends an.
3696 3707
3697Claude Code handelt auf `hookSpecificOutput` aus der JSON-Ausgabe eines Elicitation-Hooks und verwirft `systemMessage` und `continue`.3708Claude Code verarbeitet `hookSpecificOutput` aus der JSON-Ausgabe eines Elicitation-Hooks und verwirft `systemMessage` und `continue`.
3698 3709
3699<h3 id="elicitationresult">3710<h3 id="elicitationresult">
3700 ElicitationResult3711 ElicitationResult
3701</h3>3712</h3>
3702 3713
3703Wird ausgeführt, nachdem ein Benutzer auf eine MCP-Elicitierung antwortet. Hooks können die Antwort beobachten, ändern oder blockieren, bevor sie an den MCP-Server zurückgesendet wird.3714Wird ausgeführt, nachdem ein Benutzer auf eine MCP-Elicitation geantwortet hat. Hooks können die Antwort beobachten, ändern oder blockieren, bevor sie an den MCP-Server zurückgesendet wird.
3704 3715
3705Das Matcher-Feld gleicht gegen den MCP-Server-Namen ab.3716Das Matcher-Feld wird mit dem Namen des MCP-Servers abgeglichen.
3706 3717
3707<h4 id="elicitationresult-input">3718<h4 id="elicitationresult-input">
3708 ElicitationResult-Eingabe3719 ElicitationResult-Eingabe
3709</h4>3720</h4>
3710 3721
3711Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten ElicitationResult-Hooks `mcp_server_name`, `action` und optional `mode`, `elicitation_id` und `content` Felder.3722Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten ElicitationResult-Hooks die Felder `mcp_server_name` und `action` sowie die optionalen Felder `mode`, `elicitation_id` und `content`.
3712 3723
3713```json theme={null}3724```json theme={null}
3714{3725{
3743| Feld | Werte | Beschreibung |3754| Feld | Werte | Beschreibung |
3744| :- | :- | :- |3755| :- | :- | :- |
3745| `action` | `accept`, `decline`, `cancel` | Überschreibt die Aktion des Benutzers |3756| `action` | `accept`, `decline`, `cancel` | Überschreibt die Aktion des Benutzers |
3746| `content` | object | Überschreibt Formular-Feldwerte. Nur aussagekräftig, wenn `action` `accept` ist |3757| `content` | object | Überschreibt die Werte der Formularfelder. Nur sinnvoll, wenn `action` den Wert `accept` hat |
3747 3758
3748Exit-Code 2 blockiert die Antwort, indem die effektive Aktion zu `decline` geändert wird. Claude Code zeigt Ihre stderr-Nachricht nirgendwo an.3759Exit-Code 2 blockiert die Antwort und ändert die effektive Aktion in `decline`. Claude Code zeigt Ihre stderr-Meldung nirgends an.
3749 3760
3750Claude Code handelt auf `hookSpecificOutput` aus der JSON-Ausgabe eines ElicitationResult-Hooks und verwirft `systemMessage` und `continue`.3761Claude Code verarbeitet `hookSpecificOutput` aus der JSON-Ausgabe eines ElicitationResult-Hooks und verwirft `systemMessage` und `continue`.
3751 3762
3752<h2 id="prompt-based-hooks">3763<h2 id="prompt-based-hooks">
3753 Prompt-basierte Hooks3764 Prompt-basierte Hooks