Ga naar hoofdinhoud
AcademytutorialWorkstation Setup leerlijn — Deel 3: Claude Code installeren en configureren

Workstation Setup leerlijn — Deel 3: Claude Code installeren en configureren

Claude Code in VS Code, inloggen, en de verplichte global settings en safety hooks die destructieve shell-commando's onderscheppen voordat ze draaien. Kort maar belangrijk — Claude Code draaien zonder deze hooks is hoe mensen per ongeluk hun eigen repo wissen. Derde van zes korte modules.

TutorialWorkstationClaude CodeHooksSettingsSafetyTutorial series
14 min read

Met de runtimes uit Deel 2 op zijn plek wordt het tijd voor de AI-pair-programmer waar we daadwerkelijk mee werken: Claude Code. Dit deel behandelt de installatie, het inloggen, en — het stuk dat je niet moet overslaan — de verplichte global settings en safety hooks die voorkomen dat Claude zonder jouw goedkeuring destructieve shell-commando's draait. Kort deel, belangrijk deel.

Stap 1: installeer de Claude Code-extensie

In je WSL-gekoppelde VS Code-venster:

  1. Ctrl+Shift+X om Extensions te openen.
  2. Zoek naar Claude Code van Anthropic.
  3. Klik Install.

Of vanuit de WSL-terminal:

code --install-extension anthropic.claude-code

Je hebt dit waarschijnlijk al uit Deel 2 (hij stond in de extensie-lijst). Zo ja, controleer dan even of hij in de sidebar verschijnt.

Stap 2: inloggen

Open het Claude Code-paneel via de VS Code-sidebar (het kleine Claude-icoon). Klik Sign in en volg de OAuth-flow in je browser. Zodra je ingelogd bent, toont het paneel rechtsonder je subscription-tier.

Werk je vanaf de terminal? Draai dan claude auth login. Dit heb je nodig als je de claude CLI wil gebruiken voor skills zoals /opsx-apply-loop die in Docker-containers draaien. Optioneel voor nu; kom hier op terug als je je er prettig bij voelt.

Probeer een snelle test-prompt: vraag Claude iets simpels zoals "wat is de huidige directory?" en bevestig dat je een antwoord krijgt. Krijg je een permission-prompt voor een Bash-commando — dat is het eerste teken dat de safety hooks nog niet geïnstalleerd zijn. Keur niets destructiefs goed; rond eerst de volgende stappen af.

Stap 3: clone de .github repo

De global settings leven in de canonieke Conduction/.github repo op Codeberg. Clone hem eenmalig:

mkdir -p ~/code/conduction
cd ~/code/conduction
git clone [email protected]:Conduction/.github.git
cd .github

Nog geen SSH-sleutel? Deel 2 — Codeberg auth loopt je erdoorheen. Als terugval kun je ook over HTTPS clonen: git clone https://codeberg.org/Conduction/.github.git — werkt zonder auth, maar je kunt dan niet pushen.

Je hoeft dit maar één keer te clonen — de version-check hook haalt daarna updates op via de GitHub API (de settings-repo is gemirrord van Codeberg naar ConductionNL/.github op GitHub zodat de hook blijft werken), dus geen extra git pull nodig.

Stap 4: installeer de global settings + hooks

Vanuit de gekloonde .github repo:

REPO_ROOT="$(pwd)"

mkdir -p ~/.claude/hooks

cp "$REPO_ROOT/global-settings/settings.json" ~/.claude/settings.json
cp "$REPO_ROOT/global-settings/block-write-commands.sh" ~/.claude/hooks/block-write-commands.sh
cp "$REPO_ROOT/global-settings/block-config-tool-writes.sh" ~/.claude/hooks/block-config-tool-writes.sh
cp "$REPO_ROOT/global-settings/check-settings-version.sh" ~/.claude/hooks/check-settings-version.sh
chmod +x ~/.claude/hooks/*.sh

cp "$REPO_ROOT/global-settings/VERSION" ~/.claude/settings-version
echo "$REPO_ROOT" > ~/.claude/settings-repo-path

# Online version checking via GitHub API (recommended — no local repo required):
cp "$REPO_ROOT/global-settings/settings-repo-url.example" ~/.claude/settings-repo-url

Dat is de werkende set. Wat heb je net geïnstalleerd?

BestandWat het doet
~/.claude/settings.jsonDe user-level permissions-allowlist — welke commando's Claude mag draaien zonder te vragen, welke goedkeuring nodig hebben, welke geblokkeerd zijn. Plus verwijzingen naar de twee hooks hieronder.
~/.claude/hooks/block-write-commands.shDe grote. Draait voor elke Bash-tool-aanroep. Detecteert write/destructieve commando's (rm, mv, git push --force, chmod, etc.) en vraagt om expliciete goedkeuring.
~/.claude/hooks/block-config-tool-writes.shDraait voor elke Write/Edit/MultiEdit-aanroep. Weigert elke tool die naar ~/.claude/ probeert te schrijven of een script wil produceren dat dat doet. Beschermt de hooks zelf tegen stilzwijgend herschreven worden.
~/.claude/hooks/check-settings-version.shDraait bij session-start. Vergelijkt jouw geïnstalleerde versie met ConductionNL/.github en waarschuwt je als je achterloopt.
~/.claude/settings-repo-urlDe repo-slug die de version-check gebruikt om de canonieke versie op te halen (ConductionNL/.github).

Volg je een niet-standaard branch? Kopieer settings-repo-ref.example naar ~/.claude/settings-repo-ref en zet je branch/tag/SHA erin. Voor de meeste developers is de default — main — goed.

Stap 5: lock de hooks met chattr +i

Dit is de laag die geen enkel Claude-commando kan omzeilen. Zelfs als elke andere bescherming faalt — een hook wordt uitgeschakeld, een permission wordt per ongeluk goedgekeurd — weigert de kernel de write:

sudo chattr +i ~/.claude/settings.json ~/.claude/hooks/*.sh ~/.claude/settings-version

chattr +i zet de immutable-bit op Linux-bestandssystemen. Hierna kan alleen sudo chattr -i (wat Claude niet kan draaien zonder je te prompten) hem nog vrijgeven.

chattr niet ondersteund? De Conduction-setup gaat uit van WSL2 op het standaard ext4-bestandssysteem, dat chattr +i ondersteunt. Werkt jouw omgeving daar niet mee (sommige niet-ext4 bestandssystemen geven Operation not supported), sla deze stap dan over — de hook-lagen uit Stap 4 verdedigen nog steeds in de diepte. De kernel-laag is de sterkste van de vier, dus als je chattr kunt draaien, doe dat dan.

Stap 6: herstart Claude Code

De hooks registreren bij session-start. Herstart Claude Code — Ctrl+Shift+P"Developer: Reload Window" in VS Code is een snelle manier — en start een nieuwe sessie.

Bij de volgende session-start zou Claude's eerste bericht zoiets als dit moeten bevatten:

New session started — Global Claude Settings checked. Settings are up to date (v1.7.0).

Zie je in plaats daarvan UPDATE REQUIRED, dan loopt je geïnstalleerde versie achter op main. Om te updaten:

sudo chattr -i ~/.claude/settings.json ~/.claude/hooks/*.sh ~/.claude/settings-version

Vraag dan aan Claude "update my global settings to <version>" — die haalt de nieuwe bestanden vanaf GitHub. Daarna opnieuw locken:

sudo chattr +i ~/.claude/settings.json ~/.claude/hooks/*.sh ~/.claude/settings-version

Wat is het verschil tussen global en project settings?

Een veelvoorkomende verwarring. Twee lagen:

LaagStaat opDektWie onderhoudt het
Global (user-level)~/.claude/settings.json + ~/.claude/hooks/Safety-beleid op jouw machine. Read-first, write-with-approval. Geldt voor elk project dat je opent.Jij — maar vanuit de canonieke Conduction-templates. Versioned in Conduction/.github op Codeberg (gemirrord naar ConductionNL/.github op GitHub voor de version-check hook).
Project-level.claude/settings.json in elke repoProject-specifieke allowlist — welke MCP-servers aan moeten, welke Bash-commando's vooraf zijn goedgekeurd voor de tests van dit project.De project-maintainers; gecommit in de repo.

De twee vullen elkaar aan. Project-settings kunnen specifieke commando's voor de tests van dat project pre-approven; ze kunnen het global write-approval-beleid niet versoepelen. Probeert een project rm -rf zonder prompt toe te staan, dan vangt de global hook hem nog steeds op.

Welke hooks worden aangeraden, en wat doen ze?

De standaard Conduction-install levert drie hooks. In één zin per stuk:

  • block-write-commands.sh — elk Bash-commando dat Claude wil draaien wordt eerst gecheckt. Destructieve of write-class commando's (rm, mv, chmod, git push --force, npm publish, etc.) triggeren een approval-prompt; veilige read-only commando's gaan stilletjes door.
  • block-config-tool-writes.sh — elke Write/Edit/MultiEdit die Claude probeert wordt eerst gecheckt. Ligt het doel binnen ~/.claude/, of zou de inhoud een script aanmaken dat naar ~/.claude/ schrijft, dan weigert de hook. Dit voorkomt dat Claude stilzwijgend zijn eigen safety net uitschakelt.
  • check-settings-version.sh — draait eenmalig bij session-start. Vergelijkt je geïnstalleerde versie met de canonieke repo en vertelt je (in de chat) of je up-to-date bent.

De eerste twee zijn het safety net. De derde is de hartslag die dat safety net actueel houdt.

Probleemoplossing

Session-start-paneel meldt 'CONFIGURATION ERROR'

Lees de foutregel direct onder het paneel. Meest voorkomende oorzaken: gh niet geauthenticeerd (draai gh auth login), jq niet geïnstalleerd (sudo apt install jq), of ~/.claude/settings-repo-url ontbreekt (kopieer opnieuw vanuit global-settings/settings-repo-url.example).

chattr: Operation not supported

Je bestandssysteem ondersteunt de immutable-attribute mogelijk niet (ext4 binnen WSL2 wel; sommige niet-ext4 bestandssystemen niet). Sla de immutable-lock-stap over — de hook-laag uit Stap 4 verdedigt nog steeds in de diepte.

Claude bood aan om rm -rf te draaien en er kwam geen approval-prompt

De hooks zijn niet geladen. Bevestig dat de bestanden bestaan (ls -la ~/.claude/hooks/), executable zijn (chmod +x), en dat Claude Code na de install opnieuw is opgestart. Werkt het dan nog steeds niet, draai Stap 4 opnieuw — kans is groot dat settings.json niet is gekopieerd.

Session-start-regel meldt een nieuwe sessie maar er staat geen versienummer in

Het versiebestand ontbreekt. Draai cat ~/.claude/settings-version — is hij leeg, kopieer dan opnieuw vanuit global-settings/VERSION in de gekloonde repo.

Test jezelf

Vijf korte vragen om te checken of je dit deel begrepen hebt. Vastgelopen? Klik Hint. Curieus naar het antwoord? Klik Antwoord.

1. Wat is het verschil tussen global en project-level Claude settings, en waarom hebben we ze allebei nodig?

Hint

Waar elk staat, wat elk regelt, en hoe ze zich tot elkaar verhouden als ze allebei aanwezig zijn.

Antwoord

Global settings staan op ~/.claude/settings.json + ~/.claude/hooks/. Ze definiëren het safety-beleid op jouw machine en gelden voor elk project dat je opent. De Conduction global settings (verplicht) handhaven read-first, write-with-approval-gedrag.

Project settings staan op .claude/settings.json in elke repo. Ze definiëren project-specifieke toestemmingen: welke MCP-servers aan moeten, welke test-commando's vooraf zijn goedgekeurd, welke bestandspaden read-only zijn voor dat project.

Ze vullen elkaar aan. Project-settings kunnen commando's pre-approven die het global beleid ook toestaat; ze kunnen het global write-approval-beleid niet versoepelen. De global hook draait altijd als eerste.

2. De Conduction global-settings-install levert twee enforcement-hooks, niet één: block-write-commands.sh en block-config-tool-writes.sh. Waarom allebei? Wat vangt elk op dat de ander mist?

Hint

De twee hooks werken op verschillende Claude-tool-aanroepen. Eén bewaakt de Bash-tool; de ander bewaakt de file-write-tools. Denk na over wat elke tool wel en niet kan.

Antwoord
  • block-write-commands.sh onderschept elke Bash-aanroep. Hij vangt Claude op die rm -rf, git push --force, chmod, npm publish, etc. wil draaien — alles destructiefs dat via een shell loopt.
  • block-config-tool-writes.sh onderschept elke Write/Edit/MultiEdit-aanroep. Hij vangt Claude op die direct naar ~/.claude/ wil schrijven (bijvoorbeeld zijn eigen hooks uitschakelen) of een script wil produceren dat dat later doet.

Wat elk opvangt dat de ander mist: een Bash-commando kan bestanden rm'en maar kan geen Write-tool-aanroep doen. Een Write-tool kan ~/.claude/settings.json direct bewerken zonder ooit een shell-commando te draaien. Bestond alleen de Bash-hook, dan kon Claude het safety net herschrijven zonder Bash aan te roepen. Bestond alleen de Write-hook, dan kon Claude je repo rm -rf'en zonder een bestand te bewerken. Beide zijn nodig omdat Claude twee aparte routes naar een destructieve actie heeft.

3. Waarom gebruikt Stap 5 chattr +i bovenop de hooks, en wat is de trade-off?

Hint

Defense in depth — wat garandeert de kernel dat een in-process hook niet kan?

Antwoord

chattr +i zet de immutable-bit op kernel-niveau. Eenmaal gezet kan geen enkel proces — inclusief welk Claude-commando dan ook — naar die bestanden schrijven totdat sudo chattr -i hem vrijgeeft. Dat is de enige laag die geen in-process hook kan omzeilen.

De trade-off: wanneer een legitieme update wel nodig is, moet je eerst sudo chattr -i, en daarna opnieuw locken met sudo chattr +i. Een kleine frictie-belasting in ruil voor de garantie dat het safety net zelf niet stilzwijgend herschreven kan worden.

4. Je hebt net de global hooks geïnstalleerd en Claude Code herstart. Wat is de snelste manier om te bevestigen dat de Bash-hook daadwerkelijk onderschept — zonder te wachten tot Claude spontaan iets destructiefs voorstelt?

Hint

Twee dingen om naar te kijken bij session-start, en één ding dat je Claude kunt laten doen dat onschuldig is maar wel de hook triggert.

Antwoord

Twee bevestigingen:

  1. Session-start-bericht. Claude's eerste bericht moet "Global Claude Settings checked. Settings are up to date" bevatten. Ontbreekt die regel, dan is de version-check-hook niet geladen — wat betekent dat de write-blocker waarschijnlijk ook mist.
  2. Lok bewust een approval-prompt uit. Vraag Claude iets onschuldigs dat een write-class commando raakt, bijvoorbeeld "check of rm in mijn PATH staat" — de hook moet de Bash-aanroep onderscheppen en om goedkeuring vragen. Wijs de prompt af; je wilde alleen zien dat de onderschepping afgaat.

Verschijnt de prompt niet, dan is de hook niet geladen — ga terug naar Stap 4 en bevestig dat ~/.claude/settings.json echt gekopieerd is en de hooks correct refereert.

5. Claude biedt aan om rm -rf ./node_modules te draaien en het commando draait meteen — er verschijnt geen approval-prompt. Wat zegt dat je, en wat check je als eerste?

Hint

De hook-laag hoort precies dit op te vangen. Deed hij dat niet, dan is één van drie dingen waar — en maar één daarvan is "alles in orde".

Antwoord

Het zegt je dat de Bash-hook niet gedraaid heeft. Drie mogelijkheden, in volgorde van waarschijnlijkheid:

  1. De hook is niet geïnstalleerd. Draai ls -la ~/.claude/hooks/ en bevestig dat block-write-commands.sh bestaat en executable is (+x). Ontbreekt hij, draai Stap 4 opnieuw.
  2. ~/.claude/settings.json refereert niet aan de hook. De hook draait alleen als settings.json hem registreert. Open het bestand en bevestig dat het PreToolUse-blok naar block-write-commands.sh wijst.
  3. Claude Code is gestart voordat de hooks geïnstalleerd waren. Hooks laden bij session-start. Herlaad het VS Code-venster (Ctrl+Shift+P → "Developer: Reload Window") en probeer opnieuw.

Totdat één van die drie is gefixt, draai je Claude effectief zonder safety net. Schuif dit niet weg als eenmalig — onderzoek het voor je verder gaat.

Volgende stap

Claude Code is bedraad en het safety net ligt. Tijd om Claude direct toegang te geven tot de Conduction-systemen via de MCP-server.