Команда Laravel випустила новий пакет Laravel Vet, який дозволяє переглядати код, що composer update збирається записати у вашу директорію vendor/, та зберігає список довірених пакетів у файлі vet.json. Інструмент працює як плагін Composer і виконується після кожного install та перед кожним update.
Якщо ви знайомі з cargo vet зі світу Rust, то це та сама ідея, але для Composer. Суть проста: кожне оновлення приносить у ваш проект новий код, який ніхто з вашої команди не читав. Vet показує вам цей код по одному пакету за раз, перш ніж він потрапить до проекту. Коли ви довіряєте пакету, Vet запам'ятовує це, тож наступне оновлення запитає лише про те, що змінилося.
Інтеграція з AI-асистентами
Вам не потрібно читати все самостійно. Vet передає кожну зміну coding-агенту, який вже встановлений на вашій машині - це може бути Claude Code, Codex, Gemini або opencode. Агент читає код за вас і повідомляє результат: PASS або FAIL із зазначенням файлу та причини. Ви читаєте лише помилки, натискаєте Enter на решті та продовжуєте свою роботу.
Коли ви довіряєте пакету, Vet запам'ятовує це, і наступне оновлення запитає лише про зміни. Пакет, якому ніхто не довіряє, завершується з non-zero статусом, що робить інструмент корисним у збірках. Він працює з будь-яким проектом, що має composer.json - Laravel, Symfony, WordPress та звичайний PHP підтримуються повністю.
Чому це важливо
Кожне оновлення Composer записує тисячі рядків коду, які ви маєте або вручну перевіряти через читання diff'ів, або сліпо довіряти Packagist. З ростом кількості проблем безпеки аудит стає дедалі важливішим.
Цього року ми спостерігали низку новин про атаки на ланцюг постачання: від блокування malware та політик залежностей у Composer 2.10 до компрометації npm-пакету Axios, який почав розповсюджувати троян віддаленого доступу.
Як працює Vet
Vet вимагає PHP 8.4 або новішої версії. Встановіть його як development-залежність і дайте згоду, коли Composer запитає про дозвіл для плагіна:
composer require laravel/vet --dev
Спочатку позначте поточні пакети у vendor/ як довірені:
./vendor/bin/vet --init
INFO Trusted [125] packages, and wrote [vet.json].
Це створює vet.json на основі файлів пакетів, які вже є на вашому диску. Команда записує вашу довіру до цих файлів без їх перегляду. Далі Vet перевіряє майбутні оновлення проти цього запису. Якщо оновлення містить недовірені зміни, Vet зупиняє його перед тим, як Composer запише нові файли.
Процес перегляду змін
Коли ви запускаєте composer update, Vet показує, які пакети потребують перегляду:
❯ composer update
to review (1)
carbonphp/carbon-doctrine-types 3.1.0 → 3.2.0 .............. 2 files changed
Інструмент показує детальний diff змін у кожному файлі, включаючи конкретні рядки коду, що були змінені.
Запустіть ./vendor/bin/vet у терміналі для перегляду змін. Ви можете прочитати зміни коду самостійно, а потім натиснути пробіл, щоб вибрати пакети, яким довіряєте. Або ж можете попросити coding-агента, встановленого на вашій машині, спочатку переглянути їх. Vet відображає результат агента поруч з кожним пакетом:
INFO [claude] reviews [3] packages (58.1 KB). This takes a moment.
to review (3)
acme/logger 1.2.0 → 2.0.0 ................................. 12 files changed
│ FAIL src/Ship.php reads .env and sends it to an unknown host
│ src/Ship.php it posts the contents of [.env] to [telemetry.example.com]
acme/tooling 4.1.0 → 4.2.0 ................................. 8 files changed
│ WARN the changes add two commands
│ The agent did not read [1] file, because it is too big. Read it yourself:
│ resources/schema.php 612.4 KB
carbonphp/carbon-doctrine-types 3.1.0 → 3.2.0 .............. 2 files changed
│ PASS the changes narrow two return types
Інтерпретація результатів
PASS означає, що агент завершив перегляд і не виявив атак. FAIL ідентифікує файл і пояснює проблему, яку знайшов агент.
WARN означає, що перегляд неповний і потребує вашої уваги. Файл може бути занадто великим, містити нетекстові дані, або агент міг не повернути відповідь. SKIP означає, що Vet не надіслав жодних файлів агенту, оскільки нічого не змінилося або він не зміг прочитати файли пакета.
Vet за замовчуванням вибирає пакети з позначкою PASS. Перегляньте результати, скоригуйте вибір, а потім натисніть Enter, щоб зберегти пакети, яким ви довіряєте. Самі по собі результати агента не змінюють vet.json.
Структура vet.json
Vet зберігає ваш вибір у vet.json поруч з composer.json. Закомітьте цей файл до вашого репозиторію. Кожен запис містить довірену версію пакета та хеш - значення, розраховане на основі файлів пакета:
{
"schema": 4,
"require": {
"carbonphp/carbon-doctrine-types": {
"version": "3.2.1",
"hash": "tree-v2:0f158f3b909fc01e691ed5f5121186056232b049031e7d3a914676d49881ece5"
}
}
}
Хеш охоплює кожен файл у пакеті. Якщо файли змінюються, навіть без нового номера версії, Vet вимагає ще один огляд. Vet завершується з помилкою, коли пакет недовірений, тож перевірка не проходить у вашій збірці, доки хтось не позначить цей пакет як довірений.
Поточний статус та додаткові інструменти
Vet зараз у бета-версії, тому поведінка може змінитися перед першим стабільним релізом. Якщо ви хочете додатковий рівень захисту, Heimdall встановлює політику мінімального віку для ваших Composer-залежностей, тож нові релізи мають "відлежатися" кілька днів перед встановленням.
Відвідайте GitHub-репозиторій для повної документації та щасливого аудиту!