Ogni evento hook viene attivato in un punto specifico del ciclo di vita dell’agente. Usa il campo matcher (una regex confrontata con il tool_name dell’evento hook) per filtrare quali invocazioni di tool attivano il tuo hook.
Si attiva prima dell’esecuzione di un tool. Usalo per bloccare, modificare o aggiungere contesto alle chiamate ai tool.
Dati stdin:
| Campo | Descrizione | Esempio |
|---|
tool_name | Nome del tool chiamato | exec, edit, mcp__github__create_issue |
tool_input | Argomenti passati al tool | { "command": "rm -rf /", "shell_id": "main" } |
Esempio — Bloccare i comandi distruttivi:
{
"PreToolUse": [
{
"matcher": "exec",
"hooks": [
{
"type": "command",
"command": "python3 -c \"import sys, json; data = json.load(sys.stdin); cmd = data.get('tool_input', {}).get('command', ''); sys.exit(2 if 'rm -rf' in cmd else 0)\""
}
]
}
]
}
Esempio — Richiedere conferma per le operazioni di scrittura al di fuori di src/:
Usa uno script che esamina l’input del tool e restituisce una decisione:
{
"PreToolUse": [
{
"matcher": "edit",
"hooks": [
{
"type": "command",
"command": "./scripts/check-edit-path.sh",
"timeout": 5
}
]
}
]
}
Si attiva dopo il completamento dell’esecuzione di un tool. Usalo per la registrazione, la convalida o per attivare azioni successive.
Dati stdin:
| Campo | Descrizione |
|---|
tool_name | Nome del tool eseguito |
tool_input | Argomenti passati |
tool_response | Oggetto con success (booleano), output (stringa) e error (stringa o null) |
Esempio — Registra tutti i comandi shell:
{
"PostToolUse": [
{
"matcher": "exec",
"hooks": [
{
"type": "command",
"command": "sh -c 'cat >> ~/.devin-command-log'"
}
]
}
]
}
Si attiva quando l’agente richiede una decisione sull’autorizzazione. Usalo per implementare una logica di approvazione personalizzata.
Dati stdin:
| Campo | Descrizione |
|---|
tool_name | Tool che richiede l’autorizzazione |
tool_input | Argomenti per la chiamata al tool |
Esempio — approvazione automatica dei comandi git:
{
"PermissionRequest": [
{
"matcher": "exec",
"hooks": [
{
"type": "command",
"command": "python3 -c \"import sys, json; data = json.load(sys.stdin); cmd = data.get('tool_input', {}).get('command', ''); print(json.dumps({'decision': 'approve'})) if cmd.startswith('git ') else sys.exit(0)\""
}
]
}
]
}
Si attiva quando l’utente invia un messaggio. Usalo per aggiungere contesto o attivare flussi di lavoro.
Dati stdin:
| Campo | Descrizione |
|---|
prompt | Il testo del messaggio dell’utente |
Esempio — Aggiungi il contesto del progetto per i prompt relativi al deploy:
{
"UserPromptSubmit": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "./scripts/add-deploy-context.sh"
}
]
}
]
}
Si attiva quando l’agente decide di fermarsi (concludendo il proprio turno). Usalo per aggiungere istruzioni successive o per evitare che si fermi troppo presto.
Dati stdin:
| Campo | Descrizione |
|---|
stop_hook_active | Se un hook di stop è già attivo |
Esempio — Ricorda all’agente di eseguire i test:
{
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "echo '{\"decision\": \"block\", \"reason\": \"Please run the test suite before stopping.\"}'"
}
]
}
]
}
Fai attenzione agli hook di arresto che bloccano: possono far entrare l’agente in un loop se la condizione non viene soddisfatta prima o poi.
Si attiva dopo il completamento corretto della compattazione del contesto. Usalo per registrare eventi nei log, attivare azioni successive o reinserire il contesto che potrebbe essere andato perso durante la compattazione.
Dati stdin:
| Campo | Descrizione |
|---|
summary | Testo di riepilogo prodotto dal compattatore (può essere null se non è stato generato alcun riepilogo) |
Esempio — Registra gli eventi di compattazione nei log:
{
"PostCompaction": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "sh -c 'cat >> ~/.devin-compaction-log'"
}
]
}
]
}
Si attiva quando inizia una nuova sessione. Usalo per l’inizializzazione, la registrazione o la configurazione dell’ambiente.
Dati stdin:
| Campo | Descrizione |
|---|
source | Come è stata avviata la sessione |
Esempio — Esegui lo script di configurazione:
{
"SessionStart": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "./scripts/dev-setup.sh",
"timeout": 10
}
]
}
]
}
Si attiva quando termina una sessione. Usalo per la pulizia o per la registrazione finale.
Dati stdin:
| Campo | Descrizione |
|---|
reason | Motivo della fine della sessione |
Corrispondenza di più eventi
Un singolo file di hook può definire hook per più eventi:
{
"PreToolUse": [
{
"matcher": "",
"hooks": [
{ "type": "command", "command": "./scripts/audit.sh" }
]
}
],
"PostToolUse": [
{
"matcher": "",
"hooks": [
{ "type": "command", "command": "./scripts/audit.sh" }
]
}
]
}
Il campo matcher è una regex applicata al tool_name dell’evento hook. È disponibile per gli eventi relativi ai tool: PreToolUse, PostToolUse e PermissionRequest.
Per gli eventi non relativi ai tool (UserPromptSubmit, Stop, PostCompaction, SessionStart e SessionEnd), tool_name non è presente; usa "" oppure ometti il matcher per eseguire l’hook per ogni evento di quel tipo.
Il matcher non è un glob di autorizzazione. Pattern come mcp__github__* sono utili nelle autorizzazioni, ma i matcher degli hook sono regex. In un matcher di hook, usa mcp__github__.*.
| Matcher | Corrispondenze |
|---|
"" (vuoto) o omesso | Tutti i nomi dei tool per gli eventi relativi ai tool |
"exec" | Nomi di tool che contengono exec |
"^exec$" | Solo il tool exec |
"^(exec|edit)$" | Solo exec o edit |
"^mcp__.*" | Tutti i tool MCP |
"^mcp__github__.*" | Tutti i tool del server MCP github |
"^mcp__github__create_issue$" | Il tool create_issue del server MCP github |
I matcher degli hook vengono eseguiti sugli stessi nomi di tool esposti esternamente che gli script degli hook ricevono tramite stdin come tool_name. I nomi esatti dei tool disponibili possono variare in base alla modalità CLI, al modello e alle integrazioni abilitate.
I nomi più comuni dei tool core pubblici sono:
I tool dei server MCP hanno il formato mcp__<server>__<tool>. Per esempio, un tool di un server MCP github denominato create_issue appare come mcp__github__create_issue.
Per gli altri tool, fai corrispondere esattamente il tool_name mostrato nello stdin dell’hook. Per confermare l’insieme completo disponibile nella sessione corrente, aggiungi temporaneamente un hook PostToolUse con matcher: "" e registra il payload ricevuto su stdin.