Co jsou hooky v Claude Code?
Hooky v Claude Code jsou handlery, které navážete na pevně dané body životního cyklu session v nástroji Claude Code od Anthropicu. Podle reference hooků jde o „shellové příkazy, HTTP endpointy, volání MCP nástrojů, LLM prompty nebo subagenty definované uživatelem, spouštěné automaticky v určitých bodech životního cyklu Claude Code“ (přeloženo z angličtiny). Těmi body jsou události, například začátek session, chvíle před voláním nástroje, chvíle po něm a konec agentova kola.
Hook se od instrukce liší tím, kdo rozhoduje. Řádek v AGENTS.md nebo skill říká modelu, jak se má chovat, a model to buď dodrží, nebo ne. Hook se spustí pokaždé, když nastane jeho událost, bez ohledu na to, co model zamýšlel. Když reaguje na správnou událost, dokáže akci rovnou zastavit.
Lidsky řečeno
Představte si turniket u vchodu do kancelářské budovy. Provozní řád na zdi žádá návštěvníky, aby se zapsali, a většina to udělá. Turniket se neptá: bez karty zůstane zavřený, ať jste kdokoli a ať máte sebelepší důvod. Instrukce pro AI agenta jsou ten provozní řád. Hook je turniket.
Jak hooky fungují
Hook má tři části: událost, na kterou reaguje, matcher, který filtruje výskyty té události, a handler, který se spustí.
- Události. Reference jich uvádí přes třicet, od
SessionStartaUserPromptSubmitpoPreToolUse,PostToolUseaStop. Když chcete vynutit pravidlo, začněte uPreToolUse, protože běží před voláním nástroje a může ho zablokovat. - Matchery. U událostí, které se týkají nástrojů, se matcher porovnává s názvem nástroje:
Bash,Edit|Writenebo regulární výraz jakomcp__.*pro všechny MCP nástroje. - Handlery. Reference popisuje pět typů: shellový příkaz, HTTP endpoint, volání MCP nástroje, jednokolový prompt pro model Claude a experimentální agentní hook, který si před rozhodnutím může přečíst soubory. Všechny hooky našich agentů jsou příkazy.
Příkazový hook dostane událost jako JSON na standardním vstupu a odpoví návratovým kódem. Kód 0 akci pustí dál, pokud JSON, který hook vypsal, neurčí něco jiného. Kód 2 znamená blokující chybu a u událostí, které blokovat umějí, Claude Code akci zastaví. U PreToolUse se tak volání nástroje neprovede. Jakýkoli jiný návratový kód je neblokující chyba a akce proběhne, pokud hook nemá nastavené blokování při selhání.
Hooky definujete v souborech s nastavením. Mohou být v uživatelském nastavení (~/.claude/settings.json), v projektovém .claude/settings.json, který commitnete spolu s kódem, v lokálním souboru, který git nesleduje, nebo ve spravovaném nastavení pro celou organizaci. Pluginy je mohou dodávat v souboru hooks/hooks.json a skills i subagenti si je mohou deklarovat ve vlastním frontmatteru. Minimální projektový hook, který kontroluje každý shellový příkaz, vypadá takto:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "bash \"${CLAUDE_PROJECT_DIR}/.claude/hooks/guard-push.sh\"", "timeout": 5 }
]
}
]
}
}
#!/usr/bin/env bash
# Přečte volání nástroje ze stdin a odmítne push, který uvádí main.
cmd="$(jq -r '.tool_input.command // empty')"
if grep -Eq 'git[[:space:]]+push.*[[:space:]](main|master)([[:space:]]|$)' <<< "$cmd"; then
echo "Push do větve main tu není povolený. Místo toho otevřete pull request." >&2
exit 2
fi
exit 0
Proč na tom záleží
- Pravidla platí, i když se nikdo nedívá. Instrukce je jen žádost. Hook na
PreToolUse, který skončí kódem 2, je rozhodnutí, které model žádnou argumentací neobejde. Nejvíc na tom záleží u dlouhých běhů bez dozoru, kde jednotlivé kroky nikdo nečte. - Rutina přestane záviset na paměti. Hook může po každé úpravě naformátovat soubor, spustit linter, při startu session doplnit kontext nebo zalogovat každé volání nástroje. Několik takových příkladů ukazuje průvodce hooky od Anthropicu. Hook to udělá pokaždé, ne jen tehdy, když si model vzpomene.
- Pravidla jsou na jednom místě. Hook v projektovém
.claude/settings.jsonnebo v pluginu se sdílí spolu s kódem. Celý tým i každý agent, který v repozitáři pracuje, dostane stejné pravidlo ze stejného souboru.
Takto hooky používáme u vlastních headless agentů, tedy agentů bez interaktivního rozhraní. Před každým shellovým příkazem u nich běží plugin s hooky. U agentů, kteří pracují na vlastním kódu, jeden z těch hooků odmítne push do main i každý pokus modelu mergnout pull request. Do main se jejich kód dostane jedině přes pull request, který schválil člověk. Při chybě zůstává hook zavřený (fail-closed). Když nepřečte konfiguraci agenta, uplatní nejpřísnější pravidlo. Druhý hook kontroluje text každého komentáře, který se agent chystá odeslat na GitHub, a @zmínky povolí jen u členů organizace a jen v pracovní době.
Na co si dát pozor
- Ve výchozím nastavení blokuje jen
exit 2. Návratový kód 1, v Unixu obvyklý signál selhání, znamená neblokující chybu a akce proběhne. Reference to říká bez obalu: pokud má hook vynucovat pravidlo, použijteexit 2. Hlídač se špatnou cestou nebo se skriptem, který spadne, propustí všechno. Od Claude Code v2.1.295 můžete hooku nastavit"onFailure": "block"a akce se pak zablokuje. Pokryje to i skript, který se vůbec nespustí, cožexit 2uvnitř skriptu nezvládne. - Při timeoutu volání projde. Výchozí timeout příkazového hooku je 600 sekund. Hook na
PreToolUse, kterému vyprší čas, volání nástroje nezablokuje, pokud nemáonFailurenastavené na blokování. Hlídače proto pište tak, aby doběhly rychle, a timeout nastavujte explicitně. Naše hlídače běží s limity 5 až 20 sekund. - Hooky běží s vašimi oprávněními. Anthropic sám varuje, že příkazové hooky „spouštějí shellové příkazy s plnými oprávněními vašeho uživatelského účtu“ (přeloženo z angličtiny). Claude Code v interaktivní session hooky nespustí, dokud složku neoznačíte jako důvěryhodnou. V session spuštěné přes
claude -pnebo SDK ji naopak považuje za důvěryhodnou, takže hooky commitnuté v cizím repozitáři poběží bez dotazu. Než nad nějakým repozitářem spustíte Claude Code ze skriptu, projděte nastavení v jeho.claude/. - Hook vidí volání, ne jeho účinek. Hlídač čte jen text příkazu a kontext, který dostane. Náš hlídač pushů rozhoduje o samotném
git pushbez argumentů podle větve, která je přepnutá v pracovním adresáři shellu. Naši agenti proto vždy uvádějí remote i větev. Pravidlo, které pracuje s textem, musí vědět, jaký text uvidí. Navíc ho porovnává doslova. Heslo o sandboxu pro AI agenta popisuje běh, který náš hlídač odmítl, protože se zakázaný příkaz objevil jen jako text v uvozovkách. - Hook není bezpečnostní hranice. Hlavička našeho hlídače komentářů to říká na jednom řádku: „Hlídač nad vlastními voláními modelu, ne bezpečnostní hranice“ (přeloženo z angličtiny). Skripty, které běží mimo volání nástrojů modelu, přes něj nikdy neprojdou. Pokud chcete omezit, kam až proces dosáhne, použijte sandbox a přístupové údaje s omezeným rozsahem. Hooky slouží k tomu, aby se agent držel dohodnutých mantinelů. Doplňují AI guardrails a revizi s člověkem ve smyčce.
Související články:
- Co je AGENTS.md? – soubor s instrukcemi, které hook dokáže vynutit, ne jen vyslovit.
- Co jsou AI agent skills? – postupy, které si agent načte podle potřeby a které mohou deklarovat vlastní hooky.
- Co je sandbox pro AI agenta? – hranice za běhu, která omezuje, kam až příkaz dosáhne, zatímco hook rozhoduje jen o tom, jestli se vůbec spustí.
- Co jsou AI guardrails? – širší rodina kontrol, do které hooky patří.
- Co je prompt injection? – útok, který obrátí instrukce agenta proti vám, a proč proti němu pomáhá pravidlo mimo model.
- Jak vyladit GitHub Copilota, když vám firma zakáže MCP – vlastní hooky GitHub Copilota, které se konfigurují v
.github/hooks/.
Chcete být o krok napřed?
Nenechte si utéct naše nejlepší postřehy. Žádný spam, jen praktické analýzy, pozvánky na exkluzivní eventy a shrnutí podcastů přímo do vaší schránky.
