Configurazione
Gli 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
Gli amministratori aziendali possono utilizzare
allowManagedHooksOnly per bloccare gli hook utente, progetto e plugin. Consulta Configurazione degli hook.Struttura
Gli 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
PreToolUse,PermissionRequestePostToolUse)- 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 hook da eseguire quando il pattern corrisponde
type: Tipo di esecuzione dell’hook -"command"per comandi bash o"prompt"per valutazione basata su LLMcommand: (Pertype: "command") Il comando bash da eseguire (può usare la variabile di ambiente$CLAUDE_PROJECT_DIR)prompt: (Pertype: "prompt") Il prompt da inviare all’LLM per la valutazionetimeout: (Opzionale) Quanto tempo un hook dovrebbe eseguire, in secondi, prima di annullare quello specifico hook
UserPromptSubmit, Stop e SubagentStop
che non utilizzano 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 agli hook utente e progetto
- Più hook da diverse fonti possono rispondere allo stesso evento
- Gli hook dei plugin utilizzano la variabile di ambiente
${CLAUDE_PLUGIN_ROOT}per fare riferimento ai file del plugin
Gli hook dei plugin utilizzano 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 degli hook del progetto)- Tutte le variabili di ambiente standard sono disponibili
Hook in Skills, Agenti e Slash Commands
Oltre ai file di impostazioni e ai plugin, gli hook possono essere definiti direttamente in Skills, subagenti e slash commands utilizzando il frontmatter. Questi hook sono limitati al ciclo di vita del componente e vengono eseguiti solo quando quel componente è attivo. Eventi supportati:PreToolUse, PostToolUse e Stop
Esempio in una Skill:
once: Impostare sutrueper eseguire l’hook solo una volta per sessione. Dopo la prima esecuzione riuscita, l’hook viene rimosso. Nota: questa opzione è attualmente supportata solo per skill e slash command, non per gli agenti.
Hook basati su prompt
Oltre agli hook di comando bash (type: "command"), Claude Code supporta hook basati su prompt (type: "prompt") che utilizzano un LLM per valutare se consentire o bloccare un’azione. Gli hook basati su prompt sono attualmente supportati solo per gli hook Stop e SubagentStop, dove abilitano decisioni intelligenti e consapevoli del contesto.
Come funzionano gli hook basati su prompt
Invece di eseguire un comando bash, gli hook basati su prompt:- Inviano l’input dell’hook e il tuo prompt a un LLM veloce (Haiku)
- L’LLM risponde con JSON strutturato contenente una decisione
- Claude Code elabora automaticamente la decisione
Configurazione
type: Deve essere"prompt"prompt: Il testo del prompt da inviare all’LLM- Usa
$ARGUMENTScome segnaposto per l’input dell’hook JSON - Se
$ARGUMENTSnon è presente, l’input JSON viene aggiunto al prompt
- Usa
timeout: (Opzionale) Timeout in secondi (predefinito: 30 secondi)
Schema di risposta
L’LLM deve rispondere con JSON contenente:ok:trueconsente l’azione,falsela previenereason: Obbligatorio quandookèfalse. Spiegazione mostrata a Claude
Eventi di hook supportati
Gli hook basati su prompt funzionano con qualsiasi evento di hook, ma sono più utili per:- Stop: Decidere in modo intelligente se Claude dovrebbe continuare a lavorare
- SubagentStop: Valutare se un subagente ha completato il suo compito
- UserPromptSubmit: Convalidare i prompt dell’utente con l’assistenza dell’LLM
- PreToolUse: Prendere decisioni di autorizzazione consapevoli del contesto
- PermissionRequest: Consentire o negare in modo intelligente i dialoghi di autorizzazione
Esempio: Hook Stop intelligente
Esempio: SubagentStop con logica personalizzata
Confronto con gli hook di comando bash
| Funzionalità | Hook di comando Bash | Hook basati su prompt |
|---|---|---|
| Esecuzione | Esegue script bash | Interroga LLM |
| Logica decisionale | Implementi nel codice | LLM valuta il contesto |
| Complessità di configurazione | Richiede file script | Configura prompt |
| Consapevolezza del contesto | Limitata alla logica dello script | Comprensione del linguaggio naturale |
| Prestazioni | Veloce (esecuzione locale) | Più lento (chiamata API) |
| Caso d’uso | Regole deterministiche | Decisioni consapevoli del contesto |
Best practice
- Sii specifico nei prompt: Dichiara chiaramente cosa vuoi che l’LLM valuti
- Includi criteri decisionali: Elenca i fattori che l’LLM dovrebbe considerare
- Testa i tuoi prompt: Verifica che l’LLM prenda decisioni corrette per i tuoi casi d’uso
- Imposta timeout appropriati: L’impostazione predefinita è 30 secondi, regola se necessario
- Usa per decisioni complesse: Gli hook bash sono migliori per regole semplici e deterministiche
Eventi di hook
PreToolUse
Viene eseguito dopo che Claude crea i parametri dello strumento e prima di elaborare la chiamata dello strumento. Matcher comuni:Task- Compiti del subagente (consulta la documentazione dei subagenti)Bash- Comandi shellGlob- Corrispondenza di pattern di fileGrep- Ricerca di contenutiRead- Lettura di fileEdit- Modifica di fileWrite- Scrittura di fileWebFetch,WebSearch- Operazioni web
PermissionRequest
Viene eseguito quando all’utente viene mostrato un dialogo di autorizzazione. Usa il controllo decisionale PermissionRequest per consentire o negare per conto dell’utente. Riconosce gli stessi valori di matcher di PreToolUse.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. Supporta matcher per filtrare per tipo di notifica. Matcher comuni:permission_prompt- Richieste di autorizzazione da Claude Codeidle_prompt- Quando Claude è in attesa di input dell’utente (dopo 60+ secondi di inattività)auth_success- Notifiche di successo dell’autenticazioneelicitation_dialog- Quando Claude Code ha bisogno di input per l’elicitazione dello strumento MCP
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 si è verificato a causa di un’interruzione dell’utente.SubagentStop
Viene eseguito quando un subagente 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 impostare 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 in cui puoi persistere le variabili di ambiente per i successivi comandi bash.
Esempio: Impostazione di singole variabili di ambiente
nvm use), acquisisci e persistisci tutti i cambiamenti confrontando l’ambiente:
CLAUDE_ENV_FILE è disponibile solo per gli hook SessionStart. Altri tipi di hook non hanno accesso a questa variabile.SessionEnd
Viene eseguito quando una sessione 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 come risultato 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 mutuamente esclusivi per gli hook di restituire l’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à verbose (ctrl+o), ad eccezione diUserPromptSubmiteSessionStart, dove stdout viene aggiunto al contesto. L’output JSON instdoutviene analizzato per il controllo strutturato (consulta Avanzate: Output JSON). - Codice di uscita 2: Errore di blocco. Solo
stderrviene utilizzato come messaggio di errore e restituito a Claude. Il formato è[command]: {stderr}. JSON instdoutnon viene elaborato per il codice di uscita 2. Consulta il comportamento per evento di hook di seguito. - Altri codici di uscita: Errore non bloccante.
stderrviene mostrato all’utente in modalità verbose (ctrl+o) con formatoFailed with non-blocking status code: {stderr}. Sestderrè vuoto, mostraNo stderr output. L’esecuzione continua.
Comportamento del codice di uscita 2
| Evento di hook | Comportamento |
|---|---|
PreToolUse | Blocca la chiamata dello strumento, mostra stderr a Claude |
PermissionRequest | Nega l’autorizzazione, 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 subagente 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 |
Avanzate: 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 specifica chiamata dello strumento 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 decisionale 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:
updatedInputmodifica i parametri di input dello strumento prima dell’esecuzione dello strumento- Combina con
"permissionDecision": "allow"per modificare l’input e approvare automaticamente la chiamata dello strumento - Combina con
"permissionDecision": "ask"per modificare l’input e mostrarlo all’utente per la conferma
I campi
decision e reason sono deprecati per gli hook PreToolUse.
Usa invece hookSpecificOutput.permissionDecision e
hookSpecificOutput.permissionDecisionReason. I campi deprecati
"approve" e "block" si mappano a "allow" e "deny" rispettivamente.Controllo decisionale PermissionRequest
Gli hook PermissionRequest possono consentire o negare le richieste di autorizzazione mostrate all’utente.
- Per
"behavior": "allow"puoi anche facoltativamente passare un"updatedInput"che modifica i parametri di input dello strumento prima dell’esecuzione dello strumento. - Per
"behavior": "deny"puoi anche facoltativamente passare una stringa"message"che dice al modello perché l’autorizzazione è stata negata, e un booleano"interrupt"che interromperà Claude.
Controllo decisionale 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 decisionale UserPromptSubmit
Gli hook UserPromptSubmit possono controllare se un prompt dell’utente viene elaborato e aggiungere contesto.
Aggiunta di contesto (codice di uscita 0):
Ci sono due modi per aggiungere contesto alla conversazione:
- Stdout di testo semplice (più semplice): Qualsiasi testo non-JSON scritto su stdout viene aggiunto come contesto. Questo è il modo più semplice per iniettare informazioni.
-
JSON con
additionalContext(strutturato): Usa il formato JSON di seguito per un controllo maggiore. Il campoadditionalContextviene aggiunto come contesto.
additionalContext viene aggiunto più discretamente.
Blocco dei prompt:
"decision": "block"impedisce l’elaborazione del prompt. Il prompt inviato viene cancellato dal contesto."reason"viene mostrato all’utente ma non aggiunto al contesto."decision": undefined(o omesso) consente al prompt di procedere normalmente.
Il formato JSON non è richiesto per i casi d’uso semplici. Per aggiungere contesto, puoi stampare testo semplice su stdout con il codice di uscita 0. Usa JSON quando hai bisogno di
bloccare i prompt o vuoi un controllo più strutturato.
Controllo decisionale 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 decisionale 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 decisionale 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: Convalidazione del comando Bash
Esempio di output JSON: UserPromptSubmit per aggiungere contesto e convalidazione
Per gli hook
UserPromptSubmit, puoi iniettare il contesto utilizzando uno dei due metodi:- Stdout di testo semplice con codice di uscita 0: Approccio più semplice, stampa testo
- Output JSON con codice di uscita 0: Usa
"decision": "block"per rifiutare i prompt, oadditionalContextper l’iniezione di contesto strutturato
stderr per il messaggio di errore. Per bloccare utilizzando
JSON (con un motivo personalizzato), usa "decision": "block" con il codice di uscita 0.Esempio di output JSON: PreToolUse con approvazione
Lavoro con gli 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
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
Best practice di sicurezza
Ecco alcune pratiche chiave per scrivere hook più sicuri:- Convalida e igienizza gli input - Non fidarti mai ciecamente dei dati di input
- Cita sempre le variabili shell - Usa
"$VAR"non$VAR - Blocca l’attraversamento di percorsi - Controlla
..nei percorsi dei file - Usa percorsi assoluti - Specifica percorsi completi per gli script (usa “$CLAUDE_PROJECT_DIR” per il percorso del progetto)
- Salta 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
- Utilizza questo snapshot durante tutta la sessione
- Avvisa se gli hook vengono modificati esternamente
- Richiede la revisione nel menu
/hooksaffinché le modifiche abbiano effetto
Dettagli dell’esecuzione degli hook
- Timeout: Limite di esecuzione di 60 secondi per impostazione predefinita, configurabile per comando.
- Un timeout per un singolo comando non influisce sugli altri comandi.
- Parallelizzazione: Tutti gli hook corrispondenti vengono eseguiti in parallelo
- Deduplicazione: I comandi di 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 ambiente CLI locale (non impostato o vuoto). Usalo per eseguire logica diversa in base al contesto di esecuzione.
- La variabile di ambiente
- Input: JSON tramite stdin
- Output:
- PreToolUse/PermissionRequest/PostToolUse/Stop/SubagentStop: Progresso mostrato in modalità verbose (ctrl+o)
- Notification/SessionEnd: Registrato solo per il 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 i comandi degli hook manualmente prima
- Controlla i permessi - Assicurati che gli script siano eseguibili
- Rivedi i log - Usa
claude --debugper vedere i dettagli dell’esecuzione degli 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 il debug dettagliato dell’esecuzione - 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 degli hook
Esempio di output di debug
Usaclaude --debug per vedere i dettagli dell’esecuzione degli hook:
- Quale hook è in esecuzione
- Comando in esecuzione
- Stato di successo/fallimento
- Messaggi di output o errore