Passer au contenu principal
Les hooks vous permettent d’exécuter une logique personnalisée en réaction à des événements du cycle de vie de l’agent. Vous pouvez utiliser des hooks pour appliquer des politiques, ajouter du contexte, consigner des actions, modifier des autorisations ou vous intégrer à des systèmes externes. Les hooks sont configurés au format JSON. Placez-les dans le répertoire .devin/ de votre projet (ou dans une configuration niveau utilisateur), et Devin CLI les exécute lors des événements correspondants du cycle de vie. Les hooks existants dans les répertoires .claude/ sont également détectés automatiquement — voir Où se trouvent les hooks.

Que peuvent faire les hooks ?

Appliquer des politiques

Bloquer les commandes dangereuses, exiger une confirmation pour des actions spécifiques ou restreindre l’accès aux fichiers.

Ajouter du contexte

Injecter des instructions ou des informations supplémentaires lorsque des outils spécifiques sont appelés.

Déclencher des effets secondaires

Exécuter des scripts, envoyer des notifications ou consigner des événements lors de certains événements.

Modifier les autorisations

Accorder ou restreindre dynamiquement les autorisations selon la situation.

Exemple rapide

Créez .devin/hooks.v1.json dans votre projet :
{
  "PreToolUse": [
    {
      "matcher": "exec",
      "hooks": [
        {
          "type": "command",
          "command": "./scripts/check-command.sh"
        }
      ]
    }
  ]
}
./scripts/check-command.sh est exécuté avant chaque exécution de commande shell. Le script reçoit les données d’événement via stdin et peut bloquer l’opération en renvoyant un code de sortie non nul.

Événements des hooks

Les hooks peuvent réagir aux événements de cycle de vie suivants :
ÉvénementQuand il se déclenche
PreToolUseAvant l’exécution d’un outil
PostToolUseAprès l’exécution d’un outil
PermissionRequestLorsqu’une décision d’autorisation est requise
UserPromptSubmitLorsque l’utilisateur envoie un message
StopLorsque l’agent souhaite s’arrêter
SessionStartLorsqu’une session démarre
SessionEndLorsqu’une session se termine
Consultez les hooks de cycle de vie pour en savoir plus sur chaque événement et les données disponibles associées.

Format des hooks

Chaque hook comporte un type (command ou prompt), un matcher facultatif (une regex appliquée au tool_name de l’événement du hook) et une configuration :
{
  "PreToolUse": [
    {
      "matcher": "exec",
      "hooks": [
        {
          "type": "command",
          "command": "./scripts/validate.sh",
          "timeout": 10
        }
      ]
    }
  ]
}
ChampDescription
matcherExpression régulière appliquée à tool_name de l’événement de hook. Une chaîne vide ou l’absence de matcher correspond à tous les noms d’outil.
type"command" pour exécuter une commande shell, ou "prompt" pour évaluer un prompt de LLM.
commandCommande shell à exécuter (pour le type command).
promptPrompt de LLM à évaluer (pour le type prompt).
timeoutDélai d’expiration en secondes (facultatif).

Hooks de commande

Les hooks de commande lancent une commande shell. Les données d’événement sont transmises au format JSON sur stdin, et la commande peut renvoyer du JSON sur stdout pour en contrôler le résultat (consultez Format de sortie ci-dessous). Entrée (stdin):
{
  "hook_event_name": "PreToolUse",
  "tool_name": "exec",
  "tool_input": {
    "command": "rm -rf /"
  }
}
La variable d’environnement DEVIN_PROJECT_DIR est automatiquement définie sur le répertoire racine du projet. Consultez Utiliser le Matcher pour connaître les noms des outils intégrés et le format des noms d’outils MCP sur lesquels vous pouvez effectuer une correspondance.

Format de sortie

Un hook de commande peut afficher un objet JSON sur stdout pour contrôler l’issue. Pour approuver ou bloquer une action, renvoyez un champ decision à la racine (avec un champ reason facultatif) :
{
  "decision": "block",
  "reason": "Destructive command blocked by policy"
}
Pour injecter du texte dans le contexte de l’agent, renvoyez additionalContext dans un objet hookSpecificOutput identifié par le nom de l’événement :
{
  "hookSpecificOutput": {
    "hookEventName": "UserPromptSubmit",
    "additionalContext": "Remember: deploys require an approved change ticket."
  }
}
Champ de sortieDescription
decision"approve" pour autoriser l’action, ou "block" pour la refuser
reasonExplication affichée à l’agent
hookSpecificOutput.hookEventNameÉvénement auquel cette sortie s’applique (p. ex. UserPromptSubmit, SessionStart, PostToolUse)
hookSpecificOutput.additionalContextTexte injecté dans le contexte de l’agent (pour UserPromptSubmit, SessionStart, PostToolUse)

Codes de sortie

CodeSignification
0Succès — le hook continue normalement
2Blocage — l’action est refusée
AutreErreur — consignée dans les logs, mais ne bloque pas

Où se trouvent les hooks

Devin CLI lit les hooks aux emplacements suivants. Ils utilisent tous le même format JSON.

Au niveau du projet

EmplacementDescription
.devin/hooks.v1.jsonFichier de hooks autonome (recommandé)
.devin/config.jsonClé "hooks" dans le fichier de configuration
.devin/config.local.jsonClé "hooks" (surcharge locale, ignorée par Git)
.claude/settings.jsonClé "hooks" (format Claude Code)
.claude/settings.local.jsonClé "hooks" (format Claude Code)

Niveau utilisateur (global)

EmplacementDescription
~/.config/devin/config.json (%APPDATA%\devin\config.json sous Windows)Clé "hooks" dans la configuration utilisateur
~/.claude.jsonClé "hooks" (format Claude Code)
~/.claude/settings.jsonClé "hooks" (format Claude Code)
~/.claude/settings.local.jsonClé "hooks" (format Claude Code)
Dans .devin/hooks.v1.json, l’objet hooks correspond à l’intégralité du fichier (sans clé enveloppante). Dans tous les autres emplacements, les hooks sont imbriqués sous la clé "hooks" dans un fichier de configuration.
Les hooks issus des chemins .claude/ sont chargés lorsque read_config_from.claude est activé (par défaut). Vous pouvez désactiver ce comportement dans votre configuration utilisateur si nécessaire.

Vérifier les hooks

Utilisez la commande /hooks pour afficher tous les hooks actuellement chargés ainsi que leurs fichiers sources :
/hooks

Étapes suivantes

hook de cycle de vie

Découvrez en détail chaque type d’événement et les données disponibles.

Configuration

Contrôlez les emplacements de configuration depuis lesquels Devin CLI lit les hooks.