GuideFortgeschrittenHooks

Hooks einrichten in Claude Code

Deterministische Shell-Befehle, die an festgelegten Lifecycle-Events feuern – für Security-Gates, Auto-Format, Audit-Logs und mehr.

Stable Aktualisiert: Mai 2026 Plattform: Terminal Plan: Pro / Max / Team
Für wen
Entwickler, die deterministische Regeln auf Claude Codes Verhalten anwenden wollen – vor jedem Tool-Aufruf oder danach.
Wann nutzen
Wenn eine Regel IMMER greifen muss (Security-Gate, Auto-Format, Audit-Log), unabhängig davon, ob Claude sich dran erinnert.
Wann nicht
Für Verhaltensregeln, die kontextabhängig sind – die gehören in CLAUDE.md oder einen Skill.

Hooks sind Shell-Befehle, die Claude Code an festgelegten Lifecycle-Events automatisch ausführt – vor einem Tool-Aufruf, nach einem Tool-Aufruf, beim Session-Start oder am Turn-Ende. Sie sind deterministisch (kein LLM-Call, kein Token-Verbrauch) und greifen IMMER, unabhängig davon, ob Claude eine Regel im Kopf hat oder nicht.

Für wen ist das?

Für Entwickler, die professionelle Claude-Code-Setups bauen – mit Security-Gates, Compliance-Regeln oder Team-Standards. Wer eine Regel hat, die niemals umgangen werden darf, schreibt sie als Hook.

Was lernst du?

  • Was Hooks sind und warum sie deterministisch wichtig sind
  • Welche Lifecycle-Events es gibt und wann sie feuern
  • Wie du PreToolUse als Security-Gate konfigurierst
  • Wie du PostToolUse für Auto-Format und Audit-Logs nutzt
  • Wie du Hooks asynchron und HTTP-basiert betreibst

Wann nutzen?

  • Security-Gate: Bestimmte Dateien (.env, Migrations, Secrets) niemals editieren lassen
  • Auto-Format: Nach jedem Edit automatisch prettier/black/gofmt laufen lassen
  • Audit-Log: Jeden Bash-Befehl in eine Datei schreiben, damit du nachvollziehen kannst, was passiert ist
  • Pflicht-Review: Bevor Claude pushen darf, lokalen Test-Lauf erzwingen
  • Notifications: Am Session-Ende Slack-Message schicken, wenn etwas committet wurde

Wann nicht?

  • Für kontextabhängige Verhaltensregeln (gehört in CLAUDE.md oder einen Skill)
  • Für intelligente Entscheidungen, die ein LLM treffen muss (gehört in einen Subagent)
  • Wenn der Befehl langsam ist und du Claude nicht ausbremsen willst (dann async oder gar nicht)

Die wichtigsten Lifecycle-Events

EventWannTypischer Einsatz
SessionStartEinmal beim StartWerte einlesen, ENV-Check, Greeting
UserPromptSubmitNach jedem PromptPrompt-Logging, Pre-Processing
PreToolUseVor jedem Tool-CallSecurity-Gate – kann BLOCKEN
PostToolUseNach jedem Tool-CallAuto-Format, Audit, Notification
StopAm Turn-EndeCleanup, Summary, Slack-Ping
SessionEndBeim BeendenLogs schließen, Backup

PreToolUse ist der einzige Hook, der eine Aktion blockieren kann: Exit-Code 2 stoppt den Tool-Call, Exit-Code 0 lässt ihn durch.

Hook konfigurieren

Hooks leben in .claude/settings.json – pro Event ein Eintrag mit Matcher-Regex und Hook-Liste:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": ".claude/hooks/protect-secrets.sh"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "prettier --write $CLAUDE_FILE_PATHS",
            "async": true
          }
        ]
      }
    ]
  }
}

Der Matcher ist eine Regex auf den Tool-Namen – Edit|Write greift bei beiden, .* bei allem.

HINWEIS

Seit Februar 2026 gibt es zusätzlich HTTP-Hooks – Claude POSTet das Event an eine URL, dein Backend antwortet mit Allow/Block. Praktisch für Team-weite Policies, die zentral aktualisiert werden sollen.

Security-Gate: PreToolUse zum Schutz von Secrets

Ein simples, mächtiges Pattern: niemals .env-Dateien oder Migrationen editieren lassen.

#!/bin/bash
# .claude/hooks/protect-secrets.sh

# Hook bekommt JSON via stdin
INPUT=$(cat)
PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

if echo "$PATH" | grep -qE '\.env$|/migrations/|secrets\.yaml'; then
  echo "BLOCKED: $PATH ist geschützt" >&2
  exit 2  # Block
fi
exit 0  # Allow

Exit-Code 2 → Claude bekommt die Fehlermeldung und versucht den Edit nicht erneut.

Verstehen Warum deterministisch der Kernpunkt ist

Wenn du eine Regel in CLAUDE.md schreibst („niemals .env editieren”), kann Claude sie übersehen, vergessen oder durch eine geschickte Folge-Anweisung umgehen. Ein Hook ist Shell-Code, der immer läuft – er hängt nicht davon ab, ob das LLM die Regel im Kontext hat. Genau das macht Hooks zum richtigen Werkzeug für Sicherheit und Compliance.

Auto-Format mit PostToolUse

Nach jedem Edit den Formatter laufen lassen – ohne Claude zu bremsen:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "prettier --write \"$CLAUDE_FILE_PATHS\" 2>/dev/null",
            "async": true
          }
        ]
      }
    ]
  }
}

"async": true lässt den Befehl im Hintergrund laufen – Claude wartet nicht, du gewinnst Geschwindigkeit.

Hook anlegen – Schritt für Schritt

1

Event identifizieren

Welcher Lifecycle-Moment ist relevant? PreToolUse für Gates, PostToolUse für Reaktionen, SessionStart für Setup.

2

Matcher festlegen

Welche Tools sollen den Hook auslösen? `Edit|Write` für Datei-Änderungen, `Bash` für Shell-Befehle, `.*` für alles.

3

Shell-Skript schreiben

Lege `.claude/hooks/.sh` an, mache es ausführbar (`chmod +x`). Das Skript bekommt JSON via stdin (Tool-Input, Tool-Response bei PostToolUse).

Tipp Nutze `jq` zum Parsen – das ist die robusteste Variante. Niemals `eval` auf User-Input.
4

Exit-Code setzen

Bei PreToolUse: `exit 0` erlaubt, `exit 2` blockiert. Bei anderen Events egal. stderr wird an Claude weitergegeben – nutze das für klare Fehlermeldungen.

5

In settings.json registrieren

Hook unter `.claude/settings.json` eintragen. Projekt-Scope macht das Setup mit `git` teilbar.

6

Testen

Eine passende Aktion in Claude Code auslösen und prüfen, ob der Hook feuert. `claude --debug` zeigt Hook-Ausführungen im Log.

Quick Check

Welches Lifecycle-Event ist das richtige, um zu verhindern, dass Claude eine `.env`-Datei editiert?

Gut vs. Schlecht
Eine Regel `niemals .env editieren` in CLAUDE.md schreiben und sich darauf verlassen.
Die gleiche Regel als PreToolUse-Hook implementieren – dann hält sie deterministisch, auch wenn das Modell die Anweisung übersieht.

CLAUDE.md ist Kontext fürs Modell – kann übersehen oder umgangen werden. Hooks sind Shell-Code, der immer läuft. Für Sicherheit immer Hooks.

Typische Fehler

  • Hook ohne Async: Ein synchroner npm run lint nach jedem Edit verlangsamt Claude spürbar. Setze async: true, wenn die Reaktion nicht blockend sein muss.
  • Matcher zu weit: Ein Matcher .* auf PreToolUse betrifft auch Read-Operationen – das ist meist nicht gewollt. Sei spezifisch (Edit|Write|Bash).
  • Exit-Code missverstanden: Exit-Code 2 ist nur bei PreToolUse Block-Signal. Bei PostToolUse ist es einfach ein Fehler ohne Block.
  • Hook nicht ausführbar: chmod +x vergessen → Hook scheitert mit Permission Denied. Im Setup-Skript fest verdrahten.
  • Hooks für intelligente Entscheidungen: Hooks sind dumm und deterministisch. Wenn du „Entscheide, ob diese Migration sicher ist” willst, brauchst du einen Subagent, keinen Hook.

Mini-Übung

Baue einen Audit-Log-Hook für Bash-Befehle:

  1. Lege .claude/hooks/audit-bash.sh an
  2. Inhalt: echo "$(date -Iseconds) $(echo $(cat) | jq -r '.tool_input.command')" >> .claude/audit.log
  3. chmod +x .claude/hooks/audit-bash.sh
  4. In .claude/settings.json als PostToolUse mit Matcher Bash registrieren, async: true
  5. Claude ein paar Bash-Befehle ausführen lassen
  6. cat .claude/audit.log – du siehst ein lückenloses Protokoll

Nächster Schritt

Du weißt jetzt, wie du Claude Codes Verhalten deterministisch steuerst. Als Nächstes: Wenn dein Setup wächst, lohnt sich der Guide Plugins und Marketplace – denn Plugins bündeln Skills, Hooks und MCP-Server zu wiederverwendbaren Paketen, die du installieren und teilen kannst.

Lerncoach regelbasiert
Sofort-Hilfe aus dem Inhalt dieser Seite.
War das hilfreich?
Guide abgeschlossen
Damit kannst du jetzt: Hooks in `.claude/settings.json` konfigurieren – PreToolUse blockt, PostToolUse reagiert. Deterministisch, ohne LLM-Call, ohne Kosten.
Lernstatus 20 von 25 Guides
Neu → In Arbeit → Verstanden → Praxis

Gelesen?
Dann anwenden.

Wissen testen, Entscheidungen trainieren oder den nächsten Guide starten.

Esc

Wonach suchst du?

Begriffe wie MCP, Prompt, Desktop oder Haiku probieren.