From 9bf91bfbdd4c84431dc22d376321b0fe36d16f71 Mon Sep 17 00:00:00 2001 From: Mathieu Date: Fri, 30 Jan 2026 13:04:28 +0100 Subject: [PATCH 1/5] Remove matrix in github workflows --- .github/workflows/run-tests.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index c878d51..088b27e 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -16,17 +16,15 @@ jobs: strategy: fail-fast: true matrix: - os: [ubuntu-latest, windows-latest] + os: [ubuntu-latest] php: [8.3, 8.2] - laravel: [11.*, 10.*] - stability: [prefer-lowest, prefer-stable] + laravel: [12.*] + stability: [prefer-stable] include: - - laravel: 11.* - testbench: 9.* - carbon: ^2.63 - - laravel: 10.* - testbench: 8.* - carbon: ^2.63 + - laravel: 12.* + testbench: 10.* + carbon: 3.* + collision: 8.* name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }} From 008ae069a6af345e72d1c4cdd54030c8ca0f5a54 Mon Sep 17 00:00:00 2001 From: Manoj Hortulanus Date: Fri, 20 Mar 2026 10:25:59 +0100 Subject: [PATCH 2/5] chore: upgrade translations package and add Laravel 13 / Filament 5 support - Widen illuminate/contracts to ^13.0 and filament/filament to ^5.0 - Fix Language model code attribute trimming to prevent whitespace issues - Add PostgreSQL support for SPLIT_PART in LanguageResource - Replace Tailwind classes with inline styles in switcher for Filament v5 compat - Use callAfterResolving for schedule registration in service provider - Register Livewire namespace instead of individual component - Remove language switch notification (page reloads instead) - Remove retryUntil from TranslateKeys job, increase AI reasoning effort - Import spotlight-pro CSS in theme - Rebuild translations CSS dist Co-Authored-By: Claude Opus 4.6 (1M context) --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e65dc3e..ce281c3 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ ], "require": { "php": "^8.2", - "illuminate/contracts": "^10.0||^11.0||^12.0", + "illuminate/contracts": "^10.0||^11.0||^12.0||^13.0", "prism-php/prism": ">=0.98", "spatie/laravel-package-tools": "^1.16" }, From 3fc0a05de9464dfd65d2f88f956da55a452df5db Mon Sep 17 00:00:00 2001 From: Manoj Hortulanus Date: Fri, 20 Mar 2026 10:44:30 +0100 Subject: [PATCH 3/5] Revert "Merge pull request #135 from backstagephp/chore/laravel-filament-upgrade" This reverts commit 0a864204f785af45071f2ac1fbebe83907a858b2, reversing changes made to fa665508eda643c287ad58c3ac3dfa8dadd5dda3. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index ce281c3..e65dc3e 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ ], "require": { "php": "^8.2", - "illuminate/contracts": "^10.0||^11.0||^12.0||^13.0", + "illuminate/contracts": "^10.0||^11.0||^12.0", "prism-php/prism": ">=0.98", "spatie/laravel-package-tools": "^1.16" }, From fc9598e1882dba345d93ab2f2409326eb3d57daf Mon Sep 17 00:00:00 2001 From: Mark van Eijk Date: Wed, 25 Mar 2026 10:09:59 +0100 Subject: [PATCH 4/5] Remove spatie/laravel-ray dependency from all packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The dependency is unused — no ray() calls exist in the codebase. Removes it from require-dev in 9 packages, the conflict section in laravel-mails, the CI workflow removal step, and the laravel-ai configure script. Co-Authored-By: Claude Opus 4.6 (1M context) --- composer.json | 3 +-- configure.php | 6 ------ 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/composer.json b/composer.json index e65dc3e..90bc46d 100644 --- a/composer.json +++ b/composer.json @@ -31,8 +31,7 @@ "pestphp/pest-plugin-laravel": "^2.3", "phpstan/extension-installer": "^1.3", "phpstan/phpstan-deprecation-rules": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "spatie/laravel-ray": "^1.35" + "phpstan/phpstan-phpunit": "^1.3" }, "autoload": { "psr-4": { diff --git a/configure.php b/configure.php index 0ecd73c..8cbc903 100644 --- a/configure.php +++ b/configure.php @@ -273,7 +273,6 @@ function guessGitHubVendorInfo($authorName, $username): array $usePhpStan = confirm('Enable PhpStan?', true); $useLaravelPint = confirm('Enable Laravel Pint?', true); $useDependabot = confirm('Enable Dependabot?', true); -$useLaravelRay = confirm('Use Ray for debugging?', true); $useUpdateChangelogWorkflow = confirm('Use automatic changelog updater workflow?', true); writeln('------'); @@ -287,7 +286,6 @@ function guessGitHubVendorInfo($authorName, $username): array writeln('Use Laravel/Pint : ' . ($useLaravelPint ? 'yes' : 'no')); writeln('Use Larastan/PhpStan : ' . ($usePhpStan ? 'yes' : 'no')); writeln('Use Dependabot : ' . ($useDependabot ? 'yes' : 'no')); -writeln('Use Ray App : ' . ($useLaravelRay ? 'yes' : 'no')); writeln('Use Auto-Changelog : ' . ($useUpdateChangelogWorkflow ? 'yes' : 'no')); writeln('------'); @@ -354,10 +352,6 @@ function guessGitHubVendorInfo($authorName, $username): array safeUnlink(__DIR__ . '/.github/workflows/dependabot-auto-merge.yml'); } -if (! $useLaravelRay) { - remove_composer_deps(['spatie/laravel-ray']); -} - if (! $useUpdateChangelogWorkflow) { safeUnlink(__DIR__ . '/.github/workflows/update-changelog.yml'); } From 670cc66ff3373bfc93117186fdc1a3aa6088880b Mon Sep 17 00:00:00 2001 From: markvaneijk <1925388+markvaneijk@users.noreply.github.com> Date: Tue, 31 Mar 2026 03:35:12 +0000 Subject: [PATCH 5/5] Fix styling --- configure.php | 54 +++++++++++++++++++++++----------------------- tests/TestCase.php | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/configure.php b/configure.php index 8cbc903..f8366ca 100644 --- a/configure.php +++ b/configure.php @@ -3,7 +3,7 @@ function ask(string $question, string $default = ''): string { - $answer = readline($question . ($default ? " ({$default})" : null) . ': '); + $answer = readline($question.($default ? " ({$default})" : null).': '); if (! $answer) { return $default; @@ -14,7 +14,7 @@ function ask(string $question, string $default = ''): string function confirm(string $question, bool $default = false): bool { - $answer = ask($question . ' (' . ($default ? 'Y/n' : 'y/N') . ')'); + $answer = ask($question.' ('.($default ? 'Y/n' : 'y/N').')'); if (! $answer) { return $default; @@ -25,7 +25,7 @@ function confirm(string $question, bool $default = false): bool function writeln(string $line): void { - echo $line . PHP_EOL; + echo $line.PHP_EOL; } function run(string $command): string @@ -84,7 +84,7 @@ function remove_prefix(string $prefix, string $content): string function remove_composer_deps(array $names) { - $data = json_decode(file_get_contents(__DIR__ . '/composer.json'), true); + $data = json_decode(file_get_contents(__DIR__.'/composer.json'), true); foreach ($data['require-dev'] as $name => $version) { if (in_array($name, $names, true)) { @@ -92,12 +92,12 @@ function remove_composer_deps(array $names) } } - file_put_contents(__DIR__ . '/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); + file_put_contents(__DIR__.'/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); } function remove_composer_script($scriptName) { - $data = json_decode(file_get_contents(__DIR__ . '/composer.json'), true); + $data = json_decode(file_get_contents(__DIR__.'/composer.json'), true); foreach ($data['scripts'] as $name => $script) { if ($scriptName === $name) { @@ -107,7 +107,7 @@ function remove_composer_script($scriptName) } } - file_put_contents(__DIR__ . '/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); + file_put_contents(__DIR__.'/composer.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); } function remove_readme_paragraphs(string $file): void @@ -134,12 +134,12 @@ function determineSeparator(string $path): string function replaceForWindows(): array { - return preg_split('/\\r\\n|\\r|\\n/', run('dir /S /B * | findstr /v /i .git\ | findstr /v /i vendor | findstr /v /i ' . basename(__FILE__) . ' | findstr /r /i /M /F:/ ":author :vendor :package VendorName skeleton migration_table_name vendor_name vendor_slug author@domain.com"')); + return preg_split('/\\r\\n|\\r|\\n/', run('dir /S /B * | findstr /v /i .git\ | findstr /v /i vendor | findstr /v /i '.basename(__FILE__).' | findstr /r /i /M /F:/ ":author :vendor :package VendorName skeleton migration_table_name vendor_name vendor_slug author@domain.com"')); } function replaceForAllOtherOSes(): array { - return explode(PHP_EOL, run('grep -E -r -l -i ":author|:vendor|:package|VendorName|skeleton|migration_table_name|vendor_name|vendor_slug|author@domain.com" --exclude-dir=vendor ./* ./.github/* | grep -v ' . basename(__FILE__))); + return explode(PHP_EOL, run('grep -E -r -l -i ":author|:vendor|:package|VendorName|skeleton|migration_table_name|vendor_name|vendor_slug|author@domain.com" --exclude-dir=vendor ./* ./.github/* | grep -v '.basename(__FILE__))); } function getGitHubApiEndpoint(string $endpoint): ?stdClass @@ -283,10 +283,10 @@ function guessGitHubVendorInfo($authorName, $username): array writeln("Class name : {$className}"); writeln('---'); writeln('Packages & Utilities'); -writeln('Use Laravel/Pint : ' . ($useLaravelPint ? 'yes' : 'no')); -writeln('Use Larastan/PhpStan : ' . ($usePhpStan ? 'yes' : 'no')); -writeln('Use Dependabot : ' . ($useDependabot ? 'yes' : 'no')); -writeln('Use Auto-Changelog : ' . ($useUpdateChangelogWorkflow ? 'yes' : 'no')); +writeln('Use Laravel/Pint : '.($useLaravelPint ? 'yes' : 'no')); +writeln('Use Larastan/PhpStan : '.($usePhpStan ? 'yes' : 'no')); +writeln('Use Dependabot : '.($useDependabot ? 'yes' : 'no')); +writeln('Use Auto-Changelog : '.($useUpdateChangelogWorkflow ? 'yes' : 'no')); writeln('------'); writeln('This script will replace the above values in all relevant files in the project directory.'); @@ -316,26 +316,26 @@ function guessGitHubVendorInfo($authorName, $username): array ]); match (true) { - str_contains($file, determineSeparator('src/Skeleton.php')) => rename($file, determineSeparator('./src/' . $className . '.php')), - str_contains($file, determineSeparator('src/SkeletonServiceProvider.php')) => rename($file, determineSeparator('./src/' . $className . 'ServiceProvider.php')), - str_contains($file, determineSeparator('src/Facades/Skeleton.php')) => rename($file, determineSeparator('./src/Facades/' . $className . '.php')), - str_contains($file, determineSeparator('src/Commands/SkeletonCommand.php')) => rename($file, determineSeparator('./src/Commands/' . $className . 'Command.php')), - str_contains($file, determineSeparator('database/migrations/create_skeleton_table.php.stub')) => rename($file, determineSeparator('./database/migrations/create_' . title_snake($packageSlugWithoutPrefix) . '_table.php.stub')), - str_contains($file, determineSeparator('config/skeleton.php')) => rename($file, determineSeparator('./config/' . $packageSlugWithoutPrefix . '.php')), + str_contains($file, determineSeparator('src/Skeleton.php')) => rename($file, determineSeparator('./src/'.$className.'.php')), + str_contains($file, determineSeparator('src/SkeletonServiceProvider.php')) => rename($file, determineSeparator('./src/'.$className.'ServiceProvider.php')), + str_contains($file, determineSeparator('src/Facades/Skeleton.php')) => rename($file, determineSeparator('./src/Facades/'.$className.'.php')), + str_contains($file, determineSeparator('src/Commands/SkeletonCommand.php')) => rename($file, determineSeparator('./src/Commands/'.$className.'Command.php')), + str_contains($file, determineSeparator('database/migrations/create_skeleton_table.php.stub')) => rename($file, determineSeparator('./database/migrations/create_'.title_snake($packageSlugWithoutPrefix).'_table.php.stub')), + str_contains($file, determineSeparator('config/skeleton.php')) => rename($file, determineSeparator('./config/'.$packageSlugWithoutPrefix.'.php')), str_contains($file, 'README.md') => remove_readme_paragraphs($file), default => [], }; } if (! $useLaravelPint) { - safeUnlink(__DIR__ . '/.github/workflows/fix-php-code-style-issues.yml'); - safeUnlink(__DIR__ . '/pint.json'); + safeUnlink(__DIR__.'/.github/workflows/fix-php-code-style-issues.yml'); + safeUnlink(__DIR__.'/pint.json'); } if (! $usePhpStan) { - safeUnlink(__DIR__ . '/phpstan.neon.dist'); - safeUnlink(__DIR__ . '/phpstan-baseline.neon'); - safeUnlink(__DIR__ . '/.github/workflows/phpstan.yml'); + safeUnlink(__DIR__.'/phpstan.neon.dist'); + safeUnlink(__DIR__.'/phpstan-baseline.neon'); + safeUnlink(__DIR__.'/.github/workflows/phpstan.yml'); remove_composer_deps([ 'phpstan/extension-installer', @@ -348,12 +348,12 @@ function guessGitHubVendorInfo($authorName, $username): array } if (! $useDependabot) { - safeUnlink(__DIR__ . '/.github/dependabot.yml'); - safeUnlink(__DIR__ . '/.github/workflows/dependabot-auto-merge.yml'); + safeUnlink(__DIR__.'/.github/dependabot.yml'); + safeUnlink(__DIR__.'/.github/workflows/dependabot-auto-merge.yml'); } if (! $useUpdateChangelogWorkflow) { - safeUnlink(__DIR__ . '/.github/workflows/update-changelog.yml'); + safeUnlink(__DIR__.'/.github/workflows/update-changelog.yml'); } confirm('Execute `composer install` and run tests?') && run('composer install && composer test'); diff --git a/tests/TestCase.php b/tests/TestCase.php index b504517..d700567 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -13,7 +13,7 @@ protected function setUp(): void parent::setUp(); Factory::guessFactoryNamesUsing( - fn (string $modelName) => 'Backstage\Laravel\\AI\\Database\\Factories\\' . class_basename($modelName) . 'Factory' + fn (string $modelName) => 'Backstage\Laravel\\AI\\Database\\Factories\\'.class_basename($modelName).'Factory' ); }