diff --git a/.github/instructions/laravel-boost.instructions.md b/.github/instructions/laravel-boost.instructions.md index 0d84627cb..1fe66274c 100644 --- a/.github/instructions/laravel-boost.instructions.md +++ b/.github/instructions/laravel-boost.instructions.md @@ -13,6 +13,10 @@ Before relying on a package's API, confirm its installed version: - PHP packages: run `composer show --direct` to list direct dependencies with versions, or `composer show ` for a single package. - JS packages: check `package.json` for the installed versions. +## Skills Activation + +This project has domain-specific skills available in `**/skills/**`. You MUST activate the relevant skill whenever you work in that domain—don't wait until you're stuck. + ## Conventions - You must follow all existing code conventions used in this application. When creating or editing a file, check sibling files for the correct structure, approach, and naming. @@ -54,7 +58,7 @@ Before relying on a package's API, confirm its installed version: ## Searching Documentation (IMPORTANT) -- Always use `search-docs` before making code changes. Do not skip this step. It returns version-specific docs based on installed packages automatically. +- Use `search-docs` before changes that depend on Laravel ecosystem APIs, behavior, configuration, or version-specific syntax. Skip it for copy-only edits and other changes where package documentation is irrelevant. Reuse sufficient results already in context instead of searching again. - Pass a `packages` array to scope results when you know which packages are relevant. - Use multiple broad, topic-based queries: `['rate limiting', 'routing rate limiting', 'routing']`. Expect the most relevant results first. - Do not add package names to queries because package info is already shared. Use `test resource table`, not `filament 4 test resource table`. @@ -137,8 +141,10 @@ Local development is often done in WSL2 while Docker runs via **Windows Docker D # Test Enforcement -- Every change must be programmatically tested. Write a new test or update an existing test, then run the affected tests to make sure they pass. -- Run the minimum number of tests needed to ensure code quality and speed. Use `php artisan test --compact` with a specific filename or filter. +- Test every code change by adding or updating a test. +- Run the affected tests and ensure they pass. +- Test the changed behavior and its important failure modes, but do not add tests beyond them. +- Read the `testing-best-practices` skill before writing tests. === laravel/core rules === @@ -174,7 +180,7 @@ Local development is often done in WSL2 while Docker runs via **Windows Docker D # Livewire -- Livewire allow to build dynamic, reactive interfaces in PHP without writing JavaScript. +- Livewire allows you to build dynamic, reactive interfaces in PHP without writing JavaScript. - You can use Alpine.js for client-side interactions instead of JavaScript frameworks. - Keep state server-side so the UI reflects it. Validate and authorize in actions as you would in HTTP requests. @@ -189,19 +195,15 @@ Local development is often done in WSL2 while Docker runs via **Windows Docker D # PHPUnit -- This application uses PHPUnit for testing. All tests must be written as PHPUnit classes. Use `php artisan make:test --phpunit {name}` to create a new test. -- If you see a test using "Pest", convert it to PHPUnit. -- Every time a test has been updated, run that singular test. -- When the tests relating to your feature are passing, ask the user if they would like to also run the entire test suite to make sure everything is still passing. -- Tests should cover all happy paths, failure paths, and edge cases. -- You must not remove any tests or test files from the tests directory without approval. These are not temporary or helper files; these are core to the application. +- This project uses PHPUnit. Create tests with `php artisan make:test --phpunit {name}`. +- Do not include the test suite directory in `{name}`. Use `SomeFeatureTest`, not `Feature/SomeFeatureTest`. +- Read the `testing-best-practices` skill for guidance on coverage, naming, structure, dependency isolation, and review. ## Running Tests -- Run the minimal number of tests, using an appropriate filter, before finalizing. -- To run all tests: `php artisan test --compact`. -- To run all tests in a file: `php artisan test --compact tests/Feature/ExampleTest.php`. -- To filter on a particular test name: `php artisan test --compact --filter=testName` (recommended after making a change to a related file). +- Run the narrowest set of tests that covers the change. Pass a file path or `--filter=testName` to `php artisan test --compact`. +- Rerun a test after each change to it. +- Run `vendor/bin/phpunit` to call the test runner directly. It accepts the same file path and `--filter=testName` arguments. === revolution/laravel-boost-phpstorm-copilot/core rules === diff --git a/AGENTS.md b/AGENTS.md index 0a7226222..2263032e2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -197,6 +197,10 @@ Before relying on a package's API, confirm its installed version: - PHP packages: run `composer show --direct` to list direct dependencies with versions, or `composer show ` for a single package. - JS packages: check `package.json` for the installed versions. +## Skills Activation + +This project has domain-specific skills available in `**/skills/**`. You MUST activate the relevant skill whenever you work in that domain—don't wait until you're stuck. + ## Conventions - You must follow all existing code conventions used in this application. When creating or editing a file, check sibling files for the correct structure, approach, and naming. @@ -238,7 +242,7 @@ Before relying on a package's API, confirm its installed version: ## Searching Documentation (IMPORTANT) -- Always use `search-docs` before making code changes. Do not skip this step. It returns version-specific docs based on installed packages automatically. +- Use `search-docs` before changes that depend on Laravel ecosystem APIs, behavior, configuration, or version-specific syntax. Skip it for copy-only edits and other changes where package documentation is irrelevant. Reuse sufficient results already in context instead of searching again. - Pass a `packages` array to scope results when you know which packages are relevant. - Use multiple broad, topic-based queries: `['rate limiting', 'routing rate limiting', 'routing']`. Expect the most relevant results first. - Do not add package names to queries because package info is already shared. Use `test resource table`, not `filament 4 test resource table`. @@ -321,8 +325,10 @@ Local development is often done in WSL2 while Docker runs via **Windows Docker D # Test Enforcement -- Every change must be programmatically tested. Write a new test or update an existing test, then run the affected tests to make sure they pass. -- Run the minimum number of tests needed to ensure code quality and speed. Use `php artisan test --compact` with a specific filename or filter. +- Test every code change by adding or updating a test. +- Run the affected tests and ensure they pass. +- Test the changed behavior and its important failure modes, but do not add tests beyond them. +- Read the `testing-best-practices` skill before writing tests. === laravel/core rules === @@ -358,7 +364,7 @@ Local development is often done in WSL2 while Docker runs via **Windows Docker D # Livewire -- Livewire allow to build dynamic, reactive interfaces in PHP without writing JavaScript. +- Livewire allows you to build dynamic, reactive interfaces in PHP without writing JavaScript. - You can use Alpine.js for client-side interactions instead of JavaScript frameworks. - Keep state server-side so the UI reflects it. Validate and authorize in actions as you would in HTTP requests. @@ -373,19 +379,15 @@ Local development is often done in WSL2 while Docker runs via **Windows Docker D # PHPUnit -- This application uses PHPUnit for testing. All tests must be written as PHPUnit classes. Use `php artisan make:test --phpunit {name}` to create a new test. -- If you see a test using "Pest", convert it to PHPUnit. -- Every time a test has been updated, run that singular test. -- When the tests relating to your feature are passing, ask the user if they would like to also run the entire test suite to make sure everything is still passing. -- Tests should cover all happy paths, failure paths, and edge cases. -- You must not remove any tests or test files from the tests directory without approval. These are not temporary or helper files; these are core to the application. +- This project uses PHPUnit. Create tests with `php artisan make:test --phpunit {name}`. +- Do not include the test suite directory in `{name}`. Use `SomeFeatureTest`, not `Feature/SomeFeatureTest`. +- Read the `testing-best-practices` skill for guidance on coverage, naming, structure, dependency isolation, and review. ## Running Tests -- Run the minimal number of tests, using an appropriate filter, before finalizing. -- To run all tests: `php artisan test --compact`. -- To run all tests in a file: `php artisan test --compact tests/Feature/ExampleTest.php`. -- To filter on a particular test name: `php artisan test --compact --filter=testName` (recommended after making a change to a related file). +- Run the narrowest set of tests that covers the change. Pass a file path or `--filter=testName` to `php artisan test --compact`. +- Rerun a test after each change to it. +- Run `vendor/bin/phpunit` to call the test runner directly. It accepts the same file path and `--filter=testName` arguments. === revolution/laravel-boost-phpstorm-copilot/core rules === diff --git a/boost.json b/boost.json index b22a5a420..dc7d3e45a 100644 --- a/boost.json +++ b/boost.json @@ -19,12 +19,18 @@ "skills": [ "infer-conventions", "laravel-best-practices", + "testing-best-practices", "configuring-horizon", "pulse-development", "livewire-development", "echo-development", "tailwindcss-development", "blaze-optimize", - "laravel-permission-development" + "laravel-permission-development", + "eloquent-best-practices", + "laravel-11-12-app-guidelines", + "laravel-quality", + "laravel-specialist", + "laravel-testing" ] } diff --git a/composer.lock b/composer.lock index 09ac76b8b..b7f4e023f 100644 --- a/composer.lock +++ b/composer.lock @@ -5954,16 +5954,16 @@ }, { "name": "sentry/sentry", - "version": "4.30.0", + "version": "4.31.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "95a26e7c946651cacd69d1ded95a8190f952a3ae" + "reference": "39d9f86bd56c6cc6ae7b64c2b849f7f046d38394" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/95a26e7c946651cacd69d1ded95a8190f952a3ae", - "reference": "95a26e7c946651cacd69d1ded95a8190f952a3ae", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/39d9f86bd56c6cc6ae7b64c2b849f7f046d38394", + "reference": "39d9f86bd56c6cc6ae7b64c2b849f7f046d38394", "shasum": "" }, "require": { @@ -6034,7 +6034,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/4.30.0" + "source": "https://github.com/getsentry/sentry-php/tree/4.31.0" }, "funding": [ { @@ -6046,7 +6046,7 @@ "type": "custom" } ], - "time": "2026-08-05T14:54:26+00:00" + "time": "2026-08-27T12:59:01+00:00" }, { "name": "sentry/sentry-laravel", @@ -11638,24 +11638,46 @@ }, { "name": "driftingly/rector-laravel", - "version": "2.5.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/driftingly/rector-laravel.git", - "reference": "0dbdd842dfdbc821cfe5f47ca7326e2502b2a107" + "reference": "8deb9786f50cb263be3e2219136e53d6d143a7d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/driftingly/rector-laravel/zipball/0dbdd842dfdbc821cfe5f47ca7326e2502b2a107", - "reference": "0dbdd842dfdbc821cfe5f47ca7326e2502b2a107", + "url": "https://api.github.com/repos/driftingly/rector-laravel/zipball/8deb9786f50cb263be3e2219136e53d6d143a7d6", + "reference": "8deb9786f50cb263be3e2219136e53d6d143a7d6", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0", - "rector/rector": "^2.2.7", + "php": ">=8.3", + "rector/rector": "^2.6.4", + "symplify/rule-doc-generator-contracts": "^11.2", "webmozart/assert": "^1.11 || ^2.0" }, + "require-dev": { + "boundwize/structarmed": "^0.16", + "nette/utils": "^4.0", + "nikic/php-parser": "^5.6", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^2.2", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpstan/phpstan-webmozart-assert": "^2.0", + "phpunit/phpunit": "^10.5", + "symplify/rule-doc-generator": "^12.2", + "tightenco/duster": "^3.1", + "tracy/tracy": "^2.10" + }, "type": "rector-extension", + "extra": { + "rector": { + "includes": [ + "config/config.php" + ] + } + }, "autoload": { "psr-4": { "RectorLaravel\\": "src" @@ -11668,9 +11690,9 @@ "description": "Rector upgrades rules for Laravel Framework", "support": { "issues": "https://github.com/driftingly/rector-laravel/issues", - "source": "https://github.com/driftingly/rector-laravel/tree/2.5.0" + "source": "https://github.com/driftingly/rector-laravel/tree/2.6.1" }, - "time": "2026-06-02T16:22:14+00:00" + "time": "2026-08-27T12:43:48+00:00" }, { "name": "ergebnis/composer-normalize", @@ -12587,16 +12609,16 @@ }, { "name": "laravel/boost", - "version": "v2.6.0", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "44f5944bf837856bc727aab87aba026dc70faa94" + "reference": "b19e98a8637cb69b2aab7b5b6c5fe9e2c79d182f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/44f5944bf837856bc727aab87aba026dc70faa94", - "reference": "44f5944bf837856bc727aab87aba026dc70faa94", + "url": "https://api.github.com/repos/laravel/boost/zipball/b19e98a8637cb69b2aab7b5b6c5fe9e2c79d182f", + "reference": "b19e98a8637cb69b2aab7b5b6c5fe9e2c79d182f", "shasum": "" }, "require": { @@ -12649,7 +12671,7 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2026-08-25T15:25:31+00:00" + "time": "2026-08-26T21:39:22+00:00" }, { "name": "laravel/mcp", @@ -13900,16 +13922,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.33", + "version": "12.5.34", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "b98e028a26c5c5ba7e4a54be96ccf35f2914d184" + "reference": "6cbff63d670de92cb1cb3d2ff9f40327e9da9c7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b98e028a26c5c5ba7e4a54be96ccf35f2914d184", - "reference": "b98e028a26c5c5ba7e4a54be96ccf35f2914d184", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6cbff63d670de92cb1cb3d2ff9f40327e9da9c7f", + "reference": "6cbff63d670de92cb1cb3d2ff9f40327e9da9c7f", "shasum": "" }, "require": { @@ -13919,18 +13941,18 @@ "ext-libxml": "*", "ext-mbstring": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", + "myclabs/deep-copy": "^1.14.0", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", "phpunit/php-code-coverage": "^12.5.7", - "phpunit/php-file-iterator": "^6.0.1", + "phpunit/php-file-iterator": "^6.0.2", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", "sebastian/cli-parser": "^4.2.1", "sebastian/comparator": "^7.1.8", - "sebastian/diff": "^7.0.0", + "sebastian/diff": "^7.0.1", "sebastian/environment": "^8.1.2", "sebastian/exporter": "^7.0.3", "sebastian/global-state": "^8.0.3", @@ -13978,7 +14000,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.33" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.34" }, "funding": [ { @@ -13986,20 +14008,20 @@ "type": "other" } ], - "time": "2026-07-28T13:58:09+00:00" + "time": "2026-08-27T08:38:28+00:00" }, { "name": "rector/rector", - "version": "2.6.3", + "version": "2.6.4", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "7e46709996a4b3dc59e1d6ecbb6a38ace335bd58" + "reference": "6ff008471683591224951526247b7a2b86980ba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/7e46709996a4b3dc59e1d6ecbb6a38ace335bd58", - "reference": "7e46709996a4b3dc59e1d6ecbb6a38ace335bd58", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/6ff008471683591224951526247b7a2b86980ba9", + "reference": "6ff008471683591224951526247b7a2b86980ba9", "shasum": "" }, "require": { @@ -14038,7 +14060,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.6.3" + "source": "https://github.com/rectorphp/rector/tree/2.6.4" }, "funding": [ { @@ -14046,7 +14068,7 @@ "type": "github" } ], - "time": "2026-08-18T22:01:18+00:00" + "time": "2026-08-27T09:20:34+00:00" }, { "name": "revolution/laravel-boost-phpstorm-copilot", @@ -15729,6 +15751,65 @@ ], "time": "2026-08-21T12:16:08+00:00" }, + { + "name": "symplify/rule-doc-generator-contracts", + "version": "11.2.0", + "source": { + "type": "git", + "url": "https://github.com/symplify/rule-doc-generator-contracts.git", + "reference": "479cfcfd46047f80624aba931d9789e50475b5c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symplify/rule-doc-generator-contracts/zipball/479cfcfd46047f80624aba931d9789e50475b5c6", + "reference": "479cfcfd46047f80624aba931d9789e50475b5c6", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.2", + "rector/rector": "^0.15.10", + "symplify/easy-ci": "^11.1", + "symplify/easy-coding-standard": "^11.1", + "symplify/easy-testing": "^11.1", + "symplify/phpstan-extensions": "^11.1", + "symplify/phpstan-rules": "11.2.3.72", + "tomasvotruba/unused-public": "^0.0.34" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symplify\\RuleDocGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Contracts for production code of RuleDocGenerator", + "support": { + "source": "https://github.com/symplify/rule-doc-generator-contracts/tree/11.2.0" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-03-18T22:02:54+00:00" + }, { "name": "theseer/tokenizer", "version": "2.0.1",