Ratgeber · Claude Code
Claude Code Hooks: Befehle, die jedes Mal laufen.
Eine Anweisung in CLAUDE.md ist eine Bitte an das Modell. Ein Hook ist ein Befehl, den Claude Code an einer festen Stelle selbst ausführt, jedes Mal. Diese Anleitung erklärt Ereignisse, Matcher und Exit-Codes, zeigt einen Hook, der Änderungen an .env-Dateien sperrt, und wie Workban Hooks nutzt.
- Claude Code
- Mit Beispiel
- Auch für Codex
- Stand 30. Oktober 2026
Grundlagen
Was ein Hook ist.
Ein Hook ist ein Befehl, den Claude Code bei einem bestimmten Ereignis startet: bevor ein Werkzeug läuft, nachdem es gelaufen ist, wenn eine Sitzung beginnt oder wenn Claude mit seiner Antwort fertig ist. Er bekommt die Einzelheiten des Ereignisses als JSON auf der Standardeingabe, etwa den Namen des Werkzeugs und seine Parameter.
Zurück antwortet der Hook über seinen Exit-Code und seine Ausgabe. So kann er eine Aktion erlauben, sperren, eine Rückfrage auslösen oder Claude zusätzlichen Kontext geben. Weil der Hook außerhalb des Modells läuft, gilt er auch dann, wenn Claude eine Anweisung übersieht.
Orte
Wo Hooks stehen.
Hooks stehen in den JSON-Einstellungen von Claude Code. Der Ort bestimmt, wofür sie gelten. Einträge mehrerer Orte ergänzen sich, statt sich zu ersetzen.
- ~/.claude/settings.json
- Für alle deine Projekte, nur auf deinem Rechner.
- .claude/settings.json
- Für ein Projekt. Liegt im Repository, gilt also für alle, die es klonen.
- .claude/settings.local.json
- Für ein Projekt, nur für dich, nicht im Repository.
- Plugins, Skills, Subagenten
- Ein Plugin bringt Hooks mit, solange es eingeschaltet ist. Skills und Subagenten können Hooks in ihrem Kopf definieren.
- Verwaltete Einstellungen
- Für eine ganze Organisation, von Admins vorgegeben.
Ereignisse
Die Ereignisse, die du am häufigsten brauchst.
Die Referenz von Claude Code nennt über 30 Ereignisse. Diese tragen die meisten Hooks.
- SessionStart
- Beim Start oder Fortsetzen einer Sitzung. Was der Hook als Text ausgibt, liest Claude als Kontext.
- UserPromptSubmit
- Bevor Claude deine Eingabe bearbeitet. Kann Kontext ergänzen oder die Eingabe ablehnen.
- PreToolUse
- Vor jedem Werkzeugaufruf. Kann ihn sperren, erlauben oder eine Rückfrage auslösen.
- PostToolUse
- Nachdem ein Werkzeug erfolgreich gelaufen ist, etwa für Formatierer oder Prüfungen.
- Stop
- Wenn Claude mit seiner Antwort fertig ist. Nicht nach einer Unterbrechung durch dich.
- SubagentStop
- Wenn ein Subagent fertig ist.
- SessionEnd
- Wenn die Sitzung endet.
Steuerung
Matcher grenzen ein, Exit-Codes entscheiden.
Ein Matcher legt fest, wann ein Hook überhaupt startet. Sein Exit-Code sagt Claude Code, was dann passiert.
- Matcher
- Bei Werkzeug-Ereignissen der Name des Werkzeugs:
Bash,Edit|Writefür beide,mcp__.*als regulärer Ausdruck für alle MCP-Werkzeuge. Leer oder*heißt immer. - Exit 0
- Alles in Ordnung. Gibt der Hook ein JSON-Objekt aus, wendet Claude Code dessen Felder an.
- Exit 2
- Sperrt die Aktion, bei Ereignissen, die sperren können. Was der Hook auf stderr schreibt, bekommt Claude als Grund.
- Anderer Exit-Code
- Ein Fehler, der nichts sperrt: Die Aktion läuft weiter, Claude Code zeigt einen Hinweis.
- permissionDecision
- Feiner per JSON bei PreToolUse:
allowüberspringt die Rückfrage,denysperrt,askfragt dich.
Beispiel
Keine Änderungen an .env-Dateien.
Ein PreToolUse-Hook für die Werkzeuge Edit und Write, eingetragen in deinen Benutzer-Einstellungen.
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": "~/.claude/hooks/protect-env.sh" }
]
}
]
}
}Beispiel
Das Skript dazu sperrt mit Exit-Code 2.
Es liest den Dateipfad aus der Eingabe. Ist es eine .env-Datei, etwa .env oder .env.local, schreibt es den Grund auf stderr und endet mit 2.
#!/bin/bash
# Keine Änderungen an .env-Dateien
file=$(jq -r '.tool_input.file_path // empty')
case "$file" in
*.env|*.env.*)
echo "Keine Änderungen an $file" >&2
exit 2
;;
esac
exit 0Das Skript braucht jq und muss ausführbar sein (chmod +x). Mit /hooks siehst du in Claude Code alle eingerichteten Hooks und woher sie kommen. Mit claude --debug schreibt Claude Code ins Debug-Log unter ~/.claude/debug, welche Hooks gelaufen sind und mit welchem Ergebnis.
In Workban
So nutzt Workban die Hooks.
workban setup trägt einen einzigen Befehl, workban hook run, für die Ereignisse ein, die Workban braucht. In Repositorys ohne .workban.toml tut er nichts.
- SessionStart
- Zeigt, was läuft und was im Backlog liegt, und hält CLI, Regel und Skill aktuell.
- PreToolUse
- Der Riegel: hält Änderungen im Repository an, solange die Sitzung keine eigene Aufgabe gestartet hat. Vor einer Websuche erinnert er ans Wissen des Teams.
- PostToolUse
- Welches Werkzeug die Sitzung gerade nutzt, für die Seite Live.
- UserPromptSubmit, PermissionRequest
- Die Phase auf der Karte: ob der Agent arbeitet oder auf dich wartet.
- Stop
- Der Token-Verbrauch der Runde, gelesen aus dem Protokoll der Sitzung.
- SessionEnd, SubagentStop
- Wann eine Sitzung oder ein Subagent fertig ist.
Codex
Codex hat eigene Hooks, mit einer Freigabe.
Codex kennt Hooks nach demselben Muster: Ereignis, Matcher, Befehl, darunter SessionStart, PreToolUse, PostToolUse und Stop. Sie stehen in einer hooks.json oder als [hooks] in der config.toml.
Der wichtigste Unterschied: Codex führt einen Hook erst aus, wenn du ihn über /hooks geprüft und freigegeben hast. Ändert sich der Hook, fragt Codex neu.
Fragen
Was oft gefragt wird.
Hook oder Anweisung in CLAUDE.md?
Sind Hooks ein Risiko?
Warum startet mein Hook nicht?
/hooks zeigt, ob Claude Code den Hook kennt, das Debug-Log von claude --debug, ob er lief und was er zurückgab.Quellen
Woher die Angaben stammen.
Was hier über andere Produkte steht, stammt aus deren eigenen Seiten und Ankündigungen, Stand siehe oben. Funktionen und Pläne ändern sich, im Zweifel gilt die Quelle.
Loslegen
Probier es mit deiner nächsten Aufgabe.
Workban ist kostenlos. Dein Workspace steht in einer Minute, und die erste Aufgabe erscheint, sobald dein Agent loslegt.