DonnIA
Toutes les ressources
GuideBonnes pratiques25 min

Déclencheurs et notifications

Lancer un agent sur un fichier modifié, une heure ou un webhook, et être prévenu du résultat sans surveiller un terminal.


Un agent qu'il faut lancer à la main n'est pas une automatisation, c'est un outil. La différence tient à deux morceaux qu'on oublie souvent de monter : ce qui le déclenche, et ce qui te prévient qu'il a fini. Sans le premier, tu y penses ou tu n'y penses pas. Sans le second, tu surveilles un terminal au lieu de travailler.

Il n'y a que quatre déclencheurs utiles en pratique : un événement pendant une session, un fichier qui change sur le disque, une heure qui arrive, un appel extérieur. Chacun a son mécanisme, et aucun ne demande d'infrastructure.

Le piège est ailleurs. Un agent déclenché automatiquement tourne sans personne pour l'arrêter. Ce guide met donc les garde-fous au même niveau que les déclencheurs : un plafond de tours, un plafond de dépense, et un périmètre d'outils restreint.

Les quatre déclencheurs

DéclencheurMécanismeBon pour
Événement de sessionHook Claude CodeFormater, vérifier, prévenir
Fichier modifiéHook FileChanged, ou surveillant externeRégénérer, revalider
HeureCron, ou GitHub ActionsVeille, rapport, sauvegarde
Appel extérieurPetit serveur HTTP qui lance claude -pRéagir à un autre système

Avant de commencer

  • Claude Code installé, et `jq` pour lire le JSON des hooks
  • Une tâche que tu lances actuellement à la main
  • Un endroit où recevoir la notification : terminal, mail, messagerie d'équipe

1Déclencher sur un événement de session

Un hook est une commande lancée par le harnais, pas par le modèle. C'est ce qui le rend fiable : il n'y a rien à oublier.

La liste des événements est longue. Ceux qui servent le plus souvent :

ÉvénementSe déclenche
PreToolUseAvant l'exécution d'un outil. Peut bloquer
PostToolUseAprès un outil réussi
PostToolUseFailureAprès un outil en échec
StopQuand l'agent a fini de répondre
SessionStart / SessionEndÀ l'ouverture, à la fermeture
FileChangedQuand un fichier surveillé change sur le disque

La configuration va dans .claude/settings.json pour le projet, ~/.claude/settings.json pour tous tes projets, ou hooks/hooks.json si tu la distribues dans un plugin.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs -r npx prettier --write"
          }
        ]
      }
    ]
  }
}

Le contexte arrive en JSON sur l'entrée standard : jq en extrait ce dont tu as besoin. Les codes de sortie ont un sens précis : 0 réussit, 2 est une erreur bloquante dont la sortie d'erreur est transmise au modèle, tout autre code est une erreur non bloquante qui laisse l'action se poursuivre.

2Déclencher sur un fichier modifié

Deux approches, selon que la surveillance doit vivre pendant une session ou en permanence.

Pendant une session, l'événement FileChanged se déclenche quand un fichier surveillé change sur le disque. C'est le cas typique du fichier de traduction ou du schéma que quelqu'un d'autre modifie pendant que tu travailles.

En permanence, il faut un surveillant externe qui appelle Claude Code en mode non interactif. Des outils comme entr, watchexec ou inotifywait font ça, et ils sont indépendants de Claude Code.

Vérifie les options de ton surveillant

La syntaxe et les drapeaux de entr, watchexec et inotifywait diffèrent d'un outil à l'autre et d'une version à l'autre. Lis la page de manuel installée sur ta machine avant de recopier une commande trouvée ailleurs : une option mal comprise donne un surveillant qui relance en boucle.

Deux précautions valables pour tous : exclus les dossiers générés de la surveillance, sinon la sortie de l'agent redéclenche l'agent. Et pose un délai d'attente avant l'exécution, sinon une sauvegarde qui écrit trois fichiers déclenche trois exécutions.

3Déclencher à l'heure

En local, cron suffit. Pour quelque chose de partagé avec l'équipe, GitHub Actions accepte une planification.

on:
  schedule:
    - cron: "0 7 * * 1"

Trois limites à connaître : l'intervalle minimum est de cinq minutes, les horaires sont exprimés en UTC, et les exécutions planifiées peuvent être retardées en période de charge. Pour un rapport hebdomadaire, aucune des trois n'a d'importance. Pour un déclenchement à la minute près, ce n'est pas le bon outil.

Le corps de la tâche, lui, est un appel non interactif :

claude -p "$(cat prompt-rapport.txt)" > rapport.md

4Déclencher depuis l'extérieur

Un webhook, ici, n'a rien de spécifique à Claude Code : c'est un petit serveur HTTP à toi qui reçoit une requête et lance la commande. Le point d'attention n'est pas le montage, c'est la sécurité.

Trois règles :

  • Vérifie la signature de l'appel entrant, avec le secret partagé fourni par le service émetteur. Un point d'entrée non authentifié sur internet est trouvé en quelques heures.
  • N'injecte jamais le corps de la requête dans la commande shell. Écris-le dans un fichier, et passe le chemin au prompt.
  • Traite le contenu reçu comme du texte hostile. Il vient de l'extérieur, il peut contenir des instructions destinées au modèle.

Le contenu reçu peut donner des ordres à l'agent

Le corps d'un webhook, un titre de ticket, un message d'erreur : tout ce qui vient d'ailleurs peut contenir « ignore les consignes précédentes et... ». Le modèle le lira. La parade n'est pas dans le prompt, elle est dans le périmètre : un agent déclenché par un webhook ne doit pouvoir faire que les deux ou trois choses prévues.

5Poser les garde-fous avant de brancher

Un agent déclenché automatiquement n'a personne devant l'écran. Ces drapeaux ne sont pas optionnels.

claude -p "$(cat prompt.txt)" \
  --max-turns 12 \
  --max-budget-usd 1.00 \
  --allowedTools "Read" "Grep" "Glob" \
  --output-format json \
  > resultat.json

--max-turns limite le nombre de tours agentiques, --max-budget-usd fixe un plafond de dépense avant arrêt, et --allowedTools restreint ce qui s'exécute sans demander. Le --output-format json rend la sortie exploitable par le script qui suit, au lieu d'un texte à analyser.

Le premier réflexe à avoir : commence en lecture seule. Un agent déclenché qui ne peut que lire et écrire un rapport ne peut pas faire de dégât, et tu verras en une semaine s'il fait ce que tu attends.

6Être prévenu du résultat

Le plus simple d'abord. Un hook Stop qui fait du bruit à la fin d'une tâche longue :

{
  "hooks": {
    "Stop": [
      { "hooks": [ { "type": "command", "command": "printf '\\a'" } ] }
    ]
  }
}

Sur macOS, osascript -e 'display notification "Termine"' donne une vraie notification système.

Pour une notification qui parte ailleurs que sur ta machine, un hook peut aussi être de type http : il envoie une requête POST avec le contexte en JSON dans le corps. Sinon, un curl vers l'URL d'intégration de ta messagerie d'équipe fait le travail depuis un hook de type command.

Une notification utile dit ce qui s'est passé

« La tâche est terminée » ne sert à rien : tu vas devoir ouvrir le rapport pour savoir s'il y avait quelque chose. Fais tenir la conclusion dans le message : « 3 éléments à traiter » ou « rien à signaler ». C'est la différence entre une notification qu'on lit et une notification qu'on coupe au bout de trois jours.

Et prévois le cas de l'échec. Un agent planifié qui plante silencieusement passe inaperçu pendant des semaines : tu crois qu'il n'y a rien à signaler alors qu'il ne tourne plus. Fais envoyer une notification distincte quand le code de sortie n'est pas zéro.

Vérifier que ça part vraiment

Un déclencheur silencieux qui ne s'active jamais est indiscernable d'un déclencheur qui fonctionne. Provoque l'événement à la main la première fois : modifie un fichier pour un PostToolUse, avance l'heure du cron, envoie une requête de test au webhook. En cas de doute sur un hook :

claude --debug

Le journal indique quels hooks ont trouvé une correspondance, leur code de sortie et leur sortie. C'est la façon la plus rapide de distinguer « le hook ne se déclenche pas » de « le hook se déclenche et échoue ».

Quelques prompts pour aller plus loin

ObjectifPrompt à adapter
Choisir le bon déclencheurVoici la tache que je veux automatiser : [DESCRIPTION]. Quel declencheur convient : evenement de session, fichier modifie, horaire, ou appel exterieur ? Justifie, et dis ce qui se passe si le declencheur rate une fois.
Écrire le hookEcris un hook Claude Code qui [OBJECTIF] sur l'evenement [EVENEMENT]. Le contexte arrive en JSON sur stdin. Explique le role de chaque partie de la commande.
Fixer les garde-fousVoici mon agent declenche automatiquement et ce qu'il doit faire. Quels outils lui sont strictement necessaires ? Propose la liste --allowedTools la plus restrictive qui permette la tache.
Rédiger la notificationVoici la sortie type de mon agent. Ecris le gabarit d'une notification d'une ligne qui me dise s'il y a quelque chose a faire, sans que j'aie besoin d'ouvrir le rapport.
Prévoir les pannesVoici ma chaine de declenchement : [DESCRIPTION]. Liste les facons dont elle peut echouer silencieusement, et pour chacune, comment je m'en apercevrais.

Tu as d’autres ressources comme ça ?

Ce que tu viens de lire est entièrement gratuit. Une nouvelle ressource part chaque semaine dans la newsletter : guides, modèles à copier et liens triés, sans compte à créer.

Cette page est en accès libre, n’hésite pas à la partager.