Hooks: Gestalten Sie Ihren eigenen Workflow
Eigene Logik in jede Phase der Tool-Aufrufe von Claude Code einfügen — automatisch formatieren, testen, prüfen und absichern — alles automatisiert
Was sind Claude Code Hooks?
Hooks sind das Ereignissystem von Claude Code, mit dem Sie eigene Shell-Skripte vor und nach Tool-Aufrufen ausführen können. Automatisch Linter nach dem Speichern von Dateien ausführen, Tests vor Commits durchlaufen oder Warnungen bei Zugriff auf sensible Dateien auslösen — ganz ohne manuelles Eingreifen.
Die Konfiguration verschachtelt drei Ebenen: das Event, ein Matcher, der Tools filtert, und Ihr Skript im inneren hooks-Array. Das Skript liest das JSON dieses Events von stdin und antwortet mit Exit-Codes: 0 bedeutet kein Einspruch, 2 blockiert den Aufruf bei Events, die dies erlauben. Bei den vier untenstehenden Events wird ein Command-Hook bei seinem Standardwert von 600 Sekunden abgebrochen; diese vier sind die gängigen, nicht die vollständige offizielle Liste (geprüft 2026-09-22).
Hook-Typen erklärt
Claude Code Hooks decken Tool-, Session- und Compaction-Lebenszyklus-Punkte ab, mit Command-, HTTP- und Agent-Handlern
PreToolUse: vor dem Aufruf
Wird vor der Tool-Ausführung ausgelöst — Parameter validieren, Berechtigungen prüfen, automatisch genehmigen oder ablehnen
PostToolUse: nach dem Aufruf
Wird nach der Tool-Ausführung ausgelöst — automatisch formatieren, Tests ausführen, Benachrichtigungen senden
Notification: bei Warnungen
Wird bei Claude Code-Benachrichtigungen ausgelöst — Integration mit Slack, E-Mail oder anderen Kanälen
Stop: wenn Claude abschließt
Wird ausgelöst, wenn Claude Code die Antwort abschließt — Ergebnisse protokollieren oder Aufräumen ausführen
Drei praktische Automatisierungsfälle
Die drei nachstehenden Fälle teilen eine Struktur: wählen Sie das Event, grenzen Sie es mit einem Matcher ein und setzen Sie das Skript in das innere hooks-Array. Die Snippets zeigen nur die Absicht – betrachten Sie die offizielle Referenz als Quelle für Feldnamen und Verschachtelung, und lesen Sie alles, was Ihr Skript prüfen muss, aus diesem JSON auf stdin.
Formatieren vor dem Commit
Wenn Claude gleich git commit ausführen wird, übergibt PreToolUse die Argumente zuerst an Ihr Skript. Das Skript erkennt den Commit-Befehl, führt Ihren Formatter aus und antwortet mit einem Exit-Code: 0 lässt den Aufruf durch, 2 blockiert ihn. Das alles geschieht vor der Ausführung, sodass ein blockierter Commit den Working Tree unberührt lässt.
{
"hooks": {
"PreToolUse": [{
"matcher": "Bash",
"command": "if echo \"$TOOL_INPUT\" | grep -q 'git commit'; then npm run format; fi"
}]
}
}
Benachrichtigen, wenn Tests abgeschlossen sind
PostToolUse wird erst ausgelöst, nachdem ein Befehl erfolgreich zurückgekehrt ist, sodass Ihr Skript pytest oder npm test erkennen und eine Desktop-Benachrichtigung auslösen kann. Es kann einen bereits ausgeführten Aufruf nicht rückgängig machen und bleibt bei Fehlschlägen stumm – die Benachrichtigung bedeutet also, dass Ergebnisse vorliegen, nicht dass die Tests bestanden haben.
{
"hooks": {
"PostToolUse": [{
"matcher": "Bash",
"command": "if echo \"$TOOL_INPUT\" | grep -q 'pytest\\|npm test'; then notify-send 'Tests completed'; fi"
}]
}
}
Bearbeitungen von Secret-Dateien ablehnen
Setzen Sie einen PreToolUse-Hook auf Edit und Write: Das Skript entnimmt den Zielpfad aus stdin und beendet sich mit Exit-Code 2, wenn der Name .env, credentials oder Ähnliches entspricht. Der Schreibvorgang wird abgelehnt, bevor er die Festplatte erreicht, sodass es nichts rückgängig zu machen gibt. Ein Matcher Edit|Write deckt beide Tools gleichzeitig ab.
{
"hooks": {
"PreToolUse": [{
"matcher": "Edit|Write",
"command": "if echo \"$TOOL_INPUT\" | grep -qE '\\.env|credentials|secrets'; then exit 2; fi"
}]
}
}
Headless-Modus & CI/CD
Claude Code in CI/CD-Pipelines mit dem -p-Flag für unbeaufsichtigte Automatisierungsaufgaben ausführen
-p für nicht-interaktive Ausführung
Fügen Sie den -p-Flag (oder --print) zu jedem claude-Befehl hinzu, um ihn nicht-interaktiv auszuführen und das Ergebnis nach Abschluss auszugeben.
In die CI-Pipeline einspeisen
Der nicht-interaktive Modus liest stdin und schreibt das Ergebnis nach stdout; ein Exit-Code 0 bedeutet Erfolg, sodass Build-Skripte darauf verzweigen können.
Strukturierte Ausgabe mit JSON
Verwenden Sie --output-format, um das Antwortformat zu wählen; json liefert das Ergebnis plus Session-ID und Metadaten, bereit zum Parsen durch Skripte.
# Review nicht-interaktiv ausführen: JSON-Ausgabe, max. 5 Durchläufe
claude -p "Review this PR and suggest improvements" \
--output-format json \
--max-turns 5
settings.json-Konfiguration
Definieren Sie Ihre Hooks in .claude/settings.json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"command": "~/scripts/pre-bash-hook.sh"
},
{
"matcher": "Edit|Write",
"command": "~/scripts/protect-sensitive-files.sh"
}
],
"PostToolUse": [
{
"matcher": "Bash",
"command": "~/scripts/post-bash-hook.sh"
}
],
"Notification": [
{
"command": "~/scripts/send-notification.sh"
}
],
"Stop": [
{
"command": "~/scripts/on-stop.sh"
}
]
}
}
Best Practices für Hooks
Diese vier Punkte orientieren sich an der Claude Code Hooks-Referenz einschließlich der Sicherheitshinweise (geprüft: 2026-09-22); sie behandeln das Schreiben der Skripte, während das Konfigurationsformat im obigen settings.json-Abschnitt beschrieben wird.
Blockieren mit Exit-Code 2
Laut Referenz ist Exit-Code 2 bei den meisten Hook-Ereignissen der einzige Code, der allein blockiert; jeder andere Exit-Code ist ein nicht blockierender Fehler, und die Aktion wird fortgesetzt. Ein Skript, das eine Richtlinie durchsetzen soll, muss mit Exit-Code 2 beendet werden.
Trigger mit matcher einschränken
Das Feld matcher bestimmt, wann Hooks ausgelöst werden. Ein reiner Tool-Name wird exakt abgeglichen, ein Wert mit weiteren Zeichen jedoch als nicht verankerter JavaScript-Regulärer-Ausdruck ausgewertet: Edit.* entspricht sowohl Edit als auch NotebookEdit — verwenden Sie daher Anker, um den gesamten String exakt abzugleichen.
Ein Timeout ist keine Blockade
Claude Code bricht einen Hook ab, der sein Timeout erreicht, und verwirft die Ausgabe. Bei den meisten Events führt ein zeitlich überschrittener Hook daher zu keiner Entscheidung. Die Dokumentation warnt, dass ein solcher Command-Hook bei PreToolUse den Aufruf nicht blockiert, bei PreModelSwitch jedoch den Wechsel blockiert. Debug-Protokolle enthalten die Ausführungsdetails.
Eingaben als nicht vertrauenswürdig behandeln
Die Sicherheitshinweise nennen einige Gewohnheiten: Eingabedaten niemals blind vertrauen, Shell-Variablen immer in Anführungszeichen setzen, auf Pfadtraversierung wie ../ prüfen und sensible Dateien wie .env oder .git überspringen. Ein Hook liest einen JSON-Payload, dessen Felder alles Mögliche von außen enthalten können.
Häufig gestellte Fragen
Wie erhält das Hook-Skript das Eingabe-JSON?
Ein Command-Hook empfängt ein JSON-Objekt über stdin. Übliche Felder sind session_id, transcript_path, cwd und hook_event_name; jedes Event fügt eigene hinzu, sodass Tool-Events tool_name und tool_input enthalten.
Wie blockiere ich mit einem Hook einen Tool-Aufruf?
Verknüpfen Sie das Skript mit PreToolUse und geben Sie Exit-Code 2 für Aufrufe zurück, die nicht ausgeführt werden dürfen. Die Event-Tabelle kennzeichnet PreToolUse als blockierbar, daher stoppt Exit 2 diesen Aufruf; für eine bedingte Entscheidung geben Sie stattdessen JSON mit permissionDecision aus. Exit-Code 1 blockiert bei den meisten Events nichts.
Was passiert, wenn ein Hook ein Timeout erreicht?
Ein Hook, der sein Timeout erreicht, wird abgebrochen und seine Ausgabe verworfen – was bei den meisten Events bedeutet, dass gar keine Entscheidung getroffen wird; PreModelSwitch ist der Fall, in dem Zeitüberschreitung den Wechsel blockiert. Ein falsch eingegebener Skriptpfad ist ebenfalls ein nicht blockierender Fehler, und die Dokumentation weist darauf hin, bei der ersten Ausführung eines Policy-Hooks auf diesen Hinweis zu achten.
In welcher Datei befindet sich die Hooks-Konfiguration?
Der Geltungsbereich folgt dem Definitionsort: ~/.claude/settings.json deckt alle Ihre Projekte ab und bleibt auf Ihrem Rechner; .claude/settings.json ist projektbezogen und kann committet werden; .claude/settings.local.json ist projektbezogen und wird von git ignoriert, wenn Claude Code eine Einstellung darin speichert.
Enterprise-Automatisierung mit QCode.cc
Kombinieren Sie die QCode.cc-Entwicklerplattform mit Hooks für KI-Coding-Pipelines auf Enterprise-Niveau
Gateway-Zugriff über ANTHROPIC_BASE_URL
Die offizielle Env-Variablen-Referenz von Claude Code besagt, dass ANTHROPIC_BASE_URL den API-Endpunkt auf einen Proxy oder ein Gateway richten kann; QCode veröffentlicht vor Ort einen Einrichtungsleitfaden für diese Route (geprüft 2026-09-22).
Bremsen vor der Automatisierung
Setzen Sie Bremsen, bevor Sie automatisieren: Das offizielle Beispiel zeigt ein Skript, das den Zielpfad gegen geschützte Muster prüft und mit Exit-Code 2 beendet wird, um Bearbeitungen sensibler Dateien zu blockieren.
Eine Konfiguration für das gesamte Team
Die offizielle Hook-Speicherort-Tabelle besagt, dass .claude/settings.json im Repository committet werden kann; kombinieren Sie es mit einem teamgemeinsamen QCode-API-Key, und die Hooks aller Teammitglieder verhalten sich gleich.
QCode unterstützt auch OpenAI Codex / GPT-5.6
Ihr QCode-Kontingent funktioniert nahtlos über Claude Code, OpenAI Codex CLI und Google Gemini — ein gemeinsames Guthaben, keine doppelten Kosten.
Automatisieren Sie Ihren Claude Code Workflow
Schöpfen Sie das volle Potenzial des KI-Codierens mit Hooks + QCode.cc aus
Aktualisiert 2026-09-22