Klaudiusz koduje
Workflow i produktywność

Hooks w Claude Code — deterministyczna automatyzacja, której CLAUDE.md nie zapewni

CLAUDE.md to dobre narzędzie, ale Claude stosuje je w ~80% przypadków. Hooks działają w 100% — zawsze, niezależnie od sesji. Jak skonfigurować hooki do lintingu, formatowania i innych automatycznych akcji.


Jest pewna różnica, o której mało kto mówi wprost: CLAUDE.md to zbiór instrukcji, które Claude stara się przestrzegać. Kluczowe słowo: stara. Estymacja z doświadczeń społeczności to ~80% przestrzegania — Claude może zignorować regułę z CLAUDE.md, jeśli kontekst sesji skieruje go gdzie indziej, lub jeśli instrukcja koliduje z czymś innym.

Hooks działają inaczej. Zawsze. 100%. Niezależnie od tego, co Claude myśli o sytuacji.

Czym są hooks w Claude Code

Hooks to skrypty powłoki (shell commands) skonfigurowane w pliku ustawień Claude Code, które uruchamiają się automatycznie w odpowiedzi na zdarzenia w sesji. Zdarzenie może być dowolne: Claude zakończył edycję pliku, sesja się uruchomiła, Claude zatwierdził zmianę.

Kluczowa właściwość: hook to zewnętrzny proces. Claude go nie interpretuje, nie ocenia, nie może go pominąć. Jeśli hook jest skonfigurowany — wykona się.

Zdarzenieskryptlint • format
Schemat porównujący CLAUDE.md i hooks.

Jak skonfigurować hooks

Hooki konfiguruje się w pliku .claude/settings.json w katalogu projektu (lub globalnie w ~/.claude/settings.json). Struktura jest prosta:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "npm run lint --fix"
          }
        ]
      }
    ]
  }
}

Ten przykład uruchamia linter automatycznie po każdej edycji pliku przez Claude’a. Bez pytania, bez czekania na zatwierdzenie — po prostu się wykonuje.

Dostępne zdarzenia (eventy)

Claude Code obsługuje kilka typów zdarzeń dla hooks:

  • PreToolUse — przed użyciem narzędzia (np. przed edycją pliku)
  • PostToolUse — po użyciu narzędzia (najczęściej używane)
  • Notification — gdy Claude wysyła powiadomienie
  • Stop — gdy sesja kończy pracę

PostToolUse z matcherem Edit|Write to najpopularniejsza kombinacja — uruchamia się po każdej zmianie pliku.

Praktyczne przykłady hooks

Automatyczny lint i format po edycji:

"command": "npx eslint --fix && npx prettier --write"

Uruchomienie testów po zmianach w plikach testowych:

{
  "matcher": "Edit",
  "hooks": [{ "type": "command", "command": "npm test -- --watchAll=false" }]
}

Powiadomienie dźwiękowe gdy sesja się kończy (przydatne przy długich zadaniach):

{
  "event": "Stop",
  "hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Glass.aiff" }]
}

Automatyczny commit po zakończeniu zadania:

{
  "event": "Stop",
  "hooks": [{ "type": "command", "command": "git add -A && git commit -m 'auto: claude session'" }]
}

CLAUDE.md vs hooks — kiedy co

Oba mechanizmy są potrzebne, ale służą różnym celom:

CLAUDE.md — dla zasad kontekstowych i stylowych, które wymagają interpretacji. „Preferuj async/await nad Promise chains.” „Komentarze po polsku.” „Nie modyfikuj plików w src/generated/.” Claude rozumie te instrukcje i stosuje je z rozsądkiem.

Hooks — dla akcji deterministycznych, które muszą się wykonać zawsze. Linting, formatowanie, uruchamianie testów, powiadomienia, automatyczne commity. Żadnego „zazwyczaj” ani „w większości przypadków” — albo hook się wykona, albo sesja nie będzie mogła kontynuować (jeśli tak skonfigurujesz).

Hooks jako siatka bezpieczeństwa

Jedna z najbardziej wartościowych kombinacji: hook uruchamiający testy przed zakończeniem sesji. Nawet jeśli Claude zapomni o testach w trakcie pracy — hook je uruchomi na koniec. Jeśli testy nie przejdą, możesz skonfigurować hook tak, żeby blokował zakończenie sesji.

To jest właśnie deterministyczna automatyzacja: nie polegasz na tym, że Claude pamięta o testach. Wbudujesz to w infrastrukturę sesji.