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éclencheur | Mécanisme | Bon pour |
|---|---|---|
| Événement de session | Hook Claude Code | Formater, vérifier, prévenir |
| Fichier modifié | Hook FileChanged, ou surveillant externe | Régénérer, revalider |
| Heure | Cron, ou GitHub Actions | Veille, rapport, sauvegarde |
| Appel extérieur | Petit serveur HTTP qui lance claude -p | Ré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énement | Se déclenche |
|---|---|
PreToolUse | Avant l'exécution d'un outil. Peut bloquer |
PostToolUse | Après un outil réussi |
PostToolUseFailure | Après un outil en échec |
Stop | Quand l'agent a fini de répondre |
SessionStart / SessionEnd | À l'ouverture, à la fermeture |
FileChanged | Quand 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
| Objectif | Prompt à adapter |
|---|---|
| Choisir le bon déclencheur | Voici 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 hook | Ecris 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-fous | Voici 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 notification | Voici 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 pannes | Voici 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.
Me contacter
Une question, un projet, une envie de collaborer ? Écris-moi.
Cette page est en accès libre, n’hésite pas à la partager.