Zum Hauptinhalt springen

Documentation Index

Fetch the complete documentation index at: https://docs.devinenterprise.com/llms.txt

Use this file to discover all available pages before exploring further.

Jedes Hook-Ereignis wird an einem bestimmten Punkt im Lebenszyklus des Agenten ausgelöst. Verwende das Feld matcher (einen Regex-Ausdruck, der mit dem tool_name des Hook-Ereignisses abgeglichen wird), um zu filtern, welche Tool-Aufrufe den Hook auslösen.

PreToolUse

Wird vor der Ausführung eines Tools ausgelöst. Verwenden Sie dies, um Tool-Aufrufe zu blockieren, zu ändern oder mit zusätzlichem Kontext zu versehen. Stdin-Daten:
FeldBeschreibungBeispiel
tool_nameName des aufgerufenen Toolsexec, edit, mcp__github__create_issue
tool_inputAn das Tool übergebene Argumente{ "command": "rm -rf /", "shell_id": "main" }
Beispiel — Destruktive Befehle blockieren:
{
  "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)\""
        }
      ]
    }
  ]
}
Beispiel — Bestätigung für Schreibvorgänge außerhalb von src/ anfordern: Verwende ein Skript, das die Tool-Eingabe prüft und eine Entscheidung zurückgibt:
{
  "PreToolUse": [
    {
      "matcher": "edit",
      "hooks": [
        {
          "type": "command",
          "command": "./scripts/check-edit-path.sh",
          "timeout": 5
        }
      ]
    }
  ]
}

PostToolUse

Wird ausgelöst, nachdem ein Tool seine Ausführung beendet hat. Verwende dies zur Protokollierung, Validierung oder zum Auslösen von Folgeaktionen. Stdin-Daten:
FeldBeschreibung
tool_nameName des ausgeführten Tools
tool_inputÜbergebene Argumente
tool_responseObjekt mit success (boolean), output (string) und error (string oder null)
Beispiel — Alle Shell-Befehle protokollieren:
{
  "PostToolUse": [
    {
      "matcher": "exec",
      "hooks": [
        {
          "type": "command",
          "command": "sh -c 'cat >> ~/.devin-command-log'"
        }
      ]
    }
  ]
}

PermissionRequest

Wird ausgelöst, wenn der Agent eine Entscheidung über eine Berechtigung benötigt. Damit können Sie benutzerdefinierte Genehmigungslogik implementieren. Stdin-Daten:
FeldBeschreibung
tool_nameTool, das eine Berechtigung anfordert
tool_inputArgumente für den Tool-Aufruf
Beispiel — Git-Befehle automatisch genehmigen:
{
  "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

Wird ausgelöst, wenn der Nutzer eine Nachricht absendet. Verwenden Sie dies, um Kontext hinzuzufügen oder Workflows auszulösen. Stdin-Daten:
FieldDescription
promptDer Text der Nachricht des Nutzers
Beispiel — Projektkontext für Prompts im Zusammenhang mit Deployments hinzufügen:
{
  "UserPromptSubmit": [
    {
      "matcher": "",
      "hooks": [
        {
          "type": "command",
          "command": "./scripts/add-deploy-context.sh"
        }
      ]
    }
  ]
}

Stop

Wird ausgelöst, wenn der Agent entscheidet, anzuhalten (seinen Zug zu beenden). Verwenden Sie dies, um nachfolgende Anweisungen hinzuzufügen oder ein vorzeitiges Anhalten zu verhindern. Stdin-Daten:
FieldDescription
stop_hook_activeOb bereits ein Stop-Hook aktiv ist
Beispiel — Agenten daran erinnern, Tests auszuführen:
{
  "Stop": [
    {
      "matcher": "",
      "hooks": [
        {
          "type": "command",
          "command": "echo '{\"decision\": \"block\", \"reason\": \"Please run the test suite before stopping.\"}'"
        }
      ]
    }
  ]
}
Vorsicht bei Stop-Hooks, die blockieren — sie können dazu führen, dass der Agent in eine Schleife gerät, wenn die Bedingung letztlich nicht erfüllt wird.

PostCompaction

Wird nach erfolgreichem Abschluss der Kontextkomprimierung ausgelöst. Verwenden Sie dies für die Protokollierung, das Auslösen nachgelagerter Aktionen oder das erneute Einfügen von Kontext, der während der Komprimierung verloren gegangen sein könnte. Stdin-Daten:
FeldBeschreibung
summaryVom Komprimierer erzeugter Zusammenfassungstext (kann null sein, wenn keine Zusammenfassung erzeugt wurde)
Beispiel — Komprimierungsereignisse protokollieren:
{
  "PostCompaction": [
    {
      "matcher": "",
      "hooks": [
        {
          "type": "command",
          "command": "sh -c 'cat >> ~/.devin-compaction-log'"
        }
      ]
    }
  ]
}

SessionStart

Wird ausgelöst, wenn eine neue Sitzung beginnt. Verwenden Sie es zur Initialisierung, Protokollierung oder für das Environment-Setup. Stdin-Daten:
FeldBeschreibung
sourceWie die Sitzung gestartet wurde
Beispiel — Setup-Skript ausführen:
{
  "SessionStart": [
    {
      "matcher": "",
      "hooks": [
        {
          "type": "command",
          "command": "./scripts/dev-setup.sh",
          "timeout": 10
        }
      ]
    }
  ]
}

SessionEnd

Wird ausgelöst, wenn eine Sitzung endet. Verwenden Sie dieses Ereignis für Bereinigungen oder die abschließende Protokollierung. Stdin-Daten:
FeldBeschreibung
reasonGrund für das Ende der Sitzung

Mehrere Ereignisse abgleichen

In einer einzelnen Hooks-Datei können Hooks für mehrere Ereignisse definiert werden:
{
  "PreToolUse": [
    {
      "matcher": "",
      "hooks": [
        { "type": "command", "command": "./scripts/audit.sh" }
      ]
    }
  ],
  "PostToolUse": [
    {
      "matcher": "",
      "hooks": [
        { "type": "command", "command": "./scripts/audit.sh" }
      ]
    }
  ]
}

Den Matcher verwenden

Das Feld matcher ist ein Regex, das mit dem tool_name des Hook-Ereignisses abgeglichen wird. Es ist für toolbezogene Ereignisse verfügbar: PreToolUse, PostToolUse und PermissionRequest. Bei Nicht-Tool-Ereignissen (UserPromptSubmit, Stop, PostCompaction, SessionStart und SessionEnd) gibt es kein tool_name; verwende "" oder lasse den Matcher weg, um den Hook für jedes Ereignis dieses Typs auszuführen.
Der Matcher ist kein Berechtigungs-Glob. Muster wie mcp__github__* sind für Berechtigungen nützlich, Hook-Matcher sind jedoch Regexe. Verwende in einem Hook-Matcher mcp__github__.*.
MatcherEntspricht
"" (leer) oder weggelassenAlle Tool-Namen für Tool-Ereignisse
"exec"Tool-Namen, die exec enthalten
"^exec$"Nur das Tool exec
"^(exec|edit)$"Nur exec oder edit
"^mcp__.*"Alle MCP-Tools
"^mcp__github__.*"Alle Tools vom github MCP-Server
"^mcp__github__create_issue$"Das Tool create_issue vom github MCP-Server

Tool-Namen, die Sie abgleichen können

Hook-Matcher werden anhand derselben extern sichtbaren Tool-Namen ausgeführt, die Hook-Skripte über stdin als tool_name erhalten. Welche Tool-Namen genau verfügbar sind, kann je nach CLI-Modus, Modell und aktivierten Integrationen variieren. Die gängigsten öffentlichen Core-Tool-Namen sind:
  • read
  • edit
  • grep
  • glob
  • exec
Tools auf einem MCP-Server erscheinen als mcp__<server>__<tool>. Zum Beispiel erscheint ein github-Tool auf einem MCP-Server mit dem Namen create_issue als mcp__github__create_issue. Bei anderen Tools gleichen Sie den exakten tool_name ab, der in Hook-stdin angezeigt wird. Um den in Ihrer aktuellen Sitzung vollständig verfügbaren Satz zu bestätigen, fügen Sie einen temporären PostToolUse-Hook mit matcher: "" hinzu und protokollieren Sie die stdin-Payload.