Eric L. Barnes a présenté Laravel Vet le 15 septembre 2026. Ce package en bêta de l’équipe Laravel affiche les fichiers qu’une installation ou une mise à jour placerait dans vendor/ et conserve les états approuvés dans vet.json. Le plugin Composer intervient après les installations et bloque une mise à jour avant l’écriture des nouveaux fichiers. Son fonctionnement reprend l’idée de cargo vet dans l’écosystème Rust. Les packages déjà approuvés ne sont plus redemandés, tandis que ceux qui changent repassent en revue.

terminal
composer require laravel/vet --dev
./vendor/bin/vet --init
composer update
./vendor/bin/vet

Vet peut transmettre le diff de chaque package à un agent de programmation présent sur la machine. Claude Code, Codex, Gemini et opencode figurent parmi les agents pris en charge. L’agent renvoie PASS, FAIL, WARN ou SKIP. PASS indique que l’examen est terminé sans attaque signalée. FAIL désigne un fichier et décrit le problème. WARN signale une vérification incomplète, par exemple lorsqu’un fichier est trop volumineux, contient des données non textuelles ou n’a pas reçu de réponse. SKIP signifie qu’aucun fichier n’a été envoyé, parce que rien n’avait changé ou que les fichiers du package étaient illisibles. Un package non approuvé provoque un code de sortie différent de zéro, ce qui permet d’arrêter un build. L’outil fonctionne avec tout projet contenant composer.json, notamment Laravel, Symfony, WordPress et PHP sans framework.

Vet demande PHP 8.4 ou une version ultérieure et s’installe comme dépendance de développement. L’initialisation approuve les packages déjà présents dans vendor/ et les inscrit dans vet.json. Dans l’exemple présenté, le fichier contient 125 packages. Cette opération enregistre les fichiers présents sur le disque sans les examiner. Les mises à jour suivantes sont comparées à cette base.

Un exemple fait passer carbonphp/carbon-doctrine-types de 3.1.0 à 3.2.0 avec deux fichiers modifiés. Dans src/Carbon/Doctrine/DateTimeImmutableType.php, le type de retour passe de DateTimeImmutable à CarbonImmutable. Dans src/Carbon/Doctrine/DateTimeType.php, il passe de DateTime à Carbon. Vet bloque alors l’écriture des nouveaux fichiers. La commande ./vendor/bin/vet -v affiche les changements en détail, tandis que ./vendor/bin/vet lance la revue avec un agent.

Lors d’une autre exécution, Claude examine trois packages représentant 58.1 KB de changements. La mise à jour d’acme/logger, de 1.2.0 à 2.0.0, touche 12 fichiers. L’agent renvoie FAIL, car src/Ship.php lit .env et envoie son contenu à telemetry.example.com. La mise à jour d’acme/tooling, de 4.1.0 à 4.2.0, modifie huit fichiers. Elle reçoit WARN, car deux commandes sont ajoutées et l’agent n’a pas lu resources/schema.php, un fichier de 612.4 KB. Pour carbonphp/carbon-doctrine-types, l’agent renvoie PASS après l’examen de deux fichiers et identifie deux types de retour plus précis.

Vet sélectionne par défaut les packages marqués PASS. Le développeur peut modifier cette sélection après lecture des résultats, puis appuyer sur Entrée pour enregistrer les choix. Les résultats de l’agent ne modifient pas vet.json à eux seuls. Vet place ce fichier à côté de composer.json, et l’article recommande de le versionner dans le dépôt. Une entrée utilise le schéma 4 et contient une version de package avec un hash. L’exemple indique la version 3.2.1 et le hash tree-v2:0f158f3b909fc01e691ed5f5121186056232b049031e7d3a914676d49881ece5. Le hash couvre tous les fichiers du package. Toute modification de fichier impose donc une nouvelle revue, même si le numéro de version reste identique. Le build échoue jusqu’à l’approbation de chaque package.

L’article replace Vet dans le contexte des incidents récents de la chaîne logistique logicielle. Il cite le blocage des malwares et les politiques de dépendances de Composer 2.10, ainsi qu’un package npm Axios qui a livré un cheval de Troie d’accès distant. Vet est encore en bêta et son comportement peut évoluer avant la première version stable. L’article mentionne aussi Heimdall, qui impose un âge minimal aux dépendances Composer, et renvoie vers le dépôt GitHub laravel/vet pour la documentation.