Vai al contenuto principale
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.

PreToolUse

Si attiva prima dell’esecuzione di un tool. Usalo per bloccare, modificare o aggiungere contesto alle chiamate ai tool. Dati stdin:
CampoDescrizioneEsempio
tool_nameNome del tool chiamatoexec, edit, mcp__github__create_issue
tool_inputArgomenti 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
        }
      ]
    }
  ]
}

PostToolUse

Si attiva dopo il completamento dell’esecuzione di un tool. Usalo per la registrazione, la convalida o per attivare azioni successive. Dati stdin:
CampoDescrizione
tool_nameNome del tool eseguito
tool_inputArgomenti passati
tool_responseOggetto 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'"
        }
      ]
    }
  ]
}

PermissionRequest

Si attiva quando l’agente richiede una decisione sull’autorizzazione. Usalo per implementare una logica di approvazione personalizzata. Dati stdin:
CampoDescrizione
tool_nameTool che richiede l’autorizzazione
tool_inputArgomenti 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)\""
        }
      ]
    }
  ]
}

UserPromptSubmit

Si attiva quando l’utente invia un messaggio. Usalo per aggiungere contesto o attivare flussi di lavoro. Dati stdin:
CampoDescrizione
promptIl 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"
        }
      ]
    }
  ]
}

Stop

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:
CampoDescrizione
stop_hook_activeSe 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.

PostCompaction

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:
CampoDescrizione
summaryTesto 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'"
        }
      ]
    }
  ]
}

SessionStart

Si attiva quando inizia una nuova sessione. Usalo per l’inizializzazione, la registrazione o la configurazione dell’ambiente. Dati stdin:
CampoDescrizione
sourceCome è stata avviata la sessione
Esempio — Esegui lo script di configurazione:
{
  "SessionStart": [
    {
      "matcher": "",
      "hooks": [
        {
          "type": "command",
          "command": "./scripts/dev-setup.sh",
          "timeout": 10
        }
      ]
    }
  ]
}

SessionEnd

Si attiva quando termina una sessione. Usalo per la pulizia o per la registrazione finale. Dati stdin:
CampoDescrizione
reasonMotivo 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" }
      ]
    }
  ]
}

Uso del matcher

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__.*.
MatcherCorrispondenze
"" (vuoto) o omessoTutti 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

Nomi di tool che puoi usare per la corrispondenza

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:
  • read
  • edit
  • grep
  • glob
  • exec
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.