Skip to content

0.8.0

Choose a tag to compare

@SanderMuller SanderMuller released this 19 Jul 20:59
Immutable release. Only release title and notes can be modified.

Added

  • laravel/mcp version boundary. The supported range is ^0.8||^0.9 (0.9.0 validated against the full suite); composer.json now carries a matching conflict entry, 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_paths entries 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.ts declaration 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. A route(ROUTES.player) or route(RouteName.Player) whose referent is a same-module const/enum string constant now resolves to that name instead of tainting the file UNRESOLVED. Resolution never guesses: const-only (never let/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 the livewire('show-posts') helper now map onto their conventional classes (App\Livewire\Admin\Dashboard, App\Livewire\ShowPosts) in the test-reference index, so richter:affected-tests selects 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 with core.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, through richter: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.card also seeded every nested sibling (components.card.header, …) through boundary-substring matching, inflating impacted and risk and potentially tripping a --fail-on gate 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:add stanza escaping.
  • EntryPointRow now 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/mcp installed (pinned to the Laravel 12 floor) to exercise the optional-dependency guard.

Full Changelog: v0.7.0...v0.8.0