Questa pagina fornisce documentazione di riferimento per l’implementazione di hooks in Claude Code.
~/.claude/settings.json
- Impostazioni utente.claude/settings.json
- Impostazioni progetto.claude/settings.local.json
- Impostazioni progetto locali (non committate)PreToolUse
e PostToolUse
)
Write
corrisponde solo allo strumento WriteEdit|Write
o Notebook.*
*
per abbinare tutti gli strumenti. Puoi anche usare una stringa vuota (""
) o lasciare
matcher
vuoto.type
: Attualmente è supportato solo "command"
command
: Il comando bash da eseguire (può usare la variabile d’ambiente $CLAUDE_PROJECT_DIR
)timeout
: (Opzionale) Quanto tempo dovrebbe durare un comando, in secondi, prima
di cancellare quel comando specifico.UserPromptSubmit
, Notification
, Stop
, e SubagentStop
che non usano matcher, puoi omettere il campo matcher:
CLAUDE_PROJECT_DIR
(disponibile solo quando
Claude Code genera il comando hook) per riferire script memorizzati nel tuo progetto,
assicurandoti che funzionino indipendentemente dalla directory corrente di Claude:
Task
- Attività subagent (vedi documentazione subagents)Bash
- Comandi shellGlob
- Corrispondenza pattern fileGrep
- Ricerca contenutoRead
- Lettura fileEdit
, MultiEdit
- Modifica fileWrite
- Scrittura fileWebFetch
, WebSearch
- Operazioni webmanual
- Invocato da /compact
auto
- Invocato da auto-compact (a causa della finestra di contesto piena)startup
- Invocato dall’avvioresume
- Invocato da --resume
, --continue
, o /resume
clear
- Invocato da /clear
compact
- Invocato da compattazione automatica o manuale.reason
nell’input dell’hook sarà uno di:
clear
- Sessione cancellata con comando /clearlogout
- Utente disconnessoprompt_input_exit
- Utente uscito mentre l’input del prompt era visibileother
- Altri motivi di uscitatool_input
dipende dallo strumento.
tool_input
e tool_response
dipende dallo strumento.
stop_hook_active
è true quando Claude Code sta già continuando come risultato di
un hook stop. Controlla questo valore o elabora la trascrizione per impedire a Claude Code
di funzionare indefinitamente.
manual
, custom_instructions
viene da quello che l’utente passa in
/compact
. Per auto
, custom_instructions
è vuoto.
stdout
viene mostrato all’utente in modalità trascrizione
(CTRL-R), eccetto per UserPromptSubmit
e SessionStart
, dove stdout viene
aggiunto al contesto.stderr
viene restituito a Claude per elaborare
automaticamente. Vedi comportamento per evento hook sotto.stderr
viene mostrato all’utente e
l’esecuzione continua.UserPromptSubmit
dove stdout viene iniettato come contesto.Evento Hook | Comportamento |
---|---|
PreToolUse | Blocca la chiamata dello strumento, mostra stderr a Claude |
PostToolUse | Mostra stderr a Claude (strumento già eseguito) |
Notification | N/A, mostra stderr solo all’utente |
UserPromptSubmit | Blocca elaborazione prompt, cancella prompt, mostra stderr solo all’utente |
Stop | Blocca arresto, mostra stderr a Claude |
SubagentStop | Blocca arresto, mostra stderr al subagent Claude |
PreCompact | N/A, mostra stderr solo all’utente |
SessionStart | N/A, mostra stderr solo all’utente |
SessionEnd | N/A, mostra stderr solo all’utente |
stdout
per controllo più sofisticato:
continue
è false, Claude smette di elaborare dopo che gli hooks vengono eseguiti.
PreToolUse
, questo è diverso da "permissionDecision": "deny"
, che
blocca solo una chiamata specifica dello strumento e fornisce feedback automatico a Claude.PostToolUse
, questo è diverso da "decision": "block"
, che
fornisce feedback automatizzato a Claude.UserPromptSubmit
, questo impedisce che il prompt venga elaborato.Stop
e SubagentStop
, questo ha precedenza su qualsiasi
output "decision": "block"
."continue" = false
ha precedenza su qualsiasi
output "decision": "block"
.stopReason
accompagna continue
con un motivo mostrato all’utente, non mostrato
a Claude.
PreToolUse
PreToolUse
possono controllare se una chiamata dello strumento procede.
"allow"
bypassa il sistema di permessi. permissionDecisionReason
viene mostrato
all’utente ma non a Claude."deny"
impedisce l’esecuzione della chiamata dello strumento. permissionDecisionReason
viene
mostrato a Claude."ask"
chiede all’utente di confermare la chiamata dello strumento nell’UI.
permissionDecisionReason
viene mostrato all’utente ma non a Claude.decision
e reason
sono deprecati per gli hooks PreToolUse.
Usa hookSpecificOutput.permissionDecision
e
hookSpecificOutput.permissionDecisionReason
invece. I campi deprecati
"approve"
e "block"
mappano rispettivamente a "allow"
e "deny"
.PostToolUse
PostToolUse
possono fornire feedback a Claude dopo l’esecuzione dello strumento.
"block"
richiede automaticamente a Claude con reason
.undefined
non fa nulla. reason
viene ignorato."hookSpecificOutput.additionalContext"
aggiunge contesto per Claude da considerare.UserPromptSubmit
UserPromptSubmit
possono controllare se un prompt utente viene elaborato.
"block"
impedisce che il prompt venga elaborato. Il prompt inviato viene
cancellato dal contesto. "reason"
viene mostrato all’utente ma non aggiunto al contesto.undefined
permette al prompt di procedere normalmente. "reason"
viene ignorato."hookSpecificOutput.additionalContext"
aggiunge la stringa al contesto se non
bloccato.Stop
/SubagentStop
Stop
e SubagentStop
possono controllare se Claude deve continuare.
"block"
impedisce a Claude di fermarsi. Devi popolare reason
per Claude
per sapere come procedere.undefined
permette a Claude di fermarsi. reason
viene ignorato.SessionStart
SessionStart
ti permettono di caricare contesto all’inizio di una sessione.
"hookSpecificOutput.additionalContext"
aggiunge la stringa al contesto.additionalContext
di più hooks vengono concatenati.SessionEnd
SessionEnd
vengono eseguiti quando una sessione termina. Non possono bloccare la terminazione della sessione
ma possono eseguire attività di pulizia.
UserPromptSubmit
, puoi iniettare contesto usando entrambi i metodi:UserPromptSubmit
)mcp__<server>__<tool>
, per esempio:
mcp__memory__create_entities
- Strumento create entities del server Memorymcp__filesystem__read_file
- Strumento read file del server Filesystemmcp__github__search_repositories
- Strumento search del server GitHub"$VAR"
non $VAR
..
nei percorsi file$CLAUDE_PROJECT_DIR
per il percorso del progetto).env
, .git/
, chiavi, ecc./hooks
perché le modifiche si applichinoCLAUDE_PROJECT_DIR
è disponibile e contiene il
percorso assoluto alla directory radice del progetto (dove Claude Code è stato avviato)--debug
)/hooks
per vedere se il tuo hook è registratoclaude --debug
per vedere dettagli esecuzione hook\"
dentro stringhe JSONclaude --debug
per vedere esecuzione hook
dettagliataclaude --debug
per vedere dettagli esecuzione hook: