v1.2.0
Restores compatibility with laravel/roster 1.0.0, whose API rewrite made every composer update on a consumer app hard-crash during the project-boost:sync post-hook.
Action required: this release requires laravel/boost ^2.5 (up from ^2.4). See UPGRADING.md.
composer require --dev "sandermuller/project-boost-laravel:^1.2" -W-W matters: laravel/boost is usually a sibling top-level require in the consuming app, so it has to move to ^2.5 in the same resolve.
Fixed
-
composer update/installno longer fatals withClass "Laravel\Roster\Enums\Packages" not found.laravel/roster 1.0.0(2026-07-18) removed thePackagesenum and theRosterclass this package was built against. The failure was unrecoverable rather than degrading to the intended permissive fallback:LaravelBoostGuidelineGate::EXCLUDED_PACKAGESreferenced enum cases in a class-constant initializer, which PHP evaluates on class initialization — sopermissive(), the graceful-fallback path itself, threw before anyclass_exists()guard could run. Package identity is now a plain composer/npm name string throughout, andRoster::scan()becomesProjectScan::scan(). -
Guideline dirs resolve through
laravel/boost's own name mapper. Package name → guideline dir now delegates toPackageRegistry::guidelineName()instead of slugifying locally. Pre-1.0 Roster'sPackage::name()returned the enum case name (FLUXUI_PRO), which the old slugify handled correctly; Roster 1.0 returns the composer name (livewire/flux-pro), which it would not have. Left unfixed, this would have replaced the fatal with silence — every package guideline suppressed, no error. -
npm-ecosystem packages are gated again. Discovery scans both ecosystems (
php()+js()), matchinglaravel/boost's ownDiscoverPackagePaths::packages(). Theinertia-react,inertia-svelte,inertia-vueandtailwindcssguideline dirs are npm-driven and had no gate signal from a php-only scan.
Changed
-
Requires
laravel/boost ^2.5(was^2.4).Laravel\Boost\Support\PackageRegistry— which this package now mirrors for package constants and the name → dir map — landed in2.5.0alongside boost's own Roster 1.0 adaptation.2.4.xstill requireslaravel/roster ^0.5, so there is no version of this fix that works on the2.4line. -
laravel/roster ^1.0is now an explicit requirement. It was previously pulled in only transitively throughlaravel/boost, despite this package type-hinting its classes directly — which is how a major upstream rewrite reached consumers with no constraint to stop it. -
The known-package universe is derived from the dirs
laravel/boostships under.ai/, rather than enumerated from a hardcoded list. Roster 1.0 removed the enum that supplied it, and boost's replacement keeps its name → dir map private. Scanning is also self-maintaining: a guideline dir boost adds in a future release is gated correctly without a release here. Verified equivalent against boost 2.5 — every package dir it ships was aPackagescase, and the enum cases with no shipped dir were already no-ops.
Internal
-
LaravelBoostGuidelineGate::fromRoster()becamefromProjectScan()and takes aProjectScan;VersionResolvertakes a?ProjectScan. Both are@internal— thePUBLIC_API.mdsurface (CLI commands, options, exit codes, config keys) is unchanged. -
Added a regression guard asserting the gate's exclusion and must-be-direct lists still match
laravel/boost's own. The gate is a 1:1 mirror ofDiscoverPackagePaths, and unlike a removed class, a changed policy array drifts silently — no fatal, just guidelines quietly emitted or suppressed. -
Dropped the abandoned
rector/type-perfectdev dependency, superseded bytomasvotruba/type-coverage, which now bundles it. Both installed made PHPStan abort during container compilation on a duplicate service registration, exiting non-zero with no output — so the quality gate looked green while analysing nothing.
Full Changelog: 1.1.0...1.2.0