0.8.0
Immutable
release. Only release title and notes can be modified.
Added
laravel/mcpversion boundary. The supported range is^0.8||^0.9(0.9.0 validated against the full suite);composer.jsonnow carries a matchingconflictentry, so an unvalidated future release fails at Composer resolution time instead of fataling at framework boot. The README's MCP section names the range, and CI covers the mcp-absent install so the CLI-only consumer path can't regress silently.- Generated-file exclusion for the frontend bridge.
frontend.generated_pathsentries now match a directory, an exact file, or a*-glob (crossing/) — a generated file directly under a root was inexpressible before. Ziggy's generated route map (ziggy.js) joins the default exclusions next to Wayfinder's trees, and.d.tsdeclaration files are never scanned: they carry types only, and a route-name string-literal-union type is pure false-positive surface. - Same-module constant resolution for dynamic
route()arguments. Aroute(ROUTES.player)orroute(RouteName.Player)whose referent is a same-moduleconst/enumstring constant now resolves to that name instead of tainting the file UNRESOLVED. Resolution never guesses:const-only (neverlet/var), exactly one declaration, flat object/enum bodies only — anything uncertain keeps the file-level fail-safe, and a resolved reference beside an unresolvable one still taints. - String-named Livewire components in test selection.
Livewire::test('admin.dashboard')and thelivewire('show-posts')helper now map onto their conventional classes (App\Livewire\Admin\Dashboard,App\Livewire\ShowPosts) in the test-reference index, sorichter:affected-testsselects those tests when the component class changes. Convention-based, registry-free; custom component namespaces don't match. - Quoted-pathname handling in the diff parser. Paths git C-quotes under
core.quotePath(accented or non-Latin filenames, embedded quotes/backslashes) are now decoded, and the diff runs withcore.quotepath=off— a changed Blade view or frontend file with a non-ASCII name previously dropped out of classification entirely and read as "no impact".
Changed
- Literal endpoint strings only count in call-argument position. A
/-leading string literal or backtick template now becomes a route candidate only directly inside a call's(or after a,— previously any such literal anywhere in a scanned file matched, so a constants file, nav-link map, or generated data file whose strings coincide with real route templates flooded the touched-endpoint list and, throughrichter:affected-tests, false-selected unrelated backend tests. Two recall losses are accepted and documented: a literal assigned to a variable and fetched later, and a{url: '/x'}options-object property. - Blade-view seeds resolve by exact node membership. A changed view seeds exactly its own node — previously
components.cardalso seeded every nested sibling (components.card.header, …) through boundary-substring matching, inflatingimpactedandriskand potentially tripping a--fail-ongate on views that didn't change.
Fixed
- An unreadable frontend head source (an I/O failure on a file the diff proves exists) reads UNRESOLVED instead of a determined "no references" — the same honesty guard the PHP path already had.
- A concatenated Ziggy name (
route('videos.' + action)) is recognized as a dynamic argument and flags the file, instead of silently dropping a partial name. - Optional-parameter route templates match a bare
/(root/{locale?}routes) and trailing-slash literals (/videos/against/videos/{video?}). - Extension-suffixed Wayfinder module specifiers (
…/VideoController.ts,@/routes/videos.ts) resolve instead of passing unseen. - The markdown changed-files table escapes
|and backticks in file paths — the code-span fence now outruns the longest backtick run in the path, so a legal filename can no longer break the table that lands in a PR description.
Internal
- Suite grows from 516 to 562 tests (1213 assertions): end-to-end coverage of the frontend/Blade-inline seam against the fixture project, a formatter contract test rendering one rich fixture through all three output surfaces, and characterization of the
benchmark:addstanza escaping. EntryPointRownow owns the entry-point facts and ordering both formatters previously duplicated; decoration stays per-format. Both formatters sort on the plain label.riskInputs()graph walks are memoized per run, so a broad diff no longer repeats identical caller/reach walks per changed entry-class or job file.- The shared line-range locality rule of the per-source checkers lives in one trait.
- CI: the run-tests matrix caches Composer downloads, and a dedicated job runs the suite without
laravel/mcpinstalled (pinned to the Laravel 12 floor) to exercise the optional-dependency guard.
Full Changelog: v0.7.0...v0.8.0