Ce qu'est un mod
Claude Code accepte des mods depuis le 1er octobre 2026, à partir de la version 2.1.287. Selon le billet de l'éditeur, un mod est une petite fonction TypeScript qui change le comportement de l'outil : bloquer un appel d'outil, ajouter des boutons, ajouter un panneau. Les mods sont livrés dans des plugins.
Une liste de douze mods à construire circule. Nous avons préféré en construire un seul, pour un besoin d'entreprise, et le tester pour de vrai.
Ce que fait deploy-guard
Avant que Claude lance une commande dans le terminal, avec l'outil Bash comme avec l'outil PowerShell, le mod la lit et refuse les formes courantes de ce qui détruit : réécriture forcée de l'historique partagé, retour arrière brutal, nettoyage forcé de l'arbre de travail, suppression récursive de fichiers, suppression ou vidage d'une table. La variante prudente du push forcé (celle qui garde un contrôle) reste autorisée.
Le message de refus est explicite : « deploy-guard: force push blocked. Run it yourself if you really mean it. » Le mod refuse, il ne décide pas à ta place : la commande reste lançable à la main.
Ce que ça change pour une équipe
Une IA peut travailler sur du code toute la journée : ces commandes lui sont refusées avant de partir. La règle tient dans 3 fichiers, dont un fichier de règles de 34 lignes, que n'importe quel développeur relit en quelques minutes.
Sur les offres Team et Enterprise, un mod de sécurité intégré par l'éditeur (sec-default) se charge en premier et empêche un mod installé de lever tes règles d'interdiction. Les garde-fous s'empilent, ils ne s'annulent pas.
Ce qu'on en retient
1. Le vrai test n'était pas dans les tests. Le premier refus est tombé sur Claude lui-même, pendant qu'il écrivait les tests du mod. Deux autres ont suivi dans la journée.
2. Le mod lit le texte, pas l'intention. Deux des trois commandes bloquées ne faisaient qu'écrire les mots interdits dans un fichier. À l'inverse, une forme de commande qu'il ne connaît pas passerait (un push forcé écrit avec un plus devant la branche, par exemple). C'est un filet, pas un pare-feu, et pour un filet, trop prudent vaut mieux que pas assez.
3. Un trou trouvé en testant. Sous Windows, Claude peut passer par PowerShell plutôt que par Bash, et la première version ne surveillait que Bash : dans une session neuve, une commande qui contenait les mots interdits est passée. Corrigé en quelques lignes, retesté sur les deux outils.
Le déroulé, à la minute
Heure de Paris, avec l’UTC entre parenthèses.
13:57 (11:57 UTC)
Le mod est écrit par l'agent : fichier de plugin, déclaration du garde-fou, règles, test.
13:59 (11:59 UTC)
Premier refus, sur Claude lui-même, 1 min 28 s après l'écriture. La commande refusée écrivait un fichier de test contenant le texte d'un push forcé.
14:02 (12:02 UTC)
Première version écrite et testée, 4 min 45 s de bout en bout. Deuxième refus : un retour arrière brutal.
14:19 (12:19 UTC)
Troisième refus, pendant la rédaction d'un script de comptage : une suppression récursive citée dans un texte.
15:19 (13:19 UTC)
Session neuve avec la première version : Claude choisit PowerShell, et la commande contenant les mots interdits s'exécute. Le trou est là.
15:22 (13:22 UTC)
Version 0.2.0 : le même garde sur Bash et sur PowerShell. Validation passée, 3 tests sur 3.
15:22 à 15:23 (13:22 à 13:23 UTC)
Session neuve, un appel Bash puis un appel PowerShell contenant « DROP TABLE » : les deux sont refusés avant exécution.
Chaque affirmation, sa preuve
Ce qui est écrit plus haut, et d’où cela vient. Ce que nous n’avons pas pu vérifier n’est pas ici : c’est dans la section suivante.
Les mods existent depuis le 1er octobre, version 2.1.287 ou plus récente.
Billet de l'éditeur daté du 1er octobre 2026 et entrée 2.1.287 de son journal des changements.
Le mod a été écrit par Claude.
Journal de la session : fichiers écrits à 11:57:41 UTC par l'agent.
1 min 28 s entre l'écriture et le premier refus.
Fichiers écrits à 11:57:41 UTC, premier refus à 11:59:09 UTC, relus dans le journal de la session.
Bash comme PowerShell.
Sortie de « claude plugin validate » : crochets sur l'outil Bash et sur l'outil PowerShell. Sortie de « claude plugin test » : 3 pass, 0 fail. Session neuve : les deux appels refusés.
3 fichiers, dont une règle de 34 lignes.
Fichier de plugin, fichier de crochets, fichier de règles de 34 lignes, plus un fichier de test.
3 tests sur 3.
Sortie de « claude plugin test » : 3 pass, 0 fail, en 2.1.288 puis en 2.1.289.
Première version écrite et testée en 5 minutes.
Du 11:57:41 au 12:02:26 UTC, soit 4 min 45 s (version 0.1.0).
Trois refus en session réelle, dont deux qui ne faisaient qu'écrire les mots interdits.
Refus de 11:59:09, 12:02:39 et 12:19:27 UTC relus dans le journal. Le deuxième contenait aussi une vraie suppression récursive, dans une copie de travail sans enjeu : d'où « deux sur trois ».
Une forme inconnue passerait.
Lu dans le code : les règles sont des expressions sur le texte de la commande. Un push forcé écrit avec un plus devant la branche ne contient ni l'option longue ni l'option courte.
Le trou PowerShell de la version 0.1.0.
Session neuve du 5 octobre à 13:19 UTC : la commande a été exécutée (sortie « DROP / TABLE / demo_guard »). Corrigé en 0.2.0, refusé à 13:22 UTC.
Ce qui ne marche pas, ou n’est pas vérifié
- Le mod lit le texte d'une commande, pas son intention : un texte cité qui contient un mot interdit est refusé, une forme de commande non prévue passe.
- Les deux sessions neuves ont été lancées en mode non interactif. Une session interactive avec l'option de chargement n'a pas été lancée : non vérifié.
- Le compteur de refus en barre d'état est envoyé par le code, son rendu à l'écran n'a pas été vu : non vérifié.
- Le mod lui-même n'est pas distribué : ce dossier décrit le test et la méthode pour construire le tien.
Le refaire chez toi
Le brief à donner à Claude Code pour qu’il écrive ta propre version :
Écris un mod Claude Code (plugin de crochets, TypeScript) qui lit chaque commande avant son exécution, avec l'outil Bash et avec l'outil PowerShell, et la refuse si elle contient : un push forcé (sauf la variante avec garde), un reset hard, un nettoyage forcé de l'arbre de travail, une suppression récursive, un DROP ou un TRUNCATE. Message de refus : le nom de la règle, puis « Run it yourself if you really mean it. ». Ajoute trois tests : une commande refusée, une commande autorisée, et le même cas refusé par PowerShell.
Les commandes, dans l’ordre :
claude --plugin-dir ./deploy-guardcharger le plugin pour la session seulement (Claude Code 2.1.287 ou plus récent)claude plugin validate deploy-guardvérifier la structure et voir sur quels outils le garde est branchéclaude plugin test deploy-guardlancer les tests du mod