Per una guida di avvio rapido con esempi, consulta Iniziare con i hook di Claude Code.
Configurazione
I hook di Claude Code sono configurati nei tuoi file di impostazioni:~/.claude/settings.json- Impostazioni utente.claude/settings.json- Impostazioni progetto.claude/settings.local.json- Impostazioni progetto locale (non sottoposte a commit)- Impostazioni di policy gestite dall’azienda
Struttura
I hook sono organizzati per matcher, dove ogni matcher può avere più hook:- matcher: Pattern per abbinare i nomi degli strumenti, sensibile alle maiuscole (applicabile solo per
PreToolUseePostToolUse)- Le stringhe semplici corrispondono esattamente:
Writecorrisponde solo allo strumento Write - Supporta regex:
Edit|WriteoNotebook.* - Usa
*per abbinare tutti gli strumenti. Puoi anche usare una stringa vuota ("") o lasciarematchervuoto.
- Le stringhe semplici corrispondono esattamente:
- hooks: Array di comandi da eseguire quando il pattern corrisponde
type: Attualmente è supportato solo"command"command: Il comando bash da eseguire (può usare la variabile di ambiente$CLAUDE_PROJECT_DIR)timeout: (Opzionale) Quanto tempo un comando dovrebbe eseguire, in secondi, prima di annullare quel comando specifico.
UserPromptSubmit, Notification, Stop e SubagentStop
che non usano matcher, puoi omettere il campo matcher:
Script di hook specifici del progetto
Puoi usare la variabile di ambienteCLAUDE_PROJECT_DIR (disponibile solo quando
Claude Code genera il comando hook) per fare riferimento a script archiviati nel tuo progetto,
assicurando che funzionino indipendentemente dalla directory corrente di Claude:
Hook dei plugin
I plugin possono fornire hook che si integrano perfettamente con i tuoi hook utente e progetto. Gli hook dei plugin vengono automaticamente uniti alla tua configurazione quando i plugin sono abilitati. Come funzionano gli hook dei plugin:- Gli hook dei plugin sono definiti nel file
hooks/hooks.jsondel plugin o in un file fornito da un percorso personalizzato al campohooks. - Quando un plugin è abilitato, i suoi hook vengono uniti con gli hook utente e progetto
- Più hook da fonti diverse possono rispondere allo stesso evento
- Gli hook dei plugin usano la variabile di ambiente
${CLAUDE_PLUGIN_ROOT}per fare riferimento ai file del plugin
Gli hook dei plugin usano lo stesso formato degli hook regolari con un campo
description opzionale per spiegare lo scopo dell’hook.Gli hook dei plugin vengono eseguiti insieme ai tuoi hook personalizzati. Se più hook corrispondono a un evento, vengono tutti eseguiti in parallelo.
${CLAUDE_PLUGIN_ROOT}: Percorso assoluto della directory del plugin${CLAUDE_PROJECT_DIR}: Directory radice del progetto (uguale a quella per gli hook del progetto)- Tutte le variabili di ambiente standard sono disponibili
Eventi hook
PreToolUse
Viene eseguito dopo che Claude crea i parametri dello strumento e prima dell’elaborazione della chiamata dello strumento. Matcher comuni:Task- Attività subagent (consulta la documentazione dei subagent)Bash- Comandi shellGlob- Corrispondenza del pattern di fileGrep- Ricerca di contenutiRead- Lettura di fileEdit- Modifica di fileWrite- Scrittura di fileWebFetch,WebSearch- Operazioni web
PostToolUse
Viene eseguito immediatamente dopo il completamento riuscito di uno strumento. Riconosce gli stessi valori di matcher di PreToolUse.Notification
Viene eseguito quando Claude Code invia notifiche. Le notifiche vengono inviate quando:- Claude ha bisogno della tua autorizzazione per usare uno strumento. Esempio: “Claude ha bisogno della tua autorizzazione per usare Bash”
- L’input del prompt è rimasto inattivo per almeno 60 secondi. “Claude sta aspettando il tuo input”
UserPromptSubmit
Viene eseguito quando l’utente invia un prompt, prima che Claude lo elabori. Questo ti consente di aggiungere contesto aggiuntivo in base al prompt/conversazione, convalidare i prompt o bloccare determinati tipi di prompt.Stop
Viene eseguito quando l’agente Claude Code principale ha finito di rispondere. Non viene eseguito se l’arresto è avvenuto a causa di un’interruzione dell’utente.SubagentStop
Viene eseguito quando un subagent di Claude Code (chiamata dello strumento Task) ha finito di rispondere.PreCompact
Viene eseguito prima che Claude Code stia per eseguire un’operazione di compattazione. Matcher:manual- Richiamato da/compactauto- Richiamato da auto-compact (a causa della finestra di contesto piena)
SessionStart
Viene eseguito quando Claude Code avvia una nuova sessione o riprende una sessione esistente (che attualmente avvia una nuova sessione sotto il cofano). Utile per caricare il contesto di sviluppo come problemi esistenti o modifiche recenti al tuo codebase, installare dipendenze o configurare variabili di ambiente. Matcher:startup- Richiamato all’avvioresume- Richiamato da--resume,--continueo/resumeclear- Richiamato da/clearcompact- Richiamato da compattazione automatica o manuale.
Persistenza delle variabili di ambiente
Gli hook SessionStart hanno accesso alla variabile di ambienteCLAUDE_ENV_FILE, che fornisce un percorso di file dove puoi persistere le variabili di ambiente per i successivi comandi bash.
Esempio: Impostazione di singole variabili di ambiente
nvm use), acquisisci e persisti tutti i cambiamenti confrontando l’ambiente:
CLAUDE_ENV_FILE è disponibile solo per gli hook SessionStart. Gli altri tipi di hook non hanno accesso a questa variabile.SessionEnd
Viene eseguito quando una sessione di Claude Code termina. Utile per attività di pulizia, registrazione delle statistiche della sessione o salvataggio dello stato della sessione. Il camporeason nell’input dell’hook sarà uno di:
clear- Sessione cancellata con il comando /clearlogout- Utente disconnessoprompt_input_exit- Utente uscito mentre l’input del prompt era visibileother- Altri motivi di uscita
Input dell’hook
Gli hook ricevono dati JSON tramite stdin contenenti informazioni sulla sessione e dati specifici dell’evento:Input PreToolUse
Lo schema esatto pertool_input dipende dallo strumento.
Input PostToolUse
Lo schema esatto pertool_input e tool_response dipende dallo strumento.
Input Notification
Input UserPromptSubmit
Input Stop e SubagentStop
stop_hook_active è true quando Claude Code sta già continuando a causa di
un hook di stop. Controlla questo valore o elabora la trascrizione per evitare che Claude Code
continui indefinitamente.
Input PreCompact
Permanual, custom_instructions proviene da quello che l’utente passa in
/compact. Per auto, custom_instructions è vuoto.
Input SessionStart
Input SessionEnd
Output dell’hook
Ci sono due modi per gli hook di restituire output a Claude Code. L’output comunica se bloccare e qualsiasi feedback che dovrebbe essere mostrato a Claude e all’utente.Semplice: Codice di uscita
Gli hook comunicano lo stato attraverso codici di uscita, stdout e stderr:- Codice di uscita 0: Successo.
stdoutviene mostrato all’utente in modalità trascrizione (CTRL-R), tranne perUserPromptSubmiteSessionStart, dove stdout viene aggiunto al contesto. - Codice di uscita 2: Errore di blocco.
stderrviene restituito a Claude per l’elaborazione automatica. Consulta il comportamento specifico dell’evento hook di seguito. - Altri codici di uscita: Errore non bloccante.
stderrviene mostrato all’utente e l’esecuzione continua.
Promemoria: Claude Code non vede stdout se il codice di uscita è 0, tranne per
l’hook
UserPromptSubmit dove stdout viene iniettato come contesto.Comportamento del codice di uscita 2
| Evento hook | Comportamento |
|---|---|
PreToolUse | Blocca la chiamata dello strumento, mostra stderr a Claude |
PostToolUse | Mostra stderr a Claude (lo strumento è già stato eseguito) |
Notification | N/A, mostra stderr solo all’utente |
UserPromptSubmit | Blocca l’elaborazione del prompt, cancella il prompt, mostra stderr solo all’utente |
Stop | Blocca l’arresto, mostra stderr a Claude |
SubagentStop | Blocca l’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 |
Avanzato: Output JSON
Gli hook possono restituire JSON strutturato instdout per un controllo più sofisticato:
Campi JSON comuni
Tutti i tipi di hook possono includere questi campi opzionali:continue è false, Claude interrompe l’elaborazione dopo l’esecuzione degli hook.
- Per
PreToolUse, questo è diverso da"permissionDecision": "deny", che blocca solo una chiamata dello strumento specifica e fornisce feedback automatico a Claude. - Per
PostToolUse, questo è diverso da"decision": "block", che fornisce feedback automatizzato a Claude. - Per
UserPromptSubmit, questo impedisce l’elaborazione del prompt. - Per
StopeSubagentStop, questo ha la precedenza su qualsiasi output"decision": "block". - In tutti i casi,
"continue" = falseha la precedenza su qualsiasi output"decision": "block".
stopReason accompagna continue con un motivo mostrato all’utente, non mostrato
a Claude.
Controllo della decisione PreToolUse
Gli hook PreToolUse possono controllare se una chiamata dello strumento procede.
"allow"bypassa il sistema di autorizzazione.permissionDecisionReasonviene mostrato all’utente ma non a Claude."deny"impedisce l’esecuzione della chiamata dello strumento.permissionDecisionReasonviene mostrato a Claude."ask"chiede all’utente di confermare la chiamata dello strumento nell’interfaccia utente.permissionDecisionReasonviene mostrato all’utente ma non a Claude.
updatedInput:
updatedInputti consente di modificare i parametri di input dello strumento prima dell’esecuzione dello strumento. Questo è un oggettoRecord<string, unknown>contenente i campi che desideri modificare o aggiungere.- Questo è più utile con
"permissionDecision": "allow"per modificare e approvare le chiamate dello strumento.
I campi
decision e reason sono deprecati per gli hook PreToolUse.
Usa hookSpecificOutput.permissionDecision e
hookSpecificOutput.permissionDecisionReason invece. I campi deprecati
"approve" e "block" corrispondono a "allow" e "deny" rispettivamente.Controllo della decisione PostToolUse
Gli hook PostToolUse possono fornire feedback a Claude dopo l’esecuzione dello strumento.
"block"richiede automaticamente a Claude conreason.undefinednon fa nulla.reasonviene ignorato."hookSpecificOutput.additionalContext"aggiunge contesto per Claude da considerare.
Controllo della decisione UserPromptSubmit
Gli hook UserPromptSubmit possono controllare se un prompt dell’utente viene elaborato.
"block"impedisce l’elaborazione del prompt. Il prompt inviato viene cancellato dal contesto."reason"viene mostrato all’utente ma non aggiunto al contesto.undefinedconsente al prompt di procedere normalmente."reason"viene ignorato."hookSpecificOutput.additionalContext"aggiunge la stringa al contesto se non bloccato.
Controllo della decisione Stop/SubagentStop
Gli hook Stop e SubagentStop possono controllare se Claude deve continuare.
"block"impedisce a Claude di fermarsi. Devi popolarereasonaffinché Claude sappia come procedere.undefinedconsente a Claude di fermarsi.reasonviene ignorato.
Controllo della decisione SessionStart
Gli hook SessionStart ti consentono di caricare il contesto all’inizio di una sessione.
"hookSpecificOutput.additionalContext"aggiunge la stringa al contesto.- I valori
additionalContextdi più hook vengono concatenati.
Controllo della decisione SessionEnd
Gli hook SessionEnd vengono eseguiti quando una sessione termina. Non possono bloccare la terminazione della sessione
ma possono eseguire attività di pulizia.
Esempio di codice di uscita: Convalida del comando Bash
Esempio di output JSON: UserPromptSubmit per aggiungere contesto e convalida
Per gli hook
UserPromptSubmit, puoi iniettare il contesto usando uno dei due metodi:- Codice di uscita 0 con stdout: Claude vede il contesto (caso speciale per
UserPromptSubmit) - Output JSON: Fornisce un controllo più sofisticato sul comportamento
Esempio di output JSON: PreToolUse con approvazione
Utilizzo degli strumenti MCP
Gli hook di Claude Code funzionano perfettamente con gli strumenti Model Context Protocol (MCP). Quando i server MCP forniscono strumenti, appaiono con un pattern di denominazione speciale che puoi abbinare nei tuoi hook.Denominazione degli strumenti MCP
Gli strumenti MCP seguono il patternmcp__<server>__<tool>, ad 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
Configurazione degli hook per gli strumenti MCP
Puoi indirizzare strumenti MCP specifici o interi server MCP:Esempi
Per esempi pratici inclusi formattazione del codice, notifiche e protezione dei file, consulta Altri esempi nella guida di avvio.
Considerazioni sulla sicurezza
Disclaimer
UTILIZZO A TUO RISCHIO: Gli hook di Claude Code eseguono comandi shell arbitrari sul tuo sistema automaticamente. Utilizzando gli hook, riconosci che:- Sei l’unico responsabile dei comandi che configuri
- Gli hook possono modificare, eliminare o accedere a qualsiasi file a cui il tuo account utente può accedere
- Gli hook dannosi o scritti male possono causare perdita di dati o danni al sistema
- Anthropic non fornisce alcuna garanzia e non assume alcuna responsabilità per eventuali danni derivanti dall’utilizzo degli hook
- Dovresti testare accuratamente gli hook in un ambiente sicuro prima dell’uso in produzione
Migliori pratiche di sicurezza
Ecco alcune pratiche chiave per scrivere hook più sicuri:- Convalida e sanitizza gli input - Non fidarti mai ciecamente dei dati di input
- Racchiudi sempre tra virgolette le variabili shell - Usa
"$VAR"non$VAR - Blocca il path traversal - Controlla
..nei percorsi dei file - Usa percorsi assoluti - Specifica percorsi completi per gli script (usa “$CLAUDE_PROJECT_DIR” per il percorso del progetto)
- Salta i file sensibili - Evita
.env,.git/, chiavi, ecc.
Sicurezza della configurazione
Le modifiche dirette agli hook nei file di impostazioni non hanno effetto immediato. Claude Code:- Acquisisce uno snapshot degli hook all’avvio
- Usa questo snapshot durante tutta la sessione
- Avverte se gli hook vengono modificati esternamente
- Richiede la revisione nel menu
/hooksaffinché i cambiamenti abbiano effetto
Dettagli dell’esecuzione dell’hook
- Timeout: Limite di esecuzione di 60 secondi per impostazione predefinita, configurabile per comando.
- Un timeout per un comando individuale non influisce sugli altri comandi.
- Parallelizzazione: Tutti gli hook corrispondenti vengono eseguiti in parallelo
- Deduplicazione: I comandi hook identici multipli vengono automaticamente deduplicati
- Ambiente: Viene eseguito nella directory corrente con l’ambiente di Claude Code
- La variabile di ambiente
CLAUDE_PROJECT_DIRè disponibile e contiene il percorso assoluto della directory radice del progetto (dove Claude Code è stato avviato) - La variabile di ambiente
CLAUDE_CODE_REMOTEindica se l’hook è in esecuzione in un ambiente remoto (web) ("true") o in un ambiente CLI locale (non impostato o vuoto). Usalo per eseguire logica diversa in base al contesto di esecuzione.
- La variabile di ambiente
- Input: JSON via stdin
- Output:
- PreToolUse/PostToolUse/Stop/SubagentStop: Progresso mostrato nella trascrizione (Ctrl-R)
- Notification/SessionEnd: Registrato solo nel debug (
--debug) - UserPromptSubmit/SessionStart: stdout aggiunto come contesto per Claude
Debug
Risoluzione dei problemi di base
Se i tuoi hook non funzionano:- Controlla la configurazione - Esegui
/hooksper vedere se il tuo hook è registrato - Verifica la sintassi - Assicurati che le tue impostazioni JSON siano valide
- Testa i comandi - Esegui prima manualmente i comandi hook
- Controlla i permessi - Assicurati che gli script siano eseguibili
- Rivedi i log - Usa
claude --debugper vedere i dettagli dell’esecuzione dell’hook
- Virgolette non sfuggite - Usa
\"all’interno delle stringhe JSON - Matcher sbagliato - Controlla che i nomi degli strumenti corrispondano esattamente (sensibile alle maiuscole)
- Comando non trovato - Usa percorsi completi per gli script
Debug avanzato
Per problemi di hook complessi:- Ispeziona l’esecuzione dell’hook - Usa
claude --debugper vedere l’esecuzione dettagliata dell’hook - Convalida gli schemi JSON - Testa l’input/output dell’hook con strumenti esterni
- Controlla le variabili di ambiente - Verifica che l’ambiente di Claude Code sia corretto
- Testa i casi limite - Prova gli hook con percorsi di file o input insoliti
- Monitora le risorse di sistema - Controlla l’esaurimento delle risorse durante l’esecuzione dell’hook
- Usa la registrazione strutturata - Implementa la registrazione negli script dell’hook
Esempio di output di debug
Usaclaude --debug per vedere i dettagli dell’esecuzione dell’hook:
- Quale hook è in esecuzione
- Comando in esecuzione
- Stato di successo/fallimento
- Messaggi di output o errore