Ce qui se passe
L'équipe Laravel publie Vet, un greffon Composer qui montre le code qu'un
composer update s'apprête à écrire dans vendor/, avant qu'il ne
l'écrive. L'idée est reprise de cargo vet, côté Rust : chaque mise à jour
apporte du code que personne dans l'équipe n'a lu, et on ne peut pas tout
auditer à la main.
Le paquet fonctionne avec n'importe quel projet doté d'un composer.json —
Laravel, Symfony, WordPress, PHP nu — et demande PHP 8.4 ou plus.
Comment s'y prendre
composer require laravel/vet --dev
./vendor/bin/vet --init
# INFO Trusted [125] packages, and wrote [vet.json].--init marque comme fiables les paquets déjà présents sur le disque, sans
les relire : c'est une photo de l'existant, pas un audit. À partir de là, Vet
compare les mises à jour à cette référence et bloque celles qui apportent du code
non approuvé :
❯ composer update
to review (1)
carbonphp/carbon-doctrine-types 3.1.0 → 3.2.0 ....... 2 files changed
Packages: 1 to review, 124 trusted
ERROR [1] package is not trusted.Lancer ./vendor/bin/vet dans un terminal affiche les diffs, paquet par paquet ;
la barre d'espace sélectionne ce qu'on approuve, Entrée enregistre.
L'agent lit à votre place
C'est le parti pris du paquet : Vet transmet les changements à l'agent de code déjà installé sur la machine — Claude Code, Codex, Gemini, opencode — et affiche son verdict à côté de chaque paquet :
INFO [claude] reviews [3] packages (58.1 KB).
acme/logger 1.2.0 → 2.0.0 ................ 12 files changed
│ FAIL src/Ship.php reads .env and sends it to an unknown host
acme/tooling 4.1.0 → 4.2.0 ................ 8 files changed
│ WARN the agent did not read [1] file, because it is too big
carbonphp/carbon-doctrine-types 3.1.0 → 3.2.0 ....... 2 files changed
│ PASS the changes narrow two return types- PASS — revue terminée, rien d'anormal trouvé ;
- FAIL — un fichier et une raison ;
- WARN — revue incomplète : fichier trop volumineux, données non textuelles, ou pas de réponse de l'agent ;
- SKIP — rien n'a été envoyé (aucun changement, ou fichiers illisibles).
Les PASS sont présélectionnés, et le verdict de l'agent ne modifie jamais
vet.json tout seul : c'est votre validation qui écrit.
Ce que retient vet.json
{
"schema": 4,
"require": {
"carbonphp/carbon-doctrine-types": {
"version": "3.2.1",
"hash": "tree-v2:0f158f3b909fc01e691ed5f5121186056232b049031e7d3a914676d49881ece5"
}
}
}Le fichier se commite à côté de composer.json. Le hash couvre tous les
fichiers du paquet : si une release est modifiée sans changer de numéro de
version — le scénario même des attaques récentes sur les registres — l'empreinte
ne correspond plus et la revue est redemandée.
Ce que ça change dans la CI
Vet sort en erreur quand un paquet n'est pas approuvé. Placée dans une intégration continue, la commande arrête la chaîne sur toute dépendance que personne n'a regardée : le contrôle cesse d'être un geste de bonne volonté individuelle pour devenir une condition de build.
Le paquet est en bêta ; son comportement peut encore évoluer avant la première version stable. Pour une couche complémentaire, Heimdall impose un âge minimum aux dépendances, de sorte qu'une release doit reposer quelques jours avant d'être installée.
À retenir
Vet ne promet pas de détecter une porte dérobée : il remet la relecture dans la
boucle, au moment où le code arrive, et garde trace de ce qui a été vu. Le point
le plus utile est le hash — il transforme « j'ai regardé la 3.2.0 » en une
affirmation vérifiable sur le contenu exact du paquet.