242 242
243Hooks werden in JSON-Einstellungsdateien definiert. Die Konfiguration hat drei Verschachtelungsebenen:243Hooks werden in JSON-Einstellungsdateien definiert. Die Konfiguration hat drei Verschachtelungsebenen:
244 244
2451. Wählen Sie ein [Hook-Ereignis](#hook-events) aus, auf das Sie reagieren möchten, wie `PreToolUse` oder `Stop`2451. Wählen Sie ein [Hook-Ereignis](#hook-events) aus, auf das reagiert werden soll, wie `PreToolUse` oder `Stop`
2462. Fügen Sie eine [Matcher-Gruppe](#matcher-patterns) hinzu, um zu filtern, wann es ausgelöst wird, wie „nur für das Bash-Tool"2462. Fügen Sie eine [Matcher-Gruppe](#matcher-patterns) hinzu, um zu filtern, wann es ausgelöst wird, z. B. „nur für das Bash-Tool"
2473. Definieren Sie einen oder mehrere [Hook-Handler](#hook-handler-fields), die ausgeführt werden, wenn sie passen2473. Definieren Sie einen oder mehrere [Hook-Handler](#hook-handler-fields), die ausgeführt werden, wenn eine Übereinstimmung gefunden wird
248 248
249Siehe [Wie ein Hook aufgelöst wird](#how-a-hook-resolves) oben für eine vollständige Anleitung mit einem kommentierten Beispiel.249Siehe [Wie ein Hook aufgelöst wird](#how-a-hook-resolves) oben für eine vollständige Anleitung mit einem kommentierten Beispiel.
250 250
251<Note>251<Note>
252 Diese Seite verwendet spezifische Begriffe für jede Ebene: **Hook-Ereignis** für den Lebenszyklus-Punkt, **Matcher-Gruppe** für den Filter und **Hook-Handler** für den Shell-Befehl, HTTP-Endpunkt, MCP-Tool, Prompt oder Agent, der ausgeführt wird. „Hook" allein bezieht sich auf die allgemeine Funktion.252 Diese Seite verwendet spezifische Begriffe für jede Ebene: **Hook-Ereignis** für den Lebenszykluspunkt, **Matcher-Gruppe** für den Filter und **Hook-Handler** für den Shell-Befehl, HTTP-Endpunkt, MCP-Tool, Prompt oder Agent, der ausgeführt wird. „Hook" bezieht sich allein auf die allgemeine Funktion.
253</Note>253</Note>
254 254
255<h3 id="hook-locations">255<h3 id="hook-locations">
261| Speicherort | Umfang | Freigegeben |261| Speicherort | Umfang | Freigegeben |
262| :--------------------------------------- | :---------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------ |262| :--------------------------------------- | :---------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------ |
263| `~/.claude/settings.json` | Alle Ihre Projekte | Nein, lokal auf Ihrem Computer |263| `~/.claude/settings.json` | Alle Ihre Projekte | Nein, lokal auf Ihrem Computer |
264| `.claude/settings.json` | Einzelnes Projekt | Ja, kann im Repo committed werden |264| `.claude/settings.json` | Einzelnes Projekt | Ja, kann im Repository committed werden |
265| `.claude/settings.local.json` | Einzelnes Projekt | Nein, gitignored, wenn Claude Code eine Einstellung darin speichert |265| `.claude/settings.local.json` | Einzelnes Projekt | Nein, gitignored, wenn Claude Code eine Einstellung darin speichert |
266| Verwaltete Richtlinieneinstellungen | Organisationsweit | Ja, von Admin kontrolliert |266| Verwaltete Richtlinieneinstellungen | Organisationsweit | Ja, von Administrator kontrolliert |
267| [Plugin](/docs/de/plugins) `hooks/hooks.json` | Wenn Plugin aktiviert ist | Ja, mit dem Plugin gebündelt |267| [Plugin](/docs/de/plugins) `hooks/hooks.json` | Wenn Plugin aktiviert ist | Ja, mit dem Plugin gebündelt |
268| [Skill](/docs/de/skills) Frontmatter | Der Rest der Sitzung, sobald der Skill aufgerufen wird. Siehe [Hooks in Skills und Agents](#hooks-in-skills-and-agents) | Ja, in der Skill-Datei definiert |268| [Skill](/docs/de/skills) Frontmatter | Der Rest der Sitzung, sobald der Skill aufgerufen wird. Siehe [Hooks in Skills und Agents](#hooks-in-skills-and-agents) | Ja, in der Skill-Datei definiert |
269| [Subagent](/docs/de/sub-agents) Frontmatter | Während dieser Subagent läuft | Ja, in der Subagent-Datei definiert |269| [Subagent](/docs/de/sub-agents) Frontmatter | Während dieser Subagent ausgeführt wird | Ja, in der Subagent-Datei definiert |
270 270
271[Cloud-Sitzungen](/docs/de/claude-code-on-the-web) lesen Ihre lokale `~/.claude/settings.json` nicht; Hooks dort stammen aus dem Repo, was bedeutet, dass seine `.claude/settings.json` in einer Sitzung mit einem Repository und die Plugins, die es deklariert, in jeder Sitzung, und aus den von Ihrem Server verwalteten Einstellungen Ihrer Organisation. In einer [selbstgehosteten Umgebung](/docs/de/self-hosted-environments-configuration#permissions-and-tool-approval) führt Claude Code auch die Hooks aus, die der Operator vom Host `~/.claude/` des Runners seeded hat, und es führt die Hooks in der verwalteten Einstellungsdatei des Runner-Images aus, wenn diese Datei unter den [verwalteten Quellen liegt, die Claude Code anwendet](/docs/de/managed-settings#how-claude-code-combines-managed-sources), was standardmäßig bedeutet, nur wenn weder Server-verwaltete Einstellungen noch eine von MDM bereitgestellte Claude Code-Richtlinie die verwaltete Ebene bereitstellen. Siehe [was von Ihrem Setup übertragen wird](/docs/de/cloud-environments#what-carries-over-from-your-setup), um zu erfahren, welche Dateien eine Cloud-Sitzung erreichen.271[Cloud-Sitzungen](/docs/de/claude-code-on-the-web) lesen Ihre lokale `~/.claude/settings.json` nicht; Hooks dort stammen aus der `.claude/settings.json` des Repositories in einer Sitzung mit einem Repository, aus den Plugins, die [von Ihrem claude.ai-Konto synchronisiert werden](/docs/de/plugins-reference#synced-plugins), und aus den servergesteuerten Einstellungen Ihrer Organisation. In einer [selbstgehosteten Umgebung](/docs/de/self-hosted-environments-configuration#permissions-and-tool-approval) führt Claude Code auch die Hooks aus, die der Operator vom Host `~/.claude/` des Runners seeded hat, und führt die Hooks in der verwalteten Einstellungsdatei des Runner-Images aus, wenn diese Datei unter den [verwalteten Quellen liegt, die Claude Code anwendet](/docs/de/managed-settings#how-claude-code-combines-managed-sources), was standardmäßig bedeutet, dass nur dann, wenn weder servergesteuerte Einstellungen noch eine von MDM bereitgestellte Claude Code-Richtlinie die verwaltete Ebene bereitstellt. Siehe [was von Ihrem Setup übertragen wird](/docs/de/cloud-environments#what-carries-over-from-your-setup) für die Dateien, die eine Cloud-Sitzung erreichen.
272 272
273Weitere Informationen zur Auflösung von Einstellungsdateien finden Sie unter [Einstellungen](/docs/de/settings).273Weitere Informationen zur Auflösung von Einstellungsdateien finden Sie unter [Einstellungen](/docs/de/settings).
274 274
275Hooks aus Einstellungsdateien, verwalteten Richtlinieneinstellungen und Plugins werden auch in [Subagenten](/docs/de/sub-agents) ausgeführt. Wenn ein Subagent ein Tool aufruft, werden Tool-Ereignisse wie `PreToolUse` und `PostToolUse` die gleichen konfigurierten Hooks wie in der Hauptkonversation ausgelöst, und die Eingabe enthält die [gemeinsamen Eingabefelder](#common-input-fields) `agent_id` und `agent_type`, die den Subagenten identifizieren.275Hooks aus Einstellungsdateien, verwalteten Richtlinieneinstellungen und Plugins werden auch in [Subagents](/docs/de/sub-agents) ausgeführt. Wenn ein Subagent ein Tool aufruft, werden Tool-Ereignisse wie `PreToolUse` und `PostToolUse` die gleichen konfigurierten Hooks wie im Hauptgespräch ausgelöst, und die Eingabe enthält die [gemeinsamen Eingabefelder](#common-input-fields) `agent_id` und `agent_type`, die den Subagent identifizieren.
276 276
277Enterprise-Administratoren können `allowManagedHooksOnly` verwenden, um einzuschränken, welche Hooks ausgeführt werden:277Unternehmensadministratoren können `allowManagedHooksOnly` verwenden, um einzuschränken, welche Hooks ausgeführt werden:
278 278
279* Ihre Benutzer-, Projekt-, lokalen und Plugin-Hooks werden blockiert. Hooks von Plugins, die in verwalteten Einstellungen `enabledPlugins` erzwungen aktiviert sind, sind ausgenommen279* Ihre Benutzer-, Projekt-, lokalen und Plugin-Hooks werden blockiert. Hooks aus Plugins, die in verwalteten Einstellungen `enabledPlugins` erzwungen aktiviert sind, sind ausgenommen
280* Claude Code schränkt auch Ihre [`statusLine`](/docs/de/statusline), [`fileSuggestion`](/docs/de/settings-reference#filesuggestion) und [`subagentStatusLine`](/docs/de/statusline#subagent-status-lines) Einstellungen auf verwaltete Einstellungen ein280* Claude Code schränkt auch Ihre [`statusLine`](/docs/de/statusline), [`fileSuggestion`](/docs/de/settings-reference#filesuggestion) und [`subagentStatusLine`](/docs/de/statusline#subagent-status-lines) Einstellungen auf verwaltete Einstellungen ein
281* Claude Code deaktiviert auch Plugins mit einer [`command`-Quelle](/docs/de/plugin-marketplaces#command-sources), einschließlich Plugins, die in verwalteten Einstellungen `enabledPlugins` erzwungen aktiviert sind, es sei denn, [`disableCommandPluginSources`](/docs/de/settings-reference#disablecommandpluginsources) ist explizit auf `false` gesetzt. `command`-Quellen erfordern Claude Code v2.1.229 oder später281* Claude Code deaktiviert auch Plugins mit einer [`command`-Quelle](/docs/de/plugin-marketplaces#command-sources), einschließlich Plugins, die in verwalteten Einstellungen `enabledPlugins` erzwungen aktiviert sind, es sei denn, [`disableCommandPluginSources`](/docs/de/settings-reference#disablecommandpluginsources) ist explizit auf `false` gesetzt. `command`-Quellen erfordern Claude Code v2.1.229 oder später
282* Claude Code blockiert auch Marketplace-[`headersHelper`-Befehle](/docs/de/plugin-marketplaces#authenticate-archive-downloads), es sei denn, [`disableCommandPluginSources`](/docs/de/settings-reference#disablecommandpluginsources) ist explizit auf `false` gesetzt, außer für einen Marketplace, den verwaltete Einstellungen selbst deklarieren282* Claude Code blockiert auch Marketplace-[`headersHelper`-Befehle](/docs/de/plugin-marketplaces#authenticate-archive-downloads), es sei denn, [`disableCommandPluginSources`](/docs/de/settings-reference#disablecommandpluginsources) ist explizit auf `false` gesetzt, außer für einen Marketplace, den verwaltete Einstellungen selbst deklarieren
283 283
284Siehe [was unter `allowManagedHooksOnly` läuft](/docs/de/settings-reference#what-runs-under-allowmanagedhooksonly).284Siehe [was unter `allowManagedHooksOnly` ausgeführt wird](/docs/de/settings-reference#what-runs-under-allowmanagedhooksonly).
285 285
286Hook-Einträge werden über Einstellungsebenen hinweg zusammengeführt, anstatt sich gegenseitig zu ersetzen: Benutzer-, Projekt- und lokale Einstellungen fügen ihre eigenen Hooks hinzu, ohne verwaltete zu entfernen, und die Einstellung [`disableAllHooks`](#disable-or-remove-hooks) kann verwaltete Hooks von außerhalb verwalteter Einstellungen nicht deaktivieren.286Hook-Einträge werden über Einstellungsebenen hinweg zusammengeführt, anstatt sich gegenseitig zu ersetzen: Benutzer-, Projekt- und lokale Einstellungen fügen ihre eigenen Hooks hinzu, ohne verwaltete zu entfernen, und die Einstellung [`disableAllHooks`](#disable-or-remove-hooks) kann verwaltete Hooks von außerhalb verwalteter Einstellungen nicht deaktivieren.
287 287
294 Matcher-Muster294 Matcher-Muster
295</h3>295</h3>
296 296
297Das Feld `matcher` filtert, wann Hooks ausgelöst werden. Wie ein Matcher evaluiert wird, hängt von den Zeichen ab, die er enthält:297Das Feld `matcher` filtert, wann Hooks ausgelöst werden. Wie ein Matcher ausgewertet wird, hängt von den Zeichen ab, die er enthält:
298 298
299| Matcher-Wert | Evaluiert als | Beispiel |299| Matcher-Wert | Ausgewertet als | Beispiel |
300| :----------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------- |300| :----------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
301| `"*"`, `""` oder weggelassen | Alle treffen | wird bei jedem Auftreten des Ereignisses ausgelöst |301| `"*"`, `""` oder weggelassen | Alle abgleichen | wird bei jedem Auftreten des Ereignisses ausgelöst |
302| Nur Buchstaben, Ziffern, `_`, `-`, Leerzeichen, `,` und `\|` | Exakte Zeichenkette oder Liste von exakten Zeichenketten, getrennt durch `\|` oder `,` mit optionalem umgebendem Leerzeichen | `Bash` passt nur zum Bash-Tool; `Edit\|Write` und `Edit, Write` passen jeweils zu beiden Tools genau; `code-reviewer` passt nur zu diesem Agent-Typ |302| Nur Buchstaben, Ziffern, `_`, `-`, Leerzeichen, `,` und `\|` | Exakte Zeichenkette oder Liste exakter Zeichenketten, getrennt durch `\|` oder `,` mit optionalem umgebendem Leerzeichen | `Bash` passt nur auf das Bash-Tool; `Edit\|Write` und `Edit, Write` passen jeweils auf eines der beiden Tools genau; `code-reviewer` passt nur auf diesen Agent-Typ |
303| Enthält ein anderes Zeichen | JavaScript-Regex, unverankert | `^Notebook` passt zu jedem Tool, das mit Notebook beginnt; `mcp__memory__.*` passt zu jedem Tool vom `memory`-Server |303| Enthält ein anderes Zeichen | JavaScript-Regulärer Ausdruck, nicht verankert | `^Notebook` passt auf jedes Tool, dessen Name mit `Notebook` beginnt; `mcp__memory__.*` passt auf jedes Tool vom `memory`-Server |
304 304
305Ein Matcher auf dem Regex-Pfad wird mit `RegExp.prototype.test` von JavaScript getestet, was bei einer Übereinstimmung irgendwo im Wert erfolgreich ist. `Edit.*` passt sowohl zu `Edit` als auch zu `NotebookEdit`; wickeln Sie das Muster in `^` und `$` ein, wie in `^Edit$`, wenn Sie eine Ganzzahl-Übereinstimmung benötigen.305Ein Matcher auf dem Pfad des regulären Ausdrucks wird mit `RegExp.prototype.test` von JavaScript getestet, was bei einer Übereinstimmung an einer beliebigen Stelle im Wert erfolgreich ist. `Edit.*` passt sowohl auf `Edit` als auch auf `NotebookEdit`; umgeben Sie das Muster mit `^` und `$`, wie in `^Edit$`, wenn Sie eine Übereinstimmung mit der gesamten Zeichenkette benötigen.
306 306
307Komma-Trennzeichen und die Toleranz für umgebendes Leerzeichen erfordern Claude Code v2.1.191 oder später.307Komma-Trennzeichen und die Toleranz für umgebendes Leerzeichen erfordern Claude Code v2.1.191 oder später.
308 308
309Bindestriche in der Exact-Match-Menge erfordern Claude Code v2.1.195 oder später. In früheren Versionen wird ein hyphenierter Name wie `code-reviewer` als unverankerte Regex evaluiert, daher wird er auch für `senior-code-reviewer` ausgelöst; verankern Sie ihn als `^code-reviewer$` in diesen Versionen, um nur diesen Namen zu treffen.309Bindestriche in der exakten Übereinstimmungsmenge erfordern Claude Code v2.1.195 oder später. In früheren Versionen wird ein Name mit Bindestrich wie `code-reviewer` als nicht verankerter regulärer Ausdruck ausgewertet, sodass er auch für `senior-code-reviewer` ausgelöst wird; verankern Sie ihn als `^code-reviewer$` in diesen Versionen, um nur diesen Namen abzugleichen.
310 310
311`FileChanged` und `StopFailure` verwenden einen engeren Exact-Match-Satz von nur Buchstaben, Ziffern, `_` und `|`. Ein Bindestrich, Leerzeichen oder Komma in einem Matcher für diese beiden Ereignisse hält ihn auf dem Regex-Pfad, und nur `|` trennt Alternativen. Jedes andere Ereignis mit Matcher-Unterstützung in der folgenden Tabelle akzeptiert `|` oder `,`.311`FileChanged` und `StopFailure` verwenden einen engeren exakten Übereinstimmungssatz von nur Buchstaben, Ziffern, `_` und `|`. Ein Bindestrich, Leerzeichen oder Komma in einem Matcher für diese beiden Ereignisse hält ihn auf dem Pfad des regulären Ausdrucks, und nur `|` trennt Alternativen. Jedes andere Ereignis mit Matcher-Unterstützung in der folgenden Tabelle akzeptiert `|` oder `,`.
312 312
313Das Ereignis `FileChanged` folgt diesen Regeln nicht, wenn es seine Überwachungsliste erstellt. Siehe [FileChanged](#filechanged).313Das Ereignis `FileChanged` folgt diesen Regeln nicht, wenn es seine Beobachtungsliste erstellt. Siehe [FileChanged](#filechanged).
314 314
315Jeder Ereignistyp passt auf ein anderes Feld:315Jeder Ereignistyp passt auf ein anderes Feld:
316 316
317| Ereignis | Worauf der Matcher filtert | Beispiel-Matcher-Werte |317| Ereignis | Worauf der Matcher filtert | Beispiel-Matcher-Werte |
318| :------------------------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |318| :------------------------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
319| `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied` | Tool-Name | `Bash`, `Edit\|Write`, `mcp__.*` |319| `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied` | Tool-Name | `Bash`, `Edit\|Write`, `mcp__.*` |
320| `SessionStart` | Wie die Sitzung gestartet wurde | `startup`, `resume`, `clear`, `compact`, `fork` |320| `SessionStart` | wie die Sitzung gestartet wurde | `startup`, `resume`, `clear`, `compact`, `fork` |
321| `Setup` | Welches CLI-Flag das Setup ausgelöst hat | `init`, `maintenance` |321| `Setup` | welches CLI-Flag Setup ausgelöst hat | `init`, `maintenance` |
322| `SessionEnd` | Warum die Sitzung endete | `clear`, `resume`, `logout`, `prompt_input_exit`, `other` |322| `SessionEnd` | warum die Sitzung endete | `clear`, `resume`, `logout`, `prompt_input_exit`, `other` |
323| `Notification` | Benachrichtigungstyp | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog`, `elicitation_url_dialog`, `elicitation_complete`, `elicitation_response`, `agent_needs_input`, `agent_completed`, `quota_auto_resume_fired`, `quota_auto_resume_stale`, `quota_auto_resume_disabled` |323| `Notification` | Benachrichtigungstyp | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog`, `elicitation_url_dialog`, `elicitation_complete`, `elicitation_response`, `agent_needs_input`, `agent_completed`, `quota_auto_resume_fired`, `quota_auto_resume_stale`, `quota_auto_resume_disabled` |
324| `SubagentStart` | Agent-Typ | `general-purpose`, `Explore`, `Plan`, benutzerdefinierte Agent-Namen oder Plugin-bezogene Namen wie `^my-plugin:reviewer$` |324| `SubagentStart` | Agent-Typ | `general-purpose`, `Explore`, `Plan`, benutzerdefinierte Agent-Namen oder Plugin-bezogene Namen wie `^my-plugin:reviewer$` |
325| `PreCompact`, `PostCompact` | Was die Komprimierung ausgelöst hat | `manual`, `auto` |325| `PreCompact`, `PostCompact` | was Komprimierung ausgelöst hat | `manual`, `auto` |
326| `PreModelSwitch`, `PostModelSwitch` | Kanonischer Name des Modells, zu dem die Sitzung wechselt, wie unter [PreModelSwitch](#premodelswitch) beschrieben | `claude-opus-5`, `claude-opus-4-6\|claude-opus-5`, `.*opus.*` |326| `PreModelSwitch`, `PostModelSwitch` | kanonischer Name des Modells, zu dem die Sitzung wechselt, wie unter [PreModelSwitch](#premodelswitch) beschrieben | `claude-opus-5`, `claude-opus-4-6\|claude-opus-5`, `.*opus.*` |
327| `SubagentStop` | Agent-Typ | gleiche Werte wie `SubagentStart` |327| `SubagentStop` | Agent-Typ | gleiche Werte wie `SubagentStart` |
328| `ConfigChange` | Konfigurationsquelle | `user_settings`, `project_settings`, `local_settings`, `policy_settings`, `skills` |328| `ConfigChange` | Konfigurationsquelle | `user_settings`, `project_settings`, `local_settings`, `policy_settings`, `skills` |
329| `CwdChanged` | Keine Matcher-Unterstützung | wird immer bei jedem Verzeichniswechsel ausgelöst |329| `CwdChanged` | keine Matcher-Unterstützung | wird immer bei jedem Auftreten ausgelöst |
330| `DirectoryAdded` | Wie das Verzeichnis hinzugefügt wurde | `slash_command`, `register_repo_root` |330| `DirectoryAdded` | wie das Verzeichnis hinzugefügt wurde | `slash_command`, `register_repo_root` |
331| `FileChanged` | Dateinamen zum Überwachen (siehe [FileChanged](#filechanged)) | `.envrc\|.env` |331| `FileChanged` | wörtliche Dateinamen zum Beobachten (siehe [FileChanged](#filechanged)) | `.envrc\|.env` |
332| `StopFailure` | 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`, `unknown` |332| `StopFailure` | 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`, `unknown` |
333| `InstructionsLoaded` | Ladegrund | `session_start`, `nested_traversal`, `path_glob_match`, `include`, `compact` |333| `InstructionsLoaded` | Ladegrund | `session_start`, `nested_traversal`, `path_glob_match`, `include`, `compact` |
334| `UserPromptExpansion` | Befehlsname | Ihre Skill- oder Befehlsnamen |334| `UserPromptExpansion` | Befehlsname | Ihre Skill- oder Befehlsnamen |
335| `Elicitation` | MCP-Server-Name | Ihre konfigurierten MCP-Server-Namen |335| `Elicitation` | MCP-Servername | Ihre konfigurierten MCP-Servernamen |
336| `ElicitationResult` | MCP-Server-Name | gleiche Werte wie `Elicitation` |336| `ElicitationResult` | MCP-Servername | gleiche Werte wie `Elicitation` |
337| `UserPromptSubmit`, `PostToolBatch`, `Stop`, `TeammateIdle`, `TaskCreated`, `TaskCompleted`, `WorktreeCreate`, `WorktreeRemove`, `MessageDisplay` | Keine Matcher-Unterstützung | wird immer bei jedem Auftreten ausgelöst |337| `UserPromptSubmit`, `PostToolBatch`, `Stop`, `TeammateIdle`, `TaskCreated`, `TaskCompleted`, `WorktreeCreate`, `WorktreeRemove`, `MessageDisplay` | keine Matcher-Unterstützung | wird immer bei jedem Auftreten ausgelöst |
338 338
339Das Abgleichen von `StopFailure` auf `cloud_credential_error` erfordert Claude Code v2.1.267 oder später, die erste Version, die Fehler beim Laden von Anmeldedaten unter diesem Wert statt unter `server_error` oder `unknown` meldet.339Das Abgleichen von `StopFailure` auf `cloud_credential_error` erfordert Claude Code v2.1.267 oder später, die erste Version, die Fehler beim Laden von Anmeldedaten unter diesem Wert statt unter `server_error` oder `unknown` meldet.
340 340
341Für die meisten Ereignisse wertet Claude Code den Matcher gegen ein Feld aus der [JSON-Eingabe](#hook-input-and-output) aus, die es an Ihren Hook über stdin sendet. Für Tool-Ereignisse ist dieses Feld `tool_name`. Für `PreModelSwitch` und `PostModelSwitch` wertet Claude Code den Matcher gegen den kanonischen Namen aus, den es aus `to_model` ableitet, wie unter [PreModelSwitch](#premodelswitch) beschrieben. Jeder Abschnitt [Hook-Ereignis](#hook-events) listet den vollständigen Satz von Matcher-Werten und das Eingabeschema für dieses Ereignis auf.341Für die meisten Ereignisse wertet Claude Code den Matcher gegen ein Feld aus der [JSON-Eingabe](#hook-input-and-output) aus, die es Ihrem Hook auf stdin sendet. Für Tool-Ereignisse ist dieses Feld `tool_name`. Für `PreModelSwitch` und `PostModelSwitch` wertet Claude Code den Matcher gegen den kanonischen Namen aus, den es aus `to_model` ableitet, wie unter [PreModelSwitch](#premodelswitch) beschrieben. Jeder [Hook-Ereignis](#hook-events)-Abschnitt listet den vollständigen Satz von Matcher-Werten und das Eingabeschema für dieses Ereignis auf.
342 342
343Dieses Beispiel führt ein Linting-Skript nur aus, wenn Claude eine Datei schreibt oder bearbeitet:343Dieses Beispiel führt ein Linting-Skript nur aus, wenn Claude eine Datei schreibt oder bearbeitet:
344 344
362 362
363Wenn Sie ein `matcher`-Feld zu einem Ereignis ohne Matcher-Unterstützung hinzufügen, wird es stillschweigend ignoriert.363Wenn Sie ein `matcher`-Feld zu einem Ereignis ohne Matcher-Unterstützung hinzufügen, wird es stillschweigend ignoriert.
364 364
365Für Tool-Ereignisse können Sie enger filtern, indem Sie das Feld [`if`](#common-fields) auf einzelnen Hook-Handlern setzen. `if` verwendet [Berechtigungsregel-Syntax](/docs/de/permissions), um gegen den Tool-Namen und die Argumente zusammen zu passen, daher wird `"Bash(git *)"` ausgeführt, wenn ein Bash-Befehl mit `git *` übereinstimmt und `"Edit(*.ts)"` wird nur für TypeScript-Dateien ausgeführt.365Für Tool-Ereignisse können Sie enger filtern, indem Sie das Feld [`if`](#common-fields) auf einzelnen Hook-Handlern setzen. `if` verwendet [Berechtigungsregelsyntax](/docs/de/permissions), um gegen den Tool-Namen und die Argumente zusammen abzugleichen, sodass `"Bash(git *)"` ausgeführt wird, wenn ein Bash-Eingabe-Subbefehl `git *` passt und `"Edit(*.ts)"` nur für TypeScript-Dateien ausgeführt wird.
366 366
367<h4 id="match-mcp-tools">367<h4 id="match-mcp-tools">
368 MCP-Tools abgleichen368 MCP-Tools abgleichen
369</h4>369</h4>
370 370
371[MCP](/docs/de/mcp) Server-Tools erscheinen als reguläre Tools in Tool-Ereignissen (`PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied`), daher können Sie sie auf die gleiche Weise abgleichen wie jeden anderen Tool-Namen.371[MCP](/docs/de/mcp)-Server-Tools erscheinen als reguläre Tools in Tool-Ereignissen (`PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied`), sodass Sie sie auf die gleiche Weise abgleichen können wie jeden anderen Tool-Namen.
372 372
373MCP-Tools folgen dem Benennungsmuster `mcp__<server>__<tool>`, zum Beispiel:373MCP-Tools folgen dem Benennungsmuster `mcp__<server>__<tool>`, zum Beispiel:
374 374
375* `mcp__memory__create_entities`: Memory-Server-Tool zum Erstellen von Entitäten375* `mcp__memory__create_entities`: Entitäten-Tool des Memory-Servers erstellen
376* `mcp__filesystem__read_file`: Filesystem-Server-Tool zum Lesen von Dateien376* `mcp__filesystem__read_file`: Datei-Lese-Tool des Filesystem-Servers
377* `mcp__github__search_repositories`: GitHub-Server-Suchtool377* `mcp__github__search_repositories`: Such-Tool des GitHub-Servers
378 378
379Um jedes Tool von einem Server zu treffen, fügen Sie `.*` zum Server-Präfix hinzu. Das `.*` ist erforderlich: Ein Matcher wie `mcp__memory` oder `mcp__brave-search` enthält nur Exact-Match-Zeichen, daher wird er als exakte Zeichenkette verglichen und passt zu keinem Tool.379Um jedes Tool von einem Server abzugleichen, hängen Sie `.*` an das Server-Präfix an. Das `.*` ist erforderlich: ein Matcher wie `mcp__memory` oder `mcp__brave-search` enthält nur exakte Übereinstimmungszeichen, sodass er als exakte Zeichenkette verglichen wird und kein Tool passt.
380 380
381* `mcp__memory__.*` passt zu allen Tools vom `memory`-Server381* `mcp__memory__.*` passt auf alle Tools vom `memory`-Server
382* `mcp__brave-search__.*` passt zu allen Tools von einem Server, dessen Name einen Bindestrich enthält382* `mcp__brave-search__.*` passt auf alle Tools von einem Server, dessen Name einen Bindestrich enthält
383* `mcp__.*__write.*` passt zu jedem Tool, dessen Name mit `write` beginnt, von jedem Server383* `mcp__.*__write.*` passt auf jedes Tool, dessen Name mit `write` beginnt, von jedem Server
384 384
385Bindestriche in der Exact-Match-Menge erfordern Claude Code v2.1.195 oder später. In früheren Versionen wird ein bloßes hypheniertes Präfix wie `mcp__brave-search` als unverankerte Regex evaluiert und passt zu jedem Tool von diesem Server. Die Form `mcp__brave-search__.*` funktioniert auf jeder Version.385Bindestriche in der exakten Übereinstimmungsmenge erfordern Claude Code v2.1.195 oder später. In früheren Versionen wird ein bloßes Präfix mit Bindestrich wie `mcp__brave-search` als nicht verankerter regulärer Ausdruck ausgewertet und passt auf jedes Tool von diesem Server. Die Form `mcp__brave-search__.*` funktioniert auf jeder Version.
386 386
387Tools von einem [Plugin-gebündelten MCP-Server](/docs/de/mcp#plugin-provided-mcp-servers) verwenden ein Scope-Server-Segment, das den Plugin-Namen enthält: `mcp__plugin_<plugin-name>_<server-name>__<tool>`. Ein Matcher, der gegen den bloßen Server-Schlüssel geschrieben ist, wird niemals für diese Tools ausgelöst. Für ein Plugin namens `my-plugin`, das einen Server unter dem Schlüssel `db` bündelt, erscheint ein `query`-Tool als `mcp__plugin_my-plugin_db__query`, daher ist der Matcher für jedes Tool von diesem Server `mcp__plugin_my-plugin_db__.*`. Verwenden Sie denselben Scope-Tool-Namen im Feld [`if`](#common-fields) eines Handlers. Siehe [Plugin-bereitgestellte MCP-Server](/docs/de/mcp#plugin-provided-mcp-servers), um zu erfahren, wie der Scope-Name erstellt wird.387Tools von einem [Plugin-gebündelten MCP-Server](/docs/de/mcp#plugin-provided-mcp-servers) verwenden ein bereichsbezogenes Server-Segment, das den Plugin-Namen enthält: `mcp__plugin_<plugin-name>_<server-name>__<tool>`. Ein Matcher, der gegen den bloßen Server-Schlüssel geschrieben wird, wird nie für diese Tools ausgelöst. Für ein Plugin namens `my-plugin`, das einen Server unter dem Schlüssel `db` bündelt, erscheint ein `query`-Tool als `mcp__plugin_my-plugin_db__query`, sodass der Matcher für jedes Tool von diesem Server `mcp__plugin_my-plugin_db__.*` ist. Verwenden Sie denselben bereichsbezogenen Tool-Namen im Feld [`if`](#common-fields) eines Handlers. Siehe [Plugin-bereitgestellte MCP-Server](/docs/de/mcp#plugin-provided-mcp-servers) für die Erstellung des bereichsbezogenen Namens.
388 388
389Dieses Beispiel protokolliert alle Memory-Server-Operationen und validiert Schreibvorgänge von jedem MCP-Server:389Dieses Beispiel protokolliert alle Memory-Server-Operationen und validiert Schreibvorgänge von jedem MCP-Server:
390 390
421 421
422Jedes Objekt im inneren `hooks`-Array ist ein Hook-Handler: der Shell-Befehl, HTTP-Endpunkt, MCP-Tool, LLM-Prompt oder Agent, der ausgeführt wird, wenn der Matcher passt. Es gibt fünf Typen:422Jedes Objekt im inneren `hooks`-Array ist ein Hook-Handler: der Shell-Befehl, HTTP-Endpunkt, MCP-Tool, LLM-Prompt oder Agent, der ausgeführt wird, wenn der Matcher passt. Es gibt fünf Typen:
423 423
424* **[Command-Hooks](#command-hook-fields)** (`type: "command"`): führen einen Shell-Befehl aus. Ihr Skript erhält die [JSON-Eingabe](#hook-input-and-output) des Ereignisses über stdin und kommuniziert Ergebnisse über Exit-Codes und stdout zurück.424* **[Command-Hooks](#command-hook-fields)** (`type: "command"`): Führen einen Shell-Befehl aus. Ihr Skript empfängt die [JSON-Eingabe](#hook-input-and-output) des Ereignisses auf stdin und kommuniziert Ergebnisse über Exit-Codes und stdout zurück.
425* **[HTTP-Hooks](#http-hook-fields)** (`type: "http"`): senden die [JSON-Eingabe](#hook-input-and-output) des Ereignisses als HTTP-POST-Request an eine URL. Der Endpunkt kommuniziert Ergebnisse über den Response-Body mit dem gleichen [JSON-Ausgabeformat](#json-output) wie Command-Hooks zurück.425* **[HTTP-Hooks](#http-hook-fields)** (`type: "http"`): Senden Sie die [JSON-Eingabe](#hook-input-and-output) des Ereignisses als HTTP-POST-Anfrage an eine URL. Der Endpunkt kommuniziert Ergebnisse über den Antwortkörper mit dem gleichen [JSON-Ausgabeformat](#json-output) wie Command-Hooks zurück.
426* **[MCP-Tool-Hooks](#mcp-tool-hook-fields)** (`type: "mcp_tool"`): rufen ein Tool auf einem bereits verbundenen [MCP-Server](/docs/de/mcp) auf. Die Textausgabe des Tools wird wie Command-Hook-stdout behandelt.426* **[MCP-Tool-Hooks](#mcp-tool-hook-fields)** (`type: "mcp_tool"`): Rufen Sie ein Tool auf einem bereits verbundenen [MCP-Server](/docs/de/mcp) auf. Die Textausgabe des Tools wird wie Command-Hook-stdout behandelt.
427* **[Prompt-Hooks](#prompt-and-agent-hook-fields)** (`type: "prompt"`): senden einen Prompt an ein Claude-Modell für eine Single-Turn-Evaluierung. Das Modell gibt seine Entscheidung als JSON zurück. Siehe [Prompt-basierte Hooks](#prompt-based-hooks).427* **[Prompt-Hooks](#prompt-and-agent-hook-fields)** (`type: "prompt"`): Senden Sie einen Prompt an ein Claude-Modell zur Einzelturn-Bewertung. Das Modell gibt seine Entscheidung als JSON zurück. Siehe [Prompt-basierte Hooks](#prompt-based-hooks).
428* **[Agent-Hooks](#prompt-and-agent-hook-fields)** (`type: "agent"`): spawnen einen Subagenten, der Tools wie Read, Grep und Glob verwenden kann, um Bedingungen zu überprüfen, bevor eine Entscheidung zurückgegeben wird. Agent-Hooks sind experimentell und können sich ändern. Siehe [Agent-basierte Hooks](#agent-based-hooks).428* **[Agent-Hooks](#prompt-and-agent-hook-fields)** (`type: "agent"`): Spawnen Sie einen Subagent, der Tools wie Read, Grep und Glob verwenden kann, um Bedingungen zu überprüfen, bevor er eine Entscheidung zurückgibt. Agent-Hooks sind experimentell und können sich ändern. Siehe [Agent-basierte Hooks](#agent-based-hooks).
429 429
430Alle passenden Hooks werden parallel ausgeführt. Wenn Sie denselben Handler in mehr als einer Einstellungsdatei definieren, wird er einmal ausgeführt. Eine Kopie desselben Handlers von einem Plugin oder Skill bleibt separat.430Alle passenden Hooks werden parallel ausgeführt. Wenn Sie denselben Handler in mehr als einer Einstellungsdatei definieren, wird er einmal ausgeführt. Eine Kopie desselben Handlers eines Plugins oder Skills bleibt separat.
431 431
432Handler werden im aktuellen Verzeichnis mit der Umgebung von Claude Code ausgeführt. Wenn das aktuelle Verzeichnis nicht mehr existiert, zum Beispiel ein Worktree oder temporäres Verzeichnis, das eine andere Shell während der Sitzung gelöscht hat, führt Claude Code Command-Hooks aus dem ersten dieser Verzeichnisse aus, das noch existiert: das Verzeichnis, in dem die Sitzung gestartet wurde, das Projekt-Root, Ihr Home-Verzeichnis oder das System-Temp-Verzeichnis. Claude Code zeichnet eine Warnung auf, die das Fallback-Verzeichnis im [Debug-Log](#debug-hooks) benennt.432Handler werden im aktuellen Verzeichnis mit der Umgebung von Claude Code ausgeführt. Wenn das aktuelle Verzeichnis nicht mehr existiert, z. B. ein Worktree oder temporäres Verzeichnis, das eine andere Shell während der Sitzung gelöscht hat, führt Claude Code Command-Hooks aus dem ersten dieser Verzeichnisse aus, das noch existiert: das Verzeichnis, in dem die Sitzung gestartet wurde, das Projekt-Root, Ihr Home-Verzeichnis oder das System-Temp-Verzeichnis. Claude Code zeichnet eine Warnung auf, die das Fallback-Verzeichnis im [Debug-Log](#debug-hooks) benennt.
433 433
434Die Umgebungsvariable `$CLAUDE_CODE_REMOTE` ist `"true"` in Remote-Web-Umgebungen und nicht in der lokalen CLI gesetzt. Claude Code v2.1.199 und später setzt [`$CLAUDE_CODE_BRIDGE_SESSION_ID`](/docs/de/env-vars) auf die [Remote Control](/docs/de/remote-control) Sitzungs-ID, während die lokale Sitzung eine aktive Remote Control-Verbindung hat.434Die Umgebungsvariable `$CLAUDE_CODE_REMOTE` ist `"true"` in Remote-Web-Umgebungen und nicht gesetzt in der lokalen CLI. Claude Code v2.1.199 und später setzt [`$CLAUDE_CODE_BRIDGE_SESSION_ID`](/docs/de/env-vars) auf die [Remote Control](/docs/de/remote-control)-Sitzungs-ID, während die lokale Sitzung eine aktive Remote Control-Verbindung hat.
435 435
436<h4 id="common-fields">436<h4 id="common-fields">
437 Gemeinsame Felder437 Gemeinsame Felder
442| Feld | Erforderlich | Beschreibung |442| Feld | Erforderlich | Beschreibung |
443| :-------------- | :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |443| :-------------- | :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
444| `type` | ja | `"command"`, `"http"`, `"mcp_tool"`, `"prompt"` oder `"agent"` |444| `type` | ja | `"command"`, `"http"`, `"mcp_tool"`, `"prompt"` oder `"agent"` |
445| `if` | nein | Berechtigungsregel-Syntax zum Filtern, wann dieser Hook ausgeführt wird, wie `"Bash(git *)"` oder `"Edit(*.ts)"`. Der Hook wird nur ausgeführt, wenn der Tool-Aufruf dem Muster entspricht. Siehe die [Bash-Matching-Tabelle](#bash-if-matching) unten, um zu sehen, wie Bash-Muster gegen Unterbefehle, `$()` und Backticks evaluiert werden. Wird nur auf Tool-Ereignisse evaluiert: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest` und `PermissionDenied`. Bei anderen Ereignissen wird ein Hook mit `if` gesetzt nie ausgeführt. Verwendet die gleiche Syntax wie [Berechtigungsregeln](/docs/de/permissions) |445| `if` | nein | Berechtigungsregelsyntax zum Filtern, wann dieser Hook ausgeführt wird, z. B. `"Bash(git *)"` oder `"Edit(*.ts)"`. Der Hook-Befehl wird nur ausgeführt, wenn der Tool-Aufruf dem Muster entspricht. Siehe die [Bash-Matching-Tabelle](#bash-if-matching) unten, wie Bash-Muster gegen Subcommands, `$()` und Backticks ausgewertet werden. Nur auf Tool-Ereignissen ausgewertet: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest` und `PermissionDenied`. Bei anderen Ereignissen wird ein Hook mit `if` gesetzt nie ausgeführt. Verwendet die gleiche Syntax wie [Berechtigungsregeln](/docs/de/permissions) |
446| `timeout` | nein | Sekunden vor dem Abbruch. Claude Code erzwingt es nicht auf einem Command-Hook, den Sie mit [`async: true`](#run-hooks-in-the-background) ausführen. Standardwerte: 600 für `command`, `http` und `mcp_tool`; 30 für `prompt`; 60 für `agent`. Claude Code senkt den Standardwert für `command`, `http` und `mcp_tool` auf 30 bei [`UserPromptSubmit`](#userpromptsubmit), [`PreModelSwitch`](#premodelswitch) und [`PostModelSwitch`](#postmodelswitch), und auf 10 bei [`MessageDisplay`](#messagedisplay). [`SessionEnd`](#sessionend) Hooks teilen sich ein Budget von 1,5 Sekunden; wenn Ihre Einstellungen einen längeren Pro-Hook-`timeout` setzen, erhöht Claude Code das Budget, um zu passen, bis zu 60 Sekunden |446| `timeout` | nein | Sekunden vor dem Abbruch. Claude Code erzwingt es nicht auf einem Command-Hook, den Sie mit [`async: true`](#run-hooks-in-the-background) ausführen. Standardwerte: 600 für `command`, `http` und `mcp_tool`; 30 für `prompt`; 60 für `agent`. Claude Code senkt den Standard für `command`, `http` und `mcp_tool` auf 30 bei [`UserPromptSubmit`](#userpromptsubmit), [`PreModelSwitch`](#premodelswitch) und [`PostModelSwitch`](#postmodelswitch) und auf 10 bei [`MessageDisplay`](#messagedisplay). [`SessionEnd`](#sessionend)-Hooks teilen sich ein Budget von 1,5 Sekunden; wenn Ihre Einstellungen einen längeren Pro-Hook-`timeout` setzen, erhöht Claude Code das Budget, um zu entsprechen, bis zu 60 Sekunden |
447| `statusMessage` | nein | Benutzerdefinierte Spinner-Nachricht, die angezeigt wird, während der Hook ausgeführt wird |447| `statusMessage` | nein | Benutzerdefinierte Spinner-Nachricht, die angezeigt wird, während der Hook ausgeführt wird |
448| `once` | nein | Wenn `true`, entfernt Claude Code den Hook nach seiner ersten erfolgreichen Ausführung. Eine Ausführung, die fehlschlägt, mit Exit-Code 2 blockiert oder Timeout hat, lässt den Hook an Ort und Stelle, daher wird er beim nächsten passenden Ereignis erneut ausgeführt. Wird nur für Hooks berücksichtigt, die in [Skill-Frontmatter](#hooks-in-skills-and-agents) deklariert sind; wird in Einstellungsdateien und Agent-Frontmatter ignoriert |448| `once` | nein | Wenn `true`, entfernt Claude Code den Hook nach seiner ersten erfolgreichen Ausführung. Eine Ausführung, die fehlschlägt, mit Exit-Code 2 blockiert oder das Timeout überschreitet, hinterlässt den Hook an Ort und Stelle, sodass er beim nächsten passenden Ereignis erneut ausgeführt wird. Wird nur für Hooks beachtet, die in [Skill-Frontmatter](#hooks-in-skills-and-agents) deklariert sind; wird in Einstellungsdateien und Agent-Frontmatter ignoriert |
449 449
450Das Feld `if` enthält genau eine Berechtigungsregel. Es gibt keine `&&`-, `||`- oder List-Syntax zum Kombinieren von Regeln; um mehrere Bedingungen anzuwenden, definieren Sie einen separaten Hook-Handler für jeden.450Das Feld `if` enthält genau eine Berechtigungsregel. Es gibt keine `&&`-, `||`- oder Listsyntax zum Kombinieren von Regeln; um mehrere Bedingungen anzuwenden, definieren Sie einen separaten Hook-Handler für jede.
451 451
452In einer `if`-Bedingung für ein Datei-Tool passt ein Single-Segment-Verzeichnismuster wie `"Edit(src/**)"` nur zum `src`-Verzeichnis im Arbeitsverzeichnis und den Dateien darunter. Um ein Verzeichnis namens `src` in beliebiger Tiefe zu treffen, schreiben Sie `"Edit(**/src/**)"`. Vor v2.1.214 passte `"Edit(src/**)"` zu einem Verzeichnis namens `src` in beliebiger Tiefe unter dem Arbeitsverzeichnis.452In einer `if`-Bedingung für ein Datei-Tool passt ein Verzeichnismuster mit einem Segment wie `"Edit(src/**)"` nur auf das `src`-Verzeichnis im Arbeitsverzeichnis und die Dateien darunter. Um ein Verzeichnis namens `src` in beliebiger Tiefe abzugleichen, schreiben Sie `"Edit(**/src/**)"`. Vor v2.1.214 passte `"Edit(src/**)"` auf ein Verzeichnis namens `src` in beliebiger Tiefe unter dem Arbeitsverzeichnis.
453 453
454<span id="bash-if-matching" />Für Bash-Muster hängt davon ab, ob Ihr Hook-Befehl ausgeführt wird, von der Form des Musters und dem Bash-Befehl, den Claude aufruft. Führende `VAR=value`-Zuweisungen werden vor dem Abgleich entfernt.454<span id="bash-if-matching" />Für Bash-Muster hängt davon ab, ob Ihr Hook-Befehl ausgeführt wird, von der Form des Musters und dem Bash-Befehl ab, den Claude aufruft. Führende `VAR=value`-Zuweisungen werden vor dem Abgleich entfernt.
455 455
456| `if`-Muster | Bash-Befehl | Hook wird ausgeführt? | Warum |456| `if`-Muster | Bash-Befehl | Hook wird ausgeführt? | Warum |
457| :----------------- | :-------------------------- | :-------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------ |457| :----------------- | :-------------------------- | :-------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------- |
458| `Bash(git *)` | `FOO=bar git push` | ja | führende Zuweisungen werden entfernt; `git push` passt |458| `Bash(git *)` | `FOO=bar git push` | ja | führende Zuweisungen werden entfernt; `git push` passt |
459| `Bash(git *)` | `npm test && git push` | ja | jeder Unterbefehl wird überprüft; `git push` passt |459| `Bash(git *)` | `npm test && git push` | ja | jeder Subbefehl wird überprüft; `git push` passt |
460| `Bash(rm *)` | `echo $(rm -rf /)` | ja | Befehle in `$()` und Backticks werden überprüft; `rm -rf /` passt |460| `Bash(rm *)` | `echo $(rm -rf /)` | ja | Befehle in `$()` und Backticks werden überprüft; `rm -rf /` passt |
461| `Bash(rm *)` | `echo $(date)` | nein | kein Unterbefehl passt zu `rm *` |461| `Bash(rm *)` | `echo $(date)` | nein | kein Subbefehl passt auf `rm *` |
462| `Bash(cat *)` | `echo before $(date) after` | nein | eine Substitution kann an jeder Argumentposition sitzen, daher werden der vollständige Befehl und `date` beide überprüft; keiner passt zu `cat *` |462| `Bash(cat *)` | `echo before $(date) after` | nein | eine Substitution kann an jeder Argumentposition sitzen, sodass der vollständige Befehl und `date` beide überprüft werden; keiner passt auf `cat *` |
463| `Bash(git *)` | `$TOOL git push` | ja | Claude Code kann nicht sagen, zu was sich der Befehlsname erweitert, daher wird der Hook ausgeführt |463| `Bash(git *)` | `$TOOL git push` | ja | Claude Code kann nicht sagen, worauf sich der Befehlsname erweitert, sodass es den Hook ausführt |
464| `Bash(git push *)` | `echo $(date)` | ja | Muster, die mehr als den Befehlsnamen angeben, führen den Hook trotzdem bei `$()`, Backticks oder `$VAR` aus |464| `Bash(git push *)` | `echo $(date)` | ja | Muster, die mehr als den Befehlsnamen angeben, führen den Hook trotzdem bei `$()`, Backticks oder `$VAR` aus |
465 465
466Wenn Claude Code nicht bestimmen kann, welche Befehle die Bash-Eingabe ausführt, wird Ihr Hook unabhängig vom Muster ausgeführt. Da der `if`-Filter Best-Effort ist, verwenden Sie das [Berechtigungssystem](/docs/de/permissions) statt eines Hooks, um ein hartes Zulassen oder Verweigern durchzusetzen.466Wenn Claude Code nicht bestimmen kann, welche Befehle die Bash-Eingabe ausführt, führt es Ihren Hook unabhängig vom Muster aus. Da der `if`-Filter Best-Effort ist, verwenden Sie das [Berechtigungssystem](/docs/de/permissions) statt eines Hooks, um ein hartes Zulassen oder Verweigern durchzusetzen.
467 467
468<h4 id="command-hook-fields">468<h4 id="command-hook-fields">
469 Command-Hook-Felder469 Command-Hook-Felder
472Zusätzlich zu den [gemeinsamen Feldern](#common-fields) akzeptieren Command-Hooks diese Felder:472Zusätzlich zu den [gemeinsamen Feldern](#common-fields) akzeptieren Command-Hooks diese Felder:
473 473
474| Feld | Erforderlich | Beschreibung |474| Feld | Erforderlich | Beschreibung |
475| :------------ | :----------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |475| :------------ | :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
476| `command` | ja | Shell-Befehl zum Ausführen. Mit `args` die ausführbare Datei zum direkten Spawnen. Siehe [Exec-Form und Shell-Form](#exec-form-and-shell-form) |476| `command` | ja | Shell-Befehl zum Ausführen. Mit `args` die Ausführungsdatei zum direkten Spawnen. Siehe [Exec-Form und Shell-Form](#exec-form-and-shell-form) |
477| `args` | nein | Argumentliste. Wenn vorhanden, wird `command` als ausführbare Datei aufgelöst und direkt mit `args` als Argumentvektor gespawnt, ohne Shell. Siehe [Exec-Form und Shell-Form](#exec-form-and-shell-form) |477| `args` | nein | Argumentliste. Wenn vorhanden, wird `command` als Ausführungsdatei aufgelöst und direkt mit `args` als Argumentvektor gespawnt, ohne Shell. Siehe [Exec-Form und Shell-Form](#exec-form-and-shell-form) |
478| `async` | nein | Wenn `true`, wird im Hintergrund ausgeführt, ohne zu blockieren. Siehe [Hooks im Hintergrund ausführen](#run-hooks-in-the-background) |478| `async` | nein | Wenn `true`, wird im Hintergrund ohne Blockierung ausgeführt. Siehe [Hooks im Hintergrund ausführen](#run-hooks-in-the-background) |
479| `asyncRewake` | nein | Wenn `true`, wird im Hintergrund ausgeführt und weckt Claude bei Exit-Code 2 auf. Der stderr des Hooks oder stdout, wenn stderr leer ist, wird Claude als Systemerinnerung angezeigt, damit es auf einen lang laufenden Hintergrund-Fehler reagieren kann |479| `asyncRewake` | nein | Wenn `true`, wird im Hintergrund ausgeführt und weckt Claude bei Exit-Code 2 auf. Die stderr des Hooks oder stdout, wenn stderr leer ist, wird Claude als Systemerinnerung angezeigt, damit es auf einen langfristigen Hintergrund-Fehler reagieren kann |
480| `shell` | nein | Shell zum Verwenden für diesen Hook. Akzeptiert `"bash"` oder `"powershell"`. Standardwert ist `"bash"` oder `"powershell"` unter Windows, wenn Git Bash nicht installiert ist. Das Setzen von `"powershell"` führt den Befehl über PowerShell unter Windows aus. Erfordert nicht `CLAUDE_CODE_USE_POWERSHELL_TOOL`, da Hooks PowerShell direkt spawnen. Wird ignoriert, wenn `args` gesetzt ist |480| `shell` | nein | Shell, die für diesen Hook verwendet werden soll. Akzeptiert `"bash"` oder `"powershell"`. Standardmäßig `"bash"` oder `"powershell"` unter Windows, wenn Git Bash nicht installiert ist. Das Setzen von `"powershell"` führt den Befehl über PowerShell unter Windows aus. Erfordert nicht `CLAUDE_CODE_USE_POWERSHELL_TOOL`, da Hooks PowerShell direkt spawnen. Wird ignoriert, wenn `args` gesetzt ist |
481 481
482<a id="exec-form-and-shell-form" />482<a id="exec-form-and-shell-form" />
483 483
485 Exec-Form und Shell-Form485 Exec-Form und Shell-Form
486</h5>486</h5>
487 487
488Ein Command-Hook wird als Exec-Form ausgeführt, wenn `args` gesetzt ist, und als Shell-Form, wenn `args` weggelassen ist. Setzen Sie `args`, wenn der Hook auf einen [Pfad-Platzhalter](#reference-scripts-by-path) verweist, da jedes Element als ein Argument ohne Anführungszeichen übergeben wird. Lassen Sie `args` weg, wenn Sie Shell-Funktionen wie Pipes oder `&&` benötigen, oder wenn keine dieser Bedenken zutrifft.488Ein Command-Hook wird als Exec-Form ausgeführt, wenn `args` gesetzt ist, und als Shell-Form, wenn `args` weggelassen ist. Setzen Sie `args`, wenn der Hook auf einen [Pfad-Platzhalter](#reference-scripts-by-path) verweist, da jedes Element als ein Argument ohne Anführungszeichen übergeben wird. Lassen Sie `args` weg, wenn Sie Shell-Funktionen wie Pipes oder `&&` benötigen, oder wenn keine der beiden Bedenken zutrifft.
489 489
490**Exec-Form** wird ausgeführt, wenn `args` vorhanden ist. Claude Code löst `command` als ausführbare Datei auf `PATH` auf und spawnt sie direkt mit `args` als Argumentvektor. Es gibt keine Shell, daher ist jedes `args`-Element genau ein Argument, wie geschrieben, und Pfad-Platzhalter wie `${CLAUDE_PLUGIN_ROOT}` werden als einfache Zeichenketten in `command` und in jedes `args`-Element ersetzt. Sonderzeichen wie Apostrophe, `$` und Backticks werden wörtlich durchgeleitet, da es keine Shell gibt, die sie interpretiert. Auf keiner Plattform findet Shell-Tokenisierung statt.490**Exec-Form** wird ausgeführt, wenn `args` vorhanden ist. Claude Code löst `command` als Ausführungsdatei auf `PATH` auf und spawnt es direkt mit `args` als Argumentvektor. Es gibt keine Shell, sodass jedes `args`-Element genau ein Argument ist, wie geschrieben, und Pfad-Platzhalter wie `${CLAUDE_PLUGIN_ROOT}` werden in `command` und in jedes `args`-Element als einfache Zeichenketten ersetzt. Sonderzeichen wie Apostrophe, `$` und Backticks werden wörtlich durchgeleitet, da es keine Shell gibt, um sie zu interpretieren. Auf keiner Plattform findet Shell-Tokenisierung statt.
491 491
492**Shell-Form** wird ausgeführt, wenn `args` fehlt. Die `command`-Zeichenkette wird an eine Shell übergeben: `sh -c` auf macOS und Linux, Git Bash unter Windows oder PowerShell, wenn Git Bash nicht installiert ist. Setzen Sie das Feld `shell`, um explizit zu wählen. Die Shell tokenisiert die Zeichenkette, erweitert Variablen und interpretiert Pipes, `&&`, Umleitungen und Globs.492**Shell-Form** wird ausgeführt, wenn `args` fehlt. Die `command`-Zeichenkette wird an eine Shell übergeben: `sh -c` auf macOS und Linux, Git Bash unter Windows oder PowerShell, wenn Git Bash nicht installiert ist. Setzen Sie das Feld `shell`, um explizit zu wählen. Die Shell tokenisiert die Zeichenkette, erweitert Variablen und interpretiert Pipes, `&&`, Umleitungen und Globs.
493 493
494<Note>494<Note>
495 Unter Windows erfordert die Exec-Form, dass `command` zu einer echten ausführbaren Datei wie `.exe` aufgelöst wird. Die `.cmd` und `.bat` Shims, die npm, npx, eslint und andere Tools in `node_modules/.bin` installieren, sind keine ausführbaren Dateien und können ohne Shell nicht gespawnt werden. Um sie in Exec-Form auszuführen, rufen Sie das zugrunde liegende Skript direkt mit `node` auf, zum Beispiel `"command": "node", "args": ["${CLAUDE_PLUGIN_ROOT}/node_modules/eslint/bin/eslint.js"]`. Das `node` plus Skript-Pfad-Muster funktioniert auf jeder Plattform, da `node.exe` eine echte Binärdatei ist. Um einen `.cmd` oder `.bat` Shim nach Name auszuführen, verwenden Sie Shell-Form.495 Unter Windows erfordert die Exec-Form, dass `command` sich zu einer echten Ausführungsdatei wie `.exe` auflöst. Die `.cmd`- und `.bat`-Shims, die npm, npx, eslint und andere Tools in `node_modules/.bin` installieren, sind keine Ausführungsdateien und können ohne Shell nicht gespawnt werden. Um sie in Exec-Form auszuführen, rufen Sie das zugrunde liegende Skript direkt mit `node` auf, z. B. `"command": "node", "args": ["${CLAUDE_PLUGIN_ROOT}/node_modules/eslint/bin/eslint.js"]`. Das Muster `node` plus Skriptpfad funktioniert auf jeder Plattform, da `node.exe` eine echte Binärdatei ist. Um einen `.cmd`- oder `.bat`-Shim nach Name auszuführen, verwenden Sie Shell-Form.
496</Note>496</Note>
497 497
498Dieses Beispiel führt ein Node-Skript aus, das mit einem Plugin gebündelt ist. Exec-Form übergibt den aufgelösten Skript-Pfad als ein Argument ohne Anführungszeichen:498Dieses Beispiel führt ein Node-Skript aus, das mit einem Plugin gebündelt ist. Exec-Form übergibt den aufgelösten Skriptpfad als ein Argument ohne Anführungszeichen:
499 499
500```json theme={null}500```json theme={null}
501{501{
514}514}
515```515```
516 516
517Beide Formen unterstützen die gleichen [Pfad-Platzhalter](#reference-scripts-by-path), und beide exportieren sie als Umgebungsvariablen `CLAUDE_PROJECT_DIR`, `CLAUDE_PLUGIN_ROOT` und `CLAUDE_PLUGIN_DATA` auf dem gespawnten Prozess, daher kann ein Skript `process.env.CLAUDE_PLUGIN_ROOT` lesen, unabhängig davon, wie es gestartet wurde.517Beide Formen unterstützen die gleichen [Pfad-Platzhalter](#reference-scripts-by-path) und exportieren sie beide als Umgebungsvariablen `CLAUDE_PROJECT_DIR`, `CLAUDE_PLUGIN_ROOT` und `CLAUDE_PLUGIN_DATA` auf dem gespawnten Prozess, sodass ein Skript `process.env.CLAUDE_PLUGIN_ROOT` unabhängig davon lesen kann, wie es gestartet wurde.
518 518
519Plugin-Hooks ersetzen zusätzlich [`${user_config.*}`](/docs/de/plugins-reference#user-configuration) Werte, nur in Exec-Form: Der Wert wird als einfache Zeichenkette in `command` und in jedes `args`-Element ersetzt, daher wird er nicht erneut von der Shell geparst.519Plugin-Hooks ersetzen zusätzlich [`${user_config.*}`](/docs/de/plugins-reference#user-configuration)-Werte, nur in Exec-Form: Der Wert wird in `command` und in jedes `args`-Element als einfache Zeichenkette ersetzt, sodass die Shell ihn nicht erneut analysiert.
520 520
521Ein Shell-Form-Plugin-Hook, dessen `command` auf `${user_config.*}` verweist, schlägt mit einem [Fehler](/docs/de/errors#plugin-command-references-user-config) fehl, anstatt ausgeführt zu werden. Um einen Optionswert aus einem Shell-Form-Hook zu verwenden, lesen Sie die Umgebungsvariable `$CLAUDE_PLUGIN_OPTION_<KEY>`, wie `$CLAUDE_PLUGIN_OPTION_WEBHOOK_URL` für eine `webhook_url`-Option, oder setzen Sie `args`, um den Hook auf Exec-Form umzuschalten. Vor v2.1.207 ersetzten Shell-Form-Plugin-Hook-Befehle auch `${user_config.*}`.521Ein Shell-Form-Plugin-Hook, dessen `command` auf `${user_config.*}` verweist, schlägt mit einem [Fehler](/docs/de/errors#plugin-command-references-user-config) fehl, anstatt ausgeführt zu werden. Um einen Optionswert aus einem Shell-Form-Hook zu verwenden, lesen Sie die Umgebungsvariable `$CLAUDE_PLUGIN_OPTION_<KEY>`, z. B. `$CLAUDE_PLUGIN_OPTION_WEBHOOK_URL` für eine `webhook_url`-Option, oder setzen Sie `args`, um den Hook auf Exec-Form umzuschalten. Vor v2.1.207 ersetzten Shell-Form-Plugin-Hook-Befehle auch `${user_config.*}`.
522 522
523<Note>523<Note>
524 In Exec-Form ist `command` nur der ausführbare Name oder Pfad. Wenn `command` ein bloßer Name ohne Pfad-Trennzeichen ist und Leerzeichen neben `args` enthält, protokolliert Claude Code eine Warnung, da das Spawn fehlschlagen wird: Es gibt keine ausführbare Datei namens `node script.js`. Verschieben Sie die zusätzlichen Token in `args`. Absolute Pfade mit Leerzeichen, wie `C:\Program Files\nodejs\node.exe`, sind eine einzelne gültige ausführbare Datei und lösen die Warnung nicht aus.524 In Exec-Form ist `command` nur der Ausführungsdateiname oder -pfad. Wenn `command` ein bloßer Name ohne Pfad-Trennzeichen ist und Leerzeichen neben `args` enthält, protokolliert Claude Code eine Warnung, da das Spawn fehlschlägt: Es gibt keine Ausführungsdatei namens `node script.js`. Verschieben Sie die zusätzlichen Token in `args`. Absolute Pfade mit Leerzeichen, z. B. `C:\Program Files\nodejs\node.exe`, sind eine einzelne gültige Ausführungsdatei und lösen die Warnung nicht aus.
525</Note>525</Note>
526 526
527<h4 id="http-hook-fields">527<h4 id="http-hook-fields">
532 532
533| Feld | Erforderlich | Beschreibung |533| Feld | Erforderlich | Beschreibung |
534| :--------------- | :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |534| :--------------- | :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
535| `url` | ja | URL, an die der POST-Request gesendet werden soll |535| `url` | ja | URL zum Senden der POST-Anfrage an |
536| `headers` | nein | Zusätzliche HTTP-Header als Schlüssel-Wert-Paare. Werte unterstützen Umgebungsvariablen-Interpolation mit `$VAR_NAME` oder `${VAR_NAME}` Syntax. Nur Variablen, die in `allowedEnvVars` aufgelistet sind, werden aufgelöst |536| `headers` | nein | Zusätzliche HTTP-Header als Schlüssel-Wert-Paare. Werte unterstützen Umgebungsvariablen-Interpolation mit `$VAR_NAME` oder `${VAR_NAME}`-Syntax. Nur Variablen in `allowedEnvVars` werden aufgelöst |
537| `allowedEnvVars` | nein | Liste von Umgebungsvariablennamen, die in Header-Werte interpoliert werden dürfen. Verweise auf nicht aufgelistete Variablen werden durch leere Zeichenketten ersetzt. Erforderlich für jede Umgebungsvariablen-Interpolation |537| `allowedEnvVars` | nein | Liste von Umgebungsvariablennamen, die in Header-Werte interpoliert werden dürfen. Verweise auf nicht aufgelistete Variablen werden durch leere Zeichenketten ersetzt. Erforderlich für jede Umgebungsvariablen-Interpolation |
538 538
539Claude Code sendet die [JSON-Eingabe](#hook-input-and-output) des Hooks als POST-Request-Body mit `Content-Type: application/json`. Der Response-Body verwendet das gleiche [JSON-Ausgabeformat](#json-output) wie Command-Hooks.539Claude Code sendet die [JSON-Eingabe](#hook-input-and-output) des Hooks als POST-Anfragekörper mit `Content-Type: application/json`. Der Antwortkörper verwendet das gleiche [JSON-Ausgabeformat](#json-output) wie Command-Hooks.
540 540
541Die Fehlerbehandlung unterscheidet sich von Command-Hooks; siehe [HTTP-Response-Behandlung](#http-response-handling).541Die Fehlerbehandlung unterscheidet sich von Command-Hooks; siehe [HTTP-Antwortbehandlung](#http-response-handling).
542 542
543Dieses Beispiel sendet `PreToolUse`-Ereignisse an einen lokalen Validierungsdienst und authentifiziert sich mit einem Token aus der `MY_TOKEN`-Umgebungsvariable:543Dieses Beispiel sendet `PreToolUse`-Ereignisse an einen lokalen Validierungsdienst und authentifiziert sich mit einem Token aus der Umgebungsvariable `MY_TOKEN`:
544 544
545```json theme={null}545```json theme={null}
546{546{
572Zusätzlich zu den [gemeinsamen Feldern](#common-fields) akzeptieren MCP-Tool-Hooks diese Felder:572Zusätzlich zu den [gemeinsamen Feldern](#common-fields) akzeptieren MCP-Tool-Hooks diese Felder:
573 573
574| Feld | Erforderlich | Beschreibung |574| Feld | Erforderlich | Beschreibung |
575| :------- | :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |575| :------- | :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
576| `server` | ja | Name eines konfigurierten MCP-Servers. Für einen [Plugin-gebündelten Server](/docs/de/mcp#plugin-provided-mcp-servers) ist dies der Scope-Name `plugin:<plugin-name>:<server-name>`, wie `plugin:my-plugin:db`, nicht der bloße Server-Schlüssel. Der Server muss bereits verbunden sein; der Hook löst niemals einen OAuth- oder Verbindungsfluss aus |576| `server` | ja | Name eines konfigurierten MCP-Servers. Für einen [Plugin-gebündelten Server](/docs/de/mcp#plugin-provided-mcp-servers) ist dies der bereichsbezogene Name `plugin:<plugin-name>:<server-name>`, z. B. `plugin:my-plugin:db`, nicht der bloße Server-Schlüssel. Der Server muss bereits verbunden sein; der Hook löst nie einen OAuth- oder Verbindungsfluss aus |
577| `tool` | ja | Name des Tools, das auf diesem Server aufgerufen werden soll |577| `tool` | ja | Name des Tools, das auf diesem Server aufgerufen werden soll |
578| `input` | nein | Argumente, die an das Tool übergeben werden. String-Werte unterstützen `${path}`-Substitution aus der [JSON-Eingabe](#hook-input-and-output) des Hooks, wie `"${tool_input.file_path}"` |578| `input` | nein | Argumente, die an das Tool übergeben werden. Zeichenkettenwerte unterstützen `${path}`-Ersetzung aus der [JSON-Eingabe](#hook-input-and-output) des Hooks, z. B. `"${tool_input.file_path}"` |
579 579
580Claude Code liest die Textausgabe des Tools auf die gleiche Weise wie Command-Hook-stdout, nach der [Parsing-Regel unter Exit-Code 0](#exit-code-0). Wenn der benannte Server nicht verbunden ist oder das Tool `isError: true` zurückgibt, erzeugt der Hook einen nicht-blockierenden Fehler und die Ausführung wird fortgesetzt.580Claude Code liest den Textinhalt des Tools auf die gleiche Weise wie Command-Hook-stdout und folgt der [Parsing-Regel unter Exit-Code 0](#exit-code-0). Wenn der benannte Server nicht verbunden ist oder das Tool `isError: true` zurückgibt, erzeugt der Hook einen nicht blockierenden Fehler und die Ausführung wird fortgesetzt.
581 581
582Dieses Beispiel ruft das Tool `security_scan` auf dem MCP-Server `my_server` nach jedem `Write` oder `Edit` auf und übergibt den Pfad der bearbeiteten Datei:582Dieses Beispiel ruft das Tool `security_scan` auf dem MCP-Server `my_server` nach jedem `Write` oder `Edit` auf und übergibt den Pfad der bearbeiteten Datei:
583 583
601}601}
602```602```
603 603
604Ein `mcp_tool`-Hook kann nur ausgeführt werden, sobald Claude Code die MCP-Server der Sitzung für Hooks verfügbar gemacht hat. `SessionStart` und `Setup` können vor diesem Punkt ausgelöst werden:604Ein `mcp_tool`-Hook kann nur ausgeführt werden, nachdem Claude Code die MCP-Server der Sitzung für Hooks verfügbar gemacht hat. `SessionStart` und `Setup` können vor diesem Punkt ausgelöst werden:
605 605
606* **Beim Start**: `SessionStart` wird ausgelöst, bevor die Server verfügbar sind, auch wenn Sie mit `--continue` oder `--resume` starten. Claude Code überspringt die `mcp_tool`-Hooks des Ereignisses, ohne ihre Tools aufzurufen, und das [Debug-Log](#debug-hooks) zeichnet `mcp_tool hooks are not available for the 'SessionStart' hook event (no MCP client context)` auf.606* **Beim Start**: `SessionStart` wird ausgelöst, bevor die Server verfügbar sind, auch wenn Sie mit `--continue` oder `--resume` starten. Claude Code überspringt die `mcp_tool`-Hooks des Ereignisses, ohne ihre Tools aufzurufen, und das [Debug-Log](#debug-hooks) zeichnet `mcp_tool hooks are not available for the 'SessionStart' hook event (no MCP client context)` auf.
607* **Später in einer laufenden Sitzung**: nach `/clear` oder einer Komprimierung wird `SessionStart` erneut ausgelöst, wobei die Server bereits verfügbar sind, und seine `mcp_tool`-Hooks werden ausgeführt.607* **Später in einer laufenden Sitzung**: Nach `/clear` oder einer Komprimierung wird `SessionStart` erneut ausgelöst, wobei die Server bereits verfügbar sind, und seine `mcp_tool`-Hooks werden ausgeführt.
608* **Bei `Setup`**: `Setup` wird immer ausgelöst, bevor die Server verfügbar sind, daher überspringt Claude Code seine `mcp_tool`-Hooks jedes Mal und zeichnet die gleiche Nachricht auf, die `Setup` benennt.608* **Bei `Setup`**: `Setup` wird immer ausgelöst, bevor die Server verfügbar sind, sodass Claude Code seine `mcp_tool`-Hooks jedes Mal überspringt und die gleiche Nachricht aufzeichnet, die `Setup` benennt.
609 609
610Zum Beispiel ruft diese Konfiguration das Tool `load_context` auf dem MCP-Server `my_server` aus einem `SessionStart`-Hook ohne Matcher auf, daher gilt es für jede `SessionStart`-Quelle:610Zum Beispiel ruft diese Konfiguration das Tool `load_context` auf dem MCP-Server `my_server` aus einem `SessionStart`-Hook ohne Matcher auf, sodass es auf jede `SessionStart`-Quelle angewendet wird:
611 611
612```json theme={null}612```json theme={null}
613{613{
627}627}
628```628```
629 629
630Wenn Sie `claude` ausführen, überspringt Claude Code diesen Hook, ruft `load_context` nie auf und schreibt die Nachricht `no MCP client context` in das Debug-Log. Führen Sie `/clear` in dieser gleichen Sitzung aus und der Hook wird ausgeführt und ruft `load_context` auf. Ein `type: "command"`-Hook auf `SessionStart` wird beim Start ausgeführt, daher verwenden Sie einen für alles, das die Sitzung von ihrer ersten Runde benötigt.630Wenn Sie `claude` ausführen, überspringt Claude Code diesen Hook, ruft `load_context` nie auf und schreibt die Nachricht `no MCP client context` in das Debug-Log. Führen Sie `/clear` in dieser gleichen Sitzung aus und der Hook wird ausgeführt und ruft `load_context` auf. Ein `type: "command"`-Hook auf `SessionStart` wird beim Start ausgeführt, verwenden Sie also einen für alles, das die Sitzung von ihrem ersten Turn benötigt.
631 631
632<h4 id="prompt-and-agent-hook-fields">632<h4 id="prompt-and-agent-hook-fields">
633 Prompt- und Agent-Hook-Felder633 Prompt- und Agent-Hook-Felder
636Zusätzlich zu den [gemeinsamen Feldern](#common-fields) akzeptieren Prompt- und Agent-Hooks diese Felder:636Zusätzlich zu den [gemeinsamen Feldern](#common-fields) akzeptieren Prompt- und Agent-Hooks diese Felder:
637 637
638| Feld | Erforderlich | Beschreibung |638| Feld | Erforderlich | Beschreibung |
639| :------- | :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |639| :------- | :----------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
640| `prompt` | ja | Prompt-Text zum Senden an das Modell. Verwenden Sie `$ARGUMENTS` als Platzhalter für die Hook-Eingabe JSON. Escapen Sie mit einem Backslash, um Literaltext einzuschließen: `\$1.00` wird als `$1.00` dargestellt |640| `prompt` | ja | Prompt-Text zum Senden an das Modell. Verwenden Sie `$ARGUMENTS` als Platzhalter für die Hook-Eingabe-JSON. Mit einem Backslash escapen, um wörtlichen Text einzuschließen: `\$1.00` wird als `$1.00` gerendert |
641| `model` | nein | Modell zur Verwendung für die Evaluierung. Standardwert ist ein schnelles Modell |641| `model` | nein | Modell, das für die Bewertung verwendet werden soll. Standardmäßig ein schnelles Modell |
642 642
643<h3 id="reference-scripts-by-path">643<h3 id="reference-scripts-by-path">
644 Skripte nach Pfad referenzieren644 Skripte nach Pfad referenzieren
647Verwenden Sie diese Platzhalter, um Hook-Skripte relativ zum Projekt- oder Plugin-Root zu referenzieren, unabhängig vom Arbeitsverzeichnis, wenn der Hook ausgeführt wird:647Verwenden Sie diese Platzhalter, um Hook-Skripte relativ zum Projekt- oder Plugin-Root zu referenzieren, unabhängig vom Arbeitsverzeichnis, wenn der Hook ausgeführt wird:
648 648
649* `${CLAUDE_PROJECT_DIR}`: das Projekt-Root, wo die Sitzung gestartet wurde. Claude Code setzt diese Variable auch in der Umgebung von [stdio MCP-Servern](/docs/de/mcp#option-3-add-a-local-stdio-server) und Plugin-LSP-Servern.649* `${CLAUDE_PROJECT_DIR}`: das Projekt-Root, wo die Sitzung gestartet wurde. Claude Code setzt diese Variable auch in der Umgebung von [stdio MCP-Servern](/docs/de/mcp#option-3-add-a-local-stdio-server) und Plugin-LSP-Servern.
650* `${CLAUDE_PLUGIN_ROOT}`: das Installationsverzeichnis des Plugins, für Skripte, die mit einem [Plugin](/docs/de/plugins) gebündelt sind. Siehe [Plugin-Umgebungsvariablen](/docs/de/plugins-reference#environment-variables), um zu erfahren, wie sich der Pfad über Updates verhält.650* `${CLAUDE_PLUGIN_ROOT}`: das Plugin-Installationsverzeichnis für Skripte, die mit einem [Plugin](/docs/de/plugins) gebündelt sind. Siehe [Plugin-Umgebungsvariablen](/docs/de/plugins-reference#environment-variables) für das Verhalten des Pfads über Updates hinweg.
651* `${CLAUDE_PLUGIN_DATA}`: das [persistente Datenverzeichnis](/docs/de/plugins-reference#persistent-data-directory) des Plugins, für Abhängigkeiten und Zustand, die Plugin-Updates überstehen sollten.651* `${CLAUDE_PLUGIN_DATA}`: das [persistente Datenverzeichnis](/docs/de/plugins-reference#persistent-data-directory) des Plugins für Abhängigkeiten und Status, die Plugin-Updates überstehen sollten.
652 652
653<Note>653<Note>
654 **Worktrees sind anders.** Wenn Claude während der Sitzung einen [Worktree](/docs/de/worktrees) betritt, behält Claude Code `${CLAUDE_PROJECT_DIR}` dort, wo es war, und übergibt den Worktree-Pfad an Ihre Hooks auf andere Weise:654 **Worktrees sind anders.** Wenn Claude während der Sitzung einen [Worktree](/docs/de/worktrees) betritt, behält Claude Code `${CLAUDE_PROJECT_DIR}` bei, wo es war, und übergibt den Worktree-Pfad Ihren Hooks auf andere Weise:
655 655
656 * **`${CLAUDE_PROJECT_DIR}` bleibt stehen**: Es zeigt immer noch auf das Projekt-Root, wo die Sitzung gestartet wurde, daher führt ein Befehl wie `${CLAUDE_PROJECT_DIR}/.claude/hooks/check-style.sh` das Skript immer noch im Haupt-Checkout aus.656 * **`${CLAUDE_PROJECT_DIR}` bleibt stehen**: Es zeigt immer noch auf das Projekt-Root, wo die Sitzung gestartet wurde, sodass ein Befehl wie `${CLAUDE_PROJECT_DIR}/.claude/hooks/check-style.sh` das Skript immer noch im Haupt-Checkout ausführt.
657 * **`cwd` folgt Claude**: Das Feld `cwd` in der Hook-[Eingabe JSON](#common-input-fields) ist das Worktree-Root, nachdem Claude einen Worktree betritt, und das neue Verzeichnis, nachdem Claude `cd` ausführt. Lesen Sie es, wenn ein Hook wissen muss, in welchem Verzeichnis Claude arbeitet.657 * **`cwd` folgt Claude**: Das Feld `cwd` in der Hook-[Eingabe-JSON](#common-input-fields) ist das Worktree-Root, nachdem Claude einen Worktree betritt, und das neue Verzeichnis, nachdem Claude `cd` ausführt. Lesen Sie es, wenn ein Hook wissen muss, welches Verzeichnis Claude bearbeitet.
658</Note>658</Note>
659 659
660Bevorzugen Sie [Exec-Form](#exec-form-and-shell-form) für jeden Hook, der auf einen Pfad-Platzhalter verweist. In Shell-Form wickeln Sie jeden Platzhalter in doppelte Anführungszeichen ein.660Bevorzugen Sie [Exec-Form](#exec-form-and-shell-form) für jeden Hook, der auf einen Pfad-Platzhalter verweist. In Shell-Form umgeben Sie jeden Platzhalter mit doppelten Anführungszeichen.
661 661
662<Tabs>662<Tabs>
663 <Tab title="Projekt-Skripte">663 <Tab title="Projekt-Skripte">
664 Dieses Beispiel verwendet `${CLAUDE_PROJECT_DIR}`, um einen Style-Checker aus dem `.claude/hooks/`-Verzeichnis des Projekts nach jedem `Write`- oder `Edit`-Tool-Aufruf auszuführen:664 Dieses Beispiel verwendet `${CLAUDE_PROJECT_DIR}`, um einen Style-Checker aus dem Verzeichnis `.claude/hooks/` des Projekts nach jedem `Write`- oder `Edit`-Tool-Aufruf auszuführen:
665 665
666 ```json theme={null}666 ```json theme={null}
667 {667 {
717 Hooks in Skills und Agents717 Hooks in Skills und Agents
718</h3>718</h3>
719 719
720Zusätzlich zu Einstellungsdateien und Plugins können Hooks direkt in [Skills](/docs/de/skills) und [Subagenten](/docs/de/sub-agents) mit Frontmatter definiert werden, im gleichen Konfigurationsformat wie einstellungsbasierte Hooks. Wie lange Claude Code sie registriert hält, hängt von der Komponente ab:720Zusätzlich zu Einstellungsdateien und Plugins können Hooks direkt in [Skills](/docs/de/skills) und [Subagents](/docs/de/sub-agents) mit Frontmatter im gleichen Konfigurationsformat wie einstellungsbasierte Hooks definiert werden. Wie lange Claude Code sie registriert hält, hängt von der Komponente ab:
721 721
722* **Subagent-Hooks**: Claude Code führt sie nur aus, während dieser Subagent läuft, und entfernt sie, wenn er fertig ist. Claude Code konvertiert einen `Stop`-Hook hier zu `SubagentStop`, das Ereignis, das ausgelöst wird, wenn ein Subagent fertig ist.722* **Subagent-Hooks**: Claude Code führt sie nur aus, während dieser Subagent ausgeführt wird, und entfernt sie, wenn er fertig ist. Claude Code konvertiert einen `Stop`-Hook hier zu `SubagentStop`, dem Ereignis, das ausgelöst wird, wenn ein Subagent abgeschlossen ist.
723* **Skill-Hooks**: Claude Code registriert sie, wenn Sie oder Claude den Skill aufrufen, und führt sie für den Rest der Sitzung aus, auf Runden nach der eigenen Runde des Skills auch. Um Claude Code stattdessen einen Hook nach seiner ersten erfolgreichen Ausführung zu entfernen, setzen Sie [`once: true`](#common-fields) darauf.723* **Skill-Hooks**: Claude Code registriert sie, wenn Sie oder Claude den Skill aufrufen, und führt sie für den Rest der Sitzung aus, auf Turns nach dem eigenen Turn des Skills auch. Um Claude Code stattdessen einen Hook nach seiner ersten erfolgreichen Ausführung zu entfernen, setzen Sie [`once: true`](#common-fields) darauf.
724 724
725Dieser Skill definiert einen `PreToolUse`-Hook, der ein Sicherheitsvalidierungsskript vor jedem `Bash`-Befehl ausführt:725Dieser Skill definiert einen `PreToolUse`-Hook, der ein Sicherheitsvalidierungsskript vor jedem `Bash`-Befehl ausführt:
726 726
737---737---
738```738```
739 739
740Subagenten verwenden das gleiche Format in ihrem YAML-Frontmatter.740Subagents verwenden das gleiche Format in ihrem YAML-Frontmatter.
741 741
742Frontmatter-Hooks in einem Projekt-Skill folgen der gleichen [Workspace-Trust-Regel wie Hooks in Einstellungsdateien](#workspace-trust). Claude Code registriert sie, wenn Sie oder Claude den Skill aufrufen, auch in einer `-p`-Ausführung in einem Ordner, dem Sie nicht vertraut haben.742Frontmatter-Hooks in einem Projekt-Skill folgen der gleichen [Workspace-Trust-Regel wie Hooks in Einstellungsdateien](#workspace-trust). Claude Code registriert sie, wenn Sie oder Claude den Skill aufrufen, auch in einem `-p`-Run in einem Ordner, dem Sie nicht vertraut haben.
743 743
744Frontmatter-Hooks in einem Projekt-Subagent werden nur ausgeführt, nachdem Sie den [Workspace-Trust-Dialog](/docs/de/permissions#project-allow-rules-and-workspace-trust) für den Ordner akzeptiert haben, aus dem die Agent-Datei stammt. Eine `-p`-Sitzung zählt nicht als Akzeptanz. [Was läuft, bevor Sie einem Ordner vertrauen](/docs/de/permissions#what-runs-before-you-trust-a-folder) vergleicht dies mit der Einstellungsdatei-Regel, und die Subagenten-Seite listet auf, [welche Scopes ausgenommen sind](/docs/de/sub-agents#hooks-in-subagent-frontmatter). Vor v2.1.218 konnten diese Hooks aus Ordnern ausgeführt werden, denen Sie nicht vertraut haben.744Frontmatter-Hooks in einem Projekt-Subagent werden nur ausgeführt, nachdem Sie den [Workspace-Trust-Dialog](/docs/de/permissions#project-allow-rules-and-workspace-trust) für den Ordner akzeptieren, aus dem die Agent-Datei stammt. Eine `-p`-Sitzung zählt nicht als Akzeptanz. [Was vor dem Vertrauen in einen Ordner ausgeführt wird](/docs/de/permissions#what-runs-before-you-trust-a-folder) vergleicht dies mit der Einstellungsdatei-Regel, und die Subagents-Seite listet auf, [welche Bereiche ausgenommen sind](/docs/de/sub-agents#hooks-in-subagent-frontmatter). Vor v2.1.218 konnten diese Hooks aus Ordnern ausgeführt werden, denen Sie nicht vertraut haben.
745 745
746<h3 id="the-/hooks-menu">746<h3 id="the-/hooks-menu">
747 Das Menü `/hooks`747 Das `/hooks`-Menü
748</h3>748</h3>
749 749
750Geben Sie `/hooks` in Claude Code ein, um einen schreibgeschützten Browser für Ihre konfigurierten Hooks zu öffnen. Das Menü zeigt jedes Hook-Ereignis mit einer Anzahl konfigurierter Hooks, ermöglicht es Ihnen, in Matcher zu bohren, und zeigt die vollständigen Details jedes Hook-Handlers. Verwenden Sie es, um die Konfiguration zu überprüfen, zu prüfen, aus welcher Einstellungsdatei ein Hook stammt, oder einen Hook-Befehl, Prompt oder URL zu überprüfen.750Geben Sie `/hooks` in Claude Code ein, um einen schreibgeschützten Browser für Ihre konfigurierten Hooks zu öffnen. Das Menü zeigt jedes Hook-Ereignis mit einer Anzahl konfigurierter Hooks, lässt Sie in Matcher bohren und zeigt die vollständigen Details jedes Hook-Handlers. Verwenden Sie es, um die Konfiguration zu überprüfen, zu überprüfen, aus welcher Einstellungsdatei ein Hook stammt, oder um einen Hook-Befehl, Prompt oder URL zu überprüfen.
751 751
752Das Menü zeigt alle fünf Hook-Typen an: `command`, `prompt`, `agent`, `http` und `mcp_tool`. Jeder Hook ist mit einem `[type]`-Präfix und einer Quelle gekennzeichnet, die angibt, wo er definiert wurde:752Das Menü zeigt alle fünf Hook-Typen: `command`, `prompt`, `agent`, `http` und `mcp_tool`. Jeder Hook ist mit einem `[type]`-Präfix und einer Quelle gekennzeichnet, die angibt, wo er definiert wurde:
753 753
754* `User Settings`: aus `~/.claude/settings.json`754* `User Settings`: aus `~/.claude/settings.json`
755* `Project Settings`: aus `.claude/settings.json`755* `Project Settings`: aus `.claude/settings.json`
756* `Local Settings`: aus `.claude/settings.local.json`756* `Local Settings`: aus `.claude/settings.local.json`
757* `Plugin Hooks`: aus `hooks/hooks.json` eines Plugins757* `Plugin Hooks`: aus der `hooks/hooks.json` eines Plugins
758* `Session Hooks`: in Speicher für die aktuelle Sitzung registriert758* `Session Hooks`: in der aktuellen Sitzung im Speicher registriert
759 759
760Wenn Sie einen Hook auswählen, wird eine Detailansicht geöffnet, die sein Ereignis, Matcher, Typ, Quelldatei und den vollständigen Befehl, Prompt oder URL zeigt. Das Menü ist schreibgeschützt: Um Hooks hinzuzufügen, zu ändern oder zu entfernen, bearbeiten Sie die Einstellungs-JSON direkt oder bitten Sie Claude, die Änderung vorzunehmen.760Das Auswählen eines Hooks öffnet eine Detailansicht, die sein Ereignis, Matcher, Typ, Quellendatei und den vollständigen Befehl, Prompt oder URL anzeigt. Das Menü ist schreibgeschützt: Um Hooks hinzuzufügen, zu ändern oder zu entfernen, bearbeiten Sie die Einstellungs-JSON direkt oder bitten Sie Claude, die Änderung vorzunehmen.
761 761
762<h3 id="disable-or-remove-hooks">762<h3 id="disable-or-remove-hooks">
763 Hooks deaktivieren oder entfernen763 Hooks deaktivieren oder entfernen
765 765
766Um einen Hook zu entfernen, löschen Sie seinen Eintrag aus der Einstellungs-JSON-Datei.766Um einen Hook zu entfernen, löschen Sie seinen Eintrag aus der Einstellungs-JSON-Datei.
767 767
768Um alle Hooks vorübergehend zu deaktivieren, ohne sie zu entfernen, setzen Sie `"disableAllHooks": true` in Ihrer Einstellungsdatei. Claude Code liest den Wert, der nach [Einstellungs-Vorrang](/docs/de/settings#settings-precedence) bleibt, daher überschreibt ein `"disableAllHooks": false` in der `.claude/settings.json` eines Projekts ein `true` in Ihren Benutzereinstellungen. Um Hooks für einen Durchlauf auszuschalten, egal was die Einstellungen des Projekts sagen, übergeben Sie `--settings '{"disableAllHooks": true}'`, was Vorrang vor Projekt- und lokalen Einstellungen hat. Es gibt keine Möglichkeit, einen einzelnen Hook zu deaktivieren, während er in der Konfiguration bleibt.768Um alle Hooks vorübergehend zu deaktivieren, ohne sie zu entfernen, setzen Sie `"disableAllHooks": true` in Ihrer Einstellungsdatei. Claude Code liest den Wert, der nach [Einstellungspriorität](/docs/de/settings#settings-precedence) bleibt, sodass ein `"disableAllHooks": false` in der `.claude/settings.json` eines Projekts ein `true` in Ihren Benutzereinstellungen überschreibt. Um Hooks für einen Run auszuschalten, unabhängig davon, was die Einstellungen des Projekts sagen, übergeben Sie `--settings '{"disableAllHooks": true}'`, was Vorrang vor Projekt- und lokalen Einstellungen hat. Es gibt keine Möglichkeit, einen einzelnen Hook zu deaktivieren, während er in der Konfiguration bleibt.
769 769
770Die Einstellung `disableAllHooks` respektiert die Hierarchie der verwalteten Einstellungen. Wenn ein Administrator Hooks durch verwaltete Richtlinieneinstellungen konfiguriert hat, kann `disableAllHooks`, das in Benutzer-, Projekt- oder lokalen Einstellungen gesetzt ist, diese verwalteten Hooks nicht deaktivieren. Nur `disableAllHooks`, das auf der Ebene der verwalteten Einstellungen gesetzt ist, kann verwaltete Hooks deaktivieren. Für die vollständige Reichweite jeder Ebene siehe [`disableAllHooks`](/docs/de/settings-reference#disableallhooks).770Die Einstellung `disableAllHooks` respektiert die Hierarchie der verwalteten Einstellungen. Wenn ein Administrator Hooks durch verwaltete Richtlinieneinstellungen konfiguriert hat, kann `disableAllHooks`, das in Benutzer-, Projekt- oder lokalen Einstellungen gesetzt ist, diese verwalteten Hooks nicht deaktivieren. Nur `disableAllHooks`, das auf der Ebene der verwalteten Einstellungen gesetzt ist, kann verwaltete Hooks deaktivieren. Für die vollständige Reichweite jeder Ebene siehe [`disableAllHooks`](/docs/de/settings-reference#disableallhooks).
771 771
772Direkte Bearbeitungen von Hooks in Einstellungsdateien werden normalerweise automatisch vom Datei-Watcher aufgegriffen.772Direkte Änderungen an Hooks in Einstellungsdateien werden normalerweise automatisch vom Datei-Watcher aufgegriffen.
773 773
774<h2 id="hook-input-and-output">774<h2 id="hook-input-and-output">
775 Hook-Eingabe und -Ausgabe775 Hook-Eingabe und -Ausgabe
776</h2>776</h2>
777 777
778Command-Hooks erhalten JSON-Daten über stdin und kommunizieren Ergebnisse über Exit-Codes, stdout und stderr. HTTP-Hooks erhalten die gleiche JSON als POST-Request-Body und kommunizieren Ergebnisse über den HTTP-Response-Body. Dieser Abschnitt behandelt Felder und Verhalten, die allen Ereignissen gemeinsam sind. Jeder Abschnitt eines Ereignisses unter [Hook-Ereignisse](#hook-events) enthält sein spezifisches Eingabeschema und Optionen zur Entscheidungskontrolle.778Command Hooks empfangen JSON-Daten über stdin und teilen Ergebnisse über Exit-Codes, stdout und stderr mit. HTTP Hooks empfangen das gleiche JSON wie der POST-Request-Body und teilen Ergebnisse über den HTTP-Response-Body mit. Dieser Abschnitt behandelt Felder und Verhalten, die für alle Events gemeinsam sind. Jeder Event-Abschnitt unter [Hook Events](#hook-events) enthält sein spezifisches Input-Schema und Optionen zur Entscheidungskontrolle.
779 779
780Auf macOS und Linux werden Command-Hooks in ihrer eigenen Sitzung ohne steuerndes Terminal ausgeführt. Der Hook-Prozess und alle untergeordneten Prozesse können `/dev/tty` nicht öffnen oder Escape-Sequenzen direkt an die Claude Code-Benutzeroberfläche senden. Windows hat kein `/dev/tty`.780Auf macOS und Linux werden Command Hooks in ihrer eigenen Session ohne steuerndes Terminal ausgeführt. Der Hook-Prozess und alle untergeordneten Prozesse können `/dev/tty` nicht öffnen oder Escape-Sequenzen direkt an die Claude Code-Schnittstelle senden. Windows hat kein `/dev/tty`.
781 781
782Um eine Nachricht dem Benutzer auf jeder Plattform anzuzeigen, geben Sie [`systemMessage`](#json-output) in der JSON-Ausgabe zurück. Einige Ereignisse verwerfen sie oder liefern sie an anderer Stelle, und jeder [Abschnitt eines Ereignisses](#hook-events) sagt, wo. Um eine Desktop-Benachrichtigung auszulösen, einen Fenstertitel zu setzen oder die Glocke zu läuten, geben Sie stattdessen [`terminalSequence`](#emit-terminal-notifications) zurück.782Um eine Nachricht für den Benutzer auf jeder Plattform anzuzeigen, geben Sie [`systemMessage`](#json-output) in der JSON-Ausgabe zurück. Einige Events verwerfen sie oder liefern sie an anderer Stelle, und jeder [Event-Abschnitt](#hook-events) gibt an, wo. Um eine Desktop-Benachrichtigung auszulösen, einen Fenstertitel zu setzen oder die Glocke zu läuten, geben Sie stattdessen [`terminalSequence`](#emit-terminal-notifications) zurück.
783 783
784<h3 id="common-input-fields">784<h3 id="common-input-fields">
785 Gemeinsame Eingabefelder785 Allgemeine Eingabefelder
786</h3>786</h3>
787 787
788Hook-Ereignisse erhalten diese Felder als JSON, zusätzlich zu ereignisspezifischen Feldern, die in jedem Abschnitt [Hook-Ereignis](#hook-events) dokumentiert sind. Für Command-Hooks kommt diese JSON über stdin an. Für HTTP-Hooks kommt sie als POST-Request-Body an.788Hook Events empfangen diese Felder als JSON, zusätzlich zu Event-spezifischen Feldern, die in jedem [Hook-Event](#hook-events)-Abschnitt dokumentiert sind. Für Command Hooks kommt dieses JSON über stdin an. Für HTTP Hooks kommt es als POST-Request-Body an.
789 789
790| Feld | Beschreibung |790| Feld | Beschreibung |
791| :---------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |791| :---------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
792| `session_id` | Aktuelle Sitzungs-ID |792| `session_id` | Aktuelle Session-Kennung |
793| `prompt_id` | UUID, die die aktuell verarbeitete Benutzereingabeaufforderung identifiziert. Entspricht dem [`prompt.id`-Attribut bei OpenTelemetry-Ereignissen](/docs/de/monitoring-usage#event-correlation-attributes), sodass Sie Hook-Ausgabe mit Telemetrie für eine einzelne Eingabeaufforderung korrelieren können. Nicht vorhanden, bis zur ersten Benutzereingabe. Erfordert Claude Code v2.1.196 oder später |793| `prompt_id` | UUID, die den aktuell verarbeiteten Benutzer-Prompt identifiziert. Stimmt mit dem [`prompt.id`-Attribut auf OpenTelemetry-Events](/docs/de/monitoring-usage#event-correlation-attributes) überein, sodass Sie Hook-Ausgabe mit Telemetrie für einen einzelnen Prompt korrelieren können. Nicht vorhanden bis zur ersten Benutzereingabe. Erfordert Claude Code v2.1.196 oder später |
794| `transcript_path` | Pfad zur Gesprächs-JSON. Die Transkriptdatei wird asynchron geschrieben und kann der In-Memory-Konversation hinterherhinken, sodass sie möglicherweise noch nicht die neuesten Nachrichten des aktuellen Zugs enthält, wenn ein Hook ausgelöst wird. Hooks, die den endgültigen Assistententext des aktuellen Zugs benötigen, sollten `last_assistant_message` auf [Stop](#stop) und [SubagentStop](#subagentstop) verwenden, anstatt das Transkript zu lesen |794| `transcript_path` | Pfad zur Konversations-JSON. Die Transkriptdatei wird asynchron geschrieben und kann der In-Memory-Konversation hinterherhinken, daher kann sie möglicherweise noch nicht die neuesten Nachrichten des aktuellen Turns enthalten, wenn ein Hook ausgelöst wird. Hooks, die den endgültigen Assistant-Text des aktuellen Turns benötigen, sollten `last_assistant_message` auf [Stop](#stop) und [SubagentStop](#subagentstop) verwenden, anstatt das Transkript zu lesen |
795| `cwd` | Aktuelles Arbeitsverzeichnis, wenn der Hook aufgerufen wird |795| `cwd` | Aktuelles Arbeitsverzeichnis, wenn der Hook aufgerufen wird |
796| `scratchpad_dir` | Pfad zum Scratchpad-Verzeichnis der Sitzung, in dem Claude temporäre Arbeitsdateien speichert. Nicht vorhanden, wenn die Sitzung kein Scratchpad hat oder das Temp-Verzeichnis nicht verfügbar ist. Erfordert Claude Code v2.1.257 oder später |796| `scratchpad_dir` | Pfad zum Scratchpad-Verzeichnis der Session, in dem Claude temporäre Arbeitsdateien speichert. Nicht vorhanden, wenn die Session kein Scratchpad hat oder das Temp-Verzeichnis nicht verfügbar ist. Erfordert Claude Code v2.1.257 oder später |
797| `permission_mode` | Aktueller [Berechtigungsmodus](/docs/de/permissions#permission-modes): `"default"`, `"plan"`, `"acceptEdits"`, `"auto"`, `"dontAsk"` oder `"bypassPermissions"`. Der als **Manuell** bezeichnete Modus kommt als `"default"` an, nie als `"manual"`, sodass Skripte, die `"default"` abgleichen, weiterhin funktionieren. Nicht alle Ereignisse erhalten dieses Feld. Überprüfen Sie das JSON-Beispiel in jedem Abschnitt [Hook-Ereignis](#hook-events) |797| `permission_mode` | Aktueller [Berechtigungsmodus](/docs/de/permissions#permission-modes): `"default"`, `"plan"`, `"acceptEdits"`, `"auto"`, `"dontAsk"` oder `"bypassPermissions"`. Der als **Manuell** bezeichnete Modus kommt als `"default"` an, nie als `"manual"`, sodass Skripte, die `"default"` abgleichen, weiterhin funktionieren. Nicht alle Events erhalten dieses Feld. Überprüfen Sie das JSON-Beispiel in jedem [Hook-Event](#hook-events)-Abschnitt |
798| `effort` | Objekt mit einem `level`-Feld, das die [Anstrengungsstufe](/docs/de/model-config#adjust-effort-level) enthält, die beim Ausführen des Hooks aktiv ist: `"low"`, `"medium"`, `"high"`, `"xhigh"` oder `"max"`. Wenn Sie eine Stufe setzen, die das aktive Modell nicht unterstützt, meldet `level` die Stufe, die Claude Code stattdessen ausgeführt hat; [Anstrengungsstufe anpassen](/docs/de/model-config#adjust-effort-level) sagt, wie es diese Stufe auswählt. Ultracode ist keine separate Stufe und wird als `"xhigh"` gemeldet. Das Objekt entspricht dem [Statuszeilen](/docs/de/statusline#available-data)-Feld `effort`. Vorhanden für Ereignisse, die innerhalb eines Tool-Use-Kontexts ausgelöst werden, wie `PreToolUse`, `PostToolUse`, `Stop` und `SubagentStop`, wenn das aktuelle Modell den Anstrengungsparameter unterstützt. Die Stufe ist auch für Hook-Befehle und das Bash-Tool als die Umgebungsvariable `$CLAUDE_EFFORT` verfügbar. |798| `effort` | Objekt mit einem `level`-Feld, das die [Effort-Stufe](/docs/de/model-config#adjust-effort-level) enthält, die wirksam ist, wenn der Hook ausgeführt wird: `"low"`, `"medium"`, `"high"`, `"xhigh"` oder `"max"`. Wenn Sie eine Stufe festlegen, die das aktive Modell nicht unterstützt, meldet `level` die Stufe, die Claude Code stattdessen ausgeführt hat; [Effort-Stufe anpassen](/docs/de/model-config#adjust-effort-level) sagt, wie es diese Stufe auswählt. Ultracode ist keine separate Stufe und wird als `"xhigh"` gemeldet. Das Objekt stimmt mit dem [Status-Feld](/docs/de/statusline#available-data) `effort`-Feld überein. Vorhanden für Events, die innerhalb eines Tool-Use-Kontexts ausgelöst werden, wie `PreToolUse`, `PostToolUse`, `Stop` und `SubagentStop`, wenn das aktuelle Modell den Effort-Parameter unterstützt. Die Stufe ist auch für Hook-Befehle und das Bash-Tool als die `$CLAUDE_EFFORT`-Umgebungsvariable verfügbar. |
799| `hook_event_name` | Name des ausgelösten Ereignisses |799| `hook_event_name` | Name des ausgelösten Events |
800 800
801Wenn mit `--agent` oder innerhalb eines Subagenten ausgeführt, sind zwei zusätzliche Felder enthalten:801Bei Ausführung mit `--agent` oder innerhalb eines Subagenten sind zwei zusätzliche Felder enthalten:
802 802
803| Feld | Beschreibung |803| Feld | Beschreibung |
804| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |804| :----------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
805| `agent_id` | Eindeutige Kennung für den Subagenten. Nur vorhanden, wenn der Hook innerhalb eines Subagenten-Aufrufs ausgelöst wird. Verwenden Sie dies, um Subagenten-Hook-Aufrufe von Main-Thread-Aufrufen zu unterscheiden. |805| `agent_id` | Eindeutige Kennung für den Subagenten. Nur vorhanden, wenn der Hook innerhalb eines Subagenten-Aufrufs ausgelöst wird. Verwenden Sie dies, um Subagenten-Hook-Aufrufe von Main-Thread-Aufrufen zu unterscheiden. |
806| `agent_type` | Agent-Name (zum Beispiel `"Explore"` oder `"security-reviewer"`). Vorhanden, wenn die Sitzung `--agent` verwendet oder der Hook innerhalb eines Subagenten ausgelöst wird. Für Subagenten hat der Typ des Subagenten Vorrang vor dem `--agent`-Wert der Sitzung. Siehe [SubagentStart](#subagentstart) für die Werte, die benutzerdefinierte und Plugin-Subagenten melden, und wie Sie einen Matcher gegen einen Plugin-bezogenen Namen schreiben. |806| `agent_type` | Agent-Name (z. B. `"Explore"` oder `"security-reviewer"`). Vorhanden, wenn die Session `--agent` verwendet oder der Hook innerhalb eines Subagenten ausgelöst wird. Für Subagenten hat der Typ des Subagenten Vorrang vor dem `--agent`-Wert der Session. Siehe [SubagentStart](#subagentstart) für die Werte, die benutzerdefinierte und Plugin-Subagenten melden, und wie man einen Matcher gegen einen Plugin-Scoped-Namen schreibt. |
807 807
808Nur [`SessionStart`](#sessionstart)-Hooks können ein `model`-Feld erhalten, und Claude Code schließt es nicht immer ein. [`PreModelSwitch`](#premodelswitch) und [`PostModelSwitch`](#postmodelswitch)-Hooks erhalten stattdessen `from_model` und `to_model`, verwenden Sie also einen PostModelSwitch-Hook, um das Modell zu verfolgen, während es sich während einer Sitzung ändert.808Nur [`SessionStart`](#sessionstart)-Hooks können ein `model`-Feld empfangen, und Claude Code fügt es nicht immer ein. [`PreModelSwitch`](#premodelswitch)- und [`PostModelSwitch`](#postmodelswitch)-Hooks empfangen stattdessen `from_model` und `to_model`, verwenden Sie also einen PostModelSwitch-Hook, um das Modell zu verfolgen, während es sich während einer Session ändert.
809 809
810Es gibt keine `$CLAUDE_MODEL`-Umgebungsvariable. Der Hook kann `$ANTHROPIC_MODEL` lesen, wenn Sie es in Ihrer Shell setzen, aber dieser Wert ändert sich nicht, wenn Sie während einer Sitzung mit `/model` Modelle wechseln.810Es gibt keine `$CLAUDE_MODEL`-Umgebungsvariable. Der Hook kann `$ANTHROPIC_MODEL` lesen, wenn Sie es in Ihrer Shell festlegen, aber dieser Wert ändert sich nicht, wenn Sie während einer Session mit `/model` Modelle wechseln.
811 811
812Ein Hook-Prozess erbt die übergeordnete Umgebung, abgesehen von den `OTEL_*`-Exportervariablen, die Claude Code [aus jedem Unterprozess entfernt, den es spawnt](/docs/de/monitoring-usage#administrator-configuration), und wenn [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/de/env-vars#variables) auf `1` gesetzt ist, die Variablen, die es entfernt.812Ein Hook-Prozess erbt die übergeordnete Umgebung, mit Ausnahme der `OTEL_*`-Exporter-Variablen, die Claude Code [aus jedem Subprocess entfernt, den es spawnt](/docs/de/monitoring-usage#administrator-configuration), und, wenn [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/de/env-vars#variables) auf `1` gesetzt ist, die Variablen, die es entfernt.
813 813
814Zum Beispiel erhält ein `PreToolUse`-Hook für einen Bash-Befehl dies über stdin:814Beispielsweise empfängt ein `PreToolUse`-Hook für einen Bash-Befehl dies auf stdin:
815 815
816```json theme={null}816```json theme={null}
817{817{
833}833}
834```834```
835 835
836Die Felder `tool_name`, `tool_input` und `tool_use_id` sind ereignisspezifisch. Jeder Abschnitt [Hook-Ereignis](#hook-events) dokumentiert die zusätzlichen Felder für dieses Ereignis.836Die Felder `tool_name`, `tool_input` und `tool_use_id` sind Event-spezifisch. Jeder [Hook-Event](#hook-events)-Abschnitt dokumentiert die zusätzlichen Felder für diesen Event.
837 837
838<h3 id="exit-code-output">838<h3 id="exit-code-output">
839 Exit-Code-Ausgabe839 Exit-Code-Ausgabe
840</h3>840</h3>
841 841
842Der Exit-Code aus Ihrem Hook-Befehl teilt Claude Code mit, ob die Aktion fortgesetzt, blockiert oder ignoriert werden soll. Der Exit-Code wirkt nicht allein. Claude Code liest [JSON-Ausgabefelder](#json-output) von stdout bei jedem Exit-Code, nicht nur 0, und für Ereignisse, die das Standard-Entscheidungsmodell verwenden, wirkt ein analysiertes Objekt, das die Schema-Validierung besteht, neben dem Code. Exit 2's Blockierung ist das einzige Ergebnis, das JSON nicht überschreiben kann.842Der Exit-Code aus Ihrem Hook-Befehl teilt Claude Code mit, ob die Aktion fortgesetzt, blockiert oder ignoriert werden soll. Der Exit-Code wirkt nicht allein. Claude Code liest [JSON-Ausgabefelder](#json-output) von stdout bei jedem Exit-Code, nicht nur 0, und für Events, die das Standard-Entscheidungsmodell verwenden, wirkt ein gepartes Objekt, das die Schema-Validierung besteht, neben dem Code. Exit 2's Block ist das einzige Ergebnis, das JSON nicht überschreiben kann.
843 843
844Zwei Tabellen besitzen die ereignisspezifischen Ausnahmen: [Exit-Code-2-Verhalten pro Ereignis](#exit-code-2-behavior-per-event) sagt, was Exit-Codes für jedes Ereignis tun, und [Entscheidungskontrolle](#decision-control) sagt, welche Entscheidungsfelder jedes Ereignis berücksichtigt. Universelle Felder wie `systemMessage` funktionieren über die meisten Ereignisse hinweg und sind in der Tabelle [JSON-Ausgabe](#json-output) aufgelistet.844Zwei Tabellen besitzen die Event-spezifischen Ausnahmen: [Exit-Code-2-Verhalten pro Event](#exit-code-2-behavior-per-event) sagt, was Exit-Codes für jeden Event tun, und [Entscheidungskontrolle](#decision-control) sagt, welche Entscheidungsfelder jeder Event berücksichtigt. Universelle Felder wie `systemMessage` funktionieren über die meisten Events hinweg und sind in der [JSON-Ausgabe](#json-output)-Tabelle aufgelistet.
845 845
846<h4 id="exit-code-0">846<h4 id="exit-code-0">
847 Exit-Code 0847 Exit-Code 0
848</h4>848</h4>
849 849
850Exit 0 bedeutet Erfolg und ist der beabsichtigte Exit-Code, wenn Sie JSON für strukturierte Kontrolle ausgeben.850Exit 0 bedeutet Erfolg und ist der beabsichtigte Exit-Code, wenn Sie JSON für strukturierte Kontrolle drucken.
851 851
852Für die meisten Ereignisse schreibt Claude Code stdout in das Debug-Log und zeigt es nicht im Transkript an. Die Ausnahmen sind `UserPromptSubmit`, `UserPromptExpansion`, `SessionStart` und `PostModelSwitch`, wo Claude Code Plain-Text-stdout als Kontext hinzufügt, den Claude sehen und darauf reagieren kann.852Für die meisten Events schreibt Claude Code stdout in das Debug-Protokoll und zeigt es nicht im Transkript an. Die Ausnahmen sind `UserPromptSubmit`, `UserPromptExpansion`, `SessionStart` und `PostModelSwitch`, wo Claude Code einfachen Text-stdout als Kontext hinzufügt, den Claude sehen und bearbeiten kann.
853 853
854Ob Claude Code Ihren stdout als [JSON-Ausgabe](#json-output) oder als Plain-Text liest, hängt davon ab, wie er beginnt und endet, wobei umgebender Whitespace ignoriert wird:854Ob Claude Code Ihren stdout als [JSON-Ausgabe](#json-output) oder als einfachen Text liest, hängt davon ab, wie er beginnt und endet, wobei umgebender Whitespace ignoriert wird:
855 855
856* **Beginnt mit `{` und endet mit `}`**: Claude Code analysiert es als JSON. Wenn die Ausgabe zwei oder mehr Zeilen sind, die jeweils selbst als JSON analysiert werden, und keine Zeile ein [JSON-Ausgabe](#json-output)-Objekt ist, das ein Feld setzt, behandelt Claude Code die gesamte Ausgabe als Plain-Text. Wenn eine dieser Zeilen ein Feld setzt, ist die gesamte Ausgabe ein Parse-Fehler, der unten beschrieben wird.856* **Beginnt mit `{` und endet mit `}`**: Claude Code parst es als JSON. Wenn die Ausgabe zwei oder mehr Zeilen sind, die jeweils selbst als JSON geparst werden, und keine Zeile ein [JSON-Ausgabe](#json-output)-Objekt ist, das ein Feld setzt, behandelt Claude Code die gesamte Ausgabe als einfachen Text. Wenn eine dieser Zeilen ein Feld setzt, ist die gesamte Ausgabe ein Parse-Fehler, der unten beschrieben wird.
857* **Beginnt mit `{` aber endet nicht mit `}`**: Claude Code behandelt es als Plain-Text.857* **Beginnt mit `{` aber endet nicht mit `}`**: Claude Code behandelt es als einfachen Text.
858* **Beginnt mit etwas anderem**: Claude Code behandelt es als Plain-Text, ein JSON-Array oder eine zitierte JSON-Zeichenkette enthalten.858* **Beginnt mit etwas anderem**: Claude Code behandelt es als einfachen Text, ein JSON-Array oder einen zitierten JSON-String enthalten.
859 859
860Für Ereignisse, die das Standard-Entscheidungsmodell verwenden, ist Exit 0 mit einem analysierten Objekt, das die Schema-Validierung nicht besteht, ein nicht-blockierender Fehler: die Aktion wird fortgesetzt, und das Transkript zeigt eine `<hook name> hook error`-Benachrichtigung mit der Validierungsmeldung. Das gleiche passiert bei jedem Exit-Code außer 2, während [Exit 2 immer noch blockiert](#exit-code-2).860Für Events, die das Standard-Entscheidungsmodell verwenden, ist Exit 0 mit einem geparsten Objekt, das die Schema-Validierung nicht besteht, ein nicht blockierender Fehler: die Aktion wird fortgesetzt, und das Transkript zeigt einen `<Hook-Name> hook error`-Hinweis mit der Validierungsmeldung. Das gleiche passiert bei jedem Exit-Code außer 2, während [Exit 2 immer noch blockiert](#exit-code-2).
861 861
862Für Ereignisse, die das Standard-Entscheidungsmodell verwenden, wenn Claude Code versucht, Ihren stdout als JSON zu analysieren und kann nicht, meldet es einen nicht-blockierenden Fehler bei jedem Exit-Code außer 2. Das Transkript zeigt eine `<hook name> hook error`-Benachrichtigung mit der Parse-Meldung. Bei den Ereignissen, die Plain-Text-stdout als Kontext hinzufügen, fügt Claude Code den Text nicht hinzu. Vor v2.1.248 behandelte Claude Code diesen stdout als Plain-Text.862Für Events, die das Standard-Entscheidungsmodell verwenden, wenn Claude Code versucht, Ihren stdout als JSON zu parsen und kann nicht, meldet es einen nicht blockierenden Fehler bei jedem Exit-Code außer 2. Das Transkript zeigt einen `<Hook-Name> hook error`-Hinweis mit der Parse-Meldung. Bei den Events, die einfachen Text-stdout als Kontext hinzufügen, fügt Claude Code den Text nicht hinzu. Vor v2.1.248 behandelte Claude Code diesen stdout als einfachen Text.
863 863
864Stderr von einem Hook, der mit 0 beendet wird, geht nur in das Debug-Log, nie in das Transkript, und Claude sieht es nie. Um es selbst zu lesen, aktivieren Sie [Debug-Protokollierung](#debug-hooks). Um eine Warnung an Claude von einem `PostToolUse` oder `PostToolUseFailure`-Hook zu übermitteln, beenden Sie stattdessen mit 2, damit [Claude den stderr sieht](#exit-code-2-behavior-per-event), obwohl das Tool bereits ausgeführt wurde.864Stderr von einem Hook, der mit 0 beendet wird, geht nur in das Debug-Protokoll, nie in das Transkript, und Claude sieht es nie. Um es selbst zu lesen, aktivieren Sie [Debug-Protokollierung](#debug-hooks). Um eine Warnung an Claude von einem `PostToolUse`- oder `PostToolUseFailure`-Hook zu übermitteln, beenden Sie stattdessen mit 2, damit [Claude den stderr sieht](#exit-code-2-behavior-per-event), obwohl das Tool bereits ausgeführt wurde.
865 865
866<h4 id="exit-code-2">866<h4 id="exit-code-2">
867 Exit-Code 2867 Exit-Code 2
868</h4>868</h4>
869 869
870Exit 2 bedeutet ein blockierender Fehler. Bei [Ereignissen, die blockieren können](#exit-code-2-behavior-per-event), blockiert Exit 2, unabhängig davon, ob Sie JSON ausgeben: selbst ein JSON `permissionDecision` von `"allow"` kann es nicht überschreiben. Claude Code liest immer noch alle gültigen [JSON-Ausgabe](#json-output) auf stdout. Bei `Elicitation` und `ElicitationResult` wird die `hookSpecificOutput` eines Exit-2-Hooks ignoriert.870Exit 2 bedeutet einen blockierenden Fehler. Bei [Events, die blockieren können](#exit-code-2-behavior-per-event), blockiert Exit 2, unabhängig davon, ob Sie JSON drucken oder nicht: selbst ein JSON `permissionDecision` von `"allow"` kann es nicht überschreiben. Claude Code liest immer noch alle gültigen [JSON-Ausgabe](#json-output) auf stdout. Bei `Elicitation` und `ElicitationResult` wird die `hookSpecificOutput` eines Exit-2-Hooks ignoriert.
871 871
872Die Blockierungsmeldung ist der Grund aus der Blockierungsentscheidung Ihres JSON, wenn es eine macht, und Ihr stderr-Text ansonsten. Was die Blockierung tut, variiert je nach Ereignis: `PreToolUse` blockiert den Tool-Aufruf, `UserPromptSubmit` lehnt den Prompt ab, und so weiter. [Exit-Code-2-Verhalten pro Ereignis](#exit-code-2-behavior-per-event) listet die Auswirkung für jedes Ereignis auf, und jeder Abschnitt eines Ereignisses sagt, wo die Meldung hingeht.872Die Blockierungsmeldung ist der Grund aus der Blockierungsentscheidung Ihres JSON, wenn es eine gibt, und Ihr stderr-Text andernfalls. Was der Block tut, variiert je nach Event: `PreToolUse` blockiert den Tool-Aufruf, `UserPromptSubmit` lehnt den Prompt ab, und so weiter. [Exit-Code-2-Verhalten pro Event](#exit-code-2-behavior-per-event) listet die Auswirkung für jeden Event auf, und jeder Event-Abschnitt sagt, wohin die Meldung geht.
873 873
874Ein Hook, der mit 2 beendet wird, während er JSON ausgibt, das die [JSON-Ausgabe](#json-output)-Schema-Validierung nicht besteht, blockiert immer noch: Claude Code verwendet stderr als Blockierungsgrund und zeichnet den Validierungsfehler im Debug-Log auf. Vor v2.1.214 behandelte Claude Code diese Kombination als nicht-blockierenden Fehler und die Aktion wurde fortgesetzt.874Ein Hook, der mit 2 beendet wird, während JSON gedruckt wird, das die [JSON-Ausgabe](#json-output)-Schema-Validierung nicht besteht, blockiert immer noch: Claude Code verwendet stderr als Blockierungsgrund und zeichnet den Validierungsfehler im Debug-Protokoll auf. Vor v2.1.214 behandelte Claude Code diese Kombination als nicht blockierenden Fehler und die Aktion wurde fortgesetzt.
875 875
876Dieses Skript blockiert `rm`-Befehle durch Beendigung mit 2 und lässt jeden anderen Befehl zum normalen Berechtigungsfluss:876Dieses Skript blockiert `rm`-Befehle durch Beendigung mit 2 und lässt jeden anderen Befehl zum normalen Berechtigungsfluss:
877 877
878```bash theme={null}878```bash theme={null}
879#!/bin/bash879#!/bin/bash
880# Liest JSON-Eingabe von stdin, prüft den Befehl880# Reads JSON input from stdin, checks the command
881input=$(cat)881input=$(cat)
882command=$(jq -r '.tool_input.command' <<<"$input")882command=$(jq -r '.tool_input.command' <<<"$input")
883 883
884if [[ "$command" == rm* ]]; then884if [[ "$command" == rm* ]]; then
885 echo "Blocked: rm commands are not allowed" >&2885 echo "Blocked: rm commands are not allowed" >&2
886 exit 2 # Blockierender Fehler: Tool-Aufruf wird verhindert886 exit 2 # Blocking error: tool call is prevented
887fi887fi
888 888
889exit 0 # Keine Entscheidung: der normale Berechtigungsfluss gilt889exit 0 # No decision: the normal permission flow applies
890```890```
891 891
892<h4 id="other-exit-codes">892<h4 id="other-exit-codes">
893 Andere Exit-Codes893 Andere Exit-Codes
894</h4>894</h4>
895 895
896Jeder andere Exit-Code blockiert nicht allein für die meisten Hook-Ereignisse. Was passiert, hängt von Ihrem stdout ab:896Jeder andere Exit-Code blockiert nicht allein für die meisten Hook-Events. Was passiert, hängt von Ihrem stdout ab:
897 897
898* Mit einem analysierten Objekt, das die Schema-Validierung besteht, für Ereignisse, die das Standard-Entscheidungsmodell verwenden, ignoriert Claude Code den Exit-Code und das JSON allein entscheidet das Ergebnis:898* Mit einem geparsten Objekt, das die Schema-Validierung besteht, für Events, die das Standard-Entscheidungsmodell verwenden, ignoriert Claude Code den Exit-Code und das JSON allein entscheidet das Ergebnis:
899 * Jedes Feld, das das Ereignis unterstützt, wird berücksichtigt, einschließlich `permissionDecision`, `additionalContext`, `updatedInput` und `systemMessage`, und der Hook wird nicht als Fehler gemeldet.899 * Jedes Feld, das der Event unterstützt, wird berücksichtigt, einschließlich `permissionDecision`, `additionalContext`, `updatedInput` und `systemMessage`, und der Hook wird nicht als Fehler gemeldet.
900 * [Entscheidungskontrolle](#decision-control) listet die Entscheidungsfelder pro Ereignis auf; universelle Felder wie `systemMessage` folgen der Tabelle [JSON-Ausgabe](#json-output).900 * [Entscheidungskontrolle](#decision-control) listet die Entscheidungsfelder pro Event auf; universelle Felder wie `systemMessage` folgen der [JSON-Ausgabe](#json-output)-Tabelle.
901* Mit einem analysierten Objekt, das die Schema-Validierung nicht besteht, für Ereignisse, die das Standard-Entscheidungsmodell verwenden, ist es der gleiche nicht-blockierende Fehler wie [bei Exit 0](#exit-code-0): die Aktion wird fortgesetzt, und die `<hook name> hook error`-Benachrichtigung trägt die Validierungsmeldung.901* Mit einem geparsten Objekt, das die Schema-Validierung nicht besteht, für Events, die das Standard-Entscheidungsmodell verwenden, ist es der gleiche nicht blockierende Fehler wie [bei Exit 0](#exit-code-0): die Aktion wird fortgesetzt, und der `<Hook-Name> hook error`-Hinweis trägt die Validierungsmeldung.
902* Mit stdout, das Claude Code [versucht als JSON zu analysieren](#exit-code-0) und kann nicht, meldet Claude Code den gleichen nicht-blockierenden Fehler wie bei Exit 0 für Ereignisse, die das Standard-Entscheidungsmodell verwenden. Die Aktion wird fortgesetzt, und die Benachrichtigung trägt die Parse-Meldung.902* Mit stdout, das Claude Code [versucht als JSON zu parsen](#exit-code-0) und kann nicht, meldet Claude Code den gleichen nicht blockierenden Fehler wie bei Exit 0 für Events, die das Standard-Entscheidungsmodell verwenden. Die Aktion wird fortgesetzt, und der Hinweis trägt die Parse-Meldung.
903* Mit stdout, das Claude Code [als Plain-Text behandelt](#exit-code-0), oder mit leerem stdout, ist es ein nicht-blockierender Fehler für die meisten Hook-Ereignisse: die Aktion wird fortgesetzt, und das Transkript zeigt eine `<hook name> hook error`-Benachrichtigung gefolgt von der ersten Zeile von stderr, mit dem Präfix `Failed with non-blocking status code:`. Um den vollständigen stderr zu erfassen, aktivieren Sie [Debug-Protokollierung](#debug-hooks).903* Mit stdout, das Claude Code [als einfachen Text behandelt](#exit-code-0), oder mit leerem stdout, ist es ein nicht blockierender Fehler für die meisten Hook-Events: die Aktion wird fortgesetzt, und das Transkript zeigt einen `<Hook-Name> hook error`-Hinweis gefolgt von der ersten Zeile von stderr, mit dem Präfix `Failed with non-blocking status code:`. Um den vollständigen stderr zu erfassen, aktivieren Sie [Debug-Protokollierung](#debug-hooks).
904 904
905Ereignisse außerhalb des Standard-Entscheidungsmodells behalten ihre eigenen Zeilen in der [ereignisspezifischen Tabelle](#exit-code-2-behavior-per-event): `WorktreeCreate` schlägt die Erstellung bei jedem Nicht-Null-Exit fehl, egal was Ihr JSON sagt, und Ereignisse, die Hook-Ausgabe vollständig verwerfen, wie `StopFailure`, ignorieren Ihr JSON bei jedem Exit-Code, abgesehen von Nebenwirkungsfeldern wie `terminalSequence`, die immer noch ausgelöst werden.905Events außerhalb des Standard-Entscheidungsmodells behalten ihre eigenen Zeilen in der [Pro-Event-Tabelle](#exit-code-2-behavior-per-event): `WorktreeCreate` schlägt die Erstellung bei jedem Nonzero-Exit fehl, unabhängig davon, was Ihr JSON sagt, und Events, die Hook-Ausgabe vollständig verwerfen, wie `StopFailure`, ignorieren Ihr JSON bei jedem Exit-Code, abgesehen von Nebeneffekt-Feldern wie `terminalSequence`, die immer noch ausgelöst werden.
906 906
907Ein Hook, der nicht starten kann, landet im gleichen nicht-blockierenden Bucket. Wenn der Skriptpfad nicht existiert oder nicht ausführbar ist, beendet die Shell mit einem Code wie 127 und Sie sehen die gleiche Benachrichtigung mit der Meldung des Interpreters, zum Beispiel `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`. Für die meisten Hook-Ereignisse wird die Aktion fortgesetzt. Wenn Sie einen Policy-Hook einrichten, achten Sie auf diese Benachrichtigung bei seiner ersten Ausführung: ein Tippfehler im Pfad in `settings.json` lässt das Gate stillschweigend deaktiviert.907Ein Hook, der nicht starten kann, landet im gleichen nicht blockierenden Bucket. Wenn der Skriptpfad nicht existiert oder nicht ausführbar ist, beendet die Shell mit einem Code wie 127 und Sie sehen den gleichen Hinweis mit der Interpreter-Meldung, zum Beispiel `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`. Für die meisten Hook-Events wird die Aktion fortgesetzt. Wenn Sie einen Policy-Hook einrichten, achten Sie auf diesen Hinweis bei seiner ersten Ausführung: ein Tippfehler im Pfad in `settings.json` lässt das Gate stillschweigend deaktiviert.
908 908
909<Warning>909<Warning>
910 Für die meisten Hook-Ereignisse ist Exit-Code 2 der einzige Exit-Code, der allein durch den Code blockiert. Ohne gültiges JSON auf stdout behandelt Claude Code Exit-Code 1 als nicht-blockierenden Fehler und setzt die Aktion fort, obwohl 1 der konventionelle Unix-Fehlercode ist. Wenn Ihr Hook eine Richtlinie durchsetzen soll, verwenden Sie `exit 2`. Die Worktree-Ereignisse unterscheiden sich: jeder Nicht-Null-Exit-Code von `WorktreeCreate` bricht die Worktree-Erstellung ab, und jeder Nicht-Null-Exit-Code von `WorktreeRemove` lässt die Worktree-Entfernung fehlschlagen, wenn das Verzeichnis danach noch existiert.910 Für die meisten Hook-Events ist Exit-Code 2 der einzige Exit-Code, der allein durch den Code blockiert. Ohne gültiges JSON auf stdout behandelt Claude Code Exit-Code 1 als nicht blockierenden Fehler und setzt die Aktion fort, obwohl 1 der konventionelle Unix-Fehlercode ist. Wenn Ihr Hook eine Richtlinie durchsetzen soll, verwenden Sie `exit 2`. Die Worktree-Events unterscheiden sich: jeder Nonzero-Exit-Code von `WorktreeCreate` bricht die Worktree-Erstellung ab, und jeder Nonzero-Exit-Code von `WorktreeRemove` lässt die Worktree-Entfernung fehlschlagen, wenn das Verzeichnis danach noch existiert.
911</Warning>911</Warning>
912 912
913<h4 id="timeouts">913<h4 id="timeouts">
914 Timeouts914 Timeouts
915</h4>915</h4>
916 916
917Abgesehen von einem Command-Hook, den Sie mit [`async: true`](#run-hooks-in-the-background) ausführen, bricht Claude Code einen `command`, `http` oder `mcp_tool`-Hook ab, der sein [`timeout`](#common-fields) erreicht, verwirft die Ausgabe des Hooks, sodass bei den meisten Ereignissen ein abgelaufener Hook keine Entscheidung rendert.917Abgesehen von einem Command Hook, den Sie mit [`async: true`](#run-hooks-in-the-background) ausführen, bricht Claude Code einen `command`-, `http`- oder `mcp_tool`-Hook ab, der sein [`timeout`](#common-fields) erreicht, verwirft die Hook-Ausgabe, sodass bei den meisten Events ein abgelaufener Hook keine Entscheidung rendert.
918 918
919Bei [`PreModelSwitch`](#premodelswitch) blockiert ein Hook, der bei seinem Timeout abgebrochen wird, den Modellwechsel. Bei `PreToolUse` unterscheiden sich die beiden Hook-Familien:919Bei [`PreModelSwitch`](#premodelswitch) blockiert ein Hook, der bei seinem Timeout abgebrochen wird, den Modellwechsel. Bei `PreToolUse` unterscheiden sich die beiden Hook-Familien:
920 920
921* Ein abgelaufener `command`, `http` oder `mcp_tool`-Hook blockiert den Tool-Aufruf nicht. Der Aufruf wird durch den normalen [Berechtigungsfluss](/docs/de/permissions) fortgesetzt, verlassen Sie sich also nicht auf einen steckengebliebenen Hook, um als Gate zu fungieren.921* Ein abgelaufener `command`-, `http`- oder `mcp_tool`-Hook blockiert den Tool-Aufruf nicht. Der Aufruf wird durch den normalen [Berechtigungsfluss](/docs/de/permissions) fortgesetzt, verlassen Sie sich also nicht auf einen steckengebliebenen Hook, um als Gate zu fungieren.
922* Ein [Agent SDK-Callback-Hook](/docs/de/agent-sdk/hooks), der sein Timeout überschreitet, [blockiert den Tool-Aufruf](#pretooluse).922* Ein [Agent SDK Callback Hook](/docs/de/agent-sdk/hooks), der sein Timeout überschreitet, [blockiert den Tool-Aufruf](#pretooluse).
923 923
924<h4 id="exit-code-2-behavior-per-event">924<h4 id="exit-code-2-behavior-per-event">
925 Exit-Code-2-Verhalten pro Ereignis925 Exit-Code-2-Verhalten pro Event
926</h4>926</h4>
927 927
928Exit-Code 2 ist die Art, wie ein Hook signalisiert „Stopp, mach das nicht." Die Auswirkung hängt vom Ereignis ab, da einige Ereignisse Aktionen darstellen, die blockiert werden können (wie ein Tool-Aufruf, der noch nicht stattgefunden hat), und andere Dinge darstellen, die bereits passiert sind oder nicht verhindert werden können.928Exit-Code 2 ist die Art, wie ein Hook signalisiert „Stopp, mach das nicht." Die Auswirkung hängt vom Event ab, da einige Events Aktionen darstellen, die blockiert werden können (wie ein Tool-Aufruf, der noch nicht stattgefunden hat), und andere Dinge darstellen, die bereits passiert sind oder nicht verhindert werden können.
929 929
930| Hook-Ereignis | Kann blockiert werden? | Was passiert bei Exit 2 |930| Hook-Event | Kann blockieren? | Was passiert bei Exit 2 |
931| :-------------------- | :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |931| :-------------------- | :--------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
932| `PreToolUse` | Ja | Blockiert den Tool-Aufruf |932| `PreToolUse` | Ja | Blockiert den Tool-Aufruf |
933| `PermissionRequest` | Nein | Exit-Code 2 wird für dieses Ereignis nicht berücksichtigt und der Berechtigungsfluss wird unverändert fortgesetzt. Verweigern Sie stattdessen durch das [`decision`-Objekt](#permissionrequest-decision-control) |933| `PermissionRequest` | Nein | Exit-Code 2 wird für diesen Event nicht berücksichtigt und der Berechtigungsfluss wird unverändert fortgesetzt. Verweigern Sie stattdessen durch das [`decision`-Objekt](#permissionrequest-decision-control) |
934| `UserPromptSubmit` | Ja | Blockiert die Prompt-Verarbeitung und löscht den Prompt |934| `UserPromptSubmit` | Ja | Blockiert die Prompt-Verarbeitung und löscht den Prompt |
935| `UserPromptExpansion` | Ja | Blockiert die Erweiterung |935| `UserPromptExpansion` | Ja | Blockiert die Erweiterung |
936| `Stop` | Ja | Verhindert, dass Claude stoppt, setzt das Gespräch fort |936| `Stop` | Ja | Verhindert, dass Claude stoppt, setzt die Konversation fort |
937| `SubagentStop` | Ja | Verhindert, dass der Subagent stoppt |937| `SubagentStop` | Ja | Verhindert, dass der Subagent stoppt |
938| `TeammateIdle` | Ja | Verhindert, dass der Teammate untätig wird, sodass er weiterarbeitet |938| `TeammateIdle` | Ja | Verhindert, dass der Teammate untätig wird, sodass er weiterarbeitet |
939| `TaskCreated` | Ja | Rollback der Aufgabenerstellung |939| `TaskCreated` | Ja | Rollback der Task-Erstellung |
940| `TaskCompleted` | Ja | Verhindert, dass die Aufgabe als abgeschlossen markiert wird |940| `TaskCompleted` | Ja | Verhindert, dass die Task als abgeschlossen markiert wird |
941| `ConfigChange` | Ja | Blockiert die Konfigurationsänderung von der Anwendung (außer `policy_settings`) |941| `ConfigChange` | Ja | Blockiert die Konfigurationsänderung von der Wirksamkeit (außer `policy_settings`) |
942| `StopFailure` | Nein | Ausgabe und Exit-Code werden ignoriert, außer `terminalSequence` |942| `StopFailure` | Nein | Ausgabe und Exit-Code werden ignoriert, außer `terminalSequence` |
943| `PostToolUse` | Nein | Zeigt stderr Claude an; das Tool wurde bereits ausgeführt |943| `PostToolUse` | Nein | Zeigt stderr Claude; das Tool ist bereits ausgeführt |
944| `PostToolUseFailure` | Nein | Zeigt stderr Claude an; das Tool ist bereits fehlgeschlagen |944| `PostToolUseFailure` | Nein | Zeigt stderr Claude; das Tool ist bereits fehlgeschlagen |
945| `PostToolBatch` | Ja | Stoppt die agentengesteuerte Schleife vor dem nächsten Modellaufruf |945| `PostToolBatch` | Ja | Stoppt die agentic Loop vor dem nächsten Modellaufruf |
946| `PermissionDenied` | Nein | Exit-Code und stderr werden ignoriert, da die Ablehnung bereits erfolgt ist. Verwenden Sie JSON `hookSpecificOutput.retry: true`, um dem Modell zu sagen, dass es möglicherweise erneut versuchen kann; Claude Code ignoriert `retry: true` für [Ablehnungen ohne Urteil](#permissiondenied-decision-control) |946| `PermissionDenied` | Nein | Exit-Code und stderr werden ignoriert, da die Verweigerung bereits aufgetreten ist. Verwenden Sie JSON `hookSpecificOutput.retry: true`, um dem Modell zu sagen, dass es möglicherweise erneut versuchen kann; Claude Code ignoriert `retry: true` für [No-Verdict-Verweigerungen](#permissiondenied-decision-control) |
947| `Notification` | Nein | Exit-Code und stderr werden ignoriert |947| `Notification` | Nein | Exit-Code und stderr werden ignoriert |
948| `SubagentStart` | Nein | Zeigt stderr nur dem Benutzer an |948| `SubagentStart` | Nein | Zeigt stderr nur dem Benutzer |
949| `SessionStart` | Nein | Zeigt stderr nur dem Benutzer an |949| `SessionStart` | Nein | Zeigt stderr nur dem Benutzer |
950| `Setup` | Nein | Exit-Code und stderr werden ignoriert |950| `Setup` | Nein | Exit-Code und stderr werden ignoriert |
951| `SessionEnd` | Nein | Zeigt stderr nur dem Benutzer an |951| `SessionEnd` | Nein | Zeigt stderr nur dem Benutzer |
952| `CwdChanged` | Nein | Zeigt stderr nur dem Benutzer an |952| `CwdChanged` | Nein | Zeigt stderr nur dem Benutzer |
953| `DirectoryAdded` | Nein | Stderr geht in das Debug-Log; das Verzeichnis ist bereits hinzugefügt |953| `DirectoryAdded` | Nein | Stderr geht in das Debug-Protokoll; das Verzeichnis ist bereits hinzugefügt |
954| `FileChanged` | Nein | Zeigt stderr nur dem Benutzer an |954| `FileChanged` | Nein | Zeigt stderr nur dem Benutzer |
955| `PreCompact` | Ja | Blockiert die Komprimierung |955| `PreCompact` | Ja | Blockiert die Komprimierung |
956| `PostCompact` | Nein | Zeigt stderr nur dem Benutzer an |956| `PostCompact` | Nein | Zeigt stderr nur dem Benutzer |
957| `PreModelSwitch` | Ja | Blockiert den Modellwechsel und zeigt stderr dem Benutzer an |957| `PreModelSwitch` | Ja | Blockiert den Modellwechsel und zeigt stderr dem Benutzer |
958| `PostModelSwitch` | Nein | Zeigt stderr nur dem Benutzer an; das Modell hat bereits gewechselt |958| `PostModelSwitch` | Nein | Zeigt stderr nur dem Benutzer; das Modell ist bereits gewechselt |
959| `Elicitation` | Ja | Verweigert die Elicitation |959| `Elicitation` | Ja | Verweigert die Elicitation |
960| `ElicitationResult` | Ja | Blockiert die Antwort (Aktion wird Ablehnung) |960| `ElicitationResult` | Ja | Blockiert die Antwort (Aktion wird Ablehnung) |
961| `WorktreeCreate` | Ja | Jeder Nicht-Null-Exit-Code führt zu Fehler bei der Worktree-Erstellung |961| `WorktreeCreate` | Ja | Jeder Nonzero-Exit-Code führt dazu, dass die Worktree-Erstellung fehlschlägt |
962| `WorktreeRemove` | Ja | Jeder Nicht-Null-Exit-Code lässt die Worktree-Entfernung fehlschlagen, wenn das Verzeichnis danach noch existiert. Siehe [WorktreeRemove](#worktreeremove) für das, was mit dem Verzeichnis passiert |962| `WorktreeRemove` | Ja | Jeder Nonzero-Exit-Code führt dazu, dass die Worktree-Entfernung fehlschlägt, wenn das Verzeichnis danach noch existiert. Siehe [WorktreeRemove](#worktreeremove) für das, was mit dem Verzeichnis passiert |
963| `InstructionsLoaded` | Nein | Exit-Code wird ignoriert |963| `InstructionsLoaded` | Nein | Exit-Code wird ignoriert |
964| `MessageDisplay` | Nein | Der ursprüngliche Text wird angezeigt |964| `MessageDisplay` | Nein | Der ursprüngliche Text wird angezeigt |
965 965
966Für `SessionStart`, `SubagentStart` und `PostModelSwitch` rendert Claude Code den Exit-Code-2-stderr im Transkript als `<hook name> hook error`-Benachrichtigung, auf die gleiche Weise wie es einen [nicht-blockierenden Fehler](#exit-code-output) rendert. Claude sieht es nicht, und die Sitzung oder der Subagent wird fortgesetzt. Für `SubagentStart` wird die Benachrichtigung im eigenen Transkript des Subagenten angezeigt, nicht im übergeordneten Gespräch.966Für `SessionStart`, `SubagentStart` und `PostModelSwitch` rendert Claude Code den Exit-Code-2-stderr im Transkript als `<Hook-Name> hook error`-Hinweis, auf die gleiche Weise wie es einen [nicht blockierenden Fehler](#exit-code-output) rendert. Claude sieht es nicht, und die Session oder der Subagent wird fortgesetzt. Für `SubagentStart` erscheint der Hinweis im eigenen Transkript des Subagenten, nicht in der übergeordneten Konversation.
967 967
968<h3 id="http-response-handling">968<h3 id="http-response-handling">
969 HTTP-Response-Behandlung969 HTTP-Response-Handling
970</h3>970</h3>
971 971
972HTTP-Hooks verwenden HTTP-Statuscodes und Response-Bodies anstelle von Exit-Codes und stdout. Die Ergebnisse unten gelten für die meisten Ereignisse; ein Ereignis mit seinem eigenen Fehlervertrag in der [ereignisspezifischen Tabelle](#exit-code-2-behavior-per-event), wie `WorktreeCreate`, wendet diesen Vertrag auch auf einen fehlgeschlagenen HTTP-Hook an:972HTTP Hooks verwenden HTTP-Statuscodes und Response-Bodies anstelle von Exit-Codes und stdout. Die folgenden Ergebnisse gelten für die meisten Events; ein Event mit seinem eigenen Fehlervertrag in der [Pro-Event-Tabelle](#exit-code-2-behavior-per-event), wie `WorktreeCreate`, wendet diesen Vertrag auch auf einen fehlgeschlagenen HTTP-Hook an:
973 973
974* **2xx mit leerem Body**: Erfolg, äquivalent zu Exit-Code 0 ohne Ausgabe974* **2xx mit leerem Body**: Erfolg, äquivalent zu Exit-Code 0 ohne Ausgabe
975* **2xx mit JSON-Objekt-Body**: analysiert mit dem gleichen [JSON-Ausgabe](#json-output)-Schema wie Command-Hooks. Ein Body, der die Schema-Validierung nicht besteht, ist ein nicht-blockierender Fehler975* **2xx mit JSON-Objekt-Body**: geparst mit dem gleichen [JSON-Ausgabe](#json-output)-Schema wie Command Hooks. Ein Body, der die Schema-Validierung nicht besteht, ist ein nicht blockierender Fehler
976* **2xx mit jedem anderen Body, wie Plain-Text**: nicht-blockierender Fehler, behandelt wie ein Nicht-2xx-Status. Claude Code fügt den Text nicht zu Claudes Kontext hinzu976* **2xx mit jedem anderen Body, wie einfacher Text**: nicht blockierender Fehler, behandelt wie ein Nicht-2xx-Status. Claude Code fügt den Text nicht zu Claudes Kontext hinzu
977* **Nicht-2xx-Status**: nicht-blockierender Fehler, Ausführung wird fortgesetzt977* **Nicht-2xx-Status**: nicht blockierender Fehler, Ausführung wird fortgesetzt
978* **Verbindungsfehler**: nicht-blockierender Fehler, Ausführung wird fortgesetzt978* **Verbindungsfehler**: nicht blockierender Fehler, Ausführung wird fortgesetzt
979* **Timeout**: der Hook wird abgebrochen, wie unter [Timeouts](#timeouts) beschrieben979* **Timeout**: der Hook wird abgebrochen, wie unter [Timeouts](#timeouts) beschrieben
980 980
981Im Gegensatz zu Command-Hooks können HTTP-Hooks nicht allein durch Statuscodes einen blockierenden Fehler signalisieren. Um einen Tool-Aufruf zu blockieren oder eine Berechtigung zu verweigern, geben Sie eine 2xx-Antwort mit einem JSON-Body zurück, der die entsprechenden Entscheidungsfelder enthält.981Im Gegensatz zu Command Hooks können HTTP Hooks einen blockierenden Fehler nicht allein durch Statuscodes signalisieren. Um einen Tool-Aufruf zu blockieren oder eine Berechtigung zu verweigern, geben Sie eine 2xx-Response mit einem JSON-Body zurück, der die entsprechenden Entscheidungsfelder enthält.
982 982
983<h3 id="json-output">983<h3 id="json-output">
984 JSON-Ausgabe984 JSON-Ausgabe
985</h3>985</h3>
986 986
987Exit-Codes ermöglichen es Ihnen nur zu blockieren oder stillschweigend zu sein, aber JSON-Ausgabe gibt Ihnen eine feinere Kontrolle. Anstatt mit Code 2 zu beenden, um zu blockieren, beenden Sie mit 0 und geben Sie ein JSON-Objekt auf stdout aus. Claude Code liest spezifische Felder aus diesem JSON, um das Verhalten zu steuern, einschließlich [Entscheidungskontrolle](#decision-control) zum Blockieren, Zulassen oder Eskalieren an den Benutzer.987Exit-Codes lassen Sie nur blockieren oder schweigen, aber JSON-Ausgabe gibt Ihnen feinere Kontrolle. Anstatt mit Code 2 zu beenden, um zu blockieren, beenden Sie mit 0 und drucken Sie ein JSON-Objekt auf stdout. Claude Code liest spezifische Felder aus diesem JSON, um Verhalten zu steuern, einschließlich [Entscheidungskontrolle](#decision-control) zum Blockieren, Zulassen oder Eskalieren an den Benutzer.
988 988
989<Note>989<Note>
990 Wählen Sie einen Ansatz pro Hook: verwenden Sie entweder Exit-Codes allein zum Signalisieren, oder beenden Sie mit 0 und geben Sie JSON für strukturierte Kontrolle aus. Wenn Sie sie mischen, behält Exit 2 seine [Blockierungsauswirkung](#exit-code-2-behavior-per-event), und Claude Code liest immer noch die JSON-Felder, mit der einen Elicitation-Ausnahme, die unter [Exit-Code 2](#exit-code-2) vermerkt ist.990 Wählen Sie einen Ansatz pro Hook: Verwenden Sie entweder Exit-Codes allein zum Signalisieren oder beenden Sie mit 0 und drucken Sie JSON für strukturierte Kontrolle. Wenn Sie sie mischen, behält Exit 2 seine [blockierende Auswirkung](#exit-code-2-behavior-per-event), und Claude Code liest immer noch die JSON-Felder, mit der einen Elicitation-Ausnahme, die unter [Exit-Code 2](#exit-code-2) notiert ist.
991</Note>991</Note>
992 992
993Der stdout Ihres Hooks darf nur das JSON-Objekt enthalten. Wenn Ihr Shell-Profil beim Start Text ausgibt, kann dies die JSON-Analyse beeinträchtigen. Siehe [Hook-JSON hat keine Auswirkung](/docs/de/hooks-guide#hook-json-has-no-effect) in der Fehlerbehebungsanleitung.993Der stdout Ihres Hooks muss nur das JSON-Objekt enthalten. Wenn Ihr Shell-Profil beim Start Text druckt, kann es die JSON-Analyse beeinträchtigen. Siehe [Hook JSON hat keine Auswirkung](/docs/de/hooks-guide#hook-json-has-no-effect) im Troubleshooting-Leitfaden.
994 994
995Die Strings `additionalContext`, `systemMessage` und `initialUserMessage` eines Hooks sowie sein Plain-stdout sind auf 10.000 Zeichen begrenzt:995Die Strings `additionalContext`, `systemMessage` und `initialUserMessage` eines Hooks sowie sein einfacher stdout sind auf 10.000 Zeichen begrenzt:
996 996
997* **Umfang**: Claude Code misst jeden String für sich allein, auch wenn mehrere Hooks für das gleiche Ereignis ausgeführt werden. Für JSON-Ausgabe wird jedes Feld separat gemessen; Plain-stdout wird als Ganzes gemessen.997* **Umfang**: Claude Code misst jeden String für sich, auch wenn mehrere Hooks für den gleichen Event ausgeführt werden. Für JSON-Ausgabe wird jedes Feld separat gemessen; einfacher stdout wird als Ganzes gemessen.
998* **Über dem Limit**: Claude Code speichert die Ausgabe in einer Datei im Sitzungsverzeichnis und ersetzt sie durch den Dateipfad und eine Vorschau von bis zu den ersten 2.000 Zeichen. Ein großes gültiges Bash-Ergebnis wird auf die gleiche Weise behandelt, wie unter [Ausgabelimits](/docs/de/tools-reference#output-limits) beschrieben. Im Gegensatz zu dieser Bash-Obergrenze hat diese Obergrenze keine Einstellung oder Umgebungsvariable, um sie zu erhöhen.998* **Über dem Limit**: Claude Code speichert die Ausgabe in einer Datei im Session-Verzeichnis und ersetzt sie durch den Dateipfad und eine Vorschau von bis zu den ersten 2.000 Zeichen. Ein großes gültiges Bash-Ergebnis wird auf die gleiche Weise behandelt, beschrieben unter [Ausgabelimits](/docs/de/tools-reference#output-limits). Im Gegensatz zu dieser Bash-Obergrenze hat diese Obergrenze keine Einstellung oder Umgebungsvariable, um sie zu erhöhen.
999* **Datei lesen**: Claude Code fordert Claude nicht auf, die Datei zu lesen, daher halten Sie alles, das Claude immer sehen muss, innerhalb der Obergrenze.999* **Datei lesen**: Claude Code bittet Claude nicht, die Datei zu lesen, daher halten Sie alles, das Claude immer sehen muss, innerhalb der Obergrenze.
1000 1000
1001Das JSON-Objekt unterstützt drei Arten von Feldern:1001Das JSON-Objekt unterstützt drei Arten von Feldern:
1002 1002
1003* **Universelle Felder** wie `continue` sind in der Tabelle unten aufgelistet. Jedes Ereignis akzeptiert sie, aber einige Ereignisse verwerfen sie oder liefern `systemMessage` an anderer Stelle als dem Transkript. Jeder Abschnitt eines Ereignisses sagt so. `terminalSequence` funktioniert auch auf diesen Ereignissen, mit den Ausnahmen, die unter [Terminal-Benachrichtigungen ausgeben](#emit-terminal-notifications) aufgelistet sind.1003* **Universelle Felder** wie `continue` sind in der folgenden Tabelle aufgelistet. Jeder Event akzeptiert sie, aber einige Events verwerfen sie oder liefern `systemMessage` an anderer Stelle als dem Transkript. Jeder Event-Abschnitt sagt so. `terminalSequence` funktioniert auch auf diesen Events, mit den Ausnahmen, die unter [Terminal-Benachrichtigungen ausgeben](#emit-terminal-notifications) aufgelistet sind.
1004* **Top-Level `decision` und `reason`** werden von einigen Ereignissen verwendet, um zu blockieren oder Feedback zu geben.1004* **Top-Level `decision` und `reason`** werden von einigen Events verwendet, um zu blockieren oder Feedback zu geben.
1005* **`hookSpecificOutput`** ist ein verschachteltes Objekt für Ereignisse, die reichere Kontrolle benötigen. Es erfordert ein `hookEventName`-Feld, das auf den Ereignisnamen gesetzt ist.1005* **`hookSpecificOutput`** ist ein verschachteltes Objekt für Events, die reichere Kontrolle benötigen. Es erfordert ein `hookEventName`-Feld, das auf den Event-Namen gesetzt ist.
1006 1006
1007| Feld | Standard | Beschreibung |1007| Feld | Standard | Beschreibung |
1008| :----------------- | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1008| :----------------- | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1009| `continue` | `true` | Wenn `false`, stoppt Claude die Verarbeitung vollständig, nachdem der Hook ausgeführt wurde. Hat Vorrang vor allen ereignisspezifischen Entscheidungsfeldern |1009| `continue` | `true` | Wenn `false`, stoppt Claude die Verarbeitung vollständig, nachdem der Hook ausgeführt wird. Hat Vorrang vor allen Event-spezifischen Entscheidungsfeldern |
1010| `stopReason` | keine | Nachricht, die dem Benutzer angezeigt wird, wenn `continue` `false` ist. Sie bleibt in der Konversation, sodass Claude sie sieht, wenn die Konversation fortgesetzt wird |1010| `stopReason` | keine | Meldung, die dem Benutzer angezeigt wird, wenn `continue` `false` ist. Sie bleibt in der Konversation, sodass Claude sie sieht, wenn die Konversation fortgesetzt wird |
1011| `suppressOutput` | `false` | Hat keine Auswirkung: Claude Code akzeptiert das Feld, aber handelt nicht danach. Der stdout eines erfolgreichen Hooks wird nie im Transkript angezeigt und wird im Debug-Log aufgezeichnet |1011| `suppressOutput` | `false` | Hat keine Auswirkung: Claude Code akzeptiert das Feld, aber handelt nicht danach. Der stdout eines erfolgreichen Hooks wird nie im Transkript angezeigt und wird im Debug-Protokoll aufgezeichnet |
1012| `systemMessage` | keine | Warnmeldung, die dem Benutzer angezeigt wird. In [Agent SDK](/docs/de/agent-sdk/overview) und [`--output-format stream-json`](/docs/de/headless)-Ausgabe kann es als [`SDKInformationalMessage`](/docs/de/agent-sdk/typescript#sdkinformationalmessage) ankommen |1012| `systemMessage` | keine | Warnmeldung, die dem Benutzer angezeigt wird. In [Agent SDK](/docs/de/agent-sdk/overview) und [`--output-format stream-json`](/docs/de/headless)-Ausgabe kann es als [`SDKInformationalMessage`](/docs/de/agent-sdk/typescript#sdkinformationalmessage) ankommen |
1013| `terminalSequence` | keine | Eine Terminal-Escape-Sequenz, die Claude Code in Ihrem Namen ausgeben soll, wie eine Desktop-Benachrichtigung, ein Fenstertitel oder eine Glocke. Beschränkt auf OSC `0`/`1`/`2`/`9`/`99`/`777` und BEL. Wenn der Wert etwas außerhalb der Zulassungsliste enthält, wird das Feld ignoriert. Verwenden Sie dies anstelle des Schreibens zu `/dev/tty`, das für Hooks nicht verfügbar ist |1013| `terminalSequence` | keine | Eine Terminal-Escape-Sequenz, die Claude Code in Ihrem Namen ausgeben soll, wie eine Desktop-Benachrichtigung, einen Fenstertitel oder eine Glocke. Beschränkt auf OSC `0`/`1`/`2`/`9`/`99`/`777` und BEL. Wenn der Wert etwas außerhalb der Zulassungsliste enthält, wird das Feld ignoriert. Verwenden Sie dies anstelle des Schreibens zu `/dev/tty`, das für Hooks nicht verfügbar ist |
1014 1014
1015Um Claude vollständig zu stoppen:1015Um Claude vollständig zu stoppen:
1016 1016
1018{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }1018{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }
1019```1019```
1020 1020
1021Für `PreToolUse` und `PostToolUse`-Hooks gilt der Stopp auch, wenn der Tool-Aufruf fehlschlägt oder abgeschlossen wird, während Claude immer noch eine Antwort streamt.1021Für `PreToolUse`- und `PostToolUse`-Hooks gilt der Stop auch, wenn der Tool-Aufruf fehlschlägt oder abgeschlossen wird, während Claude immer noch eine Antwort streamt.
1022 1022
1023<h4 id="emit-terminal-notifications">1023<h4 id="emit-terminal-notifications">
1024 Terminal-Benachrichtigungen ausgeben1024 Terminal-Benachrichtigungen ausgeben
1025</h4>1025</h4>
1026 1026
1027Hooks werden ohne steuerndes Terminal ausgeführt, daher schlägt das direkte Schreiben von Escape-Sequenzen zu `/dev/tty` fehl. Geben Sie stattdessen die Escape-Sequenz im Feld `terminalSequence` zurück und Claude Code gibt sie für Sie über seinen eigenen Terminal-Schreibpfad aus. Dies ist race-frei, funktioniert innerhalb von tmux und GNU screen und funktioniert unter Windows, wo es kein `/dev/tty` gibt.1027Hooks werden ohne steuerndes Terminal ausgeführt, daher schlägt das direkte Schreiben von Escape-Sequenzen zu `/dev/tty` fehl. Geben Sie stattdessen die Escape-Sequenz im `terminalSequence`-Feld zurück und Claude Code gibt sie für Sie über seinen eigenen Terminal-Schreibpfad aus. Dies ist race-frei, funktioniert innerhalb von tmux und GNU screen und funktioniert unter Windows, wo es kein `/dev/tty` gibt.
1028 1028
1029Das Feld akzeptiert einen String aus einer oder mehreren zugelassenen Escape-Sequenzen:1029Das Feld akzeptiert einen String von einer oder mehreren zugelassenen Escape-Sequenzen:
1030 1030
1031* OSC `0`, `1`, `2`: Fenster- und Symboltitel1031* OSC `0`, `1`, `2`: Fenster- und Icon-Titel
1032* OSC `9`: iTerm2-, ConEmu-, Windows Terminal- und WezTerm-Benachrichtigungen, einschließlich `9;4` Taskleisten-Fortschritt1032* OSC `9`: iTerm2, ConEmu, Windows Terminal und WezTerm-Benachrichtigungen, einschließlich `9;4` Taskleisten-Fortschritt
1033* OSC `99`: Kitty-Benachrichtigungen1033* OSC `99`: Kitty-Benachrichtigungen
1034* OSC `777`: urxvt-, Ghostty- und Warp-Benachrichtigungen1034* OSC `777`: urxvt, Ghostty und Warp-Benachrichtigungen
1035* Bare BEL1035* Bare BEL
1036 1036
1037Sequenzen können mit BEL oder mit ST beendet werden. Alles außerhalb der Zulassungsliste, einschließlich CSI-Cursor- und Farbsequenzen, OSC-Palettensequenzen, OSC-8-Hyperlinks, OSC-52-Zwischenablage-Schreibvorgänge und OSC-1337, wird abgelehnt und das Feld wird ignoriert.1037Sequenzen können mit BEL oder mit ST beendet werden. Alles außerhalb der Zulassungsliste, einschließlich CSI-Cursor- und Farbsequenzen, OSC-Palettensequenzen, OSC-8-Hyperlinks, OSC-52-Clipboard-Schreibvorgänge und OSC 1337, wird abgelehnt und das Feld wird ignoriert.
1038 1038
1039Claude Code gibt die Sequenz selbst aus, wenn es die Ausgabe Ihres Hooks verarbeitet, sodass das Feld bei Ereignissen funktioniert, die `systemMessage` und `continue` verwerfen, wie `Notification` und `StopFailure`. Es hat zwei Limits:1039Claude Code schreibt die Sequenz selbst, wenn es Ihre Hook-Ausgabe verarbeitet, sodass das Feld bei Events funktioniert, die `systemMessage` und `continue` verwerfen, wie `Notification` und `StopFailure`. Es hat zwei Limits:
1040 1040
1041* Claude Code gibt die Sequenz nur in einer interaktiven Sitzung aus, und nur während seine Benutzeroberfläche auf dem Bildschirm ist. Im nicht-interaktiven Modus mit dem `-p`-Flag und im Agent SDK ignoriert es das Feld.1041* Claude Code schreibt die Sequenz nur in einer interaktiven Session und nur, während seine Schnittstelle auf dem Bildschirm ist. Im nicht-interaktiven Modus mit dem `-p`-Flag und im Agent SDK ignoriert es das Feld.
1042* Ein `WorktreeCreate`-Command-Hook kann kein JSON zurückgeben, da Claude Code seinen stdout als Worktree-Pfad liest. Ein HTTP-`WorktreeCreate`-Hook gibt JSON zurück und kann das Feld enthalten.1042* Ein `WorktreeCreate`-Command-Hook kann kein JSON zurückgeben, da Claude Code seinen stdout als Worktree-Pfad liest. Ein HTTP-`WorktreeCreate`-Hook gibt JSON zurück und kann das Feld enthalten.
1043 1043
1044Das Beispiel unten löst eine Desktop-Benachrichtigung von einem `Notification`-Hook aus. Die Escape-Sequenz wird mit `printf`-Oktalescapes erstellt, sodass die Steuerbytes nie auf der Shell-Befehlszeile erscheinen, und `jq -n --arg` erstellt die JSON-Ausgabe, sodass Anführungszeichen, Backslashes und Zeilenumbrüche in der Benachrichtigungsmeldung korrekt escaped werden:1044Das folgende Beispiel löst eine Desktop-Benachrichtigung von einem `Notification`-Hook aus. Die Escape-Sequenz wird mit `printf`-Oktal-Escapes erstellt, sodass die Steuerbytes nie auf der Shell-Befehlszeile erscheinen, und `jq -n --arg` erstellt die JSON-Ausgabe, sodass Anführungszeichen, Backslashes und Zeilenumbrüche in der Benachrichtigungsmeldung korrekt escaped werden:
1045 1045
1046```bash theme={null}1046```bash theme={null}
1047#!/bin/bash1047#!/bin/bash
1048# Notification-Hook: Ping des Desktops, wenn Claude Code Aufmerksamkeit benötigt.1048# Notification hook: ping the desktop when Claude Code needs attention.
1049input=$(cat)1049input=$(cat)
1050title="Claude Code"1050title="Claude Code"
1051body=$(jq -r '.message // "Needs your attention"' <<<"$input")1051body=$(jq -r '.message // "Needs your attention"' <<<"$input")
1053jq -nc --arg seq "$seq" '{terminalSequence: $seq}'1053jq -nc --arg seq "$seq" '{terminalSequence: $seq}'
1054```1054```
1055 1055
1056Die Form `{ "terminalSequence": "..." }` ist die gleiche aus jeder Shell oder Sprache.1056Die `{ "terminalSequence": "..." }`-Form ist die gleiche aus jeder Shell oder Sprache.
1057 1057
1058<h4 id="add-context-for-claude">1058<h4 id="add-context-for-claude">
1059 Kontext für Claude hinzufügen1059 Kontext für Claude hinzufügen
1060</h4>1060</h4>
1061 1061
1062Das Feld `additionalContext` übergibt einen String aus Ihrem Hook in Claudes Kontextfenster. Claude Code umhüllt den String in eine Systemerinnerung und fügt ihn in das Gespräch an dem Punkt ein, an dem der Hook ausgelöst wurde. Claude liest die Erinnerung bei der nächsten Modellanfrage, aber sie wird nicht als Chat-Nachricht in der Benutzeroberfläche angezeigt.1062Das `additionalContext`-Feld übergibt einen String von Ihrem Hook in Claudes Kontextfenster. Claude Code umhüllt den String in eine Systemerinnerung und fügt ihn in die Konversation an dem Punkt ein, an dem der Hook ausgelöst wurde. Claude liest die Erinnerung bei der nächsten Modellanfrage, aber sie erscheint nicht als Chat-Nachricht in der Schnittstelle.
1063 1063
1064Geben Sie `additionalContext` innerhalb von `hookSpecificOutput` neben dem Ereignisnamen zurück:1064Geben Sie `additionalContext` innerhalb von `hookSpecificOutput` neben dem Event-Namen zurück:
1065 1065
1066```json theme={null}1066```json theme={null}
1067{1067{
1072}1072}
1073```1073```
1074 1074
1075Wo die Erinnerung angezeigt wird, hängt vom Ereignis ab:1075Wo die Erinnerung erscheint, hängt vom Event ab:
1076 1076
1077* [SessionStart](#sessionstart) und [SubagentStart](#subagentstart): am Anfang der Konversation, vor der ersten Eingabeaufforderung1077* [SessionStart](#sessionstart) und [SubagentStart](#subagentstart): am Anfang der Konversation, vor dem ersten Prompt
1078* [UserPromptSubmit](#userpromptsubmit) und [UserPromptExpansion](#userpromptexpansion): neben der eingereichten Eingabeaufforderung1078* [UserPromptSubmit](#userpromptsubmit) und [UserPromptExpansion](#userpromptexpansion): neben dem eingereichten Prompt
1079* [PreToolUse](#pretooluse), [PostToolUse](#posttooluse), [PostToolUseFailure](#posttoolusefailure) und [PostToolBatch](#posttoolbatch): neben dem Tool-Ergebnis1079* [PreToolUse](#pretooluse), [PostToolUse](#posttooluse), [PostToolUseFailure](#posttoolusefailure) und [PostToolBatch](#posttoolbatch): neben dem Tool-Ergebnis
1080* [Stop](#stop) und [SubagentStop](#subagentstop): am Ende des Zugs. Die Konversation wird fortgesetzt, sodass Claude auf das Feedback reagieren kann. Siehe [Stop-Entscheidungskontrolle](#stop-decision-control)1080* [Stop](#stop) und [SubagentStop](#subagentstop): am Ende des Turns. Die Konversation wird fortgesetzt, sodass Claude auf das Feedback reagieren kann. Siehe [Stop-Entscheidungskontrolle](#stop-decision-control)
1081* [PostModelSwitch](#postmodelswitch): mit der nächsten Anfrage nach dem Wechsel. Siehe [PostModelSwitch-Entscheidungskontrolle](#postmodelswitch-decision-control) für Timing1081* [PostModelSwitch](#postmodelswitch): mit der nächsten Anfrage nach dem Wechsel. Siehe [PostModelSwitch-Entscheidungskontrolle](#postmodelswitch-decision-control) für Timing
1082 1082
1083Wenn mehrere Hooks `additionalContext` für das gleiche Ereignis zurückgeben, erhält Claude alle Werte.1083Wenn mehrere Hooks `additionalContext` für den gleichen Event zurückgeben, empfängt Claude alle Werte.
1084 1084
1085Wenn ein Wert 10.000 Zeichen überschreitet, schreibt Claude Code den Text in eine Datei im Sitzungsverzeichnis und übergibt Claude stattdessen den Dateipfad mit einer Vorschau von bis zu den ersten 2.000 Zeichen. Claude kann die Datei lesen, aber Claude Code fordert es nicht auf.1085Wenn ein Wert 10.000 Zeichen überschreitet, schreibt Claude Code den Text in eine Datei im Session-Verzeichnis und übergibt Claude stattdessen den Dateipfad mit einer Vorschau von bis zu den ersten 2.000 Zeichen. Claude kann die Datei lesen, aber Claude Code bittet nicht darum.
1086 1086
1087Verwenden Sie `additionalContext` für Informationen, die Claude über den aktuellen Zustand Ihrer Umgebung oder die gerade ausgeführte Operation wissen sollte:1087Verwenden Sie `additionalContext` für Informationen, die Claude über den aktuellen Zustand Ihrer Umgebung oder die gerade ausgeführte Operation wissen sollte:
1088 1088
1089* **Umgebungszustand**: der aktuelle Branch, das Bereitstellungsziel oder aktive Feature-Flags1089* **Umgebungszustand**: der aktuelle Branch, Bereitstellungsziel oder aktive Feature-Flags
1090* **Bedingte Projektregeln**: welcher Test-Befehl für die gerade bearbeitete Datei gilt, welche Verzeichnisse in diesem Worktree schreibgeschützt sind1090* **Bedingte Projektregeln**: welcher Test-Befehl für die gerade bearbeitete Datei gilt, welche Verzeichnisse in diesem Worktree schreibgeschützt sind
1091* **Externe Daten**: offene Probleme, die Ihnen zugewiesen sind, aktuelle CI-Ergebnisse, Inhalte, die von einem internen Service abgerufen wurden1091* **Externe Daten**: offene Issues, die Ihnen zugewiesen sind, aktuelle CI-Ergebnisse, Inhalte, die von einem internen Service abgerufen wurden
1092 1092
1093Für Anweisungen, die sich nie ändern, bevorzugen Sie [CLAUDE.md](/docs/de/memory). Es wird ohne Ausführung eines Skripts geladen und ist der Standardort für statische Projektkonventionen.1093Für Anweisungen, die sich nie ändern, bevorzugen Sie [CLAUDE.md](/docs/de/memory). Es wird ohne Ausführung eines Skripts geladen und ist der Standard-Ort für statische Projektkonventionen.
1094 1094
1095Schreiben Sie den Text als sachliche Aussagen statt als imperative Systembefehle. Formulierungen wie „Das Bereitstellungsziel ist Produktion" oder „Dieses Repo verwendet `bun test`" werden als Projektinformationen gelesen. Text, der als Out-of-Band-Systembefehle formuliert ist, kann Claudes Prompt-Injection-Abwehr auslösen, was dazu führt, dass Claude den Text an Sie zurückgibt, anstatt ihn als Kontext zu behandeln.1095Schreiben Sie den Text als sachliche Aussagen statt imperativer Systembefehle. Formulierungen wie „Das Bereitstellungsziel ist Produktion" oder „Dieses Repo verwendet `bun test`" werden als Projektinformationen gelesen. Text, der als Out-of-Band-Systembefehle formuliert ist, kann Claudes Prompt-Injection-Abwehr auslösen, was dazu führt, dass Claude den Text an Sie übermittelt, anstatt ihn als Kontext zu behandeln.
1096 1096
1097Claude Code speichert den eingespritzt Text im Sitzungstranskript. Für Mid-Session-Ereignisse wie `PostToolUse` oder `UserPromptSubmit` wird beim Fortsetzen mit `--continue` oder `--resume` der gespeicherte Text erneut abgespielt, anstatt den Hook für vergangene Umdrehungen erneut auszuführen, sodass Werte wie Zeitstempel oder Commit-SHAs beim Fortsetzen veraltet werden. `SessionStart`-Hooks werden beim Fortsetzen mit `source` auf `"resume"` gesetzt erneut ausgeführt, oder `"fork"` wenn Sie `--fork-session` hinzugefügt haben, sodass sie ihren Kontext aktualisieren können.1097Claude Code speichert den eingefügten Text im Session-Transkript. Für Mid-Session-Events wie `PostToolUse` oder `UserPromptSubmit`, wenn Sie mit `--continue` oder `--resume` fortfahren, spielt Claude Code den gespeicherten Text erneut ab, anstatt den Hook für vergangene Turns erneut auszuführen, sodass Werte wie Zeitstempel oder Commit-SHAs veraltet werden. `SessionStart`-Hooks werden bei Wiederaufnahme mit `source` auf `"resume"` oder `"fork"` gesetzt, wenn Sie `--fork-session` hinzugefügt haben, erneut ausgeführt, sodass sie ihren Kontext aktualisieren können.
1098 1098
1099<h4 id="decision-control">1099<h4 id="decision-control">
1100 Entscheidungskontrolle1100 Entscheidungskontrolle
1101</h4>1101</h4>
1102 1102
1103Nicht jedes Ereignis unterstützt das Blockieren oder Steuern des Verhaltens durch JSON. Die Ereignisse, die dies tun, verwenden jeweils einen anderen Satz von Feldern, um diese Entscheidung auszudrücken. Verwenden Sie diese Tabelle als schnelle Referenz, bevor Sie einen Hook schreiben:1103Nicht jeder Event unterstützt Blockierung oder Verhaltenskontrolle durch JSON. Die Events, die dies tun, verwenden jeweils einen anderen Satz von Feldern, um diese Entscheidung auszudrücken. Verwenden Sie diese Tabelle als schnelle Referenz, bevor Sie einen Hook schreiben:
1104 1104
1105| Ereignisse | Entscheidungsmuster | Schlüsselfelder |1105| Events | Entscheidungsmuster | Schlüsselfelder |
1106| :---------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1106| :---------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1107| UserPromptSubmit, UserPromptExpansion, PostToolUse, PostToolUseFailure, PostToolBatch, Stop, SubagentStop, ConfigChange, PreCompact | Top-Level `decision` | `decision: "block"`, `reason`. Stop und SubagentStop akzeptieren auch `hookSpecificOutput.additionalContext` für [nicht-fehlerhafte Rückmeldung, die die Konversation fortsetzt](#stop-decision-control) |1107| UserPromptSubmit, UserPromptExpansion, PostToolUse, PostToolUseFailure, PostToolBatch, Stop, SubagentStop, ConfigChange, PreCompact | Top-Level `decision` | `decision: "block"`, `reason`. Stop und SubagentStop akzeptieren auch `hookSpecificOutput.additionalContext` für [nicht-fehlerhafte Rückmeldung, die die Konversation fortsetzt](#stop-decision-control) |
1108| TeammateIdle, TaskCompleted | Exit-Code oder `continue: false` | Exit-Code 2 blockiert die Aktion mit stderr-Feedback. JSON `{"continue": false, "stopReason": "..."}` stoppt auch den Teammate vollständig, was dem `Stop`-Hook-Verhalten entspricht; [TaskCompleted ignoriert es, wenn das `TaskUpdate`-Tool das Ereignis ausgelöst hat](#taskcompleted-decision-control) |1108| TeammateIdle, TaskCompleted | Exit-Code oder `continue: false` | Exit-Code 2 blockiert die Aktion mit stderr-Rückmeldung. JSON `{"continue": false, "stopReason": "..."}` stoppt auch den Teammate vollständig, was dem `Stop`-Hook-Verhalten entspricht; [TaskCompleted ignoriert es, wenn das `TaskUpdate`-Tool den Event ausgelöst hat](#taskcompleted-decision-control) |
1109| TaskCreated | Exit-Code oder Top-Level `decision` | Exit-Code 2 oder `decision: "block"` [bricht die Aufgabe ab](#taskcreated-decision-control) und gibt die Nachricht an Claude zurück. `continue: false` wird ignoriert |1109| TaskCreated | Exit-Code oder Top-Level `decision` | Exit-Code 2 oder `decision: "block"` [bricht die Task ab](#taskcreated-decision-control) und gibt die Meldung an Claude zurück. `continue: false` wird ignoriert |
1110| PreToolUse | `hookSpecificOutput` | `permissionDecision` (allow/deny/ask/defer), `permissionDecisionReason` |1110| PreToolUse | `hookSpecificOutput` | `permissionDecision` (allow/deny/ask/defer), `permissionDecisionReason` |
1111| PreModelSwitch | `hookSpecificOutput` oder Top-Level `decision` | `permissionDecision` (allow/deny/ask), `permissionDecisionReason`. `decision: "block"` [bricht auch den Wechsel ab](#premodelswitch-decision-control) |1111| PreModelSwitch | `hookSpecificOutput` oder Top-Level `decision` | `permissionDecision` (allow/deny/ask), `permissionDecisionReason`. `decision: "block"` [bricht auch den Wechsel ab](#premodelswitch-decision-control) |
1112| PermissionRequest | `hookSpecificOutput` | `decision.behavior` (allow/deny) |1112| PermissionRequest | `hookSpecificOutput` | `decision.behavior` (allow/deny) |
1113| PermissionDenied | `hookSpecificOutput` | `retry: true` teilt dem Modell mit, dass es möglicherweise den verweigerten Tool-Aufruf erneut versuchen kann; Claude Code ignoriert es für [Ablehnungen ohne Urteil](#permissiondenied-decision-control) |1113| PermissionDenied | `hookSpecificOutput` | `retry: true` teilt dem Modell mit, dass es den verweigerten Tool-Aufruf möglicherweise erneut versuchen kann; Claude Code ignoriert es für [No-Verdict-Verweigerungen](#permissiondenied-decision-control) |
1114| WorktreeCreate | Pfad-Rückgabe | Command-Hook gibt Pfad auf stdout aus; HTTP-Hook gibt `hookSpecificOutput.worktreePath` zurück. Hook-Fehler oder fehlender Pfad schlägt die Erstellung fehl |1114| WorktreeCreate | Pfad-Rückgabe | Command Hook druckt Pfad auf stdout; HTTP Hook gibt `hookSpecificOutput.worktreePath` zurück. Hook-Fehler oder fehlender Pfad schlägt die Erstellung fehl |
1115| WorktreeRemove | Exit-Code | Jeder Nicht-Null-Exit-Code lässt die Entfernung fehlschlagen, wenn das Verzeichnis danach noch existiert. Siehe [WorktreeRemove](#worktreeremove) für das, was mit dem Verzeichnis passiert |1115| WorktreeRemove | Exit-Code | Jeder Nonzero-Exit-Code lässt die Entfernung fehlschlagen, wenn das Verzeichnis danach noch existiert. JSON-Ausgabe wird verworfen |
1116| Elicitation | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (Formularfeldwerte für accept) |1116| Elicitation | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (Formularfeldwerte für accept) |
1117| ElicitationResult | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (Formularfeldwerte überschreiben) |1117| ElicitationResult | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (Formularfeldwerte überschreiben) |
1118| MessageDisplay | `hookSpecificOutput` | `displayContent` ersetzt den angezeigten Text auf dem Bildschirm. Nur Anzeige: das Transkript und das, was Claude sieht, behalten das Original |1118| MessageDisplay | `hookSpecificOutput` | `displayContent` ersetzt den angezeigten Text auf dem Bildschirm. Nur Anzeige: das Transkript und das, was Claude sieht, behalten das Original |
1119| SessionStart, SubagentStart, PostModelSwitch | Nur Kontext | `hookSpecificOutput.additionalContext` fügt Kontext für Claude hinzu. SessionStart akzeptiert auch [`initialUserMessage`, `watchPaths`, `sessionTitle` und `reloadSkills`](#sessionstart-decision-control). Keine Blockierung oder Entscheidungskontrolle |1119| SessionStart, SubagentStart, PostModelSwitch | Nur Kontext | `hookSpecificOutput.additionalContext` fügt Kontext für Claude hinzu. SessionStart akzeptiert auch [`initialUserMessage`, `watchPaths`, `sessionTitle` und `reloadSkills`](#sessionstart-decision-control). Keine Blockierung oder Entscheidungskontrolle |
1120| Setup, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, DirectoryAdded, FileChanged | Keine | Keine Entscheidungskontrolle. Wird für Nebenwirkungen wie Protokollierung oder Bereinigung verwendet |1120| Setup, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, DirectoryAdded, FileChanged | Keine | Keine Entscheidungskontrolle. Wird für Nebeneffekte wie Protokollierung oder Bereinigung verwendet |
1121 1121
1122Einige Ereignisse können auch Inhalte umschreiben, anstatt nur zuzulassen oder zu blockieren:1122Einige Events können auch Inhalte umschreiben, anstatt nur zu erlauben oder zu blockieren:
1123 1123
1124* `PreToolUse`: `updatedInput` direkt unter `hookSpecificOutput` ersetzt die Argumente eines Tools, bevor es ausgeführt wird. Siehe [PreToolUse-Entscheidungskontrolle](#pretooluse-decision-control)1124* `PreToolUse`: `updatedInput` direkt unter `hookSpecificOutput` ersetzt die Argumente eines Tools, bevor es ausgeführt wird. Siehe [PreToolUse-Entscheidungskontrolle](#pretooluse-decision-control)
1125* `PermissionRequest`: `updatedInput` innerhalb des `decision`-Objekts. Siehe [PermissionRequest-Entscheidungskontrolle](#permissionrequest-decision-control)1125* `PermissionRequest`: `updatedInput` innerhalb des `decision`-Objekts. Siehe [PermissionRequest-Entscheidungskontrolle](#permissionrequest-decision-control)
1126* `PostToolUse`: `updatedToolOutput` ersetzt das Ergebnis des Tools. Siehe [PostToolUse-Entscheidungskontrolle](#posttooluse-decision-control)1126* `PostToolUse`: `updatedToolOutput` ersetzt das Tool-Ergebnis. Siehe [PostToolUse-Entscheidungskontrolle](#posttooluse-decision-control)
1127* `UserPromptSubmit`: kann die Eingabeaufforderung nicht ersetzen; injiziert nur `additionalContext` daneben1127* `UserPromptSubmit`: kann den Prompt nicht ersetzen; es injiziert nur `additionalContext` daneben
1128 1128
1129Für Redaktions- oder Transformationsfälle fangen Sie bei `PreToolUse` für ausgehende Tool-Eingaben und `PostToolUse` für eingehende Tool-Ergebnisse ab.1129Für Redaktions- oder Transformationsfälle, fangen Sie bei `PreToolUse` für ausgehende Tool-Eingaben und `PostToolUse` für eingehende Tool-Ergebnisse ab.
1130 1130
1131Hier sind Beispiele für jedes Muster in Aktion:1131Hier sind Beispiele für jedes Muster in Aktion:
1132 1132
1133<Tabs>1133<Tabs>
1134 <Tab title="Top-Level-Entscheidung">1134 <Tab title="Top-level decision">
1135 Der einzige Wert für `decision` ist `"block"`. Um die Aktion fortzusetzen, lassen Sie `decision` aus Ihrem JSON weg, oder beenden Sie mit 0 ohne jede JSON:1135 Der einzige Wert für `decision` ist `"block"`. Um die Aktion fortzusetzen, lassen Sie `decision` aus Ihrem JSON weg oder beenden Sie mit 0 ohne JSON:
1136 1136
1137 ```json theme={null}1137 ```json theme={null}
1138 {1138 {
1143 </Tab>1143 </Tab>
1144 1144
1145 <Tab title="PreToolUse">1145 <Tab title="PreToolUse">
1146 Verwendet `hookSpecificOutput` für reichere Kontrolle: zulassen, verweigern oder an den Benutzer eskalieren. Sie können auch die Tool-Eingabe vor der Ausführung ändern oder zusätzlichen Kontext für Claude injizieren. Siehe [PreToolUse-Entscheidungskontrolle](#pretooluse-decision-control) für den vollständigen Satz von Optionen.1146 Verwendet `hookSpecificOutput` für reichere Kontrolle: erlauben, verweigern oder eskalieren an den Benutzer. Sie können auch Tool-Eingabe vor der Ausführung ändern oder zusätzlichen Kontext für Claude injizieren. Siehe [PreToolUse-Entscheidungskontrolle](#pretooluse-decision-control) für den vollständigen Satz von Optionen.
1147 1147
1148 ```json theme={null}1148 ```json theme={null}
1149 {1149 {
1157 </Tab>1157 </Tab>
1158 1158
1159 <Tab title="PermissionRequest">1159 <Tab title="PermissionRequest">
1160 Verwendet `hookSpecificOutput`, um eine Berechtigungsanfrage im Namen des Benutzers zuzulassen oder zu verweigern. Beim Zulassen können Sie auch die Eingabe des Tools ändern oder Berechtigungsregeln anwenden, damit der Benutzer nicht erneut aufgefordert wird. Siehe [PermissionRequest-Entscheidungskontrolle](#permissionrequest-decision-control) für den vollständigen Satz von Optionen.1160 Verwendet `hookSpecificOutput`, um eine Berechtigungsanfrage im Namen des Benutzers zu erlauben oder zu verweigern. Beim Erlauben können Sie auch die Tool-Eingabe ändern oder Berechtigungsregeln anwenden, sodass der Benutzer nicht erneut aufgefordert wird. Siehe [PermissionRequest-Entscheidungskontrolle](#permissionrequest-decision-control) für den vollständigen Satz von Optionen.
1161 1161
1162 ```json theme={null}1162 ```json theme={null}
1163 {1163 {
1175 </Tab>1175 </Tab>
1176</Tabs>1176</Tabs>
1177 1177
1178Erweiterte Beispiele einschließlich Bash-Befehlsvalidierung, Prompt-Filterung und Auto-Genehmigungsskripte finden Sie unter [Was Sie automatisieren können](/docs/de/hooks-guide#what-you-can-automate) in der Anleitung und der [Bash-Befehlsvalidierungs-Referenzimplementierung](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py).1178Für erweiterte Beispiele einschließlich Bash-Befehlsvalidierung, Prompt-Filterung und Auto-Approval-Skripte, siehe [Was Sie automatisieren können](/docs/de/hooks-guide#what-you-can-automate) im Leitfaden und die [Bash-Befehlsvalidierungs-Referenzimplementierung](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py).
1179 1179
1180<h2 id="hook-events">1180<h2 id="hook-events">
1181 Hook-Ereignisse1181 Hook-Ereignisse
1182</h2>1182</h2>
1183 1183
1184Jedes 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 durch die agentengesteuerte Schleife bis zum Sitzungsende. Jeder Abschnitt beschreibt, wann das Ereignis ausgelöst wird, welche Matcher es unterstützt, die JSON-Eingabe, die es erhält, und wie das Verhalten durch die Ausgabe gesteuert wird.1184Jedes 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.
1185 1185
1186<h3 id="sessionstart">1186<h3 id="sessionstart">
1187 SessionStart1187 SessionStart
1189 1189
1190Wird 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).1190Wird 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).
1191 1191
1192SessionStart 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 Zeitpunkt, an dem `mcp_tool` Hooks ausgeführt werden.1192SessionStart 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 Zeitpunkt der Ausführung von `mcp_tool` Hooks.
1193 1193
1194Der Matcher-Wert entspricht der Art, wie die Sitzung initiiert wurde:1194Der Matcher-Wert entspricht der Art, wie die Sitzung eingeleitet wurde:
1195 1195
1196| Matcher | Wann es ausgelöst wird |1196| Matcher | Wann wird es ausgelöst |
1197| :-------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- |1197| :-------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1198| `startup` | Neue Sitzung |1198| `startup` | Neue Sitzung |
1199| `resume` | `--resume`, `--continue` oder `/resume` |1199| `resume` | `--resume`, `--continue` oder `/resume` |
1200| `clear` | `/clear` |1200| `clear` | `/clear` |
1201| `compact` | Auto- oder manuelle Komprimierung |1201| `compact` | Automatische oder manuelle Komprimierung |
1202| `fork` | Eine neue Sitzung, die von einer vorhandenen abgezweigt ist: `--fork-session` mit `--resume` oder `--continue`, die `/fork` Hintergrund-Kopie oder `/branch` |1202| `fork` | Eine neue Sitzung, die aus einer vorhandenen abgezweigt wurde: `--fork-session` mit `--resume` oder `--continue`, die `/fork` Hintergrundkopie oder `/branch` |
1203 1203
1204Vor v2.1.214 meldeten abgezweigte Sitzungen die Quelle `"resume"`.1204Vor v2.1.214 meldeten abgezweigte Sitzungen die Quelle `"resume"`.
1205 1205
1206Wenn Sie eine interaktive Sitzung starten, ein Gespräch beim Start mit `--continue` oder `--resume` fortsetzen oder `/clear` ausführen, werden SessionStart-Hooks im Hintergrund ausgeführt. Sie können sofort tippen, und ein Gespräch, das 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.1206Wenn Sie eine interaktive Sitzung starten, ein Gespräch beim Start mit `--continue` oder `--resume` fortsetzen oder `/clear` ausführen, werden SessionStart-Hooks im Hintergrund ausgeführt. Sie können sofort tippen, und ein fortgesetztes Gespräch 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.
1207 1207
1208Wenn Sie Gespräche mit `/resume` innerhalb einer Sitzung wechseln, wartet der Wechsel darauf, dass die Hooks fertig sind. Wenn Sie `/clear` ausführen oder zu einem anderen Gespräch wechseln, während Hintergrund-Hooks noch laufen, gilt nichts, was sie zurückgeben, für die Sitzung.1208Wenn Sie mit `/resume` innerhalb einer Sitzung zu Gesprächen wechseln, wartet der Wechsel darauf, dass die Hooks fertig sind. Wenn Sie `/clear` ausführen oder zu einem anderen Gespräch wechseln, während Hintergrund-Hooks noch laufen, gilt nichts, was sie zurückgeben, für die Sitzung.
1209 1209
1210Das gleiche Warten gilt beim Start, einschließlich einer fortgesetzten Sitzung: Ein Prompt, den Sie senden, während SessionStart-Hooks noch laufen, erreicht Claude nicht, bis sie fertig sind.1210Die gleiche Wartezeit gilt beim Start, einschließlich einer fortgesetzten Sitzung: eine Eingabeaufforderung, die Sie senden, während SessionStart-Hooks noch laufen, erreicht Claude nicht, bis sie fertig sind.
1211 1211
1212Während des Wartens drücken Sie `Esc`, um den Prompt zurück in die Eingabe zu nehmen, ohne ihn zu senden. Die Hooks laufen weiter.1212Während dieser Wartezeit drücken Sie `Esc`, um die Eingabeaufforderung zurück in die Eingabe zu nehmen, ohne sie zu senden. Die Hooks laufen weiter.
1213 1213
1214<h4 id="sessionstart-input">1214<h4 id="sessionstart-input">
1215 SessionStart-Eingabe1215 SessionStart-Eingabe
1216</h4>1216</h4>
1217 1217
1218Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SessionStart-Hooks `source` und optional `model`, `agent_type` und `session_title`:1218Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten SessionStart-Hooks `source` und optional `model`, `agent_type` und `session_title`:
1219 1219
1220| Feld | Beschreibung |1220| Feld | Beschreibung |
1221| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1221| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1222| `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 von einer vorhandenen abgezweigt ist |1222| `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 |
1223| `model` | Die aktive Modell-ID. Sie kann weggelassen werden, zum Beispiel nach `/clear` oder wenn eine Sitzung durch Gesprächswiederherstellung wiederhergestellt wird, daher überprüfen Sie das Feld, bevor Sie es lesen |1223| `model` | Die aktive Modell-ID. Sie kann weggelassen werden, z. B. nach `/clear` oder wenn eine Sitzung durch Gesprächswiederherstellung wiederhergestellt wird, daher überprüfen Sie das Feld, bevor Sie es lesen |
1224| `agent_type` | Der Agent-Name, vorhanden, wenn Sie Claude Code mit `claude --agent <name>` starten |1224| `agent_type` | Der Agent-Name, vorhanden, wenn Sie Claude Code mit `claude --agent <name>` starten |
1225| `session_title` | Der aktuelle Sitzungstitel, falls bereits einer gesetzt ist, zum Beispiel über `--name` oder `/rename`. 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 |1225| `session_title` | Der aktuelle Sitzungstitel, falls bereits gesetzt, z. B. über `--name` oder `/rename`. 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 |
1226 1226
1227Wenn `source` `"resume"` oder `"fork"` ist und das Transkript mindestens eine Antwort von Claude enthält, erhalten SessionStart-Hooks auch die vier Felder unten. Ihr Hook kann sie verwenden, um zu melden, was das Fortsetzen eines veralteten Gesprächs kostet, bevor die erste Anfrage erfolgt, zum Beispiel in einer [`systemMessage`](#json-output). Diese Felder erfordern Claude Code v2.1.251 oder später.1227Wenn `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, was das Fortsetzen eines veralteten Gesprächs kostet, bevor die erste Anfrage erfolgt, z. B. in einer [`systemMessage`](#json-output). Diese Felder erfordern Claude Code v2.1.251 oder später.
1228 1228
1229| Feld | Beschreibung |1229| Feld | Beschreibung |
1230| :---------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1230| :---------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1231| `seconds_since_last_response` | Wanduhr-Sekunden seit der letzten Antwort im fortgesetzten Transkript |1231| `seconds_since_last_response` | Wanduhr-Sekunden seit der letzten Antwort im fortgesetzten Transkript |
1232| `context_tokens` | Tokens, die die erste Anfrage der fortgesetzten Sitzung als ihren Prompt erneut sendet |1232| `context_tokens` | Tokens, die die erste Anfrage der fortgesetzten Sitzung als ihre Eingabeaufforderung erneut sendet |
1233| `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 das zwischengespeicherte Gespräch ersetzt hat |1233| `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 das zwischengespeicherte Gespräch ersetzt hat |
1234| `estimated_cache_write_usd` | Geschätzte Kosten in US-Dollar zum Schreiben von `context_tokens` in den Prompt-Cache auf dem Modell der Sitzung, ohne die Antwort |1234| `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 |
1235 1235
1236Dieses Beispiel zeigt die Eingabe für eine Sitzung, die 90 Minuten nach ihrer letzten Antwort fortgesetzt wurde:1236Dieses Beispiel zeigt die Eingabe für eine Sitzung, die 90 Minuten nach ihrer letzten Antwort fortgesetzt wurde:
1237 1237
1257Claude 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:1257Claude 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:
1258 1258
1259| Feld | Beschreibung |1259| Feld | Beschreibung |
1260| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1260| :------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1261| `additionalContext` | Zeichenkette, die zu Claudes Kontext am Anfang des Gesprächs hinzugefügt wird, vor dem ersten Prompt. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude), um zu erfahren, wie der Text bereitgestellt wird und was Sie darin einfügen sollten |1261| `additionalContext` | String, der zu Claudes Kontext am Anfang des Gesprächs hinzugefügt wird, vor der ersten Eingabeaufforderung. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude), um zu erfahren, wie der Text bereitgestellt wird und was Sie darin einfügen sollten |
1262| `initialUserMessage` | Zeichenkette, die als erste Benutzernachricht der Sitzung verwendet wird. Gilt im [nicht-interaktiven Modus](/docs/de/headless) mit dem `-p`-Flag, wo sie zur ersten Runde wird, auch wenn kein Prompt bereitgestellt wird. Wenn ein Prompt bereitgestellt wird, folgt er als nächste Runde. Im Gegensatz zu `additionalContext`, das an eine vorhandene Runde angehängt wird, erstellt dies die Runde |1262| `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 |
1263| `sessionTitle` | Setzt den Sitzungstitel, mit der gleichen Auswirkung wie `/rename`. Verwenden Sie, 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 |1263| `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 |
1264| `watchPaths` | Array von absoluten Pfaden zum Überwachen von [FileChanged](#filechanged)-Ereignissen während dieser Sitzung |1264| `watchPaths` | Array von absoluten Pfaden zum Überwachen von [FileChanged](#filechanged) Ereignissen während dieser Sitzung |
1265| `reloadSkills` | Boolesch. 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 dem ersten Prompt |1265| `reloadSkills` | Boolean. Wenn `true`, scannt Claude Code die [Skill](/docs/de/skills)- und Befehlsverzeichnisse erneut, nachdem die SessionStart-Hooks abgeschlossen sind, sodass Skills, die der Hook installiert hat, in der gleichen Sitzung verfügbar sind, beginnend mit der ersten Eingabeaufforderung |
1266 1266
1267```json theme={null}1267```json theme={null}
1268{1268{
1274}1274}
1275```1275```
1276 1276
1277Da einfacher stdout bereits Claude für dieses Ereignis erreicht, kann ein Hook, der nur Kontext lädt, direkt auf stdout drucken, ohne JSON zu erstellen. Verwenden Sie die JSON-Form, wenn Sie Kontext mit anderen Feldern wie `sessionTitle` kombinieren müssen.1277Da 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 die JSON-Form, wenn Sie Kontext mit anderen Feldern wie `sessionTitle` kombinieren müssen.
1278 1278
1279Verwenden 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 erscheinen. Dieses Beispiel synchronisiert ein gemeinsames Skills-Repository und fordert die Neuscan an:1279Verwenden 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:
1280 1280
1281```bash theme={null}1281```bash theme={null}
1282#!/bin/bash1282#!/bin/bash
1287echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1287echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1288```1288```
1289 1289
1290Die Repository-URL ist ein Platzhalter; ersetzen Sie sie durch Ihr eigenes Skills-Repository. Mit dem Platzhalter schlägt der Clone fehl und gibt eine `fatal:`-Nachricht zu stderr aus. Stderr von einem SessionStart-Hook, der mit 0 beendet wird, ist nur informativ, daher gilt die `reloadSkills`-Anfrage immer noch.1290Die 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.
1291 1291
1292<h4 id="persist-environment-variables">1292<h4 id="persist-environment-variables">
1293 Umgebungsvariablen beibehalten1293 Umgebungsvariablen beibehalten
1294</h4>1294</h4>
1295 1295
1296SessionStart-Hooks haben Zugriff auf die Umgebungsvariable `CLAUDE_ENV_FILE`, die einen Dateipfad bereitstellt, in dem Sie Umgebungsvariablen für nachfolgende Bash-Befehle beibehalten können.1296SessionStart-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.
1297 1297
1298Um einzelne Umgebungsvariablen zu setzen, schreiben Sie `export`-Anweisungen in `CLAUDE_ENV_FILE`. Verwenden Sie Anhängen (`>>`), um Variablen zu bewahren, die von anderen Hooks gesetzt wurden:1298Um einzelne Umgebungsvariablen zu setzen, schreiben Sie `export` Anweisungen in `CLAUDE_ENV_FILE`. Verwenden Sie Anhängen (`>>`), um von anderen Hooks gesetzte Variablen zu bewahren:
1299 1299
1300```bash theme={null}1300```bash theme={null}
1301#!/bin/bash1301#!/bin/bash
1316 1316
1317ENV_BEFORE=$(export -p | sort)1317ENV_BEFORE=$(export -p | sort)
1318 1318
1319# Führen Sie Ihre Setup-Befehle aus, die die Umgebung ändern1319# Run your setup commands that modify the environment
1320source ~/.nvm/nvm.sh1320source ~/.nvm/nvm.sh
1321nvm use 201321nvm use 20
1322 1322
1336 Setup1336 Setup
1337</h3>1337</h3>
1338 1338
1339Wird nur ausgelöst, wenn Sie Claude Code mit `--init-only` starten oder mit `--init` oder `--maintenance` im [nicht-interaktiven Modus](/docs/de/headless) mit dem `-p`-Flag. Es wird nicht beim normalen Start ausgelöst. 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).1339Wird 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 beim normalen Start nicht 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 die Initialisierung pro Sitzung verwenden Sie stattdessen [SessionStart](#sessionstart).
1340 1340
1341Der Matcher-Wert entspricht dem CLI-Flag, das den Hook ausgelöst hat:1341Der Matcher-Wert entspricht dem CLI-Flag, das den Hook ausgelöst hat:
1342 1342
1343| Matcher | Wann es ausgelöst wird |1343| Matcher | Wann wird es ausgelöst |
1344| :------------ | :------------------------------------------- |1344| :------------ | :------------------------------------------- |
1345| `init` | `claude --init-only` oder `claude -p --init` |1345| `init` | `claude --init-only` oder `claude -p --init` |
1346| `maintenance` | `claude -p --maintenance` |1346| `maintenance` | `claude -p --maintenance` |
1347 1347
1348Wenn 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 ein Gespräch zu starten.1348Wenn 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 ein Gespräch zu starten.
1349 1349
1350Wenn Sie ein Gespräch mit `-p` starten oder fortsetzen, müssen Sie auch einen Prompt bereitstellen, entweder als Argument oder über stdin. Sie können den Prompt überspringen, wenn ein `SessionStart`-Hook [`initialUserMessage`](#sessionstart-decision-control) bereitstellt oder wenn Sie eine Sitzung mit einem [verschobenen Tool-Aufruf](#defer-a-tool-call-for-later) fortsetzen.1350Wenn Sie ein Gespräch 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.
1351 1351
1352Bei Erfolg gibt `--init-only` nichts auf dem Terminal aus. 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.1352Bei 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.
1353 1353
1354Da Setup nicht bei jedem Start ausgelöst wird, kann ein Plugin, das eine Abhängigkeit installiert benötigt, sich nicht allein auf Setup verlassen. Das praktische Muster ist, die Abhängigkeit bei der ersten Verwendung zu überprüfen und bei Fehlen zu installieren, zum Beispiel ein Hook oder eine Skill, die auf `${CLAUDE_PLUGIN_DATA}/node_modules` testet und `npm install` ausführt, wenn es fehlt. Siehe das [Verzeichnis für persistente Daten](/docs/de/plugins-reference#persistent-data-directory), um zu erfahren, wo Sie installierte Abhängigkeiten speichern können. 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-reference#node-js-package-dependencies), wenn es das Plugin zwischenspeichert.1354Da Setup nicht bei jedem Start ausgeführt wird, kann sich ein Plugin, das eine Abhängigkeit installiert benötigt, 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-reference#persistent-data-directory), um zu erfahren, wo installierte Abhängigkeiten gespeichert werden. 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-reference#node-js-package-dependencies), wenn es das Plugin zwischenspeichert.
1355 1355
1356<h4 id="setup-input">1356<h4 id="setup-input">
1357 Setup-Eingabe1357 Setup-Eingabe
1358</h4>1358</h4>
1359 1359
1360Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten Setup-Hooks ein Feld `trigger`, das auf `"init"` oder `"maintenance"` gesetzt ist:1360Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten Setup-Hooks ein `trigger` Feld, das auf `"init"` oder `"maintenance"` gesetzt ist:
1361 1361
1362```json theme={null}1362```json theme={null}
1363{1363{
1373 Setup-Entscheidungskontrolle1373 Setup-Entscheidungskontrolle
1374</h4>1374</h4>
1375 1375
1376Setup-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` werden stdout, stderr und Exit-Code eines Setup-Hooks in der Ausgabe des Laufs nur als [`hook_response`-Ereignisse](/docs/de/headless#read-session-metadata) angezeigt, wenn Sie mit `--output-format stream-json --verbose` starten.1376Setup-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` werden stdout, stderr und Exit-Code eines Setup-Hooks in der Ausgabe des Laufs nur als [`hook_response` Ereignisse](/docs/de/headless#read-session-metadata) angezeigt, wenn Sie mit `--output-format stream-json --verbose` starten.
1377 1377
1378Setup-Hooks haben Zugriff auf `CLAUDE_ENV_FILE`. Variablen, die in diese Datei geschrieben werden, bleiben in nachfolgenden Bash-Befehlen für die Sitzung erhalten, 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.1378Setup-Hooks haben Zugriff auf `CLAUDE_ENV_FILE`. Variablen, die in diese Datei geschrieben werden, bleiben in nachfolgenden Bash-Befehlen 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.
1379 1379
1380<h3 id="instructionsloaded">1380<h3 id="instructionsloaded">
1381 InstructionsLoaded1381 InstructionsLoaded
1382</h3>1382</h3>
1383 1383
1384Wird 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, zum Beispiel wenn Claude auf ein Unterverzeichnis zugreift, das eine verschachtelte `CLAUDE.md` enthält, oder wenn bedingte Regeln mit `paths:`-Frontmatter passen. Der Hook unterstützt keine Blockierung oder Entscheidungskontrolle. Er wird asynchron zu Beobachtungszwecken ausgeführt.1384Wird ausgeführt, wenn eine `CLAUDE.md` oder `.claude/rules/*.md` Datei in den Kontext geladen wird. Dieses Ereignis wird beim Sitzungsstart für eifrig geladene Dateien ausgeführt 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.
1385 1385
1386Dieses Ereignis wird nicht ausgelöst, wenn Claude [AGENTS.md direkt](/docs/de/memory#agents-md) über die Einstellung **Projektanweisungen** liest. Es wird ausgelöst, wenn eine `CLAUDE.md` Ihre `AGENTS.md` importiert, mit `load_reason` auf `include` gesetzt wie für jede andere importierte Datei, und wenn `CLAUDE.md` ein Symlink zu ihr ist, als normales `CLAUDE.md`-Laden.1386Dieses Ereignis wird nicht ausgeführt, wenn Claude [direkt `AGENTS.md` liest](/docs/de/memory#agents-md) über die Einstellung **Projektanweisungen**. Es wird ausgeführt, wenn eine `CLAUDE.md` Ihre `AGENTS.md` importiert, mit `load_reason` auf `include` gesetzt wie für jede andere importierte Datei, und wenn `CLAUDE.md` ein Symlink zu ihr ist, als normales `CLAUDE.md` Laden.
1387 1387
1388Der Matcher wird gegen `load_reason` ausgeführt. Verwenden Sie zum Beispiel `"matcher": "session_start"`, um nur für Dateien zu feuern, die beim Sitzungsstart geladen werden, oder `"matcher": "path_glob_match|nested_traversal"`, um nur für träge Ladevorgänge zu feuern.1388Der 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.
1389 1389
1390<h4 id="instructionsloaded-input">1390<h4 id="instructionsloaded-input">
1391 InstructionsLoaded-Eingabe1391 InstructionsLoaded-Eingabe
1392</h4>1392</h4>
1393 1393
1394Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten InstructionsLoaded-Hooks diese Felder:1394Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten InstructionsLoaded-Hooks diese Felder:
1395 1395
1396| Feld | Beschreibung |1396| Feld | Beschreibung |
1397| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1397| :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1398| `file_path` | Absoluter Pfad zur Anweisungsdatei, die geladen wurde |1398| `file_path` | Absoluter Pfad zur Anweisungsdatei, die geladen wurde |
1399| `memory_type` | Umfang der Datei: `"User"`, `"Project"`, `"Local"` oder `"Managed"` |1399| `memory_type` | Umfang der Datei: `"User"`, `"Project"`, `"Local"` oder `"Managed"` |
1400| `load_reason` | Warum die Datei geladen wurde: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` oder `"compact"`. Der Wert `"compact"` wird ausgelöst, wenn Anweisungsdateien nach einem Komprimierungsereignis neu geladen werden |1400| `load_reason` | Warum die Datei geladen wurde: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` oder `"compact"`. Der `"compact"` Wert wird ausgeführt, wenn Anweisungsdateien nach einem Komprimierungsereignis erneut geladen werden |
1401| `globs` | Pfad-Glob-Muster aus dem `paths:`-Frontmatter der Datei, falls vorhanden. Nur für `path_glob_match`-Ladevorgänge vorhanden |1401| `globs` | Pfad-Glob-Muster aus dem `paths:` Frontmatter der Datei, falls vorhanden. Nur für `path_glob_match` Ladevorgänge vorhanden |
1402| `trigger_file_path` | Pfad zur Datei, deren Zugriff diesen Ladevorgang ausgelöst hat, für träge Ladevorgänge |1402| `trigger_file_path` | Pfad zur Datei, deren Zugriff diesen Ladevorgang ausgelöst hat, für träge Ladevorgänge |
1403| `parent_file_path` | Pfad zur übergeordneten Anweisungsdatei, die diese eingebunden hat, für `include`-Ladevorgänge |1403| `parent_file_path` | Pfad zur übergeordneten Anweisungsdatei, die diese eingebunden hat, für `include` Ladevorgänge |
1404 1404
1405```json theme={null}1405```json theme={null}
1406{1406{
1418 InstructionsLoaded-Entscheidungskontrolle1418 InstructionsLoaded-Entscheidungskontrolle
1419</h4>1419</h4>
1420 1420
1421InstructionsLoaded-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-Tracking oder Beobachtbarkeit.1421InstructionsLoaded-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.
1422 1422
1423<h3 id="userpromptsubmit">1423<h3 id="userpromptsubmit">
1424 UserPromptSubmit1424 UserPromptSubmit
1425</h3>1425</h3>
1426 1426
1427Wird ausgeführt, wenn der Benutzer einen Prompt einreicht, bevor Claude ihn verarbeitet. Dies ermöglicht es Ihnen, zusätzlichen Kontext basierend auf dem Prompt/Gespräch hinzuzufügen, Prompts zu validieren oder bestimmte Arten von Prompts zu blockieren.1427Wird ausgeführt, wenn der Benutzer eine Eingabeaufforderung einreicht, bevor Claude sie verarbeitet. Dies ermöglicht es Ihnen, zusätzlichen Kontext basierend auf der Eingabeaufforderung/dem Gespräch hinzuzufügen, Eingabeaufforderungen zu validieren oder bestimmte Arten von Eingabeaufforderungen zu blockieren.
1428
1429`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.
1428 1430
1429`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 anderen Ereignissen. Da dieser Hook vor jedem Prompt 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 Feld `timeout` im Hook-Eintrag.1431Abgesehen 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.
1430 1432
1431Ein [Agent SDK-Callback-Hook](/docs/de/agent-sdk/hooks) auf `UserPromptSubmit`, der sein Timeout erreicht, blockiert den Prompt mit einer Nachricht, die den Hook und das Timeout benennt, da ein Callback dort als Richtlinien-Gate fungieren kann, das nicht offen fehlschlagen darf. Die Sitzung wird fortgesetzt. Vor v2.1.208 endete ein Callback-Timeout bei diesem Ereignis die Runde mit einem Ausführungsfehler.1433Ein [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.
1432 1434
1433<h4 id="userpromptsubmit-input">1435<h4 id="userpromptsubmit-input">
1434 UserPromptSubmit-Eingabe1436 UserPromptSubmit-Eingabe
1435</h4>1437</h4>
1436 1438
1437Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten UserPromptSubmit-Hooks das Feld `prompt`, das den Text enthält, den der Benutzer eingereicht hat.1439Zusä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 seiner 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.
1438 1440
1439```json theme={null}1441```json theme={null}
1440{1442{
1451 UserPromptSubmit-Entscheidungskontrolle1453 UserPromptSubmit-Entscheidungskontrolle
1452</h4>1454</h4>
1453 1455
1454`UserPromptSubmit`-Hooks können steuern, ob ein Benutzer-Prompt verarbeitet wird und Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.1456`UserPromptSubmit` Hooks können steuern, ob eine Benutzereingabeaufforderung verarbeitet wird und Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.
1455 1457
1456Es gibt zwei Möglichkeiten, Kontext zum Gespräch bei Exit-Code 0 hinzuzufügen:1458Es gibt zwei Möglichkeiten, Kontext zum Gespräch bei Exit-Code 0 hinzuzufügen:
1457 1459
1458* **Plain-Text-stdout**: Claude Code fügt stdout, das es [als Klartext behandelt](#exit-code-0), zu Claudes Kontext hinzu1460* **Klartext-stdout**: Claude Code fügt stdout, das es [als Klartext behandelt](#exit-code-0), zu Claudes Kontext hinzu
1459* **JSON mit `additionalContext`**: Verwenden Sie das JSON-Format unten für mehr Kontrolle. Das Feld `additionalContext` wird als Kontext hinzugefügt1461* **JSON mit `additionalContext`**: Verwenden Sie das JSON-Format unten für mehr Kontrolle. Das `additionalContext` Feld wird als Kontext hinzugefügt
1460 1462
1461Weder Kanal erzeugt einen sichtbaren Transkript-Eintrag. Plain-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).1463Keiner 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 Bereitstellung zu bestätigen, überprüfen Sie das [Debug-Protokoll](#debug-hooks).
1462 1464
1463Um einen Prompt zu blockieren, geben Sie ein JSON-Objekt mit `decision` auf `"block"` zurück:1465Um eine Eingabeaufforderung zu blockieren, geben Sie ein JSON-Objekt mit `decision` auf `"block"` zurück:
1464 1466
1465| Feld | Beschreibung |1467| Feld | Beschreibung |
1466| :----------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |1468| :----------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
1467| `decision` | `"block"` verhindert die Verarbeitung des Prompts und löscht ihn aus dem Kontext. Weglassen, um den Prompt fortzusetzen |1469| `decision` | `"block"` verhindert, dass die Eingabeaufforderung verarbeitet wird und löscht sie aus dem Kontext. Weglassen, um die Eingabeaufforderung fortzufahren |
1468| `reason` | Wird dem Benutzer angezeigt, wenn `decision` `"block"` ist. Wird nicht zum Kontext hinzugefügt |1470| `reason` | Wird dem Benutzer angezeigt, wenn `decision` `"block"` ist. Nicht zum Kontext hinzugefügt |
1469| `additionalContext` | Zeichenkette, die zu Claudes Kontext zusammen mit dem eingereichten Prompt hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |1471| `additionalContext` | String, der zu Claudes Kontext neben der eingereichten Eingabeaufforderung hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
1470| `sessionTitle` | Setzt den Sitzungstitel. Verwenden Sie, um Sitzungen automatisch basierend auf dem Prompt-Inhalt zu benennen |1472| `sessionTitle` | Legt den Sitzungstitel fest. Verwenden Sie dies, um Sitzungen automatisch basierend auf dem Inhalt der Eingabeaufforderung zu benennen |
1471| `suppressOriginalPrompt` | Wenn `true`, wenn `decision` `"block"` ist, lässt den ursprünglichen Prompt-Text aus der Blockierungsmeldung aus, die dem Benutzer angezeigt wird |1473| `suppressOriginalPrompt` | Wenn `true`, wenn `decision` `"block"` ist, wird der ursprüngliche Eingabeaufforderungstext aus der angezeigten Blockierungsmeldung weggelassen |
1472 1474
1473Ein Hook, der durch Beenden mit 2 blockiert, wird auf die gleiche Weise wie `reason` weitergeleitet: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text an, und er wird nicht zum Kontext hinzugefügt.1475Ein Hook, der durch Beendigung mit 2 blockiert, wird auf die gleiche Weise wie `reason` weitergeleitet: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text an, und er wird nicht zum Kontext hinzugefügt.
1474 1476
1475```json theme={null}1477```json theme={null}
1476{1478{
1488 UserPromptExpansion1490 UserPromptExpansion
1489</h3>1491</h3>
1490 1492
1491Wird ausgeführt, wenn ein vom Benutzer eingegebener Befehl in einen Prompt erweitert wird, bevor er Claude erreicht. Verwenden Sie dies, um bestimmte Befehle von direkter Aufrufe zu blockieren, Kontext für eine bestimmte Skill einzufügen oder zu protokollieren, welche Befehle Benutzer aufrufen. Zum Beispiel kann ein Hook, der `deploy` passt, `/deploy` blockieren, es sei denn, eine Genehmigungsdatei ist vorhanden, oder ein Hook, der eine Review-Skill passt, kann die Review-Checkliste des Teams als `additionalContext` anhängen.1493Wird 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.
1492 1494
1493Dieses Ereignis deckt den Pfad ab, den `PreToolUse` nicht abdeckt: Ein `PreToolUse`-Hook, der das `Skill`-Tool passt, 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.1495Dieses Ereignis deckt den Pfad ab, den `PreToolUse` nicht abdeckt: Ein `PreToolUse` Hook, der das `Skill` Tool abgleicht, wird nur ausgeführt, wenn Claude das Tool aufruft, aber das direkte Eingeben von `/skillname` umgeht `PreToolUse`. `UserPromptExpansion` wird auf diesem direkten Pfad ausgeführt.
1494 1496
1495Passt auf `command_name`. Lassen Sie den Matcher leer, um auf jedem Prompt-Typ-Befehl zu feuern.1497Gleicht `command_name` ab. Lassen Sie den Matcher leer, um bei jedem Eingabeaufforderungs-Typ-Befehl zu aktivieren.
1496 1498
1497<h4 id="userpromptexpansion-input">1499<h4 id="userpromptexpansion-input">
1498 UserPromptExpansion-Eingabe1500 UserPromptExpansion-Eingabe
1499</h4>1501</h4>
1500 1502
1501Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten UserPromptExpansion-Hooks `expansion_type`, `command_name`, `command_args`, `command_source` und die ursprüngliche `prompt`-Zeichenkette. Das Feld `expansion_type` ist `slash_command` für Skill- und benutzerdefinierte Befehle oder `mcp_prompt` für MCP-Server-Prompts.1503Zusä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.
1502 1504
1503```json theme={null}1505```json theme={null}
1504{1506{
1519 UserPromptExpansion-Entscheidungskontrolle1521 UserPromptExpansion-Entscheidungskontrolle
1520</h4>1522</h4>
1521 1523
1522`UserPromptExpansion`-Hooks können die Erweiterung blockieren oder Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.1524`UserPromptExpansion` Hooks können die Erweiterung blockieren oder Kontext hinzufügen. Alle [JSON-Ausgabefelder](#json-output) sind verfügbar.
1523 1525
1524| Feld | Beschreibung |1526| Feld | Beschreibung |
1525| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------- |1527| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------- |
1526| `decision` | `"block"` verhindert die Erweiterung des Befehls. Weglassen, um ihn fortzusetzen |1528| `decision` | `"block"` verhindert, dass der Befehl erweitert wird. Weglassen, um fortzufahren |
1527| `reason` | Wird dem Benutzer angezeigt, wenn `decision` `"block"` ist |1529| `reason` | Wird dem Benutzer angezeigt, wenn `decision` `"block"` ist |
1528| `additionalContext` | Zeichenkette, die zu Claudes Kontext zusammen mit dem erweiterten Prompt hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |1530| `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 1531
1530Ein Hook, der durch Beenden mit 2 blockiert, wird auf die gleiche Weise wie `reason` weitergeleitet: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text an.1532Ein Hook, der durch Beendigung mit 2 blockiert, wird auf die gleiche Weise wie `reason` weitergeleitet: Die Blockierungsmeldung zeigt dem Benutzer den stderr-Text an.
1531 1533
1532```json theme={null}1534```json theme={null}
1533{1535{
1544 MessageDisplay1546 MessageDisplay
1545</h3>1547</h3>
1546 1548
1547Wird 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.1549Wird 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 fertiggestellter 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.
1548 1550
1549Verwenden Sie MessageDisplay, um:1551Verwenden Sie MessageDisplay für:
1550 1552
1551* Markdown für eine minimale Anzeige zu entfernen1553* Markdown für eine minimale Anzeige entfernen
1552* Den Text zu transformieren, den eine Agent SDK-Anwendung ihren Benutzern zeigt1554* Den Text transformieren, den eine Agent SDK Anwendung ihren Benutzern zeigt
1553* API-Schlüssel oder interne Hostnamen aus Claudes Antworten zu redigieren1555* API-Schlüssel oder interne Hostnamen aus Claudes Antworten redigieren
1554 1556
1555Claude Code hält jeden Batch, bis Ihr Hook zurückkommt, 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 Feld `timeout` im Hook-Eintrag.1557Claude Code hält jeden Batch, bis Ihr Hook zurückkommt, 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.
1556 1558
1557MessageDisplay ist nur für die Anzeige: Der Ersatztext ändert nur das, was auf dem Bildschirm gerendert wird. Das Transkript und das, was Claude sieht, behalten den ursprünglichen Text, daher sieht Claude den Ersatz nie, und der ausführliche Modus zeigt das Original. Der Hook erhält nur Assistenten-Nachrichtentext, daher werden Tool-Ergebnisse und der Text, den Sie eingeben, unverändert gerendert.1559MessageDisplay ist nur für die Anzeige: Der Ersatztext ändert nur das, was auf dem Bildschirm gerendert wird. Das Transkript und das, 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.
1558 1560
1559MessageDisplay 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.1561MessageDisplay unterstützt keine Matcher und wird für jede Assistenten-Nachricht ausgeführt, die Text streamt; Nachrichten ohne Text, wie nur Tool-Aufrufe, lösen es nicht aus.
1560 1562
1561In 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 an, nachdem die Nachricht abgeschlossen ist und trägt den vollständigen Nachrichtentext: `index` ist `0`, `final` ist `true` und `delta` hält die gesamte Nachricht. Ein Hook, der den `delta`-Text für jede Nachricht erfasst, erhält den gleichen Gesamttext in beiden Modi.1563In 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 an 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.
1562 1564
1563<h4 id="messagedisplay-input">1565<h4 id="messagedisplay-input">
1564 MessageDisplay-Eingabe1566 MessageDisplay-Eingabe
1565</h4>1567</h4>
1566 1568
1567Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten MessageDisplay-Hooks Kennungen für die Runde und 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.1569Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten MessageDisplay-Hooks Identifikatoren 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.
1568 1570
1569| Feld | Beschreibung |1571| Feld | Beschreibung |
1570| :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1572| :----------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1571| `turn_id` | UUID der aktuellen Runde |1573| `turn_id` | UUID des aktuellen Zugs |
1572| `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 |1574| `message_id` | UUID der angezeigten Assistenten-Nachricht. 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| `index` | Null-basierter Index dieses Batches innerhalb der Nachricht |1575| `index` | Null-basierter Index dieses Batches innerhalb der Nachricht |
1574| `final` | `true` beim letzten Batch der Nachricht. Jede Nachricht hat genau einen finalen Batch |1576| `final` | `true` beim letzten Batch der Nachricht. Jede Nachricht hat genau einen finalen Batch |
1575| `delta` | Die neu abgeschlossenen Zeilen seit dem vorherigen Batch, einschließlich abschließender Zeilenumbrüche. 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 auf einem Zeilenumbruch endet, daher verwenden Sie `final`, nicht ein nicht-leeres Delta, als End-of-Message-Signal. In Agent SDK und `claude -p` Läufen trägt der einzelne Aufruf die gesamte Nachricht |1577| `delta` | Die neu fertiggestellten Zeilen seit dem vorherigen Batch, einschließlich abschließender Zeilenumbrüche. Immer ganze Zeilen, außer dem finalen Batch, der in der Mitte einer Zeile enden kann. 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 1578
1577```json theme={null}1579```json theme={null}
1578{1580{
1598| :--------------- | :--------------------------------------------------------------------------------- |1600| :--------------- | :--------------------------------------------------------------------------------- |
1599| `displayContent` | Text, der anstelle des Delta angezeigt wird. Weglassen, um das Original anzuzeigen |1601| `displayContent` | Text, der anstelle des Delta angezeigt wird. Weglassen, um das Original anzuzeigen |
1600 1602
1601MessageDisplay-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`.1603MessageDisplay-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 `displayContent` aus ihrer JSON-Ausgabe und verwirft `systemMessage` und `continue`.
1602 1604
1603Dieses Beispiel entfernt Markdown-Formatierung aus Claudes Antworten für eine Nur-Text-Anzeige. Das Skript liest jeden Batch von stdin, entfernt Fettdruck-Marker und Inline-Code-Backticks aus `delta` und gibt das Ergebnis als `displayContent` zurück.1605Dieses 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.
1604 1606
1605<Tabs>1607<Tabs>
1606 <Tab title="macOS/Linux">1608 <Tab title="macOS/Linux">
1659 }1661 }
1660 ```1662 ```
1661 1663
1662 Das Flag `-NoProfile` überspringt das Laden Ihres PowerShell-Profils, damit der Hook schnell startet, und `-ExecutionPolicy Bypass` ermöglicht PowerShell, die lokale Skriptdatei auszuführen.1664 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 1665
1664 Speichern Sie dieses Skript unter `.claude/hooks/plain-display.ps1` in Ihrem Projekt:1666 Speichern Sie dieses Skript unter `.claude/hooks/plain-display.ps1` in Ihrem Projekt:
1665 1667
1676 </Tab>1678 </Tab>
1677</Tabs>1679</Tabs>
1678 1680
1679Batches ohne Markdown werden unverändert durchgelassen. Wenn das Skript fehlschlägt, zum Beispiel 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.1681Batches 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.
1680 1682
1681<h3 id="pretooluse">1683<h3 id="pretooluse">
1682 PreToolUse1684 PreToolUse
1683</h3>1685</h3>
1684 1686
1685Wird ausgeführt, nachdem Claude Tool-Parameter erstellt hat und bevor der Tool-Aufruf verarbeitet wird. Passt auf jeden Tool-Namen außer `EndConversation`: eingebaute Tools wie `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` und `ExitPlanMode`, und alle [MCP-Tool-Namen](#match-mcp-tools).1687Wird 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` sowie alle [MCP-Tool-Namen](#match-mcp-tools).
1686 1688
1687Um einen Hook auszuführen, wenn sich eine bestimmte Datei auf der Festplatte ändert, egal was sie geschrieben hat, verwenden Sie [FileChanged](#filechanged) statt PreToolUse-Matching-Datei-Bearbeitungs-Tools nach Name. 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.1689Um einen Hook auszuführen, wenn sich eine bestimmte Datei auf der Festplatte ändert, unabhängig davon, wer sie schreibt, verwenden Sie stattdessen [FileChanged](#filechanged). 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.
1688 1690
1689<Warning>1691<Warning>
1690 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 ihre Inhalte beim Erstellen des Prompts ein, daher wird kein PreToolUse-Hook für sie ausgelöst, einschließlich Hooks, die `Read` passen. Um bestimmte Pfade von `@`-Referenzen zu blockieren, verwenden Sie stattdessen eine [`Read`-Deny-Regel](/docs/de/permissions#read-and-edit).1692 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 ausgeführt, 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 1693
1692 PreToolUse wird auch nicht für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgelöst.1694 PreToolUse wird auch nicht für [`EndConversation`](/docs/de/tools-reference#endconversation-tool-behavior) ausgeführt.
1693</Warning>1695</Warning>
1694 1696
1695Verwenden Sie [PreToolUse-Entscheidungskontrolle](#pretooluse-decision-control), um die Verwendung des Tools zuzulassen, zu verweigern, um Berechtigung zu bitten oder zu verschieben.1697Verwenden Sie [PreToolUse-Entscheidungskontrolle](#pretooluse-decision-control), um den Tool-Aufruf zu erlauben, zu verweigern, zu fragen oder aufzuschieben.
1696 1698
1697Ein [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 Verweigerung, die von einem anderen Hook zurückgegeben wird, hat immer noch Vorrang.1699Ein [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.
1698 1700
1699<h4 id="pretooluse-input">1701<h4 id="pretooluse-input">
1700 PreToolUse-Eingabe1702 PreToolUse-Eingabe
1701</h4>1703</h4>
1702 1704
1703Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreToolUse-Hooks `tool_name`, `tool_input` und `tool_use_id`.1705Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten PreToolUse-Hooks `tool_name`, `tool_input` und `tool_use_id`.
1704 1706
1705Fü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 kam. Die `source`-Werte umfassen `plugin`, `sdk` und Konfigurationsumfänge 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 auf Basis von `source` statt auf `name` oder dem `mcp__<server>__`-Tool-Namen-Präfix. Das Feld `mcp_server` erfordert Claude Code v2.1.274 oder später.1707Fü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.
1706 1708
1707Für die Datei-Tools `Write`, `Edit` und `Read` ist `tool_input.file_path` immer absolut:1709Für die Datei-Tools `Write`, `Edit` und `Read` ist `tool_input.file_path` immer absolut:
1708 1710
1709* Claude Code erweitert `~` und relative Pfade, bevor Hooks ausgeführt werden, daher kann ein Hook, der auf Pfade passt, nicht durch `~` oder eine relative Schreibweise des gleichen Pfads umgangen werden1711* Claude Code erweitert `~` und relative Pfade, bevor Hooks ausgeführt werden, daher kann ein Hook, der auf Pfaden abgleicht, nicht durch `~` oder eine relative Schreibweise des gleichen Pfads umgangen werden
1710* Unter Windows kommt der Pfad mit Backslash-Trennzeichen an, auch wenn Ihr Hook unter Git Bash läuft, wo `$PWD` wie `/c/project` aussieht1712* Unter Windows kommt der Pfad mit Backslash-Trennzeichen an, auch wenn Ihr Hook unter Git Bash läuft, wo `$PWD` wie `/c/project` aussieht
1711* Ein Vergleich, der mit Schrägstrichen geschrieben ist, wie ein `/src/`-Check, passt niemals auf einen Backslash-Pfad, und der Tool-Aufruf wird fortgesetzt, als hätte der Hook nichts zu blockieren1713* Ein Vergleich mit Schrägstrichen, wie eine `/src/` Überprüfung, gleicht nie einen Backslash-Pfad ab, und der Tool-Aufruf wird fortgesetzt, als hätte der Hook nichts zu blockieren
1712* Normalisieren Sie Trennzeichen vor dem Vergleich: `FILE_PATH="${FILE_PATH//\\//}"` in Bash oder `file_path.replace("\\", "/")` in Python, dann passen Sie auf ein Pfad-Segment wie `/src/` statt auf Anker mit `^`, da der Pfad absolut ist1714* 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 ist
1713 1715
1714Ein `Write`-Aufruf unter Windows liefert:1716Ein `Write` Aufruf unter Windows liefert:
1715 1717
1716```json theme={null}1718```json theme={null}
1717{1719{
1725}1727}
1726```1728```
1727 1729
1728Die `tool_input`-Felder hängen vom Tool ab:1730Die `tool_input` Felder hängen vom Tool ab:
1729 1731
1730<a id="bash" />1732<a id="bash" />
1731 1733
1736Führt Shell-Befehle aus.1738Führt Shell-Befehle aus.
1737 1739
1738| Feld | Typ | Beispiel | Beschreibung |1740| Feld | Typ | Beispiel | Beschreibung |
1739| :------------------ | :----------- | :----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1741| :------------------ | :------ | :----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1740| `command` | Zeichenkette | `"npm test"` | Der auszuführende Shell-Befehl |1742| `command` | string | `"npm test"` | Der auszuführende Shell-Befehl |
1741| `description` | Zeichenkette | `"Run test suite"` | Optionale Beschreibung, was der Befehl tut |1743| `description` | string | `"Run test suite"` | Optionale Beschreibung, was der Befehl tut |
1742| `timeout` | Zahl | `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 |1744| `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| `run_in_background` | Boolesch | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |1745| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |
1744 1746
1745Wenn 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 einschaltet; 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 durch Bash zu bearbeiten. Setzen Sie `bashEditDiffEnabled` auf `false`, um die Aufzeichnung auszuschalten. Hintergrund-Befehle und schreibgeschützte Befehle tragen keinen Diff.1747Wenn 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 durch Bash zu bearbeiten. Setzen Sie `bashEditDiffEnabled` auf `false`, um die Aufzeichnung auszuschalten. Hintergrund-Befehle und schreibgeschützte Befehle tragen keinen Diff.
1746 1748
1747Ihr [PostToolUse-Hook](#posttooluse) erhält dann die geänderten Dateien in `tool_response.bashEditDiff`. Die Liste deckt ab, was sich im Repository geändert hat, während der Befehl lief. Dateien, die Git ignoriert, und Dateien in Submodulen werden nicht aufgelistet. Erfordert Claude Code v2.1.269 oder später.1749Ihr [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 lief. Dateien, die Git ignoriert, und Dateien in Submodulen werden nicht aufgelistet. Erfordert Claude Code v2.1.269 oder später.
1748 1750
1749<Note>1751<Note>
1750 Die Liste ist Best-Effort und in öffentlicher Beta. Claude Code kann eine Änderung verpassen, eine Datei einbeziehen, 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.1752 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</Note>1753</Note>
1752 1754
1753`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.1755`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 1756
1755| Feld | Typ | Beispiel | Beschreibung |1757| Feld | Typ | Beispiel | Beschreibung |
1756| :------------- | :------- | :------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1758| :------------- | :------ | :------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1757| `changedFiles` | Array | `["/path/to/src/app.ts"]` | Absolute Pfade der Dateien, die der Befehl geändert hat, höchstens 200. Vorhanden, wenn `files` einen Diff hält oder `moreFiles` über Null liegt |1759| `changedFiles` | array | `["/path/to/src/app.ts"]` | Absolute Pfade der Dateien, die der Befehl geändert hat, höchstens 200. Vorhanden, wenn `files` einen Diff enthält oder `moreFiles` über Null liegt |
1758| `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 |1760| `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| `moreFiles` | Zahl | `2` | Anzahl der geänderten Dateien ohne Diff in `files` |1761| `moreFiles` | number | `2` | Anzahl der geänderten Dateien ohne Diff in `files` |
1760| `unavailable` | Boolesch | `true` | Gesetzt, wenn der Diff unvollständig ist oder nicht genommen werden konnte |1762| `unavailable` | boolean | `true` | Gesetzt, wenn der Diff unvollständig ist oder nicht genommen werden konnte |
1761| `skipped` | Boolesch | `true` | Gesetzt für einen Git-Befehl, der den Arbeitsbaum bewegt, wie `git checkout` oder `git stash`, daher nimmt Claude Code keinen Diff |1763| `skipped` | boolean | `true` | Gesetzt für einen Git-Befehl, der den Arbeitsbaum bewegt, wie `git checkout` oder `git stash`, daher nimmt Claude Code keinen Diff |
1762| `shared` | Boolesch | `true` | Gesetzt, wenn ein anderer Bash-Tool-Aufruf, wie der eines Subagenten, im gleichen Repository zur gleichen Zeit lief, daher können einige aufgelistete Änderungen von diesem Befehl sein |1764| `shared` | boolean | `true` | Gesetzt, wenn ein anderer Bash-Tool-Aufruf, wie der eines Subagenten, im gleichen Repository zur gleichen Zeit lief, daher können einige aufgelistete Änderungen von diesem Befehl sein |
1763 1765
1764<a id="powershell" />1766<a id="powershell" />
1765 1767
1772Die Felder entsprechen dem Bash-Tool, mit der Befehlszeichenkette in `command`:1774Die Felder entsprechen dem Bash-Tool, mit der Befehlszeichenkette in `command`:
1773 1775
1774| Feld | Typ | Beispiel | Beschreibung |1776| Feld | Typ | Beispiel | Beschreibung |
1775| :------------------ | :----------- | :------------------------- | :-------------------------------------------------- |1777| :------------------ | :------ | :------------------------- | :-------------------------------------------------- |
1776| `command` | Zeichenkette | `"Get-ChildItem -Recurse"` | Der auszuführende PowerShell-Befehl |1778| `command` | string | `"Get-ChildItem -Recurse"` | Der auszuführende PowerShell-Befehl |
1777| `description` | Zeichenkette | `"List files recursively"` | Optionale Beschreibung, was der Befehl tut |1779| `description` | string | `"List files recursively"` | Optionale Beschreibung, was der Befehl tut |
1778| `timeout` | Zahl | `120000` | Optionales Timeout in Millisekunden |1780| `timeout` | number | `120000` | Optionales Timeout in Millisekunden |
1779| `run_in_background` | Boolesch | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |1781| `run_in_background` | boolean | `false` | Ob der Befehl im Hintergrund ausgeführt werden soll |
1780 1782
1781Passen Sie `Bash|PowerShell` in Hooks an, die Shell-Befehle inspizieren, damit sie beide Tools abdecken:1783Gleichen Sie `Bash|PowerShell` in Hooks ab, die Shell-Befehle überprüfen, damit sie beide Tools abdecken:
1782 1784
1783* Unter Windows, wo das PowerShell-Tool aktiviert ist, behandelt Claude PowerShell als die primäre Shell und leitet Shell-Befehle durch sie.1785* Unter Windows, überall wo das PowerShell-Tool aktiviert ist, behandelt Claude PowerShell als die primäre Shell und leitet Shell-Befehle durch sie.
1784* Unter Windows ohne Git Bash ist das Tool automatisch aktiviert und Claude Code registriert das Bash-Tool überhaupt nicht.1786* Unter Windows ohne Git Bash ist das Tool automatisch aktiviert und Claude Code registriert das Bash-Tool überhaupt nicht.
1785* Ein Hook, der nur `Bash` passt, wird dort nie ausgelöst.1787* Ein Hook, der nur `Bash` abgleicht, wird dort nie ausgeführt.
1786 1788
1787<h5 id="write">1789<h5 id="write">
1788 Write1790 Write
1791Erstellt oder überschreibt eine Datei.1793Erstellt oder überschreibt eine Datei.
1792 1794
1793| Feld | Typ | Beispiel | Beschreibung |1795| Feld | Typ | Beispiel | Beschreibung |
1794| :---------- | :----------- | :-------------------- | :--------------------------------------- |1796| :---------- | :----- | :-------------------- | :--------------------------------------- |
1795| `file_path` | Zeichenkette | `"/path/to/file.txt"` | Absoluter Pfad zur zu schreibenden Datei |1797| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu schreibenden Datei |
1796| `content` | Zeichenkette | `"file content"` | Inhalt zum Schreiben in die Datei |1798| `content` | string | `"file content"` | Inhalt zum Schreiben in die Datei |
1797 1799
1798<h5 id="edit">1800<h5 id="edit">
1799 Edit1801 Edit
1802Ersetzt eine Zeichenkette in einer vorhandenen Datei.1804Ersetzt eine Zeichenkette in einer vorhandenen Datei.
1803 1805
1804| Feld | Typ | Beispiel | Beschreibung |1806| Feld | Typ | Beispiel | Beschreibung |
1805| :------------ | :----------- | :-------------------- | :---------------------------------------- |1807| :------------ | :------ | :-------------------- | :---------------------------------------- |
1806| `file_path` | Zeichenkette | `"/path/to/file.txt"` | Absoluter Pfad zur zu bearbeitenden Datei |1808| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu bearbeitenden Datei |
1807| `old_string` | Zeichenkette | `"original text"` | Text zum Suchen und Ersetzen |1809| `old_string` | string | `"original text"` | Text zum Suchen und Ersetzen |
1808| `new_string` | Zeichenkette | `"replacement text"` | Ersatztext |1810| `new_string` | string | `"replacement text"` | Ersatztext |
1809| `replace_all` | Boolesch | `false` | Ob alle Vorkommen ersetzt werden sollen |1811| `replace_all` | boolean | `false` | Ob alle Vorkommen ersetzt werden sollen |
1810 1812
1811<h5 id="read">1813<h5 id="read">
1812 Read1814 Read
1815Liest Dateiinhalte.1817Liest Dateiinhalte.
1816 1818
1817| Feld | Typ | Beispiel | Beschreibung |1819| Feld | Typ | Beispiel | Beschreibung |
1818| :---------- | :----------- | :-------------------- | :-------------------------------------------- |1820| :---------- | :----- | :-------------------- | :-------------------------------------------- |
1819| `file_path` | Zeichenkette | `"/path/to/file.txt"` | Absoluter Pfad zur zu lesenden Datei |1821| `file_path` | string | `"/path/to/file.txt"` | Absoluter Pfad zur zu lesenden Datei |
1820| `offset` | Zahl | `10` | Optionale Zeilennummer zum Starten des Lesens |1822| `offset` | number | `10` | Optionale Zeilennummer zum Starten des Lesens |
1821| `limit` | Zahl | `50` | Optionale Anzahl der zu lesenden Zeilen |1823| `limit` | number | `50` | Optionale Anzahl der zu lesenden Zeilen |
1822 1824
1823<h5 id="glob">1825<h5 id="glob">
1824 Glob1826 Glob
1827Findet Dateien, die einem Glob-Muster entsprechen.1829Findet Dateien, die einem Glob-Muster entsprechen.
1828 1830
1829| Feld | Typ | Beispiel | Beschreibung |1831| Feld | Typ | Beispiel | Beschreibung |
1830| :-------- | :----------- | :--------------- | :------------------------------------------------------------------------------------ |1832| :-------- | :----- | :--------------- | :--------------------------------------------------------------------------------- |
1831| `pattern` | Zeichenkette | `"**/*.ts"` | Glob-Muster zum Abgleichen von Dateien |1833| `pattern` | string | `"**/*.ts"` | Glob-Muster zum Abgleichen von Dateien |
1832| `path` | Zeichenkette | `"/path/to/dir"` | Optionales Verzeichnis zum Durchsuchen. Standardwert ist aktuelles Arbeitsverzeichnis |1834| `path` | string | `"/path/to/dir"` | Optionales Verzeichnis zum Durchsuchen. Standardmäßig aktuelles Arbeitsverzeichnis |
1833 1835
1834<h5 id="grep">1836<h5 id="grep">
1835 Grep1837 Grep
1838Durchsucht Dateiinhalte mit regulären Ausdrücken.1840Durchsucht Dateiinhalte mit regulären Ausdrücken.
1839 1841
1840| Feld | Typ | Beispiel | Beschreibung |1842| Feld | Typ | Beispiel | Beschreibung |
1841| :------------ | :----------- | :--------------- | :------------------------------------------------------------------------------------------ |1843| :------------ | :------ | :--------------- | :--------------------------------------------------------------------------------------- |
1842| `pattern` | Zeichenkette | `"TODO.*fix"` | Regex-Muster zum Suchen |1844| `pattern` | string | `"TODO.*fix"` | Muster für reguläre Ausdrücke zum Suchen |
1843| `path` | Zeichenkette | `"/path/to/dir"` | Optionale Datei oder Verzeichnis zum Durchsuchen |1845| `path` | string | `"/path/to/dir"` | Optionale Datei oder Verzeichnis zum Durchsuchen |
1844| `glob` | Zeichenkette | `"*.ts"` | Optionales Glob-Muster zum Filtern von Dateien |1846| `glob` | string | `"*.ts"` | Optionales Glob-Muster zum Filtern von Dateien |
1845| `output_mode` | Zeichenkette | `"content"` | `"content"`, `"files_with_matches"` oder `"count"`. Standardwert ist `"files_with_matches"` |1847| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` oder `"count"`. Standardmäßig `"files_with_matches"` |
1846| `-i` | Boolesch | `true` | Groß-/Kleinschreibung ignorieren |1848| `-i` | boolean | `true` | Groß-/Kleinschreibung ignorieren |
1847| `multiline` | Boolesch | `false` | Mehrzeiliges Matching aktivieren |1849| `multiline` | boolean | `false` | Mehrzeilige Übereinstimmung aktivieren |
1848 1850
1849<h5 id="webfetch">1851<h5 id="webfetch">
1850 WebFetch1852 WebFetch
1853Ruft Web-Inhalte ab und verarbeitet sie.1855Ruft Web-Inhalte ab und verarbeitet sie.
1854 1856
1855| Feld | Typ | Beispiel | Beschreibung |1857| Feld | Typ | Beispiel | Beschreibung |
1856| :------- | :----------- | :---------------------------- | :---------------------------------------------- |1858| :------- | :----- | :---------------------------- | :----------------------------------------------------------- |
1857| `url` | Zeichenkette | `"https://example.com/api"` | URL zum Abrufen von Inhalten |1859| `url` | string | `"https://example.com/api"` | URL zum Abrufen von Inhalten |
1858| `prompt` | Zeichenkette | `"Extract the API endpoints"` | Prompt zum Ausführen auf dem abgerufenen Inhalt |1860| `prompt` | string | `"Extract the API endpoints"` | Eingabeaufforderung zum Ausführen auf dem abgerufenen Inhalt |
1859 1861
1860<h5 id="websearch">1862<h5 id="websearch">
1861 WebSearch1863 WebSearch
1864Durchsucht das Web.1866Durchsucht das Web.
1865 1867
1866| Feld | Typ | Beispiel | Beschreibung |1868| Feld | Typ | Beispiel | Beschreibung |
1867| :---------------- | :----------- | :----------------------------- | :------------------------------------------------------ |1869| :---------------- | :----- | :----------------------------- | :------------------------------------------------------- |
1868| `query` | Zeichenkette | `"react hooks best practices"` | Suchanfrage |1870| `query` | string | `"react hooks best practices"` | Suchanfrage |
1869| `allowed_domains` | Array | `["docs.example.com"]` | Optional: Nur Ergebnisse von diesen Domains einbeziehen |1871| `allowed_domains` | array | `["docs.example.com"]` | Optional: Nur Ergebnisse von diesen Domains einschließen |
1870| `blocked_domains` | Array | `["spam.example.com"]` | Optional: Ergebnisse von diesen Domains ausschließen |1872| `blocked_domains` | array | `["spam.example.com"]` | Optional: Ergebnisse von diesen Domains ausschließen |
1871 1873
1872<h5 id="agent">1874<h5 id="agent">
1873 Agent1875 Agent
1876Spawnt einen [Subagenten](/docs/de/sub-agents).1878Spawnt einen [Subagenten](/docs/de/sub-agents).
1877 1879
1878| Feld | Typ | Beispiel | Beschreibung |1880| Feld | Typ | Beispiel | Beschreibung |
1879| :-------------- | :----------- | :------------------------- | :------------------------------------------------------ |1881| :-------------- | :----- | :------------------------- | :------------------------------------------------------ |
1880| `prompt` | Zeichenkette | `"Find all API endpoints"` | Die Aufgabe für den Agent |1882| `prompt` | string | `"Find all API endpoints"` | Die Aufgabe für den Agenten |
1881| `description` | Zeichenkette | `"Find API endpoints"` | Kurze Beschreibung der Aufgabe |1883| `description` | string | `"Find API endpoints"` | Kurze Beschreibung der Aufgabe |
1882| `subagent_type` | Zeichenkette | `"Explore"` | Typ des zu verwendenden spezialisierten Agenten |1884| `subagent_type` | string | `"Explore"` | Typ des zu verwendenden spezialisierten Agenten |
1883| `model` | Zeichenkette | `"sonnet"` | Optionaler Modell-Alias zum Überschreiben des Standards |1885| `model` | string | `"sonnet"` | Optionaler Modell-Alias zum Überschreiben des Standards |
1884 1886
1885Wenn ein Vordergrund-Agent-Aufruf abgeschlossen ist, erhält Ihr [PostToolUse-Hook](#posttooluse) das Ergebnis des Subagenten und die Lauftelemetrie in `tool_response`. Lesen Sie diese Felder, um das Laufen zu inspizieren; für Token- und Kosten-Rollups über Subagenten verwenden Sie die [Token- und Kosten-Zähler](/docs/de/monitoring-usage#token-counter), die auf `query_source` `"subagent"` gefiltert sind, da `totalTokens` und `usage` nur die letzte Anfrage abdecken:1887Wenn 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 Kosten-Rollups über Subagenten verwenden Sie die [Token- und Kosten-Zähler](/docs/de/monitoring-usage#token-counter), gefiltert nach `query_source` `"subagent"`, da `totalTokens` und `usage` nur die letzte Anfrage abdecken:
1886 1888
1887| Feld | Typ | Beispiel | Beschreibung |1889| Feld | Typ | Beispiel | Beschreibung |
1888| :------------------ | :----------- | :---------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1890| :------------------ | :----- | :---------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1889| `status` | Zeichenkette | `"completed"` | `"completed"` für Vordergrund-Subagenten, `"async_launched"` für Hintergrund-Subagenten. Ab v2.1.198 werden Subagenten standardmäßig im Hintergrund ausgeführt, daher erzeugt ein weggelassenes `run_in_background` auch `"async_launched"` |1891| `status` | string | `"completed"` | `"completed"` für Vordergrund-Subagenten, `"async_launched"` für Hintergrund-Subagenten. Ab v2.1.198 laufen Subagenten standardmäßig im Hintergrund, daher erzeugt ein weggelassenes `run_in_background` auch `"async_launched"` |
1890| `agentId` | Zeichenkette | `"a4d2c8f1e0b3a297"` | Kennung für die Subagenten-Ausführung |1892| `agentId` | string | `"a4d2c8f1e0b3a297"` | Identifikator für den Subagenten-Lauf |
1891| `content` | Array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Die abschließenden Textblöcke des Subagenten oder, für einen Subagenten, dessen Bericht durch `SubagentHandback` geht, eine kurze Notiz über diesen Handback an ihrer Stelle |1893| `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| `resolvedModel` | Zeichenkette | `"claude-sonnet-4-5"` | Modell, auf dem der Subagent gestartet wurde, das sich vom angeforderten Modell unterscheiden kann |1894| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modell, auf dem der Subagent gestartet wurde, das sich vom angeforderten Modell unterscheiden kann |
1893| `modelsUsed` | Array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Modelle, die in Reihenfolge verwendet wurden, mit aufeinanderfolgenden Wiederholungen zusammengefasst; wird nur gesetzt, wenn das Modell während des Laufs gewechselt wurde. Erfordert Claude Code v2.1.212 oder später |1895| `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| `totalTokens` | Zahl | `12450` | Token-Anzahl aus der letzten API-Anfrage des Subagenten: Input-, Output- und Cache-Tokens kombiniert. Dies ist keine Gesamtsumme über den ganzen Lauf |1896| `totalTokens` | number | `12450` | Token-Anzahl aus der letzten API-Anfrage des Subagenten: Eingabe-, Ausgabe- und Cache-Tokens kombiniert. Dies ist keine Gesamtsumme über den ganzen Lauf |
1895| `totalDurationMs` | Zahl | `48211` | Wanduhr-Dauer der Subagenten-Ausführung |1897| `totalDurationMs` | number | `48211` | Wanduhr-Dauer des Subagenten-Laufs |
1896| `totalToolUseCount` | Zahl | `7` | Anzahl der Tool-Aufrufe, die der Subagent gemacht hat |1898| `totalToolUseCount` | number | `7` | Anzahl der Tool-Aufrufe, die der Subagent gemacht hat |
1897| `usage` | Objekt | `{"input_tokens": 8320, ...}` | Pro-Typ-Token-Aufschlüsselung der letzten API-Anfrage: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1899| `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 1900
1899Auf 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 durch dieses Tool statt ihn als Text zurückzugeben. Das Feld `content` seines `completed`-Ergebnisses trägt dann eine kurze Notiz über diesen Handback statt des Berichts selbst. Um den Bericht zu lesen, passen Sie einen `PreToolUse`- oder `PostToolUse`-Hook auf `SubagentHandback` an und lesen Sie `tool_input.message`.1901Auf 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 durch 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`.
1900 1902
1901Fü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 stellt, gibt bei diesem Übergang zurück. Es hat `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` und `resolvedModel`.1903Fü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 bei diesem Übergang zurück. Es hat `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` und `resolvedModel`.
1902 1904
1903Bei 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, das in Gebrauch ist, wenn der Agent in den Hintergrund geht, daher wird ein Wechsel, der vor dem Backgrounding stattfand, dort widergespiegelt. `modelsUsed` und das Backgrounding-Zeit-`resolvedModel`-Verhalten erfordern Claude Code v2.1.212 oder später.1905Bei 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 ein anderer Override gilt. Bei einem `async_launched` Ergebnis benennt `resolvedModel` das Modell in Gebrauch, wenn der Agent in den Hintergrund ging, daher wird ein Wechsel, der vor dem Hintergrund-Gehen stattfand, dort widergespiegelt. `modelsUsed` und das Hintergrund-Zeit-`resolvedModel` Verhalten erfordern Claude Code v2.1.212 oder später.
1904 1906
1905<a id="askuserquestion" />1907<a id="askuserquestion" />
1906 1908
1911Stellt dem Benutzer eine bis vier Multiple-Choice-Fragen.1913Stellt dem Benutzer eine bis vier Multiple-Choice-Fragen.
1912 1914
1913| Feld | Typ | Beispiel | Beschreibung |1915| Feld | Typ | Beispiel | Beschreibung |
1914| :---------- | :----- | :----------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1916| :---------- | :----- | :----------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1915| `questions` | Array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Fragen zum Präsentieren, jeweils mit einer `question`-Zeichenkette, kurzem `header`, `options`-Array und optionalem `multiSelect`-Flag |1917| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Zu stellende Fragen, jeweils mit einer `question` Zeichenkette, kurzem `header`, `options` Array und optionalem `multiSelect` Flag |
1916| `answers` | Objekt | `{"Which framework?": "React"}` | Optional. Ordnet Fragetext der ausgewählten Option-Bezeichnung zu. Multi-Select-Antworten verbinden Bezeichnungen mit Kommas. Claude setzt dieses Feld nicht; geben Sie es über `updatedInput` an, um programmatisch zu antworten |1918| `answers` | object | `{"Which framework?": "React"}` | Optional. Ordnet Fragentext 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 1919
1918<h5 id="exitplanmode">1920<h5 id="exitplanmode">
1919 ExitPlanMode1921 ExitPlanMode
1920</h5>1922</h5>
1921 1923
1922Präsentiert einen Plan und fordert den Benutzer auf, 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 Aufruf des Tools in eine Datei auf der Festplatte, daher trägt die wörtliche `tool_input` vom Modell typischerweise nur `allowedPrompts`. Claude Code injiziert den Plan-Inhalt und den Dateipfad, bevor die Eingabe an Hooks übergeben wird.1924Prä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.
1923 1925
1924| Feld | Typ | Beispiel | Beschreibung |1926| Feld | Typ | Beispiel | Beschreibung |
1925| :--------------- | :----------- | :------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1927| :--------------- | :----- | :------------------------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1926| `plan` | Zeichenkette | `"## Refactor auth\n1. Extract..."` | Plan-Inhalt in Markdown. Injiziert aus der Plan-Datei auf der Festplatte |1928| `plan` | string | `"## Refactor auth\n1. Extract..."` | Plan-Inhalt in Markdown. Injiziert aus der Plan-Datei auf der Festplatte |
1927| `planFilePath` | Zeichenkette | `"/Users/.../plans/refactor-auth.md"` | Pfad zur Plan-Datei. Injiziert |1929| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Pfad zur Plan-Datei. Injiziert |
1928| `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 anfordert, um den Plan zu implementieren |1930| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Veraltet. Claude Code akzeptiert das Feld, ignoriert es aber. Vor v2.1.205 trug es eingabeaufforderungsbasierte Berechtigungen, die Claude anforderte, um den Plan zu implementieren |
1929 1931
1930In `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 neu zu lesen.1932In `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.
1931 1933
1932<h4 id="pretooluse-decision-control">1934<h4 id="pretooluse-decision-control">
1933 PreToolUse-Entscheidungskontrolle1935 PreToolUse-Entscheidungskontrolle
1934</h4>1936</h4>
1935 1937
1936`PreToolUse`-Hooks können steuern, ob ein Tool-Aufruf fortgesetzt wird. Im Gegensatz zu anderen Hooks, die ein Top-Level-Feld `decision` verwenden, gibt PreToolUse seine Entscheidung in einem `hookSpecificOutput`-Objekt zurück. Dies gibt ihm reichere Kontrolle: vier Ergebnisse (zulassen, verweigern, fragen oder verschieben) plus die Möglichkeit, die Tool-Eingabe vor der Ausführung zu ändern.1938`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 (erlauben, verweigern, fragen oder aufschieben) plus die Möglichkeit, Tool-Eingabe vor der Ausführung zu ändern.
1937 1939
1938| Feld | Beschreibung |1940| Feld | Beschreibung |
1939| :------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1941| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1940| `permissionDecision` | `"allow"` umgeht 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 mit ihm](#allow-with-updatedinput) benötigen. `"deny"` verhindert den Tool-Aufruf. `"ask"` fordert den Benutzer zur Bestätigung auf. `"defer"` beendet elegant, damit das Tool später fortgesetzt werden kann. [Deny- und Ask-Regeln](/docs/de/permissions#manage-permissions) gelten weiterhin, wenn ein Hook `"allow"` zurückgibt |1942| `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 sich elegant, damit das Tool später fortgesetzt werden kann. [Ablehnungs- und Frageregel](/docs/de/permissions#manage-permissions) werden immer noch ausgewertet, unabhängig davon, was der Hook zurückgibt |
1941| `permissionDecisionReason` | Für `"allow"` und `"ask"`, dem Benutzer angezeigt, aber nicht Claude. Für `"deny"`, Claude angezeigt. Für `"defer"`, ignoriert |1943| `permissionDecisionReason` | Für `"allow"` und `"ask"`, dem Benutzer angezeigt, aber nicht Claude. Für `"deny"`, Claude angezeigt. Für `"defer"`, ignoriert |
1942| `updatedInput` | Ändert die Tool-Eingabeparameter vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, daher müssen Sie unveränderte Felder zusammen mit geänderten einbeziehen. Claude Code evaluiert Berechtigungsregeln und die [Auto-Background-Berechtigung](/docs/de/tools-reference#background-commands) eines Bash-Befehls gegen die Eingabe, die Ihr Hook zurückgibt, nicht die Eingabe, die Claude gesendet hat. Kombinieren Sie mit `"allow"`, um automatisch zu genehmigen, oder mit `"ask"`, um die geänderte Eingabe dem Benutzer zu zeigen. Für `"defer"`, ignoriert |1944| `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-Background-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 mit `"ask"`, um die geänderte Eingabe dem Benutzer zu zeigen. Für `"defer"`, ignoriert |
1943| `additionalContext` | Zeichenkette, die zu Claudes Kontext zusammen mit dem Tool-Ergebnis hinzugefügt wird. Ignoriert, wenn `permissionDecision` `"defer"` ist. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |1945| `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 1946
1945Wenn mehrere PreToolUse-Hooks unterschiedliche Entscheidungen zurückgeben, ist die Priorität `deny` > `defer` > `ask` > `allow`.1947Wenn mehrere PreToolUse-Hooks unterschiedliche Entscheidungen zurückgeben, ist die Priorität `deny` > `defer` > `ask` > `allow`.
1946 1948
1947Ein Hook, der durch Beenden mit 2 blockiert, wird auf die gleiche Weise wie `"deny"` weitergeleitet: Claude sieht die stderr-Nachricht als Verweigerungsgrund.1949Ein Hook, der durch Beendigung mit 2 blockiert, wird auf die gleiche Weise wie `"deny"` weitergeleitet: Claude sieht die stderr-Nachricht als Ablehnungsgrund.
1948 1950
1949Wenn ein Hook `"ask"` zurückgibt, enthält der dem Benutzer angezeigte Berechtigungsprompt ein Label, das angibt, woher der Hook stammt: `[settings]` für einen Hook aus einer beliebigen Einstellungsdatei oder aus Agent-Frontmatter, `[plugin:<name>]` für einen Hook eines Plugins oder `[skill]` für einen Hook aus Skill-Frontmatter. Dies hilft Benutzern zu verstehen, welche Konfigurationsquelle eine Bestätigung anfordert.1951Wenn 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 aus Agent-Frontmatter, `[plugin:<name>]` für einen Hook eines Plugins oder `[skill]` für einen Hook aus Skill-Frontmatter. Dies hilft Benutzern zu verstehen, welche Konfigurationsquelle eine Bestätigung anfordert.
1950 1952
1951Ein Hook-`"ask"` erzwingt auch einen Berechtigungsprompt 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 den Prompt zu zeigen, den der Hook anfordert, genehmigen; der Klassifizierer wendete immer noch seine eigenen Sicherheitsregeln auf diesen Befehl an, und ein Hook `"deny"` wurde immer respektiert.1953Ein 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, aber er kann den Aufruf 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.
1952 1954
1953```json theme={null}1955```json theme={null}
1954{1956{
1966 1968
1967<span id="allow-with-updatedinput" />1969<span id="allow-with-updatedinput" />
1968 1970
1969Im [nicht-interaktiven Modus](/docs/de/headless) mit dem `-p`-Flag 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, um den Prompt 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, erfasst die Antwort durch 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.1971Im [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 ein [`answers`](#askuserquestion) Objekt hinzu, das jede Frage des Textes der gewählten Antwort zuordnet.
1970 1972
1971Ab 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 erfasst hat, die das Tool benötigt.1973Ab 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 sammelte, die das Tool benötigt.
1972 1974
1973<Note>1975<Note>
1974 PreToolUse verwendete zuvor Top-Level-Felder `decision` und `reason`, diese sind jedoch 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-Felder `decision` und `reason` als ihr aktuelles Format.1976 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"` ordnen sich `"allow"` und `"deny"` zu. Andere Ereignisse wie PostToolUse und Stop verwenden weiterhin Top-Level-`decision` und `reason` als ihr aktuelles Format.
1975</Note>1977</Note>
1976 1978
1977<h4 id="defer-a-tool-call-for-later">1979<h4 id="defer-a-tool-call-for-later">
1978 Ein Tool-Aufruf verschieben1980 Einen Tool-Aufruf für später aufschieben
1979</h4>1981</h4>
1980 1982
1981`"defer"` ist für Integrationen, die `claude -p` als Subprozess ausführen und seine JSON-Ausgabe lesen, wie eine Agent SDK-App oder eine benutzerdefinierte Benutzeroberfläche, die auf Claude Code aufgebaut ist. Es ermöglicht diesem aufrufenden Prozess, Claude bei einem Tool-Aufruf zu pausieren, Eingaben über seine eigene Schnittstelle zu erfassen und dort fortzufahren, wo er aufgehört hat. Claude Code respektiert 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.1983`"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, die auf Claude Code aufgebaut ist. 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 1984
1983Das Tool `AskUserQuestion` ist der typische Fall: Claude möchte den Benutzer etwas fragen, aber es gibt kein Terminal zum Antworten. Ein Lauf mit einem [Berechtigungs-Host](/docs/de/headless#turn-off-permission-prompts-in-unattended-runs) bietet `AskUserQuestion` an, daher starten Sie den Lauf mit einem. Der Roundtrip funktioniert so:1985Das `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:
1984 1986
19851. Claude ruft `AskUserQuestion` auf. Der `PreToolUse`-Hook wird ausgelöst.19871. Claude ruft `AskUserQuestion` auf. Der `PreToolUse` Hook wird ausgeführt.
19862. 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.19882. 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.
19873. 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.19893. 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.
19884. Der aufrufende Prozess führt `claude -p --resume <session-id>` aus. Der gleiche Tool-Aufruf löst `PreToolUse` erneut aus.19904. Der aufrufende Prozess führt `claude -p --resume <session-id>` mit dem gleichen Berechtigungshost aus. Der gleiche Tool-Aufruf wird `PreToolUse` erneut ausgeführt.
19895. Der Hook gibt `permissionDecision: "allow"` mit der Antwort in `updatedInput` zurück. Das Tool wird ausgeführt und Claude setzt fort.19915. Der Hook gibt `permissionDecision: "allow"` mit der Antwort in `updatedInput` zurück. Das Tool wird ausgeführt und Claude setzt fort.
1990 1992
1991Das Feld `deferred_tool_use` 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:1993Das `deferred_tool_use` Feld trägt die `id`, `name` und `input` des Tools. Die `input` sind die Parameter, die Claude für den Tool-Aufruf generiert hat, erfasst vor der Ausführung:
1992 1994
1993```json theme={null}1995```json theme={null}
1994{1996{
2004}2006}
2005```2007```
2006 2008
2007Es 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.2009Es 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 `"defer"` erneut 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.
2008 2010
2009`"defer"` funktioniert nur, wenn Claude einen einzelnen Tool-Aufruf in der Runde macht. Wenn Claude mehrere Tool-Aufrufe gleichzeitig macht, wird `"defer"` mit einer Warnung ignoriert und das Tool wird durch den normalen Berechtigungsfluss fortgesetzt. Die Einschränkung existiert, weil Resume nur einen Tool-Aufruf erneut ausführen kann: Es gibt keine Möglichkeit, einen Aufruf aus einem Batch zu verschieben, ohne die anderen ungelöst zu lassen.2011`"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 wird durch den normalen Berechtigungsfluss fortgesetzt. 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 2012
2011Wenn das verschobene 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 Nutzlast `deferred_tool_use` ist immer noch enthalten, damit Sie identifizieren können, welches Tool fehlte.2013Wenn 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 ausgeführt 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.
2012 2014
2013<Note>2015<Note>
2014 Um eine verschobene 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. Ohne es stellt Claude Code den Plan-Modus nicht wieder her. Erfordert Claude Code v2.1.246 oder später.2016 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. Ohne es stellt Claude Code den Plan-Modus nicht wieder her. Erfordert Claude Code v2.1.246 oder später.
2015 2017
2016 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 verschobene 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 bei Wiederaufnahme](/docs/de/sessions#permission-mode-on-resume) aufgelistet sind.2018 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 bei Fortsetzen](/docs/de/sessions#permission-mode-on-resume) aufgelistet sind.
2017</Note>2019</Note>
2018 2020
2019<h3 id="permissionrequest">2021<h3 id="permissionrequest">
2020 PermissionRequest2022 PermissionRequest
2021</h3>2023</h3>
2022 2024
2023Wird ausgeführt, wenn Claude Code Sie um Genehmigung für die Verwendung eines Tools bitten soll. In Sitzungen, die keinen Prompt anzeigen können, wie Hintergrund-Subagenten im [nicht-interaktiven Modus](/docs/de/headless), führt Claude Code diese Hooks immer noch aus, und wenn kein Hook eine Entscheidung zurückgibt, verweigert es den Tool-Aufruf.2025Wird ausgeführt, wenn Claude Code Sie um Erlaubnis bitten möchte, ein Tool zu verwenden. In Sitzungen, die keine Aufforderung anzeigen können, wie Hintergrund-Subagenten im [nicht-interaktiven Modus](/docs/de/headless), führt Claude Code diese Hooks immer noch aus, und wenn kein Hook eine Entscheidung zurückgibt, verweigert es den Tool-Aufruf.
2024Verwenden Sie [PermissionRequest-Entscheidungskontrolle](#permissionrequest-decision-control), um im Namen des Benutzers zuzulassen oder zu verweigern.2026Verwenden Sie [PermissionRequest-Entscheidungskontrolle](#permissionrequest-decision-control), um im Namen des Benutzers zu erlauben oder zu verweigern.
2025 2027
2026Verwenden 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 Typ `permission_prompt` nur aus, nachdem der Prompt etwa sechs Sekunden gewartet hat.2028Verwenden Sie dieses Ereignis, wenn Sie ein Signal benötigen, in dem Moment, in dem Claude um Erlaubnis bittet, ein Tool zu verwenden. Claude Code führt einen [Notification](#notification) Hook mit dem `permission_prompt` Typ nur aus, nachdem die Aufforderung etwa sechs Sekunden gewartet hat.
2027 2029
2028Claude Code führt PermissionRequest-Hooks nicht für eine Sandbox-Befehl-[Netzwerkanfrage](/docs/de/sandboxing#network-isolation) aus. Um ein Signal für diesen Prompt zu erhalten, verwenden Sie den Benachrichtigungstyp `permission_prompt`.2030Claude Code führt PermissionRequest-Hooks nicht für eine Sandbox-Anfrage eines Befehls aus [Netzwerkanfrage](/docs/de/sandboxing#network-isolation). Um ein Signal für diese Aufforderung zu erhalten, verwenden Sie den `permission_prompt` Benachrichtigungstyp.
2029 2031
2030Passt auf Tool-Namen, gleiche Werte wie PreToolUse.2032Gleicht Tool-Namen ab, gleiche Werte wie PreToolUse.
2031 2033
2032<h4 id="permissionrequest-input">2034<h4 id="permissionrequest-input">
2033 PermissionRequest-Eingabe2035 PermissionRequest-Eingabe
2034</h4>2036</h4>
2035 2037
2036PermissionRequest-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 Array `permission_suggestions` enthält die [Berechtigungsupdates](#permission-update-entries), die Claude Code für diese Anfrage vorschlägt, wie das Hinzufügen einer Allow-Regel oder das Ändern des Berechtigungsmodus.2038PermissionRequest-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 Erlaubnisregel oder das Ändern des Berechtigungsmodus.
2037 2039
2038Das Array `permission_suggestions` ist keine genaue Liste der Optionen, die Sie sehen, da jeder Berechtigungsdialog seine eigenen Optionen erstellt. Einige Dialoge, wie der für Datei-Bearbeitungen, 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, zum Beispiel wenn [`allowManagedPermissionRulesOnly`](/docs/de/settings-reference#allowmanagedpermissionrulesonly) Regel-Speicher-Optionen verbirgt. Es kann auch Optionen anbieten, die keinen Vorschlag-Eintrag haben, wie [**Ja, und zum Auto-Modus wechseln**](/docs/de/permission-modes#switch-permission-modes), das den Berechtigungsmodus direkt ändert, anstatt durch ein Berechtigungsupdate.2040Das `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.
2039 2041
2040PreToolUse-Hooks werden vor jedem Tool-Aufruf ausgeführt, ob er Genehmigung benötigt oder nicht. PermissionRequest-Hooks werden nur ausgeführt, wenn Claude Code Sie um Genehmigung bitten soll, 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.2042PreToolUse-Hooks werden vor jedem Tool-Aufruf ausgeführt, unabhängig davon, ob er Berechtigung benötigt. PermissionRequest-Hooks werden nur ausgeführt, wenn Claude Code Sie um Erlaubnis 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) ausgeführt.
2041 2043
2042```json theme={null}2044```json theme={null}
2043{2045{
2066 PermissionRequest-Entscheidungskontrolle2068 PermissionRequest-Entscheidungskontrolle
2067</h4>2069</h4>
2068 2070
2069`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:2071`PermissionRequest` Hooks können Berechtigungsanfragen erlauben 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 2072
2071| Feld | Beschreibung |2073| Feld | Beschreibung |
2072| :------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2074| :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2073| `behavior` | `"allow"` gewährt die Berechtigung, `"deny"` verweigert sie. [Deny- und Ask-Regeln](/docs/de/permissions#manage-permissions) gelten weiterhin, daher überschreibt ein Hook, der `"allow"` zurückgibt, keine passende Deny-Regel |2075| `behavior` | `"allow"` gewährt die Berechtigung, `"deny"` verweigert sie. [Ablehnungs- und Frageregel](/docs/de/permissions#manage-permissions) werden immer noch ausgewertet, daher überschreibt ein Hook, der `"allow"` zurückgibt, keine übereinstimmende Ablehnungsregel |
2074| `updatedInput` | Nur für `"allow"`: ändert die Tool-Eingabeparameter vor der Ausführung. Ersetzt das gesamte Eingabeobjekt, daher müssen Sie unveränderte Felder zusammen mit geänderten einbeziehen. Die geänderte Eingabe wird erneut gegen Deny- und Ask-Regeln evaluiert |2076| `updatedInput` | Nur für `"allow"`: ä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 Frageregel ausgewertet |
2075| `updatedPermissions` | Nur für `"allow"`: Array von [Berechtigungsupdate-Einträgen](#permission-update-entries) zum Anwenden, wie das Hinzufügen einer Allow-Regel oder das Ändern des Session-Berechtigungsmodus |2077| `updatedPermissions` | Nur für `"allow"`: Array von [Berechtigungsaktualisierungseinträgen](#permission-update-entries) zum Anwenden, wie das Hinzufügen einer Erlaubnisregel oder das Ändern des Sitzungsberechtigungsmodus |
2076| `message` | Nur für `"deny"`: teilt Claude mit, warum die Berechtigung verweigert wurde |2078| `message` | Nur für `"deny"`: sagt Claude, warum die Berechtigung verweigert wurde |
2077| `interrupt` | Nur für `"deny"`: wenn `true`, stoppt Claude |2079| `interrupt` | Nur für `"deny"`: wenn `true`, stoppt Claude |
2078 2080
2079Ein 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.2081Ein 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.
2080 2082
2081```json theme={null}2083```json theme={null}
2082{2084{
2093```2095```
2094 2096
2095<h4 id="permission-update-entries">2097<h4 id="permission-update-entries">
2096 Berechtigungsupdate-Einträge2098 Berechtigungsaktualisierungseinträge
2097</h4>2099</h4>
2098 2100
2099Das Ausgabefeld `updatedPermissions` 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.2101Das `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.
2100 2102
2101| `type` | Felder | Effekt |2103| `type` | Felder | Effekt |
2102| :------------------ | :--------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2104| :------------------ | :--------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2103| `addRules` | `rules`, `behavior`, `destination` | Fügt Berechtigungsregeln hinzu. `rules` ist ein Array von `{toolName, ruleContent?}` Objekten. Lassen Sie `ruleContent` weg, um das ganze Tool zu treffen. `behavior` ist `"allow"`, `"deny"` oder `"ask"` |2105| `addRules` | `rules`, `behavior`, `destination` | Fügt Berechtigungsregeln hinzu. `rules` ist ein Array von `{toolName, ruleContent?}` Objekten. Weglassen `ruleContent`, um das ganze Tool abzugleichen. `behavior` ist `"allow"`, `"deny"` oder `"ask"` |
2104| `replaceRules` | `rules`, `behavior`, `destination` | Ersetzt alle Regeln des gegebenen `behavior` am `destination` mit den bereitgestellten `rules` |2106| `replaceRules` | `rules`, `behavior`, `destination` | Ersetzt alle Regeln des gegebenen `behavior` am `destination` mit den bereitgestellten `rules` |
2105| `removeRules` | `rules`, `behavior`, `destination` | Entfernt passende Regeln des gegebenen `behavior` |2107| `removeRules` | `rules`, `behavior`, `destination` | Entfernt übereinstimmende Regeln des gegebenen `behavior` |
2106| `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 später |2108| `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| `addDirectories` | `directories`, `destination` | Fügt Arbeitsverzeichnisse hinzu. `directories` ist ein Array von Pfad-Zeichenketten |2109| `addDirectories` | `directories`, `destination` | Fügt Arbeitsverzeichnisse hinzu. `directories` ist ein Array von Pfad-Zeichenketten |
2108| `removeDirectories` | `directories`, `destination` | Entfernt Arbeitsverzeichnisse |2110| `removeDirectories` | `directories`, `destination` | Entfernt Arbeitsverzeichnisse |
2109 2111
2110<Note>2112<Note>
2111 `setMode` mit `bypassPermissions` nimmt nur Auswirkungen an, 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 das Update ein No-Op. Das Update 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.2113 `setMode` mit `bypassPermissions` wird nur wirksam, 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 die Sitzung im [eingeschränkten Modus](/docs/de/cli-reference#cli-flags) startet.
2112 2114
2113 `bypassPermissions` wird niemals als `defaultMode` persistiert, unabhängig von `destination`.2115 `bypassPermissions` wird niemals als `defaultMode` beibehalten, unabhängig von `destination`.
2114</Note>2116</Note>
2115 2117
2116Das Feld `destination` auf jedem Eintrag bestimmt, ob die Änderung im Speicher bleibt oder in einer Einstellungsdatei persistiert wird.2118Das `destination` Feld auf jedem Eintrag bestimmt, ob die Änderung im Speicher bleibt oder in einer Einstellungsdatei beibehalten wird.
2117 2119
2118| `destination` | Schreibt zu |2120| `destination` | Schreibt zu |
2119| :---------------- | :------------------------------------------------------ |2121| :---------------- | :------------------------------------------------- |
2120| `session` | Nur im Speicher, wird verworfen, wenn die Sitzung endet |2122| `session` | Nur im Speicher, verworfen, wenn die Sitzung endet |
2121| `localSettings` | `.claude/settings.local.json` |2123| `localSettings` | `.claude/settings.local.json` |
2122| `projectSettings` | `.claude/settings.json` |2124| `projectSettings` | `.claude/settings.json` |
2123| `userSettings` | `~/.claude/settings.json` |2125| `userSettings` | `~/.claude/settings.json` |
2124 2126
2125Ein Hook kann eines der `permission_suggestions` widerspiegeln, die er als seine eigene `updatedPermissions`-Ausgabe erhalten hat.2127Ein Hook kann eines der `permission_suggestions` widerspiegeln, die er als seine eigene `updatedPermissions` Ausgabe erhalten hat.
2126 2128
2127<h3 id="posttooluse">2129<h3 id="posttooluse">
2128 PostToolUse2130 PostToolUse
2129</h3>2131</h3>
2130 2132
2131Wird unmittelbar nach erfolgreichem Abschluss eines Tools ausgeführt.2133Wird sofort nach erfolgreichem Abschluss eines Tools ausgeführt.
2132 2134
2133Passt auf Tool-Namen, gleiche Werte wie PreToolUse.2135Gleicht Tool-Namen ab, gleiche Werte wie PreToolUse.
2134 2136
2135Passen Sie breiter an, wenn der Tool-Name nicht der richtige Filter ist:2137Gleichen Sie breiter ab, wenn der Tool-Name nicht der richtige Filter ist:
2136 2138
2137* Um einen Hook nach jedem erfolgreichen Tool-Abschluss auszuführen, lassen Sie den `matcher` weg oder setzen Sie ihn auf `"*"`. Ihr Hook kann dann selbst entdecken, was sich geändert hat, zum Beispiel durch Ausführung von `git status --porcelain`, das auch unverfolgten Dateien auflistet, die `git diff` vermisst. Für fehlgeschlagene Tool-Aufrufe fügen Sie den gleichen Hook unter [PostToolUseFailure](#posttoolusefailure) hinzu.2139* Um einen Hook nach jedem erfolgreichen Tool-Abschluss 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 auszuführen, wenn sich eine bestimmte Datei auf der Festplatte ändert, egal was sie geschrieben hat, verwenden Sie [FileChanged](#filechanged). Claude Code führt keinen `PostToolUse`-Hook aus, der `Edit|Write` passt, wenn ein `Bash`-Befehl oder ein Prozess außerhalb von Claude Code die gleiche Datei umschreibt.2140* Um einen Hook auszuführen, wenn sich eine bestimmte Datei auf der Festplatte ändert, unabhängig davon, wer sie schreibt, 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 2141
2140<h4 id="posttooluse-input">2142<h4 id="posttooluse-input">
2141 PostToolUse-Eingabe2143 PostToolUse-Eingabe
2142</h4>2144</h4>
2143 2145
2144`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 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.2146`PostToolUse` Hooks werden ausgeführt, 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 2147
2146```json theme={null}2148```json theme={null}
2147{2149{
2172 PostToolUse-Entscheidungskontrolle2174 PostToolUse-Entscheidungskontrolle
2173</h4>2175</h4>
2174 2176
2175`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:2177`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 2178
2177| Feld | Beschreibung |2179| Feld | Beschreibung |
2178| :--------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2180| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2179| `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` |2181| `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| `reason` | Erklärung, die Claude angezeigt wird, wenn `decision` `"block"` ist |2182| `reason` | Erklärung, die Claude angezeigt wird, wenn `decision` `"block"` ist |
2181| `additionalContext` | Zeichenkette, die zu Claudes Kontext zusammen mit dem Tool-Ergebnis hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |2183| `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| `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 [Annotieren Sie ein Ergebnis für den Auto-Modus-Klassifizierer](#annotate-a-result-for-the-auto-mode-classifier). Erfordert Claude Code v2.1.236 oder später |2184| `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 [Ergebnis für den Auto-Modus Klassifizierer annotieren](#annotate-a-result-for-the-auto-mode-classifier). Erfordert Claude Code v2.1.236 oder später |
2183| `updatedToolOutput` | Ersetzt die Ausgabe des Tools durch den bereitgestellten Wert vor dem Senden an Claude. Der Wert muss der Ausgabeform des Tools entsprechen |2185| `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| `updatedMCPToolOutput` | Ersetzt die Ausgabe nur für [MCP-Tools](#match-mcp-tools). Bevorzugen Sie `updatedToolOutput`, das für alle Tools funktioniert |2186| `updatedMCPToolOutput` | Ersetzt die Ausgabe nur für [MCP-Tools](#match-mcp-tools). Bevorzugen Sie `updatedToolOutput`, das für alle Tools funktioniert |
2185 2187
2186Das Beispiel unten ersetzt die Ausgabe eines `Bash`-Aufrufs. Der Ersatzwert entspricht der Ausgabeform des `Bash`-Tools:2188Das Beispiel unten ersetzt die Ausgabe eines `Bash` Aufrufs. Der Ersatzwert entspricht der Ausgabeform des `Bash` Tools:
2187 2189
2188```json theme={null}2190```json theme={null}
2189{2191{
2201```2203```
2202 2204
2203<Warning>2205<Warning>
2204 `updatedToolOutput` ändert nur das, was Claude sieht. Das Tool ist bereits ausgeführt worden, 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 zu verhindern oder zu ändern, bevor er ausgeführt wird, verwenden Sie stattdessen einen [PreToolUse](#pretooluse)-Hook.2206 `updatedToolOutput` ändert nur das, was Claude sieht. Das Tool hat bereits ausgeführt, wenn der Hook ausgeführt 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 zu verhindern oder zu ändern, bevor er ausgeführt wird, verwenden Sie stattdessen einen [PreToolUse](#pretooluse) Hook.
2205 2207
2206 Der Ersatzwert muss der Ausgabeform des Tools entsprechen. Eingebaute Tools geben strukturierte Objekte anstelle von einfachen Zeichenketten zurück. Zum Beispiel gibt `Bash` ein Objekt mit `stdout`-, `stderr`-, `interrupted`- und `isImage`-Feldern zurück. Für eingebaute 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 durchgeleitet. Das Entfernen von Fehlerdetails, die Claude benötigt, kann dazu führen, dass er bei einer falschen Annahme fortfährt.2208 Der Ersatzwert muss der Ausgabeform des Tools entsprechen. Integrierte Tools geben strukturierte Objekte statt einfacher Zeichenketten 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 bei einer falschen Annahme fortfährt.
2207</Warning>2209</Warning>
2208 2210
2209<h4 id="annotate-a-result-for-the-auto-mode-classifier">2211<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2210 Annotieren Sie ein Ergebnis für den Auto-Modus-Klassifizierer2212 Ergebnis für den Auto-Modus Klassifizierer annotieren
2211</h4>2213</h4>
2212 2214
2213Geben 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 statt an Claude zu senden. Der Klassifizierer [erhält 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 es später Aktionen überprüft. Das Feld erfordert Claude Code v2.1.236 oder später.2215Geben 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 statt an Claude zu senden. 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.
2214 2216
2215Das Beispiel unten teilt dem Klassifizierer mit, woher die Ausgabe einer Abfrage kam:2217Das Beispiel unten sagt dem Klassifizierer, woher die Ausgabe einer Abfrage stammt:
2216 2218
2217```json theme={null}2219```json theme={null}
2218{2220{
2225 2227
2226Wie viel Gewicht der Klassifizierer der Notiz gibt, hängt davon ab, wo Sie den Hook konfiguriert haben:2228Wie viel Gewicht der Klassifizierer der Notiz gibt, hängt davon ab, wo Sie den Hook konfiguriert haben:
2227 2229
2228* **Hooks, die in Claude Code konfiguriert sind**: Für Hooks aus Einstellungsdateien, Plugins, Skills und Agent-Frontmatter behandelt der Klassifizierer die Notiz als nicht überprüften, von der Anwendung bereitgestellten 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 Konversation2230* **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, von der Anwendung bereitgestellten 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 im Gespräch
2229* **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 einen Block auf, den Ihre eigene Nachricht nicht heben könnte. Nach einer Sitzungswiederaufnahme behandelt Claude Code wiederhergestellte Notizen als nicht überprüften Kontext. Wenn Hooks aus beiden Gruppen den gleichen Aufruf annotieren, behandelt der Klassifizierer die kombinierte Notiz als nicht überprüft2231* **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 einen Block auf, den Ihre eigene Nachricht auch nicht heben könnte. Nach einer Sitzungsfortsetzung behandelt Claude Code wiederhergestellte Notizen als nicht verifizierten Kontext. Wenn Hooks aus beiden Gruppen den gleichen Aufruf annotieren, behandelt der Klassifizierer die kombinierte Notiz als nicht verifizierten Kontext
2230 2232
2231Claude Code wendet diese Grenzen an, wenn die Notiz bereitgestellt wird:2233Claude Code wendet diese Grenzen an, wenn die Notiz bereitgestellt wird:
2232 2234
2233* **Länge**: Claude Code begrenzt die Notizen für einen Tool-Aufruf auf 2.000 Zeichen und schneidet den Rest ab. Die Obergrenze wird über jeden Hook geteilt, der auf diesen Aufruf antwortet2235* **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 antwortet
2234* **Nur synchrone Antworten**: Claude Code ignoriert das Feld in der Antwort eines Hooks, der [im Hintergrund läuft](#run-hooks-in-the-background), da diese Antwort ankommt, nachdem Claude Code das Tool-Ergebnis aufgezeichnet hat2236* **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 ankommt
2235* **Aufrufe, die der Klassifizierer nicht aufzeichnet**: Das Klassifizierer-Transkript lässt schreibgeschützte Lookups wie Datei-Lesevorgänge und Suchen weg. Claude Code verwirft eine Notiz, die an einen dieser Aufrufe angehängt ist2237* **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 ist
2236* **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 lässt die Notiz fallen, 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 umschreibt2238* **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 löscht 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 umschreibt
2237 2239
2238<Warning>2240<Warning>
2239 Der Klassifizierer liest Inhalte, die Sie in `classifierContext` einfügen, als Informationen vom Anwendungs-Host der Sitzung, daher kopieren Sie nicht unvertrauenswürdige Tool-Ausgabe oder Text von Drittanbietern hinein. 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 unabhängige Nachrichten oder einen Strom von Ereignissen zu liefern.2241 Der Klassifizierer liest Inhalte, die Sie in `classifierContext` einfügen, als Informationen vom Anwendungshost der Sitzung, daher kopieren Sie nicht vertrauenswürdige Tool-Ausgabe oder Text von Drittanbietern hinein. 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</Warning>2242</Warning>
2241 2243
2242<h3 id="posttoolusefailure">2244<h3 id="posttoolusefailure">
2243 PostToolUseFailure2245 PostToolUseFailure
2244</h3>2246</h3>
2245 2247
2246Wird ausgeführt, wenn ein Tool, das mit der Ausführung begonnen hat, fehlschlägt: Das Tool hat einen Fehler geworfen oder ein MCP-Tool hat ein Fehlerergebnis zurückgegeben. Verwenden Sie dies, um Fehler zu protokollieren, Warnungen zu senden oder korrektes Feedback an Claude zu geben.2248Wird 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.
2247 2249
2248Passt auf Tool-Namen, gleiche Werte wie PreToolUse.2250Gleicht Tool-Namen ab, gleiche Werte wie PreToolUse.
2249 2251
2250<Note>2252<Note>
2251 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 vor Hooks auf, daher werden weder `PreToolUse` noch dieses Ereignis ausgelöst. Berechtigungsverweigerungen lösen `PreToolUse` aus, aber nicht dieses Ereignis; siehe [PermissionDenied](#permissiondenied).2253 Dieses Ereignis wird nicht für Tool-Aufrufe ausgeführt, die vor der Ausführung abgelehnt werden: Ein unbekannter Tool-Name, Eingabe, die Schema- oder Tool-spezifische Validierung fehlschlägt, oder eine Berechtigungsverweigerung. Validierungsablehnungen werden als `tool_use_error` Ergebnisse zurückgegeben und treten auf, bevor Hooks ausgeführt werden, daher werden weder `PreToolUse` noch dieses Ereignis ausgeführt. Berechtigungsverweigerungen führen `PreToolUse` aus, aber nicht dieses Ereignis; siehe [PermissionDenied](#permissiondenied).
2252</Note>2254</Note>
2253 2255
2254<h4 id="posttoolusefailure-input">2256<h4 id="posttoolusefailure-input">
2255 PostToolUseFailure-Eingabe2257 PostToolUseFailure-Eingabe
2256</h4>2258</h4>
2257 2259
2258PostToolUseFailure-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. Zum Beispiel könnte ein fehlgeschlagener `npm test`-Befehl liefern:2260PostToolUseFailure-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:
2259 2261
2260```json theme={null}2262```json theme={null}
2261{2263{
2277```2279```
2278 2280
2279| Feld | Beschreibung |2281| Feld | Beschreibung |
2280| :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |2282| :------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2281| `error` | Zeichenkette, die beschreibt, was schief gelaufen ist. Das Format hängt vom Tool ab, das fehlgeschlagen ist |2283| `error` | Zeichenkette, die beschreibt, was schief gelaufen ist. Das Format hängt vom Tool ab, das fehlgeschlagen ist |
2282| `is_interrupt` | Optionaler Boolesch. 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 Abbruch-Nachricht statt |2284| `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 führt nicht zu diesem Hook; das Tool-Ergebnis trägt stattdessen die Abbruchmeldung |
2283| `duration_ms` | Optional. Tool-Ausführungszeit in Millisekunden. Schließt Zeit aus, die in Berechtigungsaufforderungen und PreToolUse-Hooks verbracht wird |2285| `duration_ms` | Optional. Tool-Ausführungszeit in Millisekunden. Schließt Zeit aus, die in Berechtigungsaufforderungen und PreToolUse-Hooks verbracht wird |
2284 2286
2285Die `error`-Zeichenkette ist im Allgemeinen der gleiche Text, den Claude als Ergebnis des fehlgeschlagenen Tools erhält. 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.2287Die `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.
2286 2288
2287* 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 erzeugte2289* Für Bash und PowerShell erzeugt ein Befehl, der lief und beendet wurde, eine erste Zeile `Exit code N`, dann jede Ausgabe, die der Befehl als einen Block mit stdout und stderr vermischt erzeugte
2288* Eine Nutzlast kann auch eine bloße Fehlermeldung ohne Exit-Code-Zeile tragen, wenn Claude Code den Shell-Prozess selbst nicht starten konnte2290* Eine Nutzlast kann auch eine bloße Fehlermeldung ohne Exit-Code-Zeile tragen, wenn Claude Code den Shell-Prozess selbst nicht starten konnte
2289* 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`2291* Claude Code schneidet lange Zeichenketten in der Mitte um einen `... [N characters truncated] ...` Marker ab und kann Zeilen von sich selbst einfügen, wie `Command timed out after 2m 0s`
2290 2292
2291<h4 id="posttoolusefailure-decision-control">2293<h4 id="posttoolusefailure-decision-control">
2292 PostToolUseFailure-Entscheidungskontrolle2294 PostToolUseFailure-Entscheidungskontrolle
2293</h4>2295</h4>
2294 2296
2295`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:2297`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 2298
2297| Feld | Beschreibung |2299| Feld | Beschreibung |
2298| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------- |2300| :------------------ | :------------------------------------------------------------------------------------------------------------------------------- |
2299| `additionalContext` | Zeichenkette, die zu Claudes Kontext zusammen mit dem Fehler hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |2301| `additionalContext` | String, der zu Claudes Kontext neben dem Fehler hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
2300 2302
2301```json theme={null}2303```json theme={null}
2302{2304{
2311 PostToolBatch2313 PostToolBatch
2312</h3>2314</h3>
2313 2315
2314Wird 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.2316Wird 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 vom Satz von Tools abhängt, die liefen, statt von einem einzelnen Tool. Es gibt keinen Matcher für dieses Ereignis.
2315 2317
2316<h4 id="posttoolbatch-input">2318<h4 id="posttoolbatch-input">
2317 PostToolBatch-Eingabe2319 PostToolBatch-Eingabe
2318</h4>2320</h4>
2319 2321
2320Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PostToolBatch-Hooks `tool_calls`, ein Array, das jeden Tool-Aufruf im Batch beschreibt:2322Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten PostToolBatch-Hooks `tool_calls`, ein Array, das jeden Tool-Aufruf im Batch beschreibt:
2321 2323
2322```json theme={null}2324```json theme={null}
2323{2325{
2343}2345}
2344```2346```
2345 2347
2346`tool_response` enthält den gleichen Inhalt, den das Modell im entsprechenden `tool_result`-Block erhält. 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 anstelle von rohen Dateiinhalten. Antworten können groß sein, daher analysieren Sie nur die Felder, die Sie benötigen.2348`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 2349
2348<Note>2350<Note>
2349 Die Form von `tool_response` 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.2351 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</Note>2352</Note>
2351 2353
2352<h4 id="posttoolbatch-decision-control">2354<h4 id="posttoolbatch-decision-control">
2353 PostToolBatch-Entscheidungskontrolle2355 PostToolBatch-Entscheidungskontrolle
2354</h4>2356</h4>
2355 2357
2356`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:2358`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 2359
2358| Feld | Beschreibung |2360| Feld | Beschreibung |
2359| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2361| :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2360| `additionalContext` | Kontext-Zeichenkette, die 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 |2362| `additionalContext` | Kontext-Zeichenkette, die einmal vor dem nächsten Modell-Aufruf eingefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) für Bereitstellungsdetails, was Sie darin einfügen sollten und wie fortgesetzte Sitzungen mit vergangenen Werten umgehen |
2361 2363
2362```json theme={null}2364```json theme={null}
2363{2365{
2368}2370}
2369```2371```
2370 2372
2371Das 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 Beendigung mit 2. Sie sehen sie als Warnung im Transkript, und sie bleibt in der Konversation, daher sieht Claude sie, wenn die Konversation fortgesetzt wird.2373Das 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 Beendigung mit 2. Sie sehen sie als Warnung im Transkript, und sie bleibt im Gespräch, daher sieht Claude sie, wenn das Gespräch fortgesetzt wird.
2372 2374
2373<h3 id="permissiondenied">2375<h3 id="permissiondenied">
2374 PermissionDenied2376 PermissionDenied
2375</h3>2377</h3>
2376 2378
2377Wird ausgeführt, wenn der [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode)-Klassifizierer einen Tool-Aufruf verweigert, einschließlich wenn er verweigert, ohne ein Klassifizierer-Urteil zu haben, weil [eine Sicherheitsprüfung, die von 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 geparst wurde. Dieser Hook wird nur im Auto-Modus ausgelöst: Er wird nicht ausgeführt, wenn Sie einen Berechtigungsdialog manuell verweigern, wenn ein `PreToolUse`-Hook einen Aufruf blockiert oder wenn eine `deny`-Regel passt. Verwenden Sie ihn, um Klassifizierer-Ablehnungen zu protokollieren, die Konfiguration anzupassen oder dem Modell zu sagen, dass es den Tool-Aufruf möglicherweise erneut versuchen kann.2379Wird ausgeführt, wenn [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode) einen Tool-Aufruf verweigert, einschließlich wenn er 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.
2378 2380
2379Passt auf Tool-Namen, gleiche Werte wie PreToolUse.2381Gleicht Tool-Namen ab, gleiche Werte wie PreToolUse.
2380 2382
2381<h4 id="permissiondenied-input">2383<h4 id="permissiondenied-input">
2382 PermissionDenied-Eingabe2384 PermissionDenied-Eingabe
2383</h4>2385</h4>
2384 2386
2385Zusätzlich zu den [gemeinsamen 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.2387Zusä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.
2386 2388
2387```json theme={null}2389```json theme={null}
2388{2390{
2402```2404```
2403 2405
2404| Feld | Beschreibung |2406| Feld | Beschreibung |
2405| :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2407| :------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2406| `reason` | Der Verweigerungsgrund. Für ein Klassifizierer-Urteil benennt es in den meisten Sitzungen die passende Regel in 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 es 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` |2408| `reason` | Der Verweigerungsgrund. 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 2409
2408<h4 id="permissiondenied-decision-control">2410<h4 id="permissiondenied-decision-control">
2409 PermissionDenied-Entscheidungskontrolle2411 PermissionDenied-Entscheidungskontrolle
2420}2422}
2421```2423```
2422 2424
2423Wenn `retry` `true` ist, fügt Claude Code eine Nachricht zum Gespräch hinzu, die dem Modell mitteilt, dass es den Tool-Aufruf möglicherweise erneut versuchen kann. Die Ablehnung selbst wird nicht rückgängig gemacht. Wenn Ihr Hook keine JSON zurückgibt oder `retry: false` zurückgibt, bleibt die Ablehnung bestehen und das Modell erhält die ursprüngliche Ablehnungsmeldung.2425Wenn `retry` `true` ist, fügt Claude Code eine Nachricht zum Gespräch 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.
2424 2426
2425Claude 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 hat nicht geparst oder eine Sicherheitsprüfung, die von Auto-Modus getrennt ist, verweigerte die Anfrage des Klassifizierers selbst. Für diese Verweigerungen teilt Claude Code dem Modell in der Ablehnungsmeldung bereits mit, ob es später erneut versuchen soll oder weitermachen soll.2427Claude 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 wurde nicht analysiert 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 oder weitermachen soll.
2426 2428
2427<h3 id="notification">2429<h3 id="notification">
2428 Notification2430 Notification
2429</h3>2431</h3>
2430 2432
2431Wird ausgeführt, wenn Claude Code Benachrichtigungen sendet. Passt auf Benachrichtigungstyp. Matcher weglassen, um Hooks für alle Benachrichtigungstypen auszuführen.2433Wird ausgeführt, wenn Claude Code Benachrichtigungen sendet. Gleicht Benachrichtigungstyp ab. Weglassen Sie den Matcher, um Hooks für alle Benachrichtigungstypen auszuführen.
2432 2434
2433Sie 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.2435Sie 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.
2434 2436
2435| Matcher | Wann es ausgelöst wird |2437| Matcher | Wann wird es ausgelöst |
2436| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2438| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
2437| `permission_prompt` | Claude benötigt Ihre Genehmigung für einen Tool-Aufruf oder eine Sandbox-Befehl-[Netzwerkanfrage](/docs/de/sandboxing#network-isolation), und der Prompt hat etwa sechs Sekunden gewartet |2439| `permission_prompt` | Claude benötigt Ihre Genehmigung für einen Tool-Aufruf oder eine Netzwerkanfrage eines Sandbox-Befehls, und die Aufforderung hat etwa sechs Sekunden gewartet |
2438| `idle_prompt` | Claude ist vor etwa 60 Sekunden fertig und Sie haben nicht seitdem getippt |2440| `idle_prompt` | Claude hat vor etwa 60 Sekunden geantwortet und Sie haben seitdem nicht eingegeben |
2439| `auth_success` | Authentifizierung ist abgeschlossen |2441| `auth_success` | Authentifizierung ist abgeschlossen |
2440| `elicitation_dialog` | Ein MCP-Server öffnet ein Elicitation-Formular und Sie haben nicht seitdem getippt |2442| `elicitation_dialog` | Ein MCP-Server öffnet ein Elicitierungsformular und Sie haben etwa sechs Sekunden nicht eingegeben |
2441| `elicitation_url_dialog` | Ein MCP-Server fordert Sie auf, eine Browser-URL zu öffnen und Sie haben nicht seitdem getippt |2443| `elicitation_url_dialog` | Ein MCP-Server fordert Sie auf, eine Browser-URL zu öffnen und Sie haben etwa sechs Sekunden nicht eingegeben |
2442| `elicitation_complete` | Ein MCP-Server meldet, dass eine [URL-Mode-Elicitation](#elicitation-input) abgeschlossen ist |2444| `elicitation_complete` | Ein MCP-Server meldet, dass eine [URL-Modus-Elicitierung](#elicitation-input) abgeschlossen ist |
2443| `elicitation_response` | Eine MCP-Elicitation-Antwort wird an den Server zurückgesendet |2445| `elicitation_response` | Eine MCP-Elicitierungs-Antwort wird an den Server zurückgesendet |
2444| `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, oder die aktuelle Sitzung stellt eine [Agent-Team-Teammate-Terminal-Setup-Frage](/docs/de/agent-teams#choose-a-display-mode) und Sie haben nicht seitdem getippt |2446| `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, oder die aktuelle Sitzung stellt Ihnen eine [Agent-Team-Teamkollegen-Terminal-Setup-Frage](/docs/de/agent-teams#choose-a-display-mode) und Sie haben etwa sechs Sekunden nicht eingegeben |
2445| `agent_completed` | Eine Hintergrund-Sitzung wird fertig oder schlägt fehl. Wird nur ausgelöst, während [Agent-Ansicht](/docs/de/agent-view) in einem Terminal offen ist |2447| `agent_completed` | Eine Hintergrund-Sitzung wird beendet oder schlägt fehl. Wird nur ausgeführt, während [Agent-Ansicht](/docs/de/agent-view) in einem Terminal offen ist |
2446| `quota_auto_resume_fired` | Claude Code setzt Ihre Aufgabe fort, nachdem ein claude.ai-Nutzungslimit sie pausiert hat: beim Reset oder früher, wenn etwas, das Sie in Claude Code tun, wie das Hinzufügen von Nutzungsguthaben, das Upgrade Ihres Plans oder das Wechseln von Modellen, Nutzung wieder verfügbar macht, mit der [Modell-Einstellung-Ausnahme](/docs/de/interactive-mode#wait-for-a-usage-limit-to-reset) |2448| `quota_auto_resume_fired` | Claude Code setzt Ihre Aufgabe nach einer claude.ai Nutzungslimit-Pause fort: 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, macht Nutzung wieder verfügbar, mit der [Modell-Einstellung Ausnahme](/docs/de/interactive-mode#wait-for-a-usage-limit-to-reset) |
2447| `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, statt fortzufahren. Nach einem kürzeren Schlaf wird fortgesetzt und `quota_auto_resume_fired` statt |2449| `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 wird stattdessen `quota_auto_resume_fired` ausgeführt |
2448| `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 weiterhin 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 |2450| `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 ausgeführt, wenn Sie `Esc` oder `Ctrl+C` drücken oder **Nicht automatisch fortsetzen** wählen |
2449 2451
2450Die Typen `agent_needs_input` und `agent_completed` erfordern Claude Code v2.1.198 oder später.2452Die `agent_needs_input` und `agent_completed` Typen erfordern Claude Code v2.1.198 oder später.
2451 2453
2452Die Typen `quota_auto_resume_fired`, `quota_auto_resume_stale` und `quota_auto_resume_disabled` erfordern Claude Code v2.1.234 oder später.2454Die `quota_auto_resume_fired`, `quota_auto_resume_stale` und `quota_auto_resume_disabled` Typen erfordern Claude Code v2.1.234 oder später.
2453 2455
2454In Terminal-Sitzungen erfordert `permission_prompt` für eine Sandbox-Befehl-Netzwerkanfrage Claude Code v2.1.246 oder später.2456In Terminal-Sitzungen erfordert `permission_prompt` für eine Netzwerkanfrage eines Sandbox-Befehls Claude Code v2.1.246 oder später.
2455 2457
2456`agent_needs_input` für eine Teammate-Terminal-Setup-Frage erfordert Claude Code v2.1.248 oder später.2458`agent_needs_input` für eine Teamkollegen-Terminal-Setup-Frage erfordert Claude Code v2.1.248 oder später.
2457 2459
2458<Note>2460<Note>
2459 Die Typen `permission_prompt`, `idle_prompt`, `elicitation_dialog` und `elicitation_url_dialog` teilen ihr Timing mit Desktop-Benachrichtigungen, daher sehen Sie sie in Terminal-Sitzungen nur, wenn Sie vom Terminal weg zu sein scheinen:2461 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:
2460 2462
2461 * Erwarten Sie `permission_prompt`, sobald Sie etwa sechs Sekunden nicht getippt haben. Der Timer startet, wenn der Berechtigungsprompt 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).2463 * 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 Erlaubnis bittet, ein Tool zu verwenden, verwenden Sie stattdessen [PermissionRequest](#permissionrequest).
2462 * Erwarten Sie `idle_prompt` etwa 60 Sekunden, nachdem Claude fertig ist, und nur wenn Sie seitdem nicht getippt haben. Claude Code sendet `idle_prompt` nicht, während es auf ein claude.ai-Nutzungslimit wartet. Wenn das Warten auf eigene Faust endet, wird stattdessen einer der `quota_auto_resume_*`-Typen ausgelöst.2464 * 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 von selbst endet, wird stattdessen einer der `quota_auto_resume_*` Typen ausgeführt.
2463 * Erwarten Sie `elicitation_dialog` für ein Elicitation-Formular oder `elicitation_url_dialog` für eine Browser-URL-Anfrage, sobald Sie etwa sechs Sekunden nicht getippt haben. Beide teilen das gleiche Sechs-Sekunden-Gate wie `permission_prompt`: Der Timer startet, wenn der Dialog erscheint, und jeder Tastendruck verschiebt ihn.2465 * 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.
2464 2466
2465 Eine Berechtigungsanfrage oder Elicitation, die ankommt, während ein anderer Dialog auf dem Bildschirm ist, behält das gleiche Sechs-Sekunden-Gate, zeitlich von wenn die Anfrage ankommt. Seine Benachrichtigung kann Sie erreichen, während die Anfrage immer noch hinter dem offenen Dialog wartet.2467 Eine Berechtigungsanfrage oder Elicitierung, die ankommt, während ein anderer Dialog auf dem Bildschirm ist, behält das gleiche Sechs-Sekunden-Gate, zeitlich von wenn die Anfrage ankommt. Seine Benachrichtigung kann Sie erreichen, während die Anfrage immer noch hinter dem offenen Dialog wartet.
2466</Note>2468</Note>
2467 2469
2468Claude Code zeitlich `permission_prompt` anders 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:2470Claude 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:
2469 2471
2470* Erwarten Sie `permission_prompt` etwa sechs Sekunden, nachdem Claude um Genehmigung bittet. Claude Code verschiebt es nicht, während Sie tippen.2472* Erwarten Sie `permission_prompt` etwa sechs Sekunden, nachdem Claude um Erlaubnis bittet. Claude Code verschiebt es nicht, während Sie eingeben.
2471* Wenn Sie oder ein [PermissionRequest](#permissionrequest)-Hook früher antworten, führt Claude Code `permission_prompt` nicht aus.2473* Wenn Sie oder ein [PermissionRequest](#permissionrequest) Hook früher antworten, führt Claude Code `permission_prompt` nicht aus.
2472* Setzen Sie [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/de/env-vars) auf `1`, um `permission_prompt` in diesen Sitzungen auszuschalten.2474* Setzen Sie [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/de/env-vars) auf `1`, um `permission_prompt` in diesen Sitzungen auszuschalten.
2473 2475
2474Vor v2.1.233 wurde `permission_prompt` in diesen Sitzungen nicht ausgelöst.2476Vor v2.1.233 wurde `permission_prompt` in diesen Sitzungen nicht ausgeführt.
2475 2477
2476Verwenden Sie separate Matcher, um verschiedene Handler je nach Benachrichtigungstyp auszuführen. Diese Konfiguration löst ein berechtigungsspezifisches Warnungsskript aus, wenn Claude Genehmigung benötigt, und eine andere Benachrichtigung, wenn Claude untätig war:2478Verwenden Sie separate Matcher, um verschiedene Handler je nach Benachrichtigungstyp auszuführen. Diese Konfiguration löst ein Berechtigungs-spezifisches Warnungsskript aus, wenn Claude Berechtigungsgenehmigung benötigt, und eine andere Benachrichtigung, wenn Claude untätig war:
2477 2479
2478```json theme={null}2480```json theme={null}
2479{2481{
2506 Notification-Eingabe2508 Notification-Eingabe
2507</h4>2509</h4>
2508 2510
2509Zusä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.2511Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten Notification-Hooks `message` mit dem Benachrichtigungstext, ein optionaler `title` und `notification_type`, das angibt, welcher Typ ausgeführt wurde.
2510 2512
2511```json theme={null}2513```json theme={null}
2512{2514{
2520}2522}
2521```2523```
2522 2524
2523Notification-Hooks können Benachrichtigungen nicht blockieren oder ändern. Claude Code verwirft ihre `systemMessage` und `continue`-Felder, aber gibt 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 vorgesehen.2525Notification-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-Benachrichtigungsbeispiel verlässt. Notification-Hooks sind für Nebenwirkungen wie das Weiterleiten der Benachrichtigung an einen externen Service gedacht.
2524 2526
2525<h3 id="subagentstart">2527<h3 id="subagentstart">
2526 SubagentStart2528 SubagentStart
2527</h3>2529</h3>
2528 2530
2529Wird ausgeführt, wenn Claude einen Subagenten mit dem Agent-Tool spawnt, wenn Claude [einen Subagenten fortsetzt](/docs/de/sub-agents#resume-subagents) und jedes Mal, wenn ein In-Process-[Agent-Team](/docs/de/agent-teams)-Teammate eine neue Nachricht handhabt. Unterstützt Matcher zum Filtern nach Agent-Typname. Für eingebaute Agents ist dies der Agent-Name wie `general-purpose`, `Explore` oder `Plan`. Für [benutzerdefinierte Subagenten](/docs/de/sub-agents) ist dies das Feld `name` aus dem Frontmatter des Agenten, nicht der Dateiname.2531Wird ausgeführt, wenn Claude einen Subagenten mit dem Agent-Tool spawnt, 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.
2530 2532
2531Für Subagenten, die von einem [Plugin](/docs/de/plugins) bereit gestellt werden, ist der Agent-Typ die Plugin-spezifische Kennung wie `my-plugin:reviewer`, nicht der bloße Frontmatter-Name. Der Doppelpunkt platziert einen Plugin-spezifischen Namen auf dem regulären Ausdruckspfad, daher verankern Sie den Matcher mit `^` und `$` für eine genaue Übereinstimmung: `^my-plugin:reviewer$`.2533Für Subagenten, die von einem [Plugin](/docs/de/plugins) versendet werden, ist der Agent-Typ der Plugin-scoped Identifikator 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 einen genauen Treffer: `^my-plugin:reviewer$`.
2532 2534
2533<h4 id="subagentstart-input">2535<h4 id="subagentstart-input">
2534 SubagentStart-Eingabe2536 SubagentStart-Eingabe
2535</h4>2537</h4>
2536 2538
2537Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SubagentStart-Hooks `agent_id` mit der eindeutigen Kennung für den Subagenten und `agent_type` mit dem Agent-Namen, den der Matcher filtert.2539Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten SubagentStart-Hooks `agent_id` mit dem eindeutigen Identifikator für den Subagenten und `agent_type` mit dem Agent-Namen, den der Matcher filtert.
2538 2540
2539```json theme={null}2541```json theme={null}
2540{2542{
2547}2549}
2548```2550```
2549 2551
2550SubagentStart-Hooks können die Subagenten-Erstellung nicht blockieren, können aber Kontext in den Subagenten injizieren. Zusätzlich zu den [JSON-Ausgabefeldern](#json-output), die für alle Hooks verfügbar sind, können Sie zurückgeben:2552SubagentStart-Hooks können die Erstellung von Subagenten 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:
2551 2553
2552| Feld | Beschreibung |2554| Feld | Beschreibung |
2553| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2555| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2554| `additionalContext` | Zeichenkette, die zu Claudes Kontext am Anfang des Gesprächs des Subagenten hinzugefügt wird, vor seinem ersten Prompt. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |2556| `additionalContext` | String, der zu Claudes Kontext am Anfang des Gesprächs des Subagenten hinzugefügt wird, vor seiner ersten Eingabeaufforderung. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |
2555 2557
2556```json theme={null}2558```json theme={null}
2557{2559{
2562}2564}
2563```2565```
2564 2566
2565Wenn 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 hält. Die Kopie, die beim Start injiziert wurde, 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.2567Wenn 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 eingefügte Kopie bleibt bestehen, 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) verwirft diese Kopie, injiziert Claude Code den Kontext des nächsten Laufs erneut.
2566 2568
2567<h3 id="subagentstop">2569<h3 id="subagentstop">
2568 SubagentStop2570 SubagentStop
2569</h3>2571</h3>
2570 2572
2571Wird ausgeführt, wenn ein Claude Code-Subagent fertig mit der Antwort ist. Passt auf Agent-Typ, gleiche Werte wie SubagentStart.2573Wird ausgeführt, wenn ein Claude Code Subagent mit dem Antworten fertig ist. Gleicht Agent-Typ ab, gleiche Werte wie SubagentStart.
2572 2574
2573<h4 id="subagentstop-input">2575<h4 id="subagentstop-input">
2574 SubagentStop-Eingabe2576 SubagentStop-Eingabe
2575</h4>2577</h4>
2576 2578
2577Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SubagentStop-Hooks `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path` und `last_assistant_message`. Das Feld `agent_type` ist der Wert, der zum Filtern von Matchern verwendet wird. Der `transcript_path` ist das Transkript der Hauptsitzung, während `agent_transcript_path` das eigene Transkript des Subagenten ist, das in einem verschachtelten `subagents/`-Ordner gespeichert ist. Das Feld `last_assistant_message` enthält den Textinhalt der letzten Antwort des Subagenten, daher können Hooks darauf zugreifen, ohne die Transkript-Datei zu analysieren.2579Zusä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 eigene Transkript des Subagenten 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.
2580
2581Nicht jedes SubagentStop-Ereignis kommt von einem Subagenten, den Claude spawnt. Claude Code führt auch interne Agenten für einige seiner eigenen Funktionen aus, wie [Eingabeaufforderungsvorschläge](/docs/de/interactive-mode#prompt-suggestions) und [`/btw` Seitenfragen](/docs/de/interactive-mode#side-questions-with-%2Fbtw), und SubagentStop wird ausgeführt, 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 läuft.
2582
2583Ein `matcher`, der Agent-Typen benennt, gleicht keine leere `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 einer leeren `agent_type` ausgeführt.
2578 2584
2579Auf Claude Code v2.1.271 oder später liefert ein Subagent, der mit dem [`SubagentHandback`](/docs/de/tools-reference)-Tool läuft, seinen Bericht durch dieses Tool, bevor er stoppt. Das Feld `last_assistant_message` hält dann den Schließtext 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` passt, als `tool_input.message` erhält.2585Auf Claude Code v2.1.271 oder später liefert ein Subagent, der mit dem [`SubagentHandback`](/docs/de/tools-reference) Tool läuft, seinen Bericht durch 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.
2580 2586
2581SubagentStop-Hooks erhalten auch die Arrays `background_tasks` und `session_crons`, die unter [Stop-Eingabe](#stop-input) beschrieben sind. Beide Arrays sind auf die übergeordnete Sitzung beschränkt, nicht auf den Subagenten.2587SubagentStop-Hooks erhalten auch die `background_tasks` und `session_crons` Arrays, die unter [Stop-Eingabe](#stop-input) beschrieben sind. Beide Arrays sind auf die Eltern-Sitzung scoped, nicht den Subagenten.
2582 2588
2583```json theme={null}2589```json theme={null}
2584{2590{
2597}2603}
2598```2604```
2599 2605
2600SubagentStop-Hooks verwenden das gleiche Entscheidungskontrollformat wie [Stop-Hooks](#stop-decision-control), einschließlich `hookSpecificOutput.additionalContext` mit `hookEventName` auf `"SubagentStop"` gesetzt, für Nicht-Fehler-Feedback, das den Subagenten am Laufen hält. Das Zurückgeben von `decision: "block"` mit einem `reason` hält den Subagenten am Laufen und liefert `reason` an den Subagenten als nächste Anweisung. Ein Hook, der durch Beenden 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.2606SubagentStop-Hooks verwenden das gleiche Entscheidungskontrollformat 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 Eltern-Sitzung einzufügen, nachdem ein Subagent zurückkommt, verwenden Sie stattdessen einen [`PostToolUse`](#posttooluse) Hook auf dem `Agent` Tool.
2601 2607
2602<h3 id="taskcreated">2608<h3 id="taskcreated">
2603 TaskCreated2609 TaskCreated
2604</h3>2610</h3>
2605 2611
2606Wird 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.2612Wird 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 ausgeführt.
2607 2613
2608TaskCreated-Hooks unterstützen keine Matcher und werden bei jedem Auftreten ausgelöst.2614TaskCreated-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgeführt.
2609 2615
2610<h4 id="taskcreated-input">2616<h4 id="taskcreated-input">
2611 TaskCreated-Eingabe2617 TaskCreated-Eingabe
2612</h4>2618</h4>
2613 2619
2614Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten TaskCreated-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.2620Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten TaskCreated-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.
2615 2621
2616```json theme={null}2622```json theme={null}
2617{2623{
2628```2634```
2629 2635
2630| Feld | Beschreibung |2636| Feld | Beschreibung |
2631| :----------------- | :------------------------------------------------------------------------------ |2637| :----------------- | :------------------------------------------------------------------------------------ |
2632| `task_id` | Kennung der zu erstellenden Aufgabe |2638| `task_id` | Identifikator der zu erstellenden Aufgabe |
2633| `task_subject` | Titel der Aufgabe |2639| `task_subject` | Titel der Aufgabe |
2634| `task_description` | Detaillierte Beschreibung der Aufgabe. Kann fehlen |2640| `task_description` | Detaillierte Beschreibung der Aufgabe. Kann fehlen |
2635| `teammate_name` | Name des Teammates, das die Aufgabe erstellt. Kann fehlen |2641| `teammate_name` | Name des Teamkollegen, der die Aufgabe erstellt. Kann fehlen |
2636| `team_name` | Veraltet. Session-derived team name; wird in einer zukünftigen Version entfernt |2642| `team_name` | Veraltet. Sitzungs-abgeleiteter Team-Name; wird in einer zukünftigen Version entfernt |
2637 2643
2638<h4 id="taskcreated-decision-control">2644<h4 id="taskcreated-decision-control">
2639 TaskCreated-Entscheidungskontrolle2645 TaskCreated-Entscheidungskontrolle
2640</h4>2646</h4>
2641 2647
2642Ein TaskCreated-Hook kann die Erstellung auf zwei Wegen blockieren. Auf beide Wegen 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.2648Ein 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.
2643 2649
2644* **Exit-Code 2**: Claude Code gibt den stderr-Text als Nachricht zurück.2650* **Exit-Code 2**: Claude Code gibt den stderr-Text als die Nachricht zurück.
2645* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code gibt `reason` als Nachricht zurück.2651* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code gibt `reason` als die Nachricht zurück.
2646 2652
2647Dieses Beispiel blockiert Aufgaben, deren Betreff nicht dem erforderlichen Format entspricht:2653Dieses Beispiel blockiert Aufgaben, deren Betreff nicht dem erforderlichen Format folgt:
2648 2654
2649```bash theme={null}2655```bash theme={null}
2650#!/bin/bash2656#!/bin/bash
2663 TaskCompleted2669 TaskCompleted
2664</h3>2670</h3>
2665 2671
2666Wird 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)-Teammate seine Runde mit laufenden Aufgaben beendet. Verwenden Sie dies, um Abschluss-Kriterien wie bestandene Tests oder Lint-Checks durchzusetzen, bevor eine Aufgabe geschlossen werden kann.2672Wird ausgeführt, wenn eine Aufgabe als abgeschlossen markiert wird. Dies wird in zwei Situationen ausgeführt: wenn ein Agent eine Aufgabe explizit durch 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.
2667 2673
2668TaskCompleted-Hooks unterstützen keine Matcher und werden bei jedem Auftreten ausgelöst.2674TaskCompleted-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgeführt.
2669 2675
2670<h4 id="taskcompleted-input">2676<h4 id="taskcompleted-input">
2671 TaskCompleted-Eingabe2677 TaskCompleted-Eingabe
2672</h4>2678</h4>
2673 2679
2674Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten TaskCompleted-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.2680Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten TaskCompleted-Hooks `task_id`, `task_subject` und optional `task_description`, `teammate_name` und `team_name`.
2675 2681
2676```json theme={null}2682```json theme={null}
2677{2683{
2689```2695```
2690 2696
2691| Feld | Beschreibung |2697| Feld | Beschreibung |
2692| :----------------- | :------------------------------------------------------------------------------ |2698| :----------------- | :------------------------------------------------------------------------------------ |
2693| `task_id` | Kennung der abgeschlossenen Aufgabe |2699| `task_id` | Identifikator der zu abschließenden Aufgabe |
2694| `task_subject` | Titel der Aufgabe |2700| `task_subject` | Titel der Aufgabe |
2695| `task_description` | Detaillierte Beschreibung der Aufgabe. Kann fehlen |2701| `task_description` | Detaillierte Beschreibung der Aufgabe. Kann fehlen |
2696| `teammate_name` | Name des Teammates, das die Aufgabe abschließt. Kann fehlen |2702| `teammate_name` | Name des Teamkollegen, der die Aufgabe abschließt. Kann fehlen |
2697| `team_name` | Veraltet. Session-derived team name; wird in einer zukünftigen Version entfernt |2703| `team_name` | Veraltet. Sitzungs-abgeleiteter Team-Name; wird in einer zukünftigen Version entfernt |
2698 2704
2699<h4 id="taskcompleted-decision-control">2705<h4 id="taskcompleted-decision-control">
2700 TaskCompleted-Entscheidungskontrolle2706 TaskCompleted-Entscheidungskontrolle
2701</h4>2707</h4>
2702 2708
2703TaskCompleted-Hooks unterstützen zwei Wege zur Steuerung des Aufgabenabschlusses:2709TaskCompleted-Hooks unterstützen zwei Wege zur Steuerung des Aufgaben-Abschlusses:
2704 2710
2705* **Exit-Code 2**: Die Aufgabe wird nicht als abgeschlossen markiert und die stderr-Nachricht wird dem Modell als Feedback zurückgegeben.2711* **Exit-Code 2**: Die Aufgabe wird nicht als abgeschlossen markiert und die stderr-Nachricht wird an das Modell als Feedback zurückgesendet.
2706* **JSON `{"continue": false, "stopReason": "..."}`**: Wenn ein Teammate, das seine Runde beendet, das Ereignis ausgelöst hat, stoppt den Teammate 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.2712* **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.
2707 2713
2708Dieses Beispiel führt Tests aus und blockiert den Aufgabenabschluss, wenn sie fehlschlagen:2714Dieses Beispiel führt Tests aus und blockiert den Aufgaben-Abschluss, wenn sie fehlschlagen:
2709 2715
2710```bash theme={null}2716```bash theme={null}
2711#!/bin/bash2717#!/bin/bash
2712INPUT=$(cat)2718INPUT=$(cat)
2713TASK_SUBJECT=$(echo "$INPUT" | jq -r '.task_subject')2719TASK_SUBJECT=$(echo "$INPUT" | jq -r '.task_subject')
2714 2720
2715# Führen Sie die Test-Suite aus2721# Run the test suite
2716if ! npm test 2>&1; then2722if ! npm test 2>&1; then
2717 echo "Tests not passing. Fix failing tests before completing: $TASK_SUBJECT" >&22723 echo "Tests not passing. Fix failing tests before completing: $TASK_SUBJECT" >&2
2718 exit 22724 exit 2
2725 Stop2731 Stop
2726</h3>2732</h3>
2727 2733
2728Wird ausgeführt, wenn der Haupt-Claude Code-Agent fertig mit der Antwort ist. Wird nicht ausgeführt, wenn der Stopp durch eine Benutzerunterbrechung verursacht wurde. API-Fehler lösen stattdessen [StopFailure](#stopfailure) aus.2734Wird 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 führen stattdessen [StopFailure](#stopfailure) aus.
2729 2735
2730<Tip>2736<Tip>
2731 Der Befehl [`/goal`](/docs/de/goal) ist eine eingebaute Verknüpfung für einen sitzungsspezifischen Prompt-basierten Stop-Hook. Verwenden Sie ihn, wenn Sie möchten, dass Claude weiterarbeitet, bis eine Bedingung erfüllt ist, ohne Hook-Konfiguration zu schreiben.2737 Der [`/goal`](/docs/de/goal) Befehl ist eine integrierte Abkürzung 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.
2732</Tip>2738</Tip>
2733 2739
2734<h4 id="stop-input">2740<h4 id="stop-input">
2735 Stop-Eingabe2741 Stop-Eingabe
2736</h4>2742</h4>
2737 2743
2738Zusä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 als Ergebnis eines Stop-Hooks fortgesetzt wird. Überprüfen Sie diesen Wert oder verarbeiten Sie das Transkript, um zu verhindern, dass Claude Code unbegrenzt läuft. Claude Code überschreibt den Hook und beendet die Runde nach 8 aufeinanderfolgenden Blockierungen.2744Zusä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 nie auflösen wird. Claude Code überschreibt den Hook und beendet den Zug nach 8 aufeinanderfolgenden Blockierungen.
2739 2745
2740Das Feld `last_assistant_message` 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 die gerade abgeschlossene Runde reagieren, wie Read-Aloud- oder Benachrichtigungs-Hooks, verwenden Sie dieses Feld statt `transcript_path` zu lesen: Die Transkript-Datei ist nicht garantiert, die letzte Nachricht zur Stop-Zeit auf allen Versionen einzubeziehen.2746Das `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 dem gerade abgeschlossenen Zug handeln, wie Vorlesen oder Benachrichtigungs-Hooks, verwenden Sie dieses Feld statt `transcript_path` zu lesen: Die Transkript-Datei ist nicht garantiert, die letzte Nachricht bei Stop-Zeit auf allen Versionen einzuschließen.
2741 2747
2742Die Arrays `background_tasks` und `session_crons` ermöglichen es Hooks, zwischen „Sitzung ist fertig" und „Sitzung ist pausiert und wartet auf Hintergrundarbeit, um sie wieder zu aktivieren" zu unterscheiden. Beide Arrays sind vorhanden, wenn die Task-Registry erreichbar ist, und sind leer, wenn nichts läuft oder geplant ist.2748Die `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.
2743 2749
2744Jeder Eintrag in `background_tasks` beschreibt eine laufende Aufgabe und verwendet diese Felder:2750Jeder Eintrag in `background_tasks` beschreibt eine laufende Aufgabe und verwendet diese Felder:
2745 2751
2746| Feld | Beschreibung |2752| Feld | Beschreibung |
2747| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2753| :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2748| `id` | Task-Kennung |2754| `id` | Aufgaben-Identifikator |
2749| `type` | Freundliche Task-Typ-Bezeichnung wie `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` oder `MCP task`. Jede Bezeichnung identifiziert, welche Claude Code-Funktion die Aufgabe erstellt hat. Fällt auf den rohen Diskriminanten für unbekannte Typen zurück |2755| `type` | Freundliche Aufgaben-Typ-Beschriftung wie `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` oder `MCP task`. Jede Beschriftung identifiziert, welche Claude Code Funktion die Aufgabe erstellt hat. Fällt auf den rohen Diskriminanten für unbekannte Typen zurück |
2750| `status` | Aktueller Task-Status |2756| `status` | Aktueller Aufgaben-Status |
2751| `description` | Freier Text, begrenzt auf 1000 Zeichen mit einem In-String-Marker `… [+N chars]`, wenn gekürzt |2757| `description` | Freitext-Beschreibung, begrenzt auf 1000 Zeichen mit einem In-String `… [+N chars]` Marker, wenn gekürzt |
2752| `command` | Shell-Befehlszeile, begrenzt auf 1000 Zeichen. Nur für `shell`-Aufgaben vorhanden |2758| `command` | Shell-Befehlszeile, begrenzt auf 1000 Zeichen. Nur für `shell` Aufgaben vorhanden |
2753| `agent_type` | Subagent-Typname. Nur für `subagent`-Aufgaben vorhanden |2759| `agent_type` | Subagenten-Typ-Name. Nur für `subagent` Aufgaben vorhanden |
2754| `server` | MCP-Server-Name. Nur für `monitor`- und `MCP task`-Aufgaben vorhanden |2760| `server` | MCP-Server-Name. Nur für `monitor` und `MCP task` Aufgaben vorhanden |
2755| `tool` | MCP-Tool-Name. Nur für `monitor`- und `MCP task`-Aufgaben vorhanden |2761| `tool` | MCP-Tool-Name. Nur für `monitor` und `MCP task` Aufgaben vorhanden |
2756| `name` | Workflow-Name. Nur für `workflow`-Aufgaben vorhanden |2762| `name` | Workflow-Name. Nur für `workflow` Aufgaben vorhanden |
2757 2763
2758Jeder Eintrag in `session_crons` beschreibt einen sitzungsspezifischen geplanten Wakeup, stammt von `CronCreate`, `ScheduleWakeup` und `/loop`:2764Jeder Eintrag in `session_crons` beschreibt einen Sitzungs-scoped geplanten Aufweck, stammt von `CronCreate`, `ScheduleWakeup` und `/loop`:
2759 2765
2760| Feld | Beschreibung |2766| Feld | Beschreibung |
2761| :---------- | :------------------------------------------------------------------------------------------------------------------------------------ |2767| :---------- | :--------------------------------------------------------------------------------------------------------------------------------------- |
2762| `id` | Cron-Task-Kennung |2768| `id` | Cron-Aufgaben-Identifikator |
2763| `schedule` | Cron-Ausdruck, zum Beispiel `0 9 * * 1-5` |2769| `schedule` | Cron-Ausdruck, z. B. `0 9 * * 1-5` |
2764| `recurring` | `false` für einmalige Wakeups, deren Schedule eine einzelne Feuerzeit kodiert, `true` für Aufgaben, die bei jedem Match erneut feuern |2770| `recurring` | `false` für einmalige Aufwecke, deren Zeitplan eine einzelne Feuerzeit kodiert, `true` für Aufgaben, die bei jedem Treffer erneut feuern |
2765| `prompt` | Prompt, der eingereicht wird, wenn der Cron feuert, begrenzt auf 1000 Zeichen mit dem gleichen `… [+N chars]`-Marker |2771| `prompt` | Eingabeaufforderung, die eingereicht wird, wenn der Cron feuert, begrenzt auf 1000 Zeichen mit dem gleichen `… [+N chars]` Marker |
2766 2772
2767Dieses Beispiel zeigt eine Stop-Eingabe mit einer laufenden Shell-Aufgabe und einem wiederkehrenden Cron:2773Dieses Beispiel zeigt eine Stop-Eingabe mit einer laufenden Shell-Aufgabe und einem wiederkehrenden Cron:
2768 2774
2799 Stop-Entscheidungskontrolle2805 Stop-Entscheidungskontrolle
2800</h4>2806</h4>
2801 2807
2802`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:2808`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:
2803 2809
2804| Feld | Beschreibung |2810| Feld | Beschreibung |
2805| :------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2811| :------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2806| `decision` | `"block"` verhindert, dass Claude stoppt. Weglassen, um Claude zu stoppen |2812| `decision` | `"block"` verhindert, dass Claude stoppt. Weglassen, um Claude zu stoppen |
2807| `reason` | Erforderlich, wenn `decision` `"block"` ist. Teilt Claude mit, warum es fortgesetzt werden sollte |2813| `reason` | Erforderlich, wenn `decision` `"block"` ist. Sagt Claude, warum es fortgesetzt werden sollte |
2808| `hookSpecificOutput.additionalContext` | Nicht-Fehler-Feedback für Claude. Das Gespräch wird fortgesetzt, damit Claude darauf reagieren kann, aber im Gegensatz zu `decision: "block"` wird es im Transkript als Hook-Feedback statt als Hook-Fehler angezeigt |2814| `hookSpecificOutput.additionalContext` | Fehler-freies Feedback für Claude. Das Gespräch wird fortgesetzt, damit Claude darauf handeln kann, aber im Gegensatz zu `decision: "block"` wird es im Transkript als Hook-Feedback statt als Hook-Fehler angezeigt |
2809 2815
2810Ein Hook, der durch Beenden mit 2 blockiert, wird auf die gleiche Weise wie `reason` weitergeleitet: Claude erhält die stderr-Nachricht als Erklärung, warum es fortgesetzt werden sollte.2816Ein Hook, der durch Beendigung mit 2 blockiert, wird auf die gleiche Weise wie `reason` weitergeleitet: Claude empfängt die stderr-Nachricht als Erklärung, warum es fortgesetzt werden sollte.
2811 2817
2812```json theme={null}2818```json theme={null}
2813{2819{
2816}2822}
2817```2823```
2818 2824
2819Verwenden 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 das Gespräch durch die gleichen Schleifenschutzmechanismen wie `decision: "block"` am Laufen, nämlich die `stop_hook_active`-Eingabe und die 8-aufeinanderfolgende-Fortsetzungs-Obergrenze, aber das Transkript kennzeichnet es als `Stop hook feedback` und es wird keine Hook-Fehler-Benachrichtigung angezeigt:2825Verwenden Sie `additionalContext`, wenn der Hook wie beabsichtigt funktioniert und Claude Anleitung gibt, wie "führe die Test-Suite vor dem Beenden aus". Es hält das Gespräch durch die gleichen Loop-Schutzmaßnahmen wie `decision: "block"` am Laufen, nämlich die `stop_hook_active` Eingabe und die 8-aufeinanderfolgende-Fortsetzungs-Kappe, aber das Transkript kennzeichnet es als `Stop hook feedback` und es wird keine Hook-Fehler-Benachrichtigung angezeigt:
2820 2826
2821```json theme={null}2827```json theme={null}
2822{2828{
2831 StopFailure2837 StopFailure
2832</h3>2838</h3>
2833 2839
2834Wird stattdessen von [Stop](#stop) ausgeführt, wenn die Runde aufgrund eines API-Fehlers endet. Claude Code ignoriert die Ausgabe und den Exit-Code des Hooks, außer [`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.2840Wird statt [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.
2835 2841
2836<h4 id="stopfailure-input">2842<h4 id="stopfailure-input">
2837 StopFailure-Eingabe2843 StopFailure-Eingabe
2838</h4>2844</h4>
2839 2845
2840Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten StopFailure-Hooks `error`, optionales `error_details` und optionales `last_assistant_message`. Das Feld `error` identifiziert den Fehlertyp und wird zum Filtern von Matchern verwendet.2846Zusä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.
2841 2847
2842| Feld | Beschreibung |2848| Feld | Beschreibung |
2843| :----------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2849| :----------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
2844| `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` |2850| `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` |
2845| `error_details` | Zusätzliche Details zum Fehler, falls verfügbar |2851| `error_details` | Zusätzliche Details zum Fehler, wenn verfügbar |
2846| `last_assistant_message` | Der gerenderte Fehlertext, der in der Konversation angezeigt wird. Im Gegensatz zu `Stop` und `SubagentStop`, wo dieses Feld Claudes Gesprächsausgabe enthält, enthält es für `StopFailure` die API-Fehlerzeichenkette selbst, wie `"API Error: Rate limit reached"` |2852| `last_assistant_message` | Der gerenderte Fehlertext, der im Gespräch angezeigt wird. Im Gegensatz zu `Stop` und `SubagentStop`, wo dieses Feld Claudes Gesprächsausgabe enthält, enthält es für `StopFailure` die API-Fehler-Zeichenkette selbst, wie `"API Error: Rate limit reached"` |
2847 2853
2848```json theme={null}2854```json theme={null}
2849{2855{
2863 TeammateIdle2869 TeammateIdle
2864</h3>2870</h3>
2865 2871
2866Wird ausgeführt, wenn ein [Agent-Team](/docs/de/agent-teams)-Teammate nach Abschluss seiner Runde untätig werden soll. Verwenden Sie dies, um Qualitätsgates vor dem Stoppen eines Teammates durchzusetzen, wie das Erfordern von bestandenen Lint-Checks oder das Überprüfen, dass Ausgabedateien vorhanden sind.2872Wird ausgeführt, wenn ein [Agent-Team](/docs/de/agent-teams) Teamkollege nach Abschluss seines Zugs untätig wird. 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.
2867 2873
2868TeammateIdle-Hooks unterstützen keine Matcher und werden bei jedem Auftreten ausgelöst.2874TeammateIdle-Hooks unterstützen keine Matcher und werden bei jedem Vorkommen ausgeführt.
2869 2875
2870<h4 id="teammateidle-input">2876<h4 id="teammateidle-input">
2871 TeammateIdle-Eingabe2877 TeammateIdle-Eingabe
2872</h4>2878</h4>
2873 2879
2874Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten TeammateIdle-Hooks `teammate_name` und `team_name`.2880Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten TeammateIdle-Hooks `teammate_name` und `team_name`.
2875 2881
2876```json theme={null}2882```json theme={null}
2877{2883{
2886```2892```
2887 2893
2888| Feld | Beschreibung |2894| Feld | Beschreibung |
2889| :-------------- | :------------------------------------------------------------------------------ |2895| :-------------- | :------------------------------------------------------------------------------------ |
2890| `teammate_name` | Name des Teammates, das untätig werden soll |2896| `teammate_name` | Name des Teamkollegen, der untätig wird |
2891| `team_name` | Veraltet. Session-derived team name; wird in einer zukünftigen Version entfernt |2897| `team_name` | Veraltet. Sitzungs-abgeleiteter Team-Name; wird in einer zukünftigen Version entfernt |
2892 2898
2893<h4 id="teammateidle-decision-control">2899<h4 id="teammateidle-decision-control">
2894 TeammateIdle-Entscheidungskontrolle2900 TeammateIdle-Entscheidungskontrolle
2895</h4>2901</h4>
2896 2902
2897TeammateIdle-Hooks unterstützen zwei Wege zur Steuerung des Teammate-Verhaltens:2903TeammateIdle-Hooks unterstützen zwei Wege zur Steuerung des Teamkollegen-Verhaltens:
2898 2904
2899* **Exit-Code 2**: Der Teammate erhält die stderr-Nachricht als Feedback und arbeitet weiter, anstatt untätig zu werden.2905* **Exit-Code 2**: Der Teamkollege empfängt die stderr-Nachricht als Feedback und arbeitet weiter, anstatt untätig zu werden.
2900* **JSON `{"continue": false, "stopReason": "..."}`**: Stoppt den Teammate vollständig, was dem `Stop`-Hook-Verhalten entspricht. Der `stopReason` wird dem Benutzer angezeigt.2906* **JSON `{"continue": false, "stopReason": "..."}`**: Stoppt den Teamkollegen vollständig, was dem `Stop` Hook-Verhalten entspricht. Der `stopReason` wird dem Benutzer angezeigt.
2901 2907
2902Dieses Beispiel prüft, dass ein Build-Artefakt vorhanden ist, bevor ein Teammate untätig werden darf:2908Dieses Beispiel überprüft, dass ein Build-Artefakt existiert, bevor ein Teamkollege untätig wird:
2903 2909
2904```bash theme={null}2910```bash theme={null}
2905#!/bin/bash2911#!/bin/bash
2916 ConfigChange2922 ConfigChange
2917</h3>2923</h3>
2918 2924
2919Wird ausgeführt, wenn sich eine Konfigurationsdatei während einer Sitzung ändert. Verwenden Sie dies, um Einstellungsänderungen zu überprüfen, Sicherheitsrichtlinien durchzusetzen oder nicht autorisierte Änderungen an Konfigurationsdateien zu blockieren.2925Wird ausgeführt, wenn sich eine Konfigurationsdatei während einer Sitzung ändert. Verwenden Sie dies, um Einstellungs-Änderungen zu überprüfen, Sicherheitsrichtlinien durchzusetzen oder nicht autorisierte Änderungen an Konfigurationsdateien zu blockieren.
2920 2926
2921Claude Code führt ConfigChange-Hooks aus, wenn sich eine Einstellungsdatei, eine verwaltete Richtlinieneinstellung oder eine Skill-Datei ändert. Für verwaltete Richtlinien wird es nur ausgelöst, wenn `managed-settings.json` oder eine Datei in `managed-settings.d/` sich ändert. Es wendet [Server-verwaltete Einstellungen](/docs/de/server-managed-settings) und Änderungen an macOS-verwalteten Einstellungen oder Windows-Registrierungs-Richtlinien an, ohne sie auszuführen. Auf WSL mit [`wslInheritsWindowsSettings`](/docs/de/settings-reference#wslinheritswindowssettings) wendet es auch eine geänderte Windows-seitige verwaltete Einstellungsdatei bei seiner Richtlinien-Abfrage an, ohne sie auszuführen.2927Claude Code führt ConfigChange-Hooks aus, wenn sich eine Einstellungsdatei, eine verwaltete Richtlinien-Datei oder eine Skill-Datei ändert. Für verwaltete Richtlinien wird es nur ausgeführt, wenn `managed-settings.json` oder eine Datei in `managed-settings.d/` sich ä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.
2922 2928
2923Der Matcher filtert auf die Konfigurationsquelle:2929Der Matcher filtert auf die Konfigurationsquelle:
2924 2930
2925| Matcher | Wann es ausgelöst wird |2931| Matcher | Wann wird es ausgelöst |
2926| :----------------- | :--------------------------------------------------------------------------- |2932| :----------------- | :--------------------------------------------------------------------------- |
2927| `user_settings` | `~/.claude/settings.json` ändert sich |2933| `user_settings` | `~/.claude/settings.json` ändert sich |
2928| `project_settings` | `.claude/settings.json` ändert sich |2934| `project_settings` | `.claude/settings.json` ändert sich |
2930| `policy_settings` | `managed-settings.json` oder eine Datei in `managed-settings.d/` ändert sich |2936| `policy_settings` | `managed-settings.json` oder eine Datei in `managed-settings.d/` ändert sich |
2931| `skills` | Eine Skill-Datei in `.claude/skills/` ändert sich |2937| `skills` | Eine Skill-Datei in `.claude/skills/` ändert sich |
2932 2938
2933Dieses Beispiel protokolliert alle Konfigurationsänderungen für Sicherheitsaudits:2939Dieses Beispiel protokolliert alle Konfigurationsänderungen für Sicherheits-Audits:
2934 2940
2935```json theme={null}2941```json theme={null}
2936{2942{
2954 ConfigChange-Eingabe2960 ConfigChange-Eingabe
2955</h4>2961</h4>
2956 2962
2957Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten ConfigChange-Hooks `source` und optional `file_path`. Das Feld `source` gibt an, welche Konfigurationsart sich geändert hat, und `file_path` gibt den Pfad zur spezifischen Datei an, die geändert wurde.2963Zusä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.
2958 2964
2959```json theme={null}2965```json theme={null}
2960{2966{
2971 ConfigChange-Entscheidungskontrolle2977 ConfigChange-Entscheidungskontrolle
2972</h4>2978</h4>
2973 2979
2974ConfigChange-Hooks können Konfigurationsänderungen von der Anwendung blockieren. 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.2980ConfigChange-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.
2975 2981
2976| Feld | Beschreibung |2982| Feld | Beschreibung |
2977| :--------- | :--------------------------------------------------------------------------------------------------- |2983| :--------- | :------------------------------------------------------------------------------------------------------------ |
2978| `decision` | `"block"` verhindert die Anwendung der Konfigurationsänderung. Weglassen, um die Änderung zuzulassen |2984| `decision` | `"block"` verhindert, dass die Konfigurationsänderung angewendet wird. Weglassen, um die Änderung zu erlauben |
2979| `reason` | Erklärung, die dem Benutzer angezeigt wird, wenn `decision` `"block"` ist |2985| `reason` | Akzeptiert, aber nie angezeigt |
2980 2986
2981```json theme={null}2987```json theme={null}
2982{2988{
2985}2991}
2986```2992```
2987 2993
2988`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 für Audit-Protokollierung verwenden, aber jede Blockierungsentscheidung wird ignoriert. Dies stellt sicher, dass von Unternehmen 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.2994`policy_settings` Änderungen können nicht blockiert werden. Hooks werden immer noch für `policy_settings` Quellen ausgeführt, 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.
2989 2995
2990Claude Code handelt auf die Blockierungsentscheidung 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 Beendigung mit 2 blockieren. Claude Code schreibt nur eine Zeile in das Debug-Protokoll.2996Claude Code handelt 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 Beendigung mit 2 blockieren. Claude Code schreibt nur eine Zeile in das Debug-Protokoll.
2991 2997
2992<h3 id="cwdchanged">2998<h3 id="cwdchanged">
2993 CwdChanged2999 CwdChanged
2994</h3>3000</h3>
2995 3001
2996Wird ausgeführt, wenn ein Shell-Befehl in der Hauptkonversation das Arbeitsverzeichnis ändert, zum Beispiel wenn Claude einen `cd`-Befehl ausführt. Verwenden Sie dies, um auf Verzeichniswechsel zu reagieren: Laden Sie Umgebungsvariablen neu, aktivieren Sie projektspezifische Toolchains oder führen Sie Setup-Skripte automatisch aus. Paare mit [FileChanged](#filechanged) für Tools wie [direnv](https://direnv.net/), die verzeichnisspezifische Umgebungen verwalten.3002Wird 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 Verzeichniswechsel zu reagieren: Umgebungsvariablen neu laden, projektspezifische 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.
2997 3003
2998CwdChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variablen, die in diese Datei geschrieben werden, bleiben in nachfolgenden Bash-Befehlen bis zum nächsten CwdChanged-Ereignis erhalten, wenn Claude Code sie löscht.3004CwdChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variablen, die in diese Datei geschrieben werden, bleiben in nachfolgenden Bash-Befehlen bestehen, bis zum nächsten CwdChanged-Ereignis, wenn Claude Code sie löscht.
2999 3005
3000CwdChanged unterstützt keine Matcher und wird bei jedem Auftreten ausgelöst.3006CwdChanged unterstützt keine Matcher und wird bei jedem Vorkommen ausgeführt.
3001 3007
3002<h4 id="cwdchanged-input">3008<h4 id="cwdchanged-input">
3003 CwdChanged-Eingabe3009 CwdChanged-Eingabe
3004</h4>3010</h4>
3005 3011
3006Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten CwdChanged-Hooks `old_cwd` und `new_cwd`.3012Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten CwdChanged-Hooks `old_cwd` und `new_cwd`.
3007 3013
3008```json theme={null}3014```json theme={null}
3009{3015{
3023Zusä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:3029Zusä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:
3024 3030
3025| Feld | Beschreibung |3031| Feld | Beschreibung |
3026| :----------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3032| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
3027| `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 Sie ein neues Verzeichnis betreten |3033| `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 |
3028 3034
3029CwdChanged-Hooks haben keine Entscheidungskontrolle. Sie können den Verzeichniswechsel nicht blockieren.3035CwdChanged-Hooks haben keine Entscheidungskontrolle. Sie können den Verzeichniswechsel nicht blockieren.
3030 3036
3034 DirectoryAdded3040 DirectoryAdded
3035</h3>3041</h3>
3036 3042
3037Wird 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`-Steueranfrage hinzufügt. Verwenden Sie dies, um ein neu hinzugefügtes Repository vorzubereiten, zum Beispiel durch Installation seiner Abhängigkeiten.3043Wird 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.
3038 3044
3039Claude Code führt dieses Ereignis nicht aus, wenn:3045Claude Code führt dieses Ereignis nicht aus, wenn:
3040 3046
3041* Sie ein Verzeichnis mit dem `--add-dir`-Startup-Flag übergeben; [SessionStart](#sessionstart) deckt diese Verzeichnisse ab3047* Sie ein Verzeichnis mit dem `--add-dir` Start-Flag übergeben; [SessionStart](#sessionstart) deckt diese Verzeichnisse ab
3042* Sie ein Verzeichnis auf der `/permissions`-Workspace-Registerkarte hinzufügen3048* Sie ein Verzeichnis auf der `/permissions` Workspace-Registerkarte hinzufügen
3043* Sie ein Verzeichnis hinzufügen, das bereits ein Arbeitsverzeichnis ist oder sich in einem befindet3049* Sie ein Verzeichnis hinzufügen, das bereits ein Arbeitsverzeichnis ist oder in einem liegt
3044 3050
3045Claude Code führt DirectoryAdded aus, nachdem die Sandbox- und Berechtigungsstatus aktualisiert wurden, daher sehen Sandbox-Tools das neue Verzeichnis bereits, wenn Ihr Hook läuft. Hook-Befehle selbst laufen unsandboxed.3051Claude Code führt DirectoryAdded aus, nachdem Sandbox- und Berechtigungsstatus aktualisiert wurden, daher sehen Sandbox-Tools das neue Verzeichnis bereits, wenn Ihr Hook ausgeführt wird. Hook-Befehle selbst werden unsandboxed ausgeführt.
3046 3052
3047Claude Code wartet nicht auf den Hook: Das Hinzufügen wird sofort abgeschlossen und der Hook läuft im Hintergrund mit dem 600-Sekunden-Standard-Timeout.3053Claude 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.
3048 3054
3049Der Matcher filtert auf wie das Verzeichnis hinzugefügt wurde:3055Der Matcher filtert, wie das Verzeichnis hinzugefügt wurde:
3050 3056
3051| Matcher | Wann es ausgelöst wird |3057| Matcher | Wann wird es ausgelöst |
3052| :------------------- | :----------------------------------------------------------------------------------- |3058| :------------------- | :-------------------------------------------------------------------------------------- |
3053| `slash_command` | Sie fügen ein Verzeichnis mit `/add-dir` hinzu |3059| `slash_command` | Sie fügen ein Verzeichnis mit `/add-dir` hinzu |
3054| `register_repo_root` | Ein SDK-Client fügt ein Verzeichnis mit der `register_repo_root`-Steueranfrage hinzu |3060| `register_repo_root` | Ein SDK-Client fügt ein Verzeichnis mit der `register_repo_root` Kontroll-Anfrage hinzu |
3055 3061
3056<h4 id="directoryadded-input">3062<h4 id="directoryadded-input">
3057 DirectoryAdded-Eingabe3063 DirectoryAdded-Eingabe
3058</h4>3064</h4>
3059 3065
3060Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten DirectoryAdded-Hooks `directory` und `source`.3066Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten DirectoryAdded-Hooks `directory` und `source`.
3061 3067
3062| Feld | Beschreibung |3068| Feld | Beschreibung |
3063| :---------- | :---------------------------------------------------------------------------------------------------------------------------- |3069| :---------- | :------------------------------------------------------------------------------------------------------------------------------- |
3064| `directory` | Absoluter Pfad des Verzeichnisses, das hinzugefügt wurde |3070| `directory` | Absoluter Pfad des hinzugefügten Verzeichnisses |
3065| `source` | Wie das Verzeichnis hinzugefügt wurde, `"slash_command"` für `/add-dir` oder `"register_repo_root"` für die SDK-Steueranfrage |3071| `source` | Wie das Verzeichnis hinzugefügt wurde, `"slash_command"` für `/add-dir` oder `"register_repo_root"` für die SDK-Kontroll-Anfrage |
3066 3072
3067```json theme={null}3073```json theme={null}
3068{3074{
3075}3081}
3076```3082```
3077 3083
3078DirectoryAdded-Hooks haben keine Entscheidungskontrolle. Sie können das Hinzufügen nicht blockieren, das bereits abgeschlossen ist, wenn der Hook läuft. Claude Code verwirft das `continue`-Feld aus ihrer JSON-Ausgabe und zeigt den Rest je nach Quelle unterschiedlich an:3084DirectoryAdded-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:
3079 3085
3080* `slash_command`: Claude Code liefert die `systemMessage` des Hooks an Claude als Kontext bei der nächsten Konversationsrunde, statt sie Ihnen zu zeigen. Eine Anzahl fehlgeschlagener Hooks erscheint im Transkript. Vollständige Fehlerausgabe geht in das Debug-Protokoll3086* `slash_command`: Claude Code liefert den `systemMessage` des Hooks an Claude als Kontext beim nächsten Gesprächszug, anstatt ihn Ihnen zu zeigen. Eine Anzahl fehlgeschlagener Hooks erscheint im Transkript. Vollständige Fehlerausgabe geht zum Debug-Protokoll
3081* `register_repo_root`: Claude Code schreibt `systemMessage`-Ausgabe und Fehlerausgabe nur in das Debug-Protokoll3087* `register_repo_root`: Claude Code schreibt `systemMessage` Ausgabe und Fehlerausgabe nur zum Debug-Protokoll
3082 3088
3083<h3 id="filechanged">3089<h3 id="filechanged">
3084 FileChanged3090 FileChanged
3085</h3>3091</h3>
3086 3092
3087Wird ausgeführt, wenn sich eine überwachte Datei auf der Festplatte ändert. Claude Code erkennt Änderungen mit einem Dateisystem-Watcher, nicht durch Inspizieren von Tool-Aufrufen, daher wird der Hook ausgelöst, 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.3093Wird 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 unabhängig davon ausgeführt, 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.
3088 3094
3089Das Feld `matcher` für dieses Ereignis dient zwei Rollen:3095Der `matcher` für dieses Ereignis dient zwei Rollen:
3090 3096
3091* **Erstellen Sie die Überwachungsliste**: Der Wert wird auf `|` aufgeteilt und jedes Segment wird als 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 überwachen, die buchstäblich `^\.env` heißt.3097* **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.
3092* **Filtern Sie, welche Hooks ausgeführt werden**: Wenn sich eine überwachte Datei ändert, wird der gleiche Wert verwendet, um zu filtern, welche Hook-Gruppen ausgeführt werden, wobei die Standard-[Matcher-Regeln](#matcher-patterns) gegen den Basename der geänderten Datei verwendet werden.3098* **Filtere, welche Hooks ausgeführt werden**: Wenn sich eine überwachte Datei ändert, wird der gleiche Wert verwendet, um zu filtern, welche Hook-Gruppen mit den Standard-[Matcher-Regeln](#matcher-patterns) gegen den Dateinamen der geänderten Datei ausgeführt werden.
3093 3099
3094Dieses Beispiel normalisiert Zeilenumbrüche in `data.csv` nach jeder Änderung, einschließlich eines `Bash`-Befehls oder eines externen Skripts, das die Datei umschreibt:3100Dieses Beispiel normalisiert Zeilenumbrüche in `data.csv` nach jeder Änderung, einschließlich eines `Bash` Befehls oder eines externen Skripts, das die Datei umschreibt:
3095 3101
3096```json theme={null}3102```json theme={null}
3097{3103{
3111}3117}
3112```3118```
3113 3119
3114Der Hook liest den Pfad der geänderten Datei aus dem Feld `file_path` der [JSON-Eingabe](#filechanged-input) auf stdin. Sein `grep`-Guard testet auf das gleiche, das `perl` entfernt, einen CR am Ende einer Zeile, daher beendet der Lauf nach einer Normalisierung, ohne die Datei zu berühren. Ein lockerer Guard schleift für immer, weil `perl -i` die Datei umschreibt, auch wenn es nichts ersetzt, und Claude Code führt den Hook nach jedem Umschreiben erneut aus. Speichern Sie dieses Skript unter `/path/to/normalize-line-endings.sh` und machen Sie es ausführbar:3120Der Hook liest den geänderten Dateipfad aus dem `file_path` Feld der [JSON-Eingabe](#filechanged-input) von stdin. Seine `grep` Wache testet auf das gleiche, das `perl` entfernt, einen CR am Ende einer Zeile, daher wird der Lauf nach einer Normalisierung beendet, ohne die Datei zu berühren. Eine lockere 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:
3115 3121
3116```bash theme={null}3122```bash theme={null}
3117#!/bin/bash3123#!/bin/bash
3121fi3127fi
3122```3128```
3123 3129
3124Um zu bestätigen, dass der Hook funktioniert, bitten Sie Claude, eine CRLF-Zeile zu `data.csv` mit einem `Bash`-Befehl anzuhängen. Claude Code führt den Hook aus und die Datei endet mit LF-Umbrüchen.3130Um zu bestätigen, dass der Hook funktioniert, bitten Sie Claude, eine CRLF-Zeile mit einem `Bash` Befehl zu `data.csv` anzuhängen. Claude Code führt den Hook aus und die Datei endet mit LF-Umbrüchen.
3125 3131
3126Um 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 ausgelöst werden, wenn sich eine überwachte Datei ändert, daher geben Sie der Gruppe, die dynamische Pfade handhabt, einen weggelassenen Matcher, der jede überwachte Datei passt und nichts zur Überwachungsliste hinzufügt. Ein `"*"`-Matcher passt auch auf jede Datei, aber Claude Code registriert ihn in der Überwachungsliste wie jeden anderen Wert, als eine Datei, die buchstäblich `*` heißt.3132Um 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 `*`.
3127 3133
3128FileChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variablen, die in diese Datei geschrieben werden, bleiben in nachfolgenden Bash-Befehlen bis zum nächsten [CwdChanged](#cwdchanged)-Ereignis erhalten, wenn Claude Code sie löscht.3134FileChanged-Hooks haben Zugriff auf [`CLAUDE_ENV_FILE`](#persist-environment-variables). Variablen, die in diese Datei geschrieben werden, bleiben in nachfolgenden Bash-Befehlen bestehen, bis zum nächsten [CwdChanged](#cwdchanged) Ereignis, wenn Claude Code sie löscht.
3129 3135
3130<h4 id="filechanged-input">3136<h4 id="filechanged-input">
3131 FileChanged-Eingabe3137 FileChanged-Eingabe
3132</h4>3138</h4>
3133 3139
3134Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten FileChanged-Hooks `file_path` und `event`.3140Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten FileChanged-Hooks `file_path` und `event`.
3135 3141
3136| Feld | Beschreibung |3142| Feld | Beschreibung |
3137| :---------- | :------------------------------------------------------------------------------------------------------------------------------- |3143| :---------- | :------------------------------------------------------------------------------------------------------------------------------- |
3157 3163
3158| Feld | Beschreibung |3164| Feld | Beschreibung |
3159| :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3165| :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3160| `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 |3166| `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 |
3161 3167
3162FileChanged-Hooks haben keine Entscheidungskontrolle. Sie können die Dateiänderung nicht blockieren.3168FileChanged-Hooks haben keine Entscheidungskontrolle. Sie können die Dateiänderung nicht blockieren.
3163 3169
3167 WorktreeCreate3173 WorktreeCreate
3168</h3>3174</h3>
3169 3175
3170Wird ausgeführt, wenn ein Worktree erstellt wird, entweder von `claude --worktree`, von einem [Subagent 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 ihrem eigenen Worktree isoliert. Standardmäßig erstellt Claude Code die isolierte Arbeitskopie mit `git worktree`. Wenn Sie einen WorktreeCreate-Hook konfigurieren, ersetzt er das Standard-Git-Verhalten und ermöglicht es Ihnen, ein anderes Versionskontrollsystem wie SVN, Perforce oder Mercurial zu verwenden.3176Wird 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 ihrem eigenen Worktree isoliert. Standardmäßig erstellt Claude Code die isolierte Arbeitskopie mit `git worktree`. Das Konfigurieren eines WorktreeCreate-Hooks ersetzt dieses Standard-Git-Verhalten, sodass Sie ein anderes Versionskontrollsystem wie SVN, Perforce oder Mercurial verwenden können.
3171 3177
3172Da 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.3178Da 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.
3173 3179
3174Der 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.3180Der 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), wie jeder Hook-Typ den Pfad zurückgibt.
3175 3181
3176Claude Code handelt auf den Erfolg des Hooks und den zurückgegebenen Pfad und verwirft `systemMessage` und `continue`.3182Claude Code handelt den Erfolg des Hooks und den zurückgegebenen Pfad und verwirft `systemMessage` und `continue`.
3177 3183
3178Dieses Beispiel erstellt eine SVN-Arbeitskopie und gibt den Pfad aus, damit Claude Code ihn verwenden kann. Ersetzen Sie die Repository-URL durch Ihre eigene:3184Dieses Beispiel erstellt eine SVN-Arbeitskopie und druckt den Pfad für Claude Code zur Verwendung. Ersetzen Sie die Repository-URL durch Ihre eigene:
3179 3185
3180```json theme={null}3186```json theme={null}
3181{3187{
3194}3200}
3195```3201```
3196 3202
3197Der Hook liest den Worktree-`name` aus der JSON-Eingabe auf stdin, checkt eine frische Kopie in ein neues Verzeichnis aus und gibt den Verzeichnispath aus. Das `echo` in 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.3203Der Hook liest den Worktree `name` aus der JSON-Eingabe von stdin, checkt eine frische Kopie in ein neues Verzeichnis aus und druckt den Verzeichnispath. 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.
3198 3204
3199<h4 id="worktreecreate-input">3205<h4 id="worktreecreate-input">
3200 WorktreeCreate-Eingabe3206 WorktreeCreate-Eingabe
3201</h4>3207</h4>
3202 3208
3203Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten WorktreeCreate-Hooks das Feld `name`. Dies ist eine Slug-Kennung für den neuen Worktree, entweder vom Benutzer angegeben oder automatisch generiert, zum Beispiel `bold-oak-a3f2`.3209Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten WorktreeCreate-Hooks das `name` Feld. Dies ist ein Slug-Identifikator für den neuen Worktree, entweder vom Benutzer angegeben oder automatisch generiert, z. B. `bold-oak-a3f2`.
3204 3210
3205```json theme={null}3211```json theme={null}
3206{3212{
3216 WorktreeCreate-Ausgabe3222 WorktreeCreate-Ausgabe
3217</h4>3223</h4>
3218 3224
3219WorktreeCreate-Hooks verwenden nicht das Standard-Allow/Block-Entscheidungsmodell. Stattdessen bestimmt der Erfolg oder Misserfolg des Hooks das Ergebnis. Der Hook muss den absoluten Pfad zum erstellten Worktree-Verzeichnis zurückgeben:3225WorktreeCreate-Hooks verwenden nicht das Standard-Erlauben/Blockieren-Entscheidungsmodell. Stattdessen bestimmt der Erfolg oder Fehler des Hooks das Ergebnis. Der Hook muss den Pfad zum erstellten Worktree-Verzeichnis zurückgeben:
3220 3226
3221* **Command-Hooks** (`type: "command"`): geben den Pfad auf stdout aus. Claude Code entfernt ANSI-Escape-Codes, bevor diese Zeile gelesen wird, daher werden Shell-Startup-Banner, die vor Ihrem `echo` gedruckt werden, ignoriert. Leiten Sie jede andere Hook-Ausgabe zu stderr um.3227* **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.
3222* **HTTP-Hooks** (`type: "http"`): geben `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` im Response-Body zurück.3228* **HTTP-Hooks** (`type: "http"`): Geben Sie `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` im Antwort-Body zurück.
3223 3229
3224Wenn der Hook fehlschlägt oder keinen Pfad erzeugt, schlägt die Worktree-Erstellung mit einem Fehler fehl.3230Wenn der Hook fehlschlägt oder keinen Pfad erzeugt, schlägt die Worktree-Erstellung mit einem Fehler fehl.
3225 3231
3226Claude Code löst einen relativen Pfad gegen das Verzeichnis auf, in dem der Hook ausgeführt wurde, und bricht alle `.` oder `..`-Segmente 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.3232Claude Code löst einen relativen Pfad gegen das Verzeichnis auf, in dem der Hook lief, 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.
3227 3233
3228Claude Code verweigert einen absoluten Pfad, der `.` oder `..`-Segmente enthält, und jeden Pfad, der durch einen Symlink unterhalb der Repository-Root geht, da ein Symlink, der zum 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 innerhalb des Repository geht. Vor v2.1.216 folgte die Worktree-Erstellung dem Hook-Pfad ohne dieses Screening.3234Claude Code lehnt einen absoluten Pfad ab, der `.` oder `..` Segmente enthält, und jeden Pfad, der durch einen Symlink unterhalb der Repository-Root geht, da ein Symlink, der zum 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.
3229 3235
3230<h3 id="worktreeremove">3236<h3 id="worktreeremove">
3231 WorktreeRemove3237 WorktreeRemove
3232</h3>3238</h3>
3233 3239
3234Wird ausgeführt, wenn ein Worktree entfernt wird. Dies ist das Bereinigungspendant zu [WorktreeCreate](#worktreecreate). Das Ereignis wird ausgelöst, wenn:3240Wird ausgeführt, wenn ein Worktree entfernt wird. Dies ist das Bereinigungsgegenüber zu [WorktreeCreate](#worktreecreate). Das Ereignis wird ausgeführt, wenn:
3235 3241
3236* Sie eine `--worktree`-Sitzung beenden und wählen, sie zu entfernen3242* Sie eine `--worktree` Sitzung beenden und wählen, sie zu entfernen
3237* Ein Subagent mit `isolation: "worktree"` fertig ist3243* Ein Subagent mit `isolation: "worktree"` beendet
3238* Sie eine [Hintergrund-Sitzung](/docs/de/agent-view#what-deleting-a-session-removes) löschen, deren Worktree der Hook erstellt hat3244* Sie eine [Hintergrund-Sitzung](/docs/de/agent-view#what-deleting-a-session-removes) löschen, deren Worktree der Hook erstellt hat
3239 3245
3240Für Git-basierte Worktrees handhabt Claude Code die Bereinigung automatisch mit `git worktree remove`. Wenn Sie einen WorktreeCreate-Hook für ein nicht-Git-Versionskontrollsystem konfiguriert haben, koppeln Sie ihn mit einem WorktreeRemove-Hook, um die Bereinigung zu handhaben. Ohne einen wird das Worktree-Verzeichnis auf der Festplatte belassen.3246Für Git-basierte Worktrees verarbeitet Claude Code die Bereinigung automatisch mit `git worktree remove`. Wenn Sie einen WorktreeCreate-Hook für ein nicht-Git-Versionskontrollsystem konfiguriert haben, paaren Sie ihn mit einem WorktreeRemove-Hook, um die Bereinigung zu verarbeiten. Ohne einen wird das Worktree-Verzeichnis auf der Festplatte gelassen.
3241 3247
3242Claude Code verwirft die [JSON-Ausgabefelder](#json-output) eines WorktreeRemove-Hooks, wie `systemMessage` und `continue`.3248Claude Code verwirft die [JSON-Ausgabefelder](#json-output) eines WorktreeRemove-Hooks, wie `systemMessage` und `continue`.
3243 3249
3244Für einen Hintergrund-Sitzungs-Delete überprüft Claude Code den gespeicherten Worktree-Pfad, bevor der Hook ausgelöst wird, und verweigert einen Pfad, der ein Symlink ist oder durch einen unterhalb der Repository-Root geht. Der Hook wird für einen Worktree ausgelöst, der immer noch Dateien enthält, nur wenn Sie den Delete in [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 ausgelöst.3250Für einen Hintergrund-Sitzungs-Löschung überprüft Claude Code den gespeicherten Worktree-Pfad, bevor der Hook ausgeführt wird, und lehnt einen Pfad ab, der ein Symlink ist oder durch einen unterhalb der Repository-Root geht. Der Hook wird für einen Worktree, der immer noch Dateien enthält, nur ausgeführt, wenn Sie den Löschvorgang in [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.
3245 3251
3246Claude Code übergibt den Pfad, den WorktreeCreate zurückgegeben hat, als `worktree_path` in der Hook-Eingabe. Dieses Beispiel liest diesen Pfad und entfernt das Verzeichnis:3252Claude Code übergibt den von WorktreeCreate zurückgegebenen Pfad als `worktree_path` in der Hook-Eingabe. Dieses Beispiel liest diesen Pfad und entfernt das Verzeichnis:
3247 3253
3248```json theme={null}3254```json theme={null}
3249{3255{
3266 WorktreeRemove-Eingabe3272 WorktreeRemove-Eingabe
3267</h4>3273</h4>
3268 3274
3269Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten WorktreeRemove-Hooks das Feld `worktree_path`, das der absolute Pfad zum entfernten Worktree ist.3275Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten WorktreeRemove-Hooks das `worktree_path` Feld, das der absolute Pfad zum entfernten Worktree ist.
3270 3276
3271```json theme={null}3277```json theme={null}
3272{3278{
3278}3284}
3279```3285```
3280 3286
3281Ein WorktreeRemove-Hook-Exit-Code entscheidet das Ergebnis. Wenn ein Hook mit Nicht-Null beendet wird und das Verzeichnis unter `worktree_path` immer noch danach existiert, schlägt die Entfernung fehl:3287Der Exit-Code eines WorktreeRemove-Hooks entscheidet das Ergebnis. Wenn ein Hook mit nicht-Null beendet wird und das Verzeichnis bei `worktree_path` immer noch danach existiert, schlägt die Entfernung fehl:
3282 3288
3283* Der Worktree bleibt auf der Festplatte, und der Hook-Befehl und stderr gehen in das [Debug-Protokoll](#debug-hooks).3289* Der Worktree bleibt auf der Festplatte, und der Hook-Befehl und stderr gehen zum [Debug-Protokoll](#debug-hooks).
3284* Wenn Sie eine Hintergrund-Sitzung löschen, bleibt die Sitzung auch. Die Verweigerungsmeldung in [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.3290* Wenn Sie eine Hintergrund-Sitzung löschten, bleibt die Sitzung auch. Die Verweigerungsmeldung in [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 trotzdem entfernt.
3285 3291
3286<h3 id="precompact">3292<h3 id="precompact">
3287 PreCompact3293 PreCompact
3288</h3>3294</h3>
3289 3295
3290Wird ausgeführt, bevor Claude Code einen Komprimierungsvorgang ausführen soll.3296Wird ausgeführt, bevor Claude Code einen Komprimierungsvorgang ausführen möchte.
3291 3297
3292Der Matcher-Wert gibt an, ob die Komprimierung manuell oder automatisch ausgelöst wurde:3298Der Matcher-Wert gibt an, ob die Komprimierung manuell oder automatisch ausgelöst wurde:
3293 3299
3294| Matcher | Wann es ausgelöst wird |3300| Matcher | Wann wird es ausgelöst |
3295| :------- | :---------------------------------------------------------------------------------------------------------------------- |3301| :------- | :----------------------------------------------------------------------------------------------------------------------------- |
3296| `manual` | `/compact` |3302| `manual` | `/compact` |
3297| `auto` | Auto-Komprimierung, wenn das Gespräch das [Auto-Compact-Fenster](/docs/de/model-config#set-the-auto-compact-window) erreicht |3303| `auto` | Auto-Komprimierung, wenn das Gespräch das [Auto-Komprimierungs-Fenster](/docs/de/model-config#set-the-auto-compact-window) erreicht |
3298 3304
3299Exit 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.3305Beenden 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.
3300 3306
3301Das Blockieren der automatischen Komprimierung hat unterschiedliche Auswirkungen, je nachdem, wann es ausgelöst wird. Wenn die Komprimierung proaktiv ausgelöst wurde, bevor das Kontextlimit erreicht wurde, überspringt Claude Code sie und das Gespräch wird unkomprimiert fortgesetzt. Wenn die Komprimierung ausgelöst wurde, um sich von einem Kontextlimit-Fehler zu erholen, der bereits von der API zurückgegeben wurde, wird der zugrunde liegende Fehler angezeigt und die aktuelle Anfrage schlägt fehl.3307Das Blockieren der automatischen Komprimierung hat unterschiedliche Auswirkungen, je nachdem, wann es ausgeführt wird. Wenn die Komprimierung proaktiv ausgelöst wurde, bevor das Kontext-Limit erreicht wurde, überspringt Claude Code sie und das Gespräch 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.
3302 3308
3303Claude Code verwirft die `systemMessage` und `continue`-Felder eines PreCompact-Hooks.3309Claude Code verwirft die `systemMessage` und `continue` Felder eines PreCompact-Hooks.
3304 3310
3305<h4 id="precompact-input">3311<h4 id="precompact-input">
3306 PreCompact-Eingabe3312 PreCompact-Eingabe
3307</h4>3313</h4>
3308 3314
3309Zusätzlich zu den [gemeinsamen 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`.3315Zusä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`.
3310 3316
3311```json theme={null}3317```json theme={null}
3312{3318{
3323 PostCompact3329 PostCompact
3324</h3>3330</h3>
3325 3331
3326Wird ausgeführt, nachdem Claude Code einen Komprimierungsvorgang abgeschlossen hat. Verwenden Sie dieses Ereignis, um auf den neuen komprimierten Zustand zu reagieren, zum Beispiel um die generierte Zusammenfassung zu protokollieren oder den externen Zustand zu aktualisieren. Claude Code verwirft die `systemMessage` und `continue`-Felder eines PostCompact-Hooks.3332Wird ausgeführt, nachdem Claude Code einen Komprimierungsvorgang 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.
3327 3333
3328Die gleichen Matcher-Werte gelten wie für `PreCompact`:3334Die gleichen Matcher-Werte gelten wie für `PreCompact`:
3329 3335
3330| Matcher | Wann es ausgelöst wird |3336| Matcher | Wann wird es ausgelöst |
3331| :------- | :--------------------------------------------------------------------------------------------------------------------------- |3337| :------- | :---------------------------------------------------------------------------------------------------------------------------------- |
3332| `manual` | Nach `/compact` |3338| `manual` | Nach `/compact` |
3333| `auto` | Nach Auto-Komprimierung, wenn das Gespräch das [Auto-Compact-Fenster](/docs/de/model-config#set-the-auto-compact-window) erreicht |3339| `auto` | Nach Auto-Komprimierung, wenn das Gespräch das [Auto-Komprimierungs-Fenster](/docs/de/model-config#set-the-auto-compact-window) erreicht |
3334 3340
3335<h4 id="postcompact-input">3341<h4 id="postcompact-input">
3336 PostCompact-Eingabe3342 PostCompact-Eingabe
3337</h4>3343</h4>
3338 3344
3339Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PostCompact-Hooks `trigger` und `compact_summary`. Das Feld `compact_summary` enthält die Gesprächszusammenfassung, die durch den Komprimierungsvorgang generiert wurde.3345Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten PostCompact-Hooks `trigger` und `compact_summary`. Das `compact_summary` Feld enthält die Gesprächs-Zusammenfassung, die vom Komprimierungsvorgang generiert wurde.
3340 3346
3341```json theme={null}3347```json theme={null}
3342{3348{
3349}3355}
3350```3356```
3351 3357
3352PostCompact-Hooks haben keine Entscheidungskontrolle. Sie können das Komprimierungsergebnis nicht beeinflussen, können aber Folgaufgaben durchführen.3358PostCompact-Hooks haben keine Entscheidungskontrolle. Sie können das Komprimierungs-Ergebnis nicht beeinflussen, können aber Folge-Aufgaben ausführen.
3353 3359
3354<h3 id="premodelswitch">3360<h3 id="premodelswitch">
3355 PreModelSwitch3361 PreModelSwitch
3356</h3>3362</h3>
3357 3363
3358Wird ausgeführt, bevor Claude Code einen Modellwechsel anwendet, den Sie oder ein Client angefordert haben. Verwenden Sie ihn, um einen Wechsel zu blockieren, eine Bestätigung zu erfordern oder zu zeigen, was der Wechsel kostet, bevor er passiert.3364Wird 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.
3359 3365
3360PreModelSwitch erfordert Claude Code v2.1.251 oder später. Claude Code führt ihn für diese Anfragen aus:3366PreModelSwitch erfordert Claude Code v2.1.251 oder später. Claude Code führt ihn für diese Anfragen aus:
3361 3367
3362* `/model <name>` und der `/model`-Picker3368* `/model <name>` und der `/model` Picker
3363* Der `Option+P`- oder `Alt+P`-Modell-Picker3369* Der `Option+P` oder `Alt+P` Modell-Picker
3364* Die Modell-Einstellung in `/config`3370* Die Modell-Einstellung in `/config`
3365* Das Einschalten des [Fast-Modus](/docs/de/fast-mode), wenn das das Modell der Sitzung ändert3371* Das Aktivieren des [Fast-Modus](/docs/de/fast-mode), wenn das das Modell der Sitzung ändert
3366* 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)3372* 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)
3367 3373
3368Claude 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 nur [PostModelSwitch](#postmodelswitch).3374Claude 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.
3369 3375
3370Claude Code vergleicht den Matcher gegen den kanonischen Namen des Modells, zu dem die Sitzung wechselt, und ignoriert jeden `[1m]`-Suffix. Ein Alias wie `opus`, eine datierte Modell-ID und eine Provider-spezifische ID wie eine Amazon Bedrock-Modell-ID passen alle auf den einen kanonischen Namen, zu dem sie sich auflösen, daher deckt `claude-opus-5` jede Schreibweise von Opus 5 ab.3376Claude Code vergleicht den Matcher gegen den kanonischen Namen des Modells, zu dem die Sitzung wechselt, und 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.
3371 3377
3372Wenn Claude Code einen kanonischen Namen für das Ziel nicht bestimmen kann, zum Beispiel eine benutzerdefinierte Modell-ID, die nur Ihr [LLM-Gateway](/docs/de/llm-gateway) kennt, führt es jeden PreModelSwitch-Hook aus, unabhängig vom Matcher. Ein Hook, der blockiert, sollte daher `to_model` aus seiner Eingabe überprüfen, statt sich allein auf den Matcher zu verlassen.3378Wenn 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.
3373 3379
3374Schreiben 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 verweigert es einen Wechsel zu Opus 4.6 durch Beendigung mit Code 2 und lässt jedes andere Ziel durch:3380Schreiben 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 verweigert es einen Wechsel zu Opus 4.6 durch Beendigung mit Code 2 und lässt jedes andere Ziel durch:
3375 3381
3443 PreModelSwitch-Eingabe3449 PreModelSwitch-Eingabe
3444</h4>3450</h4>
3445 3451
3446Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten PreModelSwitch-Hooks die Felder in dieser Tabelle. Die letzten fünf beschreiben, was das Erneut-Senden des Gesprächs zum neuen Modell kostet, daher kann ein Hook diese Zahl zeigen, bevor der Wechsel passiert.3452Zusä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 des Gesprächs zum neuen Modell kostet, daher kann ein Hook diese Zahl zeigen, bevor der Wechsel passiert.
3447 3453
3448| Feld | Typ | Beschreibung |3454| Feld | Typ | Beschreibung |
3449| :-------------------------- | :----------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3455| :-------------------------- | :----------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3450| `from_model` | Zeichenkette | Modell-ID, zu der der Wechsel ändert |3456| `from_model` | string | Modell-ID, zu der der Wechsel wechselt |
3451| `to_model` | Zeichenkette | Modell-ID, zu der der Wechsel ändert. Der Matcher vergleicht gegen den kanonischen Namen dieses Modells |3457| `to_model` | string | Modell-ID, zu der der Wechsel wechselt. Der Matcher vergleicht gegen den kanonischen Namen dieses Modells |
3452| `requested_model` | Zeichenkette 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 |3458| `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 |
3453| `source` | Zeichenkette | Woher die Anfrage kam: `"command"` für `/model <name>`, die Modell-Einstellung in `/config` oder das Einschalten 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 |3459| `source` | string | Woher die Anfrage kam: `"command"` für `/model <name>`, die Modell-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 |
3454| `context_tokens` | Zahl | Tokens, die die nächste Anfrage als ihren Prompt erneut sendet: die Input-, Cache-Read-, Cache-Creation- und Output-Tokens der letzten Antwort in der Hauptkonversation, kombiniert. `0` vor der ersten Antwort |3460| `context_tokens` | number | Tokens, die die nächste Anfrage als ihre Eingabeaufforderung erneut sendet: die Eingabe-, Cache-Lese-, Cache-Erstellungs- und Ausgabe-Tokens der letzten Antwort im Hauptgespräch, kombiniert. `0` vor der ersten Antwort |
3455| `prompt_cache_warm` | Boolesch | Ob der Prompt-Cache des aktuellen Modells wahrscheinlich noch warm ist, was bedeutet, dass der Wechsel ihn aufgibt |3461| `prompt_cache_warm` | boolean | Ob der Prompt-Cache des aktuellen Modells wahrscheinlich noch warm ist, was bedeutet, dass der Wechsel ihn aufgibt |
3456| `cache_ttl` | Zeichenkette | [Prompt-Cache-Lebensdauer](/docs/de/prompt-caching#cache-lifetime), die Claude Code für diese Sitzung anfordert: `"5m"` oder `"1h"` |3462| `cache_ttl` | string | [Prompt-Cache-Lebensdauer](/docs/de/prompt-caching#cache-lifetime), die Claude Code für diese Sitzung anfordert: `"5m"` oder `"1h"` |
3457| `estimated_cache_write_usd` | Zahl | Geschätzte Kosten in US-Dollar zum 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 |3463| `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 |
3458| `pricing` | Zeichenkette | Wie Claude Code `estimated_cache_write_usd` bepreist: `"configured"` bei Ihren Organisations-eigenen Sätzen, wenn sie konfiguriert hat, `"catalog"` bei Listenpreis oder `"default"`, wenn `to_model` keinen bekannten Preis hat und Claude Code einen Standard-Satz annahm |3464| `pricing` | string | Wie Claude Code `estimated_cache_write_usd` bepreist: `"configured"` bei den Raten Ihrer Organisation, wenn sie konfiguriert hat, `"catalog"` bei Listenpreis oder `"default"`, wenn `to_model` keinen bekannten Preis hat und Claude Code einen Standard-Satz annahm |
3459 3465
3460Dieses Beispiel zeigt die Eingabe für `/model opus` in einer Sitzung, die Sonnet 5 ausführt:3466Dieses Beispiel zeigt die Eingabe für `/model opus` in einer Sitzung, die Sonnet 5 ausführt:
3461 3467
3481 PreModelSwitch-Entscheidungskontrolle3487 PreModelSwitch-Entscheidungskontrolle
3482</h4>3488</h4>
3483 3489
3484`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.3490`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.
3485 3491
3486Fü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:3492Fü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:
3487 3493
3488| Feld | Beschreibung |3494| Feld | Beschreibung |
3489| :------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3495| :------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3490| `permissionDecision` | `"allow"` wird fortgesetzt 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 |3496| `permissionDecision` | `"allow"` fährt fort 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 |
3491| `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"`, im Bestätigungsprompt angezeigt. Ignoriert für `"allow"` |3497| `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"` |
3492 3498
3493Nur `/model` in einer interaktiven Sitzung kann den `"ask"`-Prompt zeigen. 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.3499Nur `/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.
3494 3500
3495Dieses Beispiel fordert den Benutzer zur Bestätigung auf und zitiert die Token-Anzahl aus `context_tokens`:3501Dieses Beispiel fordert den Benutzer zur Bestätigung auf und zitiert die Token-Anzahl aus `context_tokens`:
3496 3502
3506 3512
3507Wenn mehrere PreModelSwitch-Hooks unterschiedliche Entscheidungen zurückgeben, ist die Priorität `deny` > `ask` > `allow`.3513Wenn mehrere PreModelSwitch-Hooks unterschiedliche Entscheidungen zurückgeben, ist die Priorität `deny` > `ask` > `allow`.
3508 3514
3509Claude Code zeigt 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.3515Claude 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.
3510 3516
3511Ein PreModelSwitch-Hook, der nicht vor seinem Timeout antwortet, blockiert den Wechsel. Auf [PreToolUse](#timeouts) lässt ein Timeout-Command-Hook den Tool-Aufruf im Gegensatz dazu 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`-Standard nicht.3517Ein 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.
3512 3518
3513Ein Hook, der mit einem Code anderen als 0 oder 2 beendet und keine JSON-Entscheidung druckt, blockiert nicht: Claude Code zeigt seinen stderr und wendet den Wechsel an, wie unter [Andere Exit-Codes](#other-exit-codes) beschrieben.3519Ein 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.
3514 3520
3515<h3 id="postmodelswitch">3521<h3 id="postmodelswitch">
3516 PostModelSwitch3522 PostModelSwitch
3517</h3>3523</h3>
3518 3524
3519Wird ausgeführt, nachdem sich das Modell der Sitzung ändert. Verwenden Sie ihn, um Claude modellspezifische Anleitung zu geben, ohne jede CLAUDE.md zu bearbeiten, zum Beispiel eine organisations-weite Anweisung, die auf bestimmten Modellen gilt.3525Wird 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.
3520 3526
3521PostModelSwitch 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 jedem dieser Änderungen aus:3527PostModelSwitch 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:
3522 3528
3523* Ein Wechsel, den Sie oder ein Client angefordert haben3529* Ein Wechsel, den Sie oder ein Client angefordert haben
3524* Ein [automatisches Modell-Fallback](/docs/de/model-config#automatic-model-fallback), das das Modell der Sitzung ändert3530* Ein [automatisches Modell-Fallback](/docs/de/model-config#automatic-model-fallback), das das Modell der Sitzung ändert
3525* Eine Einstellung wie [`opusplan`](/docs/de/model-config#opusplan-model-setting), die den Plan-Modus betritt oder verlässt3531* Eine Einstellung wie [`opusplan`](/docs/de/model-config#opusplan-model-setting), die den Plan-Modus betritt oder verlässt
3526* Claude Code, das das Modell wiederherstellt, wenn Sie eine Sitzung fortsetzen3532* Claude Code stellt das Modell wieder her, wenn Sie eine Sitzung fortsetzen
3527 3533
3528Claude Code führt PostModelSwitch-Hooks nicht aus, wenn ein Modell aus einer [Fallback-Modell-Kette](/docs/de/model-config#fallback-model-chains) eine Runde bedient, da diese Substitution eine Runde dauert und das Modell der Sitzung unverändert lässt.3534Claude 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.
3529 3535
3530Der Matcher folgt den gleichen Regeln wie [PreModelSwitch](#premodelswitch): Claude Code vergleicht ihn gegen den kanonischen Namen des Modells, zu dem die Sitzung wechselt.3536Der Matcher folgt den gleichen Regeln wie [PreModelSwitch](#premodelswitch): Claude Code vergleicht ihn gegen den kanonischen Namen des Modells, zu dem die Sitzung wechselt.
3531 3537
3549}3555}
3550```3556```
3551 3557
3552Um zu bestätigen, dass der Hook funktioniert, wechseln Sie zu einem Opus-Modell aus einer Sitzung, die ein anderes Modell ausführt, zum Beispiel führen Sie `/model opus` aus einer Sonnet-Sitzung aus, und fragen Sie Claude dann, welche Anleitung es zum aktuellen Modell hat.3558Um 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.
3553 3559
3554<h4 id="postmodelswitch-input">3560<h4 id="postmodelswitch-input">
3555 PostModelSwitch-Eingabe3561 PostModelSwitch-Eingabe
3556</h4>3562</h4>
3557 3563
3558PostModelSwitch-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.3564PostModelSwitch-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 wird, wenn Sie eine Sitzung fortsetzen.
3559 3565
3560`requested_model` ist `null`, wenn `source` `"auto"` ist. Wenn `source` `"resume"` ist, ist es die gespeicherte Modell-Einstellung, die Claude Code wiederhergestellt hat.3566`requested_model` ist `null`, wenn `source` `"auto"` ist. Wenn `source` `"resume"` ist, ist es die gespeicherte Modell-Einstellung, die Claude Code wiederhergestellt hat.
3561 3567
3563 PostModelSwitch-Entscheidungskontrolle3569 PostModelSwitch-Entscheidungskontrolle
3564</h4>3570</h4>
3565 3571
3566Claude Code nimmt Ihren Hook-[Plain-Text-stdout](#exit-code-0) bei Beendigung mit 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:3572Claude Code nimmt Ihren Hook-[Klartext-stdout](#exit-code-0) bei Beendigung mit 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:
3567 3573
3568| Feld | Beschreibung |3574| Feld | Beschreibung |
3569| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------- |3575| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------- |
3570| `additionalContext` | Zeichenkette, die zu Claudes Kontext mit der nächsten Anfrage hinzugefügt wird. Siehe [Kontext für Claude hinzufügen](#add-context-for-claude) |3576| `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) |
3571 3577
3572Wenn der Hook nicht innerhalb von fünf Sekunden nach dem Senden der nächsten Anfrage fertig ist, sendet Claude Code diese Anfrage ohne die Ausgabe und hängt sie statt der nächsten 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-Zielmodell.3578Wenn der Hook nicht innerhalb von fünf Sekunden nach dem Senden der nächsten Eingabeaufforderung fertig ist, 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 zum Ziel-Modell.
3573 3579
3574<h3 id="sessionend">3580<h3 id="sessionend">
3575 SessionEnd3581 SessionEnd
3576</h3>3582</h3>
3577 3583
3578Wird ausgeführt, wenn eine Claude Code-Sitzung endet. Nützlich für Bereinigungsaufgaben, Protokollierung von Sitzungsstatistiken oder Speicherung des Sitzungsstatus. Unterstützt Matcher zum Filtern nach Ausstiegsgrund.3584Wird ausgeführt, wenn eine Claude Code Sitzung endet. Nützlich für Bereinigungsaufgaben, Protokollierung von Sitzungs-Statistiken oder Speicherung des Sitzungs-Zustands. Unterstützt Matcher zum Filtern nach Exit-Grund.
3579 3585
3580Das Feld `reason` in der Hook-Eingabe gibt an, warum die Sitzung endete:3586Das `reason` Feld in der Hook-Eingabe gibt an, warum die Sitzung endete:
3581 3587
3582| Grund | Beschreibung |3588| Grund | Beschreibung |
3583| :---------------------------- | :------------------------------------------------------------------------------------------------------ |3589| :---------------------------- | :------------------------------------------------------------------------------------------------ |
3584| `clear` | Sitzung mit `/clear`-Befehl gelöscht |3590| `clear` | Sitzung mit `/clear` Befehl gelöscht |
3585| `resume` | Sitzung über interaktives `/resume` gewechselt |3591| `resume` | Sitzung mit interaktivem `/resume` gewechselt |
3586| `logout` | Benutzer hat sich abgemeldet |3592| `logout` | Benutzer abgemeldet |
3587| `prompt_input_exit` | Benutzer hat beendet, während die Prompt-Eingabe sichtbar war |3593| `prompt_input_exit` | Benutzer beendet, während Eingabeaufforderungs-Eingabe sichtbar war |
3588| `other` | Andere Ausstiegsgründe |3594| `other` | Andere Exit-Gründe |
3589| `bypass_permissions_disabled` | Entfernt in v2.1.234; Claude Code sendet es nicht. Lassen Sie es aus Ihren `SessionEnd`-Matchern fallen |3595| `bypass_permissions_disabled` | Entfernt in v2.1.234; Claude Code sendet es nicht. Löschen Sie es aus Ihren `SessionEnd` Matchern |
3590 3596
3591<h4 id="sessionend-input">3597<h4 id="sessionend-input">
3592 SessionEnd-Eingabe3598 SessionEnd-Eingabe
3593</h4>3599</h4>
3594 3600
3595Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten SessionEnd-Hooks ein Feld `reason`, das angibt, warum die Sitzung endete. Siehe die [Grundtabelle](#sessionend) oben für alle Werte.3601Zusä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.
3596 3602
3597```json theme={null}3603```json theme={null}
3598{3604{
3604}3610}
3605```3611```
3606 3612
3607SessionEnd-Hooks haben keine Entscheidungskontrolle. Sie können die Sitzungsbeendigung nicht blockieren, können aber Bereinigungsaufgaben durchführen.3613SessionEnd-Hooks haben keine Entscheidungskontrolle. Sie können die Sitzungs-Beendigung nicht blockieren, können aber Bereinigungsaufgaben ausführen. Claude Code verwirft ihre [JSON-Ausgabefelder](#json-output), wie `systemMessage`.
3614
3615SessionEnd-Hooks haben ein Standard-Timeout von 1,5 Sekunden. Es gilt, wenn Sie beenden, `/clear` ausführen oder mit interaktivem `/resume` zu Sitzungen wechseln. Sie können einem Hook auf zwei Wegen mehr Zeit geben:
3608 3616
3609SessionEnd-Hooks haben ein Standard-Timeout von 1,5 Sekunden. Es gilt, wenn Sie beenden, `/clear` ausführen oder Sitzungen mit interaktivem `/resume` wechseln. Wenn ein Hook mehr Zeit benötigt, setzen Sie `timeout` in dieser Hook-Konfiguration. Das Gesamtbudget wird automatisch auf das höchste Pro-Hook-`timeout` erhöht, das in Ihren Einstellungsdateien konfiguriert ist, bis zu 60 Sekunden. Timeouts, die auf Plugin-bereitgestellten Hooks gesetzt sind, erhöhen das Budget nicht. Um das Budget explizit zu überschreiben, setzen Sie die Umgebungsvariable `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` in Millisekunden.3617* **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.
3618* **`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`.
3619
3620Dieses Beispiel setzt das Budget auf 5 Sekunden:
3610 3621
3611```bash theme={null}3622```bash theme={null}
3612CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude3623CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
3613```3624```
3614 3625
3615Vor v2.1.268 erhöhte `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` nur das Gesamtbudget, und ein Hook ohne sein eigenes `timeout` wurde immer noch nach 1,5 Sekunden abgebrochen.3626Vor 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.
3616 3627
3617<h3 id="elicitation">3628<h3 id="elicitation">
3618 Elicitation3629 Elicitation
3619</h3>3630</h3>
3620 3631
3621Wird ausgeführt, wenn ein MCP-Server Benutzereingaben während einer Aufgabe anfordert. Standardmäßig zeigt Claude Code einen interaktiven Dialog für die Benutzerantwort an. Hooks können diese Anfrage abfangen und programmatisch antworten, wodurch der Dialog vollständig übersprungen wird.3632Wird ausgeführt, wenn ein MCP-Server Benutzereingabe 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.
3622 3633
3623Das Matcher-Feld passt auf den MCP-Server-Namen.3634Das Matcher-Feld gleicht gegen den MCP-Server-Namen ab.
3624 3635
3625<h4 id="elicitation-input">3636<h4 id="elicitation-input">
3626 Elicitation-Eingabe3637 Elicitation-Eingabe
3627</h4>3638</h4>
3628 3639
3629Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten Elicitation-Hooks `mcp_server_name`, `message` und optionale Felder `mode`, `url`, `elicitation_id` und `requested_schema`.3640Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten Elicitation-Hooks `mcp_server_name`, `message` und optionale `mode`, `url`, `elicitation_id` und `requested_schema` Felder.
3630 3641
3631Für Form-Mode-Elicitation (der häufigste Fall):3642Für Form-Modus-Elicitierung, der häufigste Fall:
3632 3643
3633```json theme={null}3644```json theme={null}
3634{3645{
3648}3659}
3649```3660```
3650 3661
3651Für URL-Mode-Elicitation (Browser-basierte Authentifizierung):3662Für URL-Modus-Elicitierung, verwendet für Browser-basierte Authentifizierung:
3652 3663
3653```json theme={null}3664```json theme={null}
3654{3665{
3682```3693```
3683 3694
3684| Feld | Werte | Beschreibung |3695| Feld | Werte | Beschreibung |
3685| :-------- | :---------------------------- | :------------------------------------------------------------------------------- |3696| :-------- | :---------------------------- | :-------------------------------------------------------------------------------- |
3686| `action` | `accept`, `decline`, `cancel` | Ob die Anfrage akzeptiert, abgelehnt oder abgebrochen werden soll |3697| `action` | `accept`, `decline`, `cancel` | Ob die Anfrage akzeptiert, abgelehnt oder abgebrochen werden soll |
3687| `content` | Objekt | Formularfeldwerte zum Einreichen. Wird nur verwendet, wenn `action` `accept` ist |3698| `content` | object | Formular-Feldwerte zum Einreichen. Wird nur verwendet, wenn `action` `accept` ist |
3688 3699
3689Exit-Code 2 verweigert die Elicitation. Claude Code zeigt Ihre stderr-Nachricht nicht irgendwo an.3700Exit-Code 2 verweigert die Elicitierung. Claude Code zeigt Ihre stderr-Nachricht nirgendwo an.
3690 3701
3691Claude Code handelt auf `hookSpecificOutput` aus einer Elicitation-Hook-JSON-Ausgabe und verwirft `systemMessage` und `continue`.3702Claude Code handelt `hookSpecificOutput` aus der JSON-Ausgabe eines Elicitation-Hooks und verwirft `systemMessage` und `continue`.
3692 3703
3693<h3 id="elicitationresult">3704<h3 id="elicitationresult">
3694 ElicitationResult3705 ElicitationResult
3695</h3>3706</h3>
3696 3707
3697Wird ausgeführt, nachdem ein Benutzer auf eine MCP-Elicitation antwortet. Hooks können die Antwort beobachten, ändern oder blockieren, bevor sie an den MCP-Server zurückgesendet wird.3708Wird 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.
3698 3709
3699Das Matcher-Feld passt auf den MCP-Server-Namen.3710Das Matcher-Feld gleicht gegen den MCP-Server-Namen ab.
3700 3711
3701<h4 id="elicitationresult-input">3712<h4 id="elicitationresult-input">
3702 ElicitationResult-Eingabe3713 ElicitationResult-Eingabe
3703</h4>3714</h4>
3704 3715
3705Zusätzlich zu den [gemeinsamen Eingabefeldern](#common-input-fields) erhalten ElicitationResult-Hooks `mcp_server_name`, `action` und optionale Felder `mode`, `elicitation_id` und `content`.3716Zusätzlich zu den [allgemeinen Eingabefeldern](#common-input-fields) erhalten ElicitationResult-Hooks `mcp_server_name`, `action` und optionale `mode`, `elicitation_id` und `content` Felder.
3706 3717
3707```json theme={null}3718```json theme={null}
3708{3719{
3735```3746```
3736 3747
3737| Feld | Werte | Beschreibung |3748| Feld | Werte | Beschreibung |
3738| :-------- | :---------------------------- | :----------------------------------------------------------------------------- |3749| :-------- | :---------------------------- | :------------------------------------------------------------------------ |
3739| `action` | `accept`, `decline`, `cancel` | Überschreibt die Aktion des Benutzers |3750| `action` | `accept`, `decline`, `cancel` | Überschreibt die Aktion des Benutzers |
3740| `content` | Objekt | Überschreibt Formularfeldwerte. Nur aussagekräftig, wenn `action` `accept` ist |3751| `content` | object | Überschreibt Formular-Feldwerte. Nur sinnvoll, wenn `action` `accept` ist |
3741 3752
3742Exit-Code 2 blockiert die Antwort, wodurch die effektive Aktion zu `decline` wird. Claude Code zeigt Ihre stderr-Nachricht nicht irgendwo an.3753Exit-Code 2 blockiert die Antwort und ändert die effektive Aktion zu `decline`. Claude Code zeigt Ihre stderr-Nachricht nirgendwo an.
3743 3754
3744Claude Code handelt auf `hookSpecificOutput` aus einer ElicitationResult-Hook-JSON-Ausgabe und verwirft `systemMessage` und `continue`.3755Claude Code handelt `hookSpecificOutput` aus der JSON-Ausgabe eines ElicitationResult-Hooks und verwirft `systemMessage` und `continue`.
3745 3756
3746<h2 id="prompt-based-hooks">3757<h2 id="prompt-based-hooks">
3747 Prompt-basierte Hooks3758 Prompt-basierte Hooks
3752Ereignisse, die alle fünf Hook-Typen unterstützen (`command`, `http`, `mcp_tool`, `prompt` und `agent`):3763Ereignisse, die alle fünf Hook-Typen unterstützen (`command`, `http`, `mcp_tool`, `prompt` und `agent`):
3753 3764
3754* `PermissionDenied`3765* `PermissionDenied`
3755* `PermissionRequest`
3756* `PostToolBatch`3766* `PostToolBatch`
3757* `PostToolUse`3767* `PostToolUse`
3758* `PostToolUseFailure`3768* `PostToolUseFailure`
3765* `UserPromptExpansion`3775* `UserPromptExpansion`
3766* `UserPromptSubmit`3776* `UserPromptSubmit`
3767 3777
3778`PermissionRequest` unterstützt `command`, `http`, `mcp_tool` und `prompt` Hooks, aber keine `agent` Hooks. Wenn Sie einen Agent-Hook bei diesem Ereignis konfigurieren, überspringt Claude Code ihn und der Genehmigungsfluss wird unverändert fortgesetzt. Um von einem Hook aus zuzulassen oder zu verweigern, geben Sie das [Entscheidungsobjekt](#permissionrequest-decision-control) von einem Command- oder HTTP-Hook zurück.
3779
3768Ereignisse, die `command`, `http` und `mcp_tool` Hooks unterstützen, aber nicht `prompt` oder `agent`:3780Ereignisse, die `command`, `http` und `mcp_tool` Hooks unterstützen, aber nicht `prompt` oder `agent`:
3769 3781
3770* `ConfigChange`3782* `ConfigChange`
3897 Agent-Hooks sind experimentell. Das Verhalten und die Konfiguration können sich in zukünftigen Versionen ändern. Für Produktions-Workflows bevorzugen Sie [Command Hooks](#command-hook-fields).3909 Agent-Hooks sind experimentell. Das Verhalten und die Konfiguration können sich in zukünftigen Versionen ändern. Für Produktions-Workflows bevorzugen Sie [Command Hooks](#command-hook-fields).
3898</Warning>3910</Warning>
3899 3911
3900Agent-basierte Hooks (`type: "agent"`) sind wie Prompt-basierte Hooks, aber mit Multi-Turn-Tool-Zugriff. Anstelle eines einzelnen LLM-Aufrufs spawnt ein Agent-Hook einen Subagenten, der Dateien lesen, Code durchsuchen und die Codebasis überprüfen kann, um Bedingungen zu überprüfen. Agent-Hooks unterstützen die gleichen Ereignisse wie Prompt-basierte Hooks.3912Agent-basierte Hooks (`type: "agent"`) sind wie Prompt-basierte Hooks, aber mit Multi-Turn-Tool-Zugriff. Anstelle eines einzelnen LLM-Aufrufs spawnt ein Agent-Hook einen Subagenten, der Dateien lesen, Code durchsuchen und die Codebasis überprüfen kann, um Bedingungen zu überprüfen. Agent-Hooks unterstützen die gleichen Ereignisse wie [Prompt-basierte Hooks](#prompt-based-hooks), mit Ausnahme von `PermissionRequest`.
3901 3913
3902<h3 id="how-agent-hooks-work">3914<h3 id="how-agent-hooks-work">
3903 Wie Agent-Hooks funktionieren3915 Wie Agent-Hooks funktionieren