Zum Inhalt springen

Praxis-Rezepte

Wissen

Fertige Hook-Konfigurationen zum Kopieren

Die folgenden Rezepte kannst du direkt in deine .claude/settings.json übernehmen. Jedes löst ein konkretes Problem -- deterministisch und zuverlässig.

Auto-Format nach jeder Änderung

Problem: Claude formatiert Code manchmal inkonsistent -- besonders bei großen Änderungen oder wenn der Context voll ist.

Lösung: PostToolUse-Hook auf Edit und Write.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write $TOOL_INPUT_FILE_PATH && npx eslint --fix $TOOL_INPUT_FILE_PATH"
          }
        ]
      }
    ]
  }
}

Ergebnis: Jede Datei, die Claude ändert oder erstellt, wird sofort formatiert und gelintet. Kein manuelles Nacharbeiten mehr.

*Performance-Tipp

Prettier und ESLint auf einzelne Dateien sind schnell (unter 1 Sekunde). Der Overhead ist minimal, aber der Qualitätsgewinn enorm.

Tests vor jedem Commit

Problem: Claude commitet manchmal Code, der Tests bricht -- besonders bei komplexen Refactorings.

Lösung: PreToolUse-Hook mit if-Filter auf git commit.

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "if": "Bash(git commit*)",
        "hooks": [
          {
            "type": "command",
            "command": "npm test 2>&1; if [ $? -ne 0 ]; then echo 'Tests fehlgeschlagen -- Commit blockiert.' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}

Ergebnis: Kein Commit geht durch, wenn Tests fehlschlagen. Claude bekommt das Feedback und fixt die Fehler automatisch.

!Exit-Code 2 ist entscheidend

Ohne exit 2 würde der Commit trotz fehlgeschlagener Tests durchgehen. Exit-Code 2 blockiert die Aktion und gibt Claude das Feedback über stderr.

TypeScript-Check nach Dateiänderungen

Problem: Claude erzeugt manchmal Type-Fehler, die erst beim Build auffallen.

Lösung: PostToolUse-Hook auf Write für TypeScript-Dateien.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "if echo $TOOL_INPUT_FILE_PATH | grep -q '\\.tsx\\?$'; then npx tsc --noEmit 2>&1 | head -20; fi"
          }
        ]
      }
    ]
  }
}

Ergebnis: Type-Fehler werden sofort sichtbar, nicht erst beim nächsten Build. Claude sieht die Fehler im Context und kann sie direkt beheben.

Security-Scan nach neuen Abhängigkeiten

Problem: Neue npm-Pakete können bekannte Sicherheitslücken mitbringen.

Lösung: PostToolUse-Hook auf Write, der bei package.json-Änderungen einen Audit ausführt.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "if echo $TOOL_INPUT_FILE_PATH | grep -q 'package.json'; then npm audit --audit-level=high 2>&1; if [ $? -ne 0 ]; then echo 'Security-Vulnerabilities gefunden!' >&2; exit 2; fi; fi"
          }
        ]
      }
    ]
  }
}

Ergebnis: Sicherheitslücken werden früh erkannt -- bevor der Code in Produktion geht.

Kontext nach Compact wiederherstellen

Problem: Nach einer Context-Komprimierung vergisst Claude wichtige Projekt-Details, die in CLAUDE.md stehen, aber im komprimierten Kontext verloren gehen.

Lösung: PostCompact-Hook, der kritische Informationen wieder injiziert.

{
  "hooks": {
    "PostCompact": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "cat .claude/post-compact-context.md"
          }
        ]
      }
    ]
  }
}

Erstelle dazu eine Datei .claude/post-compact-context.md mit den wichtigsten Projekt-Infos:

## Kritischer Projekt-Kontext (nach Compact)
- Wir arbeiten an Feature X auf Branch feature/xyz
- Architektur: Next.js 15 App Router + Zustand
- NICHT ändern: src/lib/auth.ts (wird von anderem Team bearbeitet)
- Aktuelle Aufgabe: [wird manuell aktualisiert]

*Post-Compact-Context klein halten

Die Datei sollte kurz und präzise sein -- maximal 20-30 Zeilen. Zu viel Kontext nach einem Compact ist kontraproduktiv, weil der Compact ja gerade Platz schaffen soll.

Desktop-Notification wenn Claude wartet

Problem: Claude ist fertig oder wartet auf Eingabe, aber du bist in einem anderen Fenster.

Lösung: Notification-Hook mit betriebssystemspezifischem Befehl.

{
  "hooks": {
    "Notification": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Claude Code wartet auf dich!\" with title \"Claude Code\"'"
          }
        ]
      }
    ]
  }
}

iPlattform-spezifisch

Das Beispiel nutzt osascript für macOS. Für Linux nutze notify-send "Claude Code wartet auf dich!", für Windows powershell -Command "New-BurntToastNotification -Text 'Claude Code wartet auf dich!'".

Verstehen

Hooks kombinieren

Die wahre Stärke von Hooks zeigt sich in der Kombination. Eine typische Projekt-Konfiguration sieht so aus:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "npx prettier --write $TOOL_INPUT_FILE_PATH" },
          { "type": "command", "command": "npx eslint --fix $TOOL_INPUT_FILE_PATH" }
        ]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Bash",
        "if": "Bash(git commit*)",
        "hooks": [
          { "type": "command", "command": "npm test" }
        ]
      },
      {
        "matcher": "Bash",
        "if": "Bash(git push*--force*)",
        "hooks": [
          { "type": "command", "command": "echo 'Force-push blockiert!' >&2 && exit 2" }
        ]
      }
    ],
    "PostCompact": [
      {
        "hooks": [
          { "type": "command", "command": "cat .claude/post-compact-context.md" }
        ]
      }
    ]
  }
}

Diese Konfiguration stellt sicher: Code ist immer formatiert, Tests laufen vor jedem Commit, Force-Pushes sind unmöglich, und nach einem Compact geht kein Kontext verloren.

Anwenden

Starte mit einem einzigen Hook -- zum Beispiel dem Auto-Format-Hook. Überzeuge dich, dass er funktioniert, und füge dann schrittweise weitere hinzu. Jeder Hook, den du einfügst, ist eine Garantie weniger, über die du nachdenken musst.

*Debugging-Tipp

Wenn ein Hook nicht wie erwartet funktioniert, teste den Command zuerst manuell im Terminal. Die häufigsten Fehler: falscher Pfad, fehlende Berechtigung oder fehlendes Tool (z.B. Prettier nicht installiert).

Reflektieren

Hooks verwandeln "Ich hoffe, Claude macht es richtig" in "Ich weiß, dass es richtig läuft." Das ist ein fundamentaler Unterschied in der Zusammenarbeit mit KI-Agenten: Du gibst Freiheit bei der Lösung, aber setzt harte Grenzen bei der Qualität. Dieses Prinzip -- kreative Freiheit innerhalb fester Leitplanken -- ist der Schlüssel zu produktiver Arbeit mit Claude Code.