Als je al een tijdje met Claude Code werkt, gebruik je waarschijnlijk een claude.md bestand om het model project-specifieke instructies te geven. Je zou het bijvoorbeeld kunnen vertellen om "altijd Prettier te draaien na het bewerken van een bestand."
En meestal zal het precies dat doen. Maar soms... ook niet. Het blijft een AI, geen strikte state machine, wat betekent dat gehoorzaamheid waarschijnlijk is, maar niet gegarandeerd.
Als iets elke keer zonder uitzondering moet gebeuren, zet je het niet in een prompt. Je zet het in een hook.
Wat zijn Hooks?
Hooks laten je lokale shell-commando's uitvoeren op specifieke momenten in de levenscyclus van Claude Code. Het grote verschil tussen een hook en een prompt-instructie is dat hooks deterministisch zijn. Ze worden gegarandeerd uitgevoerd.
Hooks configureer je in je .claude/settings.json bestand. Omdat het configuraties op projectniveau zijn, kun je ze vastleggen in je repository (commit). Zo zorg je ervoor dat je hele team dezelfde geautomatiseerde workflow deelt.
Levenscyclus Events
Bij het configureren van een hook kies je een event dat als trigger dient. Claude Code ondersteunt verschillende events:
- userPromptSubmit: Draait onmiddellijk wanneer je een prompt indient, nog voordat Claude het verwerkt.
- preToolUse: Draait vlak voordat een tool wordt uitgevoerd.
- postToolUse: Draait direct nadat een tool zijn taak heeft voltooid.
- notification: Draait wanneer Claude een melding naar de gebruiker stuurt.
- stop: Draait wanneer Claude klaar is met reageren en de interactie is afgerond.
Je kunt optioneel een matcher definiëren om de hook te beperken tot specifieke tools (bijv. alleen laten draaien bij edit of bash tools).
De Auto-Formatter: Post-Tool Hooks
De meest voorkomende toepassing voor hooks is het afdwingen van code-formattering. In plaats van te hopen dat Claude eraan denkt het bestand te formatteren na een aanpassing, kun je een postToolUse hook gebruiken.
Door de matcher in te stellen op edit of multi-edit, vuurt de hook elke keer als Claude een bestand wijzigt. Je kunt het script van de hook zo configureren dat het de bestandsextensie controleert en de juiste formatter draait—Prettier voor TypeScript, gofmt voor Go, of Ruff voor Python.
Harde Regels Afdwingen: Pre-Tool Hooks
Waar post-tool hooks ideaal zijn voor opruimwerkzaamheden, bieden pre-tool hooks een mechanisme voor veiligheid en compliance. Pre-tool hooks kunnen Claude daadwerkelijk blokkeren bij het uitvoeren van een tool.
Wanneer een pre-tool hook vuurt, ontvangt het de naam van de tool en de input als JSON op stdin. Het hook-script kan vervolgens de payload inspecteren en een beslissing nemen:
- Exit code 0: Ga door met de uitvoering van de tool.
- Exit code 2: Blokkeer de uitvoering van de tool.
Als je de uitvoering blokkeert, wordt alles wat je naar stderr print direct teruggekoppeld naar Claude. Dit betekent dat Claude begrijpt waarom het geblokkeerd is en zijn aanpak kan aanpassen.
Dit is hoe je niet-onderhandelbare regels afdwingt:
- Blokkeer schrijfacties naar een productie-configuratiemap.
- Blokkeer bash-commando's die
rm -rfbevatten. - Log alle uitgevoerde commando's voor compliance-doeleinden.
Omgeving en Uitvoering
Wanneer je hook-scripts schrijft, vertrouw dan op de CLAUDE_PROJECT_DIR omgevingsvariabele. Dit zorgt ervoor dat je scripts correct draaien, ongeacht wat de huidige werkmap van Claude is op het moment dat de hook vuurt.
Sla je complexe hook-scripts op binnen je repository (bijvoorbeeld in een .claude/hooks/ map) en refereer ernaar in je settings.json.
Stop met Suggereren, Begin met Garanderen
Hooks geven je de deterministische controle die prompts simpelweg niet kunnen bieden. Gebruik postToolUse voor formattering en logging, en gebruik preToolUse om gevaarlijke operaties te blokkeren.
Configureer ze eenmalig, commit ze in je repo, en laat je team een veiligere, betrouwbaardere AI-programmeeromgeving erven.