Hoppa till innehållet
aicoach.se

Hooks och subagenter i Claude Code

Hooks kör era kommandon automatiskt vid rätt tillfälle. Subagenter tar hand om deluppgifter i ett eget sammanhang. Så använder ni båda.

6 min läsning

Hooks och subagenter löser två olika problem. En hook är ett kommando som Claude Code kör automatiskt vid en viss händelse, till exempel efter varje filändring, så att det alltid blir gjort. En subagent är en separat Claude-assistent som tar hand om en deluppgift i ett eget sammanhang och bara lämnar tillbaka en sammanfattning. Hooks ger er kontroll, subagenter ger er avlastning.

Hooks: det som alltid ska hända

Det som står i CLAUDE.md är vägledning. Claude följer det nästan alltid, men det finns ingen garanti. En hook är annorlunda. Den körs av Claude Code själv, inte av Claude, så den körs varje gång händelsen inträffar, oavsett vad Claude tycker.

Hooks läggs i en inställningsfil, och var filen ligger avgör vem de gäller för:

  • .claude/settings.json i projektet. Den kan checkas in i git, så hela teamet får samma hooks.
  • .claude/settings.local.json gäller bara dig i det här projektet.
  • ~/.claude/settings.json gäller i alla dina projekt.

Varje hook kopplas till en händelse. Det finns många, men de här räcker långt:

HändelseNär den körs
PreToolUseInnan Claude använder ett verktyg, till exempel ändrar en fil. Kan stoppa åtgärden.
PostToolUseEfter att verktyget har körts utan fel. Kan inte ångra något.
SessionStartNär en session startar eller återupptas.
NotificationNär Claude Code skickar en avisering, till exempel för att den väntar på dig.
StopNär Claude är klar med sitt svar.

För verktygshändelser som PreToolUse och PostToolUse styr fältet matcher vilka verktyg hooken gäller, och det skiljer på stora och små bokstäver. Edit|Write betyder att den körs när Claude ändrar eller skriver en fil.

Exempel 1: formatera koden efter varje ändring

Det vanligaste första exemplet. Efter varje filändring kör Claude Code Prettier på just den filen, så att formateringen alltid stämmer utan att någon behöver tänka på det.

.claude/settings.json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
}
]
}
]
}
}

Claude Code skickar information om ändringen till kommandot, och jq plockar ut sökvägen till filen. Kommandot kräver att jq är installerat. Lyckas hooken syns ingenting i konversationen, filen är bara formaterad.

Exempel 2: stoppa ändringar i en mapp

I Vad ska stå i CLAUDE.md? skrev vi regeln "Rör inte filerna i legacy/". Måste den verkligen hållas är en hook rätt verktyg. Spara ett litet skript i .claude/hooks/skydda-legacy.sh och gör det körbart med chmod +x:

.claude/hooks/skydda-legacy.sh
#!/bin/bash
FIL=$(jq -r '.tool_input.file_path // empty')
# På Windows kommer sökvägen med bakåtsnedstreck. Gör om dem.
FIL="${FIL//\\//}"
if [[ "$FIL" == *"/legacy/"* ]]; then
echo "Stoppat: filerna i legacy/ ska inte ändras." >&2
exit 2
fi
exit 0

Raden som gör om snedstrecken behövs på Windows. Utan den matchar sökvägen aldrig, och skriptet släpper igenom ändringen.

Koppla sedan skriptet till PreToolUse, så att det körs innan ändringen görs:

.claude/settings.json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/skydda-legacy.sh"
}
]
}
]
}
}

Avslutas skriptet med kod 2 stoppas ändringen, och texten skriptet skriver ut skickas till Claude som förklaring. Claude kan då välja en annan väg. En sådan spärr gäller i alla lägen, även i auto-läget som Claude Code startar i som standard.

Skriv /hooks i en session för att se vilka hooks som är inlästa och vilken händelse de hör till. Ni kan också be Claude skriva hooken åt er genom att beskriva vad ni vill ha.

Subagenter: hjälpreder med eget sammanhang

När Claude läser tjugo filer, kör en lång testsvit eller går igenom loggar fylls sessionen med text som ni sällan behöver igen. En subagent gör det jobbet i ett eget sammanhang och lämnar bara tillbaka det som spelar roll. Huvudsessionen hålls ren och fokuserad.

Claude Code har några inbyggda subagenter som används automatiskt, till exempel Explore, som söker igenom kodbasen utan att ändra något. Ni kan också skapa egna. En subagent är en Markdown-fil i .claude/agents/ i projektet, eller i ~/.claude/agents/ om den ska finnas i alla dina projekt. Överst står inställningarna, och resten av filen är instruktionen subagenten arbetar efter.

.claude/agents/granskare.md
---
name: granskare
description: Granskar ändrad kod i webbshoppen. Använd efter varje ändring.
tools: Read, Grep, Glob, Bash
model: inherit
---
Du granskar kod i webbshoppen. När du anropas:
1. Kör git diff för att se vad som har ändrats.
2. Läs de ändrade filerna.
3. Kontrollera särskilt att priser hanteras i ören och att
anrop mot betalleverantören går via src/lib/payments.ts.
Svara med en lista i tre nivåer: måste rättas, bör rättas
och förslag. Visa för varje punkt hur den kan rättas.
Bara name och description krävs. Utan Edit och Write i listan kan granskaren inte ändra filer med Claudes redigeringsverktyg.

Fälten betyder följande:

  • name är subagentens namn. Det är det ni använder när ni ber om den.
  • description är det Claude läser för att avgöra när subagenten ska användas. Skriv tydligt när den passar.
  • tools begränsar vilka verktyg den får använda. Utelämnar ni fältet får den alla verktyg som subagenter kan använda.
  • model väljer modell. Med inherit används samma modell som i huvudsessionen.

Claude kan välja subagenten själv när en uppgift matchar beskrivningen. Ni kan också be om den direkt, "låt granskaren titta på mina ändringar", eller skriva @agent-granskare för att vara säker på att just den körs. Checka in mappen i git, så kan hela teamet använda och förbättra samma subagenter.

Flera saker samtidigt

Subagenter kan arbeta parallellt. Ber du Claude "undersök inloggningen, kundvagnen och betalningen med var sin subagent" går tre subagenter igenom varsin del samtidigt, och Claude sammanställer sedan svaren. Det fungerar bäst när delarna inte hänger ihop.

Huvudsessionen delar ut uppgifter till tre subagenter och får tillbaka sammanfattningar, och en hook kör Prettier efter att Claude har ändrat en fil
Subagenterna arbetar i varsitt sammanhang och lämnar bara tillbaka en sammanfattning. Hooken körs av Claude Code varje gång händelsen inträffar, utan att Claude behöver komma ihåg den.

När passar vad?

Ni villAnvänd
Att något alltid händer, som formatering eller testerEn hook
Stoppa vissa ändringar heltEn hook på PreToolUse, gärna tillsammans med en deny-regel
Lägga ut en stor deluppgift utan att fylla sessionenEn subagent
En granskare eller specialist med egna instruktioner och begränsade verktygEn subagent
Ge Claude en återkommande arbetsinstruktion i samma sessionEn skill
Förklara hur projektet fungerarCLAUDE.md

När det inte passar

Allt behöver inte automatiseras. Ett litet projekt med en utvecklare klarar sig ofta gott med en bra CLAUDE.md, och varje hook är ytterligare något som kan gå sönder.

Subagenter är fel val när du och Claude behöver prata fram och tillbaka, eller när uppgiften är en snabb, liten ändring. En vanlig subagent börjar från noll och ser inte konversationen ni har haft, så den behöver tid att sätta sig in i uppgiften. Undantaget är en fork, som får med hela konversationen.

Fallgropar att känna till

  • Hooks körs med dina rättigheter. De kan läsa, ändra och radera allt ditt konto kommer åt. Läs igenom en hook innan du lägger till den, även när den kommer från ett repo du har klonat.
  • En spärr på Edit|Write stoppar inte allt. Claude kan fortfarande ändra filer via terminalkommandon, och då körs inte hooken. Lägg därför också till en deny-regel, till exempel "permissions": { "deny": ["Edit(/legacy/**)"] } i .claude/settings.json. Den gäller även kända filkommandon i terminalen, som sed och tee. Behöver ni ett skydd som gäller alla program, slå på sandlådan med /sandbox.
  • Ogiltig JSON stänger av hela filen. Claude Code varnar när sessionen startar, och fortsätter du hoppas hela inställningsfilen över, inte bara hooken. Kommatecken efter sista raden och kommentarer är inte tillåtna. Kontrollera med /hooks.
  • Subagenter förbrukar användning. Varje subagent gör egna anrop som räknas mot samma gränser som huvudsessionen, och många subagenter som lämnar långa svar fyller ändå sessionen.
  • Subagenten vet bara det den får veta. Den ser inte konversationen, bara uppdraget Claude skriver. Egna subagenter läser er CLAUDE.md, men de inbyggda Explore och Plan gör det inte. Be Claude ge den en tydlig uppgift och upprepa regler som måste följas.
  • Ny mapp kräver omstart. Fanns inte mappen .claude/agents/ när sessionen startade behöver du starta om Claude Code för att den nya subagenten ska hittas.

Sammanfattning

Hooks lägger ni i .claude/settings.json för det som alltid ska hända, som att formatera efter varje ändring eller stoppa ändringar i en mapp. Subagenter lägger ni i .claude/agents/ för deluppgifter som ska göras i ett eget sammanhang, gärna parallellt. Börja med en hook och en granskare, och bygg vidare när ni ser vad som faktiskt sparar tid. Är ni nya i Claude Code, börja med Claude Code: kom igång steg för steg.

Fler guider

Alla guider

Vill du bygga det här för ditt eget team?

Berätta vad ni vill få gjort, så hittar vi en coach som kan just det området.

Boka ett första samtal