- keep table/Inertia/database link-tracking alive in piggyback-coverage
recording, and merge link-only edges into the piggybacked edge set
- route migration changes through the watch-pattern fallback when the
graph has no recorded table usage
- re-run cached failures whose test file cannot be located, downgrading
filtered runs to full replay instead of silently skipping them
- align non-filtered replay with the failOn*/displayDetailsOn* rerun policy
- resolve anonymous index Blade components (<x-card> from card/index.blade.php)
and stop swallowing components whose static usage walk selected no tests
- parse CTE/REPLACE queries and schema-qualified identifiers in TableExtractor
- scope-filter the xdebug recording path like pcov
- ignore in-flight .tmp files in FileState::keysWithPrefix and delete
unreadable worker partials
- vite deps helper: resolve rolldown through rolldown-vite installs and
degrade gracefully, honour vite.config resolve.alias (incl. the
laravel-vite-plugin '@' default), resolve .vue/.svelte/.mts/.cts
extensions, and stop memoizing cycle-tainted transitive sets
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Tia plugin scans the raw argv with str_starts_with() in
argumentPresent() and hasExplicitPathArgument(). In the parallel worker
path (bin/worker.php) the unserialized argv can contain an integer
--random-order-seed value as a separate element, which made
str_starts_with() throw:
TypeError: str_starts_with(): Argument #1 ($haystack) must be of
type string, int given
This is the same class of bug as #1206, which was only fixed in
HandleArguments; it resurfaced in the newer Tia plugin. Cast each argv
element to string before scanning, mirroring the #1206 fix.
Adds a regression test, and updates the parallel count assertion and the
success snapshot to account for it.
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* refactor(shard): extract parseListTestsOutput for testability
* test(shard): characterize parseListTestsOutput current behavior
* fix(shard): parse any PHP FQCN namespace from --list-tests
* fix(shard): forward --test-directory to list-tests subprocess
* chore: lint + snapshot fixups
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* refactor(shard): make extracted helpers private, test via reflection
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* revert visual_snapshot_of_help_command_output
* revert visual_snapshot_of_help_command_output
* keep function removeParallelArguments
* strip --processes argument when building list-tests command
The removeParallelArguments method was not filtering --processes flags, causing the list-tests subprocess to fail when parallel execution was enabled. This prevented time-based sharding from working correctly with the --parallel option.
Now both --parallel/-p and --processes arguments are removed from the command used to enumerate tests, ensuring the subprocess runs successfully.
* test: re-add namespace-agnostic sharding tests
- 5.x merge kept describe()-style test file, dropped PR #1677 tests for parseListTestsOutput + buildListTestsCommand. Re-add them in matching style.
- Also fix removeParallelArguments test broken by merge: source array_values() + strips --processes, so expects ['bin/pest','tests/'].
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When using not() expectations with custom error messages, the message
was truncated because throwExpectationFailedException() passed all
arguments through shortenedExport() which limits strings to ~40 chars.
Uses the full export() method for arguments instead of shortenedExport()
so custom error messages are displayed in their entirety.
Fixes#1533