From 62248802194a6ab775f2f4f0644eafcf086891e5 Mon Sep 17 00:00:00 2001 From: Twyco Date: Wed, 16 Sep 2026 09:54:34 +0200 Subject: [PATCH 1/5] faster test app action --- .github/tests/test_and_check_app/action.yml | 80 +++++++++++++++++---- 1 file changed, 67 insertions(+), 13 deletions(-) diff --git a/.github/tests/test_and_check_app/action.yml b/.github/tests/test_and_check_app/action.yml index 148b553..2820ea1 100644 --- a/.github/tests/test_and_check_app/action.yml +++ b/.github/tests/test_and_check_app/action.yml @@ -1,18 +1,72 @@ -name: test_and_check_app -description: Build the test image and run all application checks +name: "Lint and Test API" +description: "Run Pint and the Pest test suite for the Laravel API" runs: using: composite steps: - - name: Test and check app - shell: bash - run: | - set -Eeuo pipefail + - name: Setup PHP + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 #v2.37.2 + with: + php-version: "8.5" + extensions: mbstring, pdo_sqlite + coverage: none + tools: composer:v2 - docker buildx build \ - --file Dockerfile \ - --target test \ - --tag "local/kanbangit-test:${GITHUB_SHA}" \ - --progress plain \ - --load \ - . + - name: Verify Composer lockfile + run: | + if [ ! -f composer.lock ]; then + echo "::error::api/composer.lock not found" + exit 1 + fi + shell: bash + + - name: Get Composer cache directory + id: composer_cache + run: echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" + shell: bash + + - name: Cache Composer packages + uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0 + with: + path: ${{ steps.composer_cache.outputs.dir }} + key: ${{ runner.os }}-php-8.5-${{ hashFiles('api/composer.lock') }} + + - name: Setup pnpm + uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v11.7.0 + with: + package-json-file: package.json + + - name: Setup Node.js + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: 22 + cache: "pnpm" + cache-dependency-path: "pnpm-lock.yaml" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + shell: bash + + - name: Prepare environment file + run: cp .env.example .env + shell: bash + + - name: Install dependencies + run: composer install --no-interaction --prefer-dist --no-progress + shell: bash + + - name: Generate application key + run: php artisan key:generate + shell: bash + + - name: Generate Wayfinder routes and actions + run: php artisan wayfinder:generate --with-form + shell: bash + + - name: Build Vite app + run: pnpm run build + shell: bash + + - name: Run ci check + run: composer run ci:check + shell: bash From b5030e6acc4d50f1d3016242da36bb93143d8717 Mon Sep 17 00:00:00 2001 From: Twyco Date: Wed, 16 Sep 2026 10:41:40 +0200 Subject: [PATCH 2/5] faster action test --- .github/tests/test_and_check_app/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/tests/test_and_check_app/action.yml b/.github/tests/test_and_check_app/action.yml index 2820ea1..0418e5e 100644 --- a/.github/tests/test_and_check_app/action.yml +++ b/.github/tests/test_and_check_app/action.yml @@ -1,5 +1,5 @@ -name: "Lint and Test API" -description: "Run Pint and the Pest test suite for the Laravel API" +name: "Lint and Test APP" +description: "Run Pint and the Pest test suite" runs: using: composite From 5c2b62de2aa186cce9fc4f7e2767b294f543d4c3 Mon Sep 17 00:00:00 2001 From: Twyco Date: Wed, 16 Sep 2026 11:04:44 +0200 Subject: [PATCH 3/5] fix --- .github/tests/test_and_check_app/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/tests/test_and_check_app/action.yml b/.github/tests/test_and_check_app/action.yml index 0418e5e..32a478f 100644 --- a/.github/tests/test_and_check_app/action.yml +++ b/.github/tests/test_and_check_app/action.yml @@ -15,7 +15,7 @@ runs: - name: Verify Composer lockfile run: | if [ ! -f composer.lock ]; then - echo "::error::api/composer.lock not found" + echo "::error::composer.lock not found" exit 1 fi shell: bash @@ -29,7 +29,7 @@ runs: uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0 with: path: ${{ steps.composer_cache.outputs.dir }} - key: ${{ runner.os }}-php-8.5-${{ hashFiles('api/composer.lock') }} + key: ${{ runner.os }}-php-8.5-${{ hashFiles('composer.lock') }} - name: Setup pnpm uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v11.7.0 From ce250d8be5490322fecf73c4e98920d5a981a58f Mon Sep 17 00:00:00 2001 From: Twyco Date: Wed, 16 Sep 2026 11:13:34 +0200 Subject: [PATCH 4/5] use paratest --- .../skills/inertia-vue-development/SKILL.md | 394 ------------------ .../skills/tailwindcss-development/SKILL.md | 119 ------ .agents/skills/wayfinder-development/SKILL.md | 12 +- AGENTS.md | 22 +- boost.json | 4 +- composer.json | 3 +- composer.lock | 216 +++++++++- 7 files changed, 229 insertions(+), 541 deletions(-) delete mode 100644 .agents/skills/inertia-vue-development/SKILL.md delete mode 100644 .agents/skills/tailwindcss-development/SKILL.md diff --git a/.agents/skills/inertia-vue-development/SKILL.md b/.agents/skills/inertia-vue-development/SKILL.md deleted file mode 100644 index 8998330..0000000 --- a/.agents/skills/inertia-vue-development/SKILL.md +++ /dev/null @@ -1,394 +0,0 @@ ---- -name: inertia-vue-development -description: "Develops Inertia.js v2 Vue client-side applications. Activates when creating Vue pages, forms, or navigation; using ,
, useForm, or router; working with deferred props, prefetching, or polling; or when user mentions Vue with Inertia, Vue pages, Vue forms, or Vue navigation." -license: MIT -metadata: - author: laravel ---- - -# Inertia Vue Development - -## When to Apply - -Activate this skill when: - -- Creating or modifying Vue page components for Inertia -- Working with forms in Vue (using `` or `useForm`) -- Implementing client-side navigation with `` or `router` -- Using v2 features: deferred props, prefetching, WhenVisible, InfiniteScroll, once props, flash data, or polling -- Building Vue-specific features with the Inertia protocol - -## Documentation - -Use `search-docs` for detailed Inertia v2 Vue patterns and documentation. - -## Basic Usage - -### Page Components Location - -Vue page components should be placed in the `resources/js/pages` directory. - -### Page Component Structure - - -```vue - - - -``` - -## Client-Side Navigation - -### Basic Link Component - -Use `` for client-side navigation instead of traditional `` tags: - - -```vue - - - -``` - -### Link with Method - - -```vue - - - -``` - -### Prefetching - -Prefetch pages to improve perceived performance: - - -```vue - - - -``` - -### Programmatic Navigation - - -```vue - - - -``` - -## Form Handling - -### Form Component (Recommended) - -The recommended way to build forms is with the `` component: - - -```vue - - - -``` - -### Form Component With All Props - - -```vue - - - -``` - -### Form Component Reset Props - -The `` component supports automatic resetting: - -- `resetOnError` - Reset form data when the request fails -- `resetOnSuccess` - Reset form data when the request succeeds -- `setDefaultsOnSuccess` - Update default values on success - -Use the `search-docs` tool with a query of `form component resetting` for detailed guidance. - - -```vue - - - -``` - -Forms can also be built using the `useForm` composable for more programmatic control. Use the `search-docs` tool with a query of `useForm helper` for guidance. - -### `useForm` Composable - -For more programmatic control or to follow existing conventions, use the `useForm` composable: - - -```vue - - - -``` - -## Inertia v2 Features - -### Deferred Props - -Use deferred props to load data after initial page render: - - -```vue - - - -``` - -### Polling - -Automatically refresh data at intervals: - - -```vue - - - -``` - -### WhenVisible - -Lazy-load a prop when an element scrolls into view. Useful for deferring expensive data that sits below the fold: - - -```vue - - - -``` - -## Server-Side Patterns - -Server-side patterns (Inertia::render, props, middleware) are covered in inertia-laravel guidelines. - -## Common Pitfalls - -- Using traditional `` links instead of Inertia's `` component (breaks SPA behavior) -- Forgetting that Vue components must have a single root element -- Forgetting to add loading states (skeleton screens) when using deferred props -- Not handling the `undefined` state of deferred props before data loads -- Using `` without preventing default submission (use `` component or `@submit.prevent`) -- Forgetting to check if `` component is available in your Inertia version \ No newline at end of file diff --git a/.agents/skills/tailwindcss-development/SKILL.md b/.agents/skills/tailwindcss-development/SKILL.md deleted file mode 100644 index 7c8e295..0000000 --- a/.agents/skills/tailwindcss-development/SKILL.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -name: tailwindcss-development -description: "Always invoke when the user's message includes 'tailwind' in any form. Also invoke for: building responsive grid layouts (multi-column card grids, product grids), flex/grid page structures (dashboards with sidebars, fixed topbars, mobile-toggle navs), styling UI components (cards, tables, navbars, pricing sections, forms, inputs, badges), adding dark mode variants, fixing spacing or typography, and Tailwind v3/v4 work. The core use case: writing or fixing Tailwind utility classes in HTML templates (Blade, JSX, Vue). Skip for backend PHP logic, database queries, API routes, JavaScript with no HTML/CSS component, CSS file audits, build tool configuration, and vanilla CSS." -license: MIT -metadata: - author: laravel ---- - -# Tailwind CSS Development - -## Documentation - -Use `search-docs` for detailed Tailwind CSS v4 patterns and documentation. - -## Basic Usage - -- Use Tailwind CSS classes to style HTML. Check and follow existing Tailwind conventions in the project before introducing new patterns. -- Offer to extract repeated patterns into components that match the project's conventions (e.g., Blade, JSX, Vue). -- Consider class placement, order, priority, and defaults. Remove redundant classes, add classes to parent or child elements carefully to reduce repetition, and group elements logically. - -## Tailwind CSS v4 Specifics - -- Always use Tailwind CSS v4 and avoid deprecated utilities. -- `corePlugins` is not supported in Tailwind v4. - -### CSS-First Configuration - -In Tailwind v4, configuration is CSS-first using the `@theme` directive — no separate `tailwind.config.js` file is needed: - - -```css -@theme { - --color-brand: oklch(0.72 0.11 178); -} -``` - -### Import Syntax - -In Tailwind v4, import Tailwind with a regular CSS `@import` statement instead of the `@tailwind` directives used in v3: - - -```diff -- @tailwind base; -- @tailwind components; -- @tailwind utilities; -+ @import "tailwindcss"; -``` - -### Replaced Utilities - -Tailwind v4 removed deprecated utilities. Use the replacements shown below. Opacity values remain numeric. - -| Deprecated | Replacement | -|------------|-------------| -| bg-opacity-* | bg-black/* | -| text-opacity-* | text-black/* | -| border-opacity-* | border-black/* | -| divide-opacity-* | divide-black/* | -| ring-opacity-* | ring-black/* | -| placeholder-opacity-* | placeholder-black/* | -| flex-shrink-* | shrink-* | -| flex-grow-* | grow-* | -| overflow-ellipsis | text-ellipsis | -| decoration-slice | box-decoration-slice | -| decoration-clone | box-decoration-clone | - -## Spacing - -Use `gap` utilities instead of margins for spacing between siblings: - - -```html -
-
Item 1
-
Item 2
-
-``` - -## Dark Mode - -If existing pages and components support dark mode, new pages and components must support it the same way, typically using the `dark:` variant: - - -```html -
- Content adapts to color scheme -
-``` - -## Common Patterns - -### Flexbox Layout - - -```html -
-
Left content
-
Right content
-
-``` - -### Grid Layout - - -```html -
-
Card 1
-
Card 2
-
Card 3
-
-``` - -## Common Pitfalls - -- Using deprecated v3 utilities (bg-opacity-*, flex-shrink-*, etc.) -- Using `@tailwind` directives instead of `@import "tailwindcss"` -- Trying to use `tailwind.config.js` instead of CSS `@theme` directive -- Using margins for spacing between siblings instead of gap utilities -- Forgetting to add dark mode variants when the project uses dark mode \ No newline at end of file diff --git a/.agents/skills/wayfinder-development/SKILL.md b/.agents/skills/wayfinder-development/SKILL.md index 0b30645..74479ef 100644 --- a/.agents/skills/wayfinder-development/SKILL.md +++ b/.agents/skills/wayfinder-development/SKILL.md @@ -61,10 +61,14 @@ show(1, { query: { page: 1 } }) // "/posts/1?page=1" ## Wayfinder + Inertia -Use Wayfinder with the `` component: - -```vue - +Use Wayfinder with `useForm`: + + +```typescript +import { store } from "@/actions/App/Http/Controllers/ExampleController"; + +const form = useForm({ name: "My Big Post" }); +form.submit(store()); ``` ## Verification diff --git a/AGENTS.md b/AGENTS.md index 3bebeb7..268d650 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,7 +9,7 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions. -- php - 8.4 +- php - 8.5 - inertiajs/inertia-laravel (INERTIA_LARAVEL) - v2 - laravel/fortify (FORTIFY) - v1 - laravel/framework (LARAVEL) - v13 @@ -21,12 +21,6 @@ This application is a Laravel application and its main Laravel ecosystems packag - laravel/pint (PINT) - v1 - laravel/sail (SAIL) - v1 - phpunit/phpunit (PHPUNIT) - v12 -- @inertiajs/vue3 (INERTIA_VUE) - v2 -- tailwindcss (TAILWINDCSS) - v4 -- vue (VUE) - v3 -- @laravel/vite-plugin-wayfinder (WAYFINDER_VITE) - v0 -- eslint (ESLINT) - v9 -- prettier (PRETTIER) - v3 ## Skills Activation @@ -36,8 +30,6 @@ This project has domain-specific skills available. You MUST activate the relevan - `laravel-best-practices` — Apply this skill whenever writing, reviewing, or refactoring Laravel PHP code. This includes creating or modifying controllers, models, migrations, form requests, policies, jobs, scheduled commands, service classes, and Eloquent queries. Triggers for N+1 and query performance issues, caching strategies, authorization and security patterns, validation, error handling, queue and job configuration, route definitions, and architectural decisions. Also use for Laravel code reviews and refactoring existing Laravel code to follow best practices. Covers any task involving Laravel backend PHP code patterns. - `mcp-development` — Use this skill for Laravel MCP development only. Trigger when creating or editing MCP tools, resources, prompts, or servers in Laravel projects. Covers: artisan make:mcp-* generators, mcp:inspector, routes/ai.php, Tool/Resource/Prompt classes, schema validation, shouldRegister(), OAuth setup, URI templates, read-only attributes, and MCP debugging. Do not use for non-Laravel MCP projects or generic AI features without MCP. - `wayfinder-development` — Use this skill for Laravel Wayfinder which auto-generates typed functions for Laravel controllers and routes. ALWAYS use this skill when frontend code needs to call backend routes or controller actions. Trigger when: connecting any React/Vue/Svelte/Inertia frontend to Laravel controllers, routes, building end-to-end features with both frontend and backend, wiring up forms or links to backend endpoints, fixing route-related TypeScript errors, importing from @/actions or @/routes, or running wayfinder:generate. Use Wayfinder route functions instead of hardcoded URLs. Covers: wayfinder() vite plugin, .url()/.get()/.post()/.form(), query params, route model binding, tree-shaking. Do not use for backend-only task -- `inertia-vue-development` — Develops Inertia.js v2 Vue client-side applications. Activates when creating Vue pages, forms, or navigation; using ,
, useForm, or router; working with deferred props, prefetching, or polling; or when user mentions Vue with Inertia, Vue pages, Vue forms, or Vue navigation. -- `tailwindcss-development` — Always invoke when the user's message includes 'tailwind' in any form. Also invoke for: building responsive grid layouts (multi-column card grids, product grids), flex/grid page structures (dashboards with sidebars, fixed topbars, mobile-toggle navs), styling UI components (cards, tables, navbars, pricing sections, forms, inputs, badges), adding dark mode variants, fixing spacing or typography, and Tailwind v3/v4 work. The core use case: writing or fixing Tailwind utility classes in HTML templates (Blade, JSX, Vue). Skip for backend PHP logic, database queries, API routes, JavaScript with no HTML/CSS component, CSS file audits, build tool configuration, and vanilla CSS. ## Conventions @@ -56,7 +48,7 @@ This project has domain-specific skills available. You MUST activate the relevan ## Frontend Bundling -- If the user doesn't see a frontend change reflected in the UI, it could mean they need to run `npm run build`, `npm run dev`, or `composer run dev`. Ask them. +- If the user doesn't see a frontend change reflected in the UI, it could mean they need to run `pnpm run build`, `pnpm run dev`, or `composer run dev`. Ask them. ## Documentation Files @@ -130,7 +122,6 @@ This project has domain-specific skills available. You MUST activate the relevan - Inertia creates fully client-side rendered SPAs without modern SPA complexity, leveraging existing server-side patterns. - Components live in `resources/js/pages` (unless specified in `vite.config.js`). Use `Inertia::render()` for server-side routing instead of Blade views. - ALWAYS use `search-docs` tool for version-specific Inertia documentation and updated code examples. -- IMPORTANT: Activate `inertia-vue-development` when working with Inertia Vue client-side patterns. # Inertia v2 @@ -166,7 +157,7 @@ This project has domain-specific skills available. You MUST activate the relevan ## Vite Error -- If you receive an "Illuminate\Foundation\ViteException: Unable to locate file in Vite manifest" error, you can run `npm run build` or ask the user to run `npm run dev` or `composer run dev`. +- If you receive an "Illuminate\Foundation\ViteException: Unable to locate file in Vite manifest" error, you can run `pnpm run build` or ask the user to run `pnpm run dev` or `composer run dev`. ## Deployment @@ -203,11 +194,4 @@ Use Wayfinder to generate TypeScript functions for Laravel routes. Import from ` - 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). -=== inertia-vue/core rules === - -# Inertia + Vue - -Vue components must have a single root element. -- IMPORTANT: Activate `inertia-vue-development` when working with Inertia Vue client-side patterns. - diff --git a/boost.json b/boost.json index ef87103..8f4c9e4 100644 --- a/boost.json +++ b/boost.json @@ -10,8 +10,6 @@ "fortify-development", "laravel-best-practices", "mcp-development", - "wayfinder-development", - "inertia-vue-development", - "tailwindcss-development" + "wayfinder-development" ] } diff --git a/composer.json b/composer.json index 820234e..48535b3 100644 --- a/composer.json +++ b/composer.json @@ -20,6 +20,7 @@ "scalar/laravel": "^0.2.1" }, "require-dev": { + "brianium/paratest": "^7.20", "fakerphp/faker": "^1.24", "laravel/boost": "^2.0", "laravel/pail": "^1.2.5", @@ -75,7 +76,7 @@ "test": [ "@php artisan config:clear --ansi", "@lint:check", - "@php artisan test" + "@php artisan test --parallel --processes=2" ], "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", diff --git a/composer.lock b/composer.lock index 65efc66..0d3d5b2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7d965721310f81816807d6b78c5f9654", + "content-hash": "4d18577105a240f2d8cce1c098398730", "packages": [ { "name": "aws/aws-crt-php", @@ -7020,6 +7020,99 @@ } ], "packages-dev": [ + { + "name": "brianium/paratest", + "version": "v7.20.0", + "source": { + "type": "git", + "url": "https://github.com/paratestphp/paratest.git", + "reference": "81c80677c9ec0ed4ef16b246167f11dec81a6e3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/81c80677c9ec0ed4ef16b246167f11dec81a6e3d", + "reference": "81c80677c9ec0ed4ef16b246167f11dec81a6e3d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "fidry/cpu-core-counter": "^1.3.0", + "jean85/pretty-package-versions": "^2.1.1", + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "phpunit/php-code-coverage": "^12.5.3 || ^13.0.1", + "phpunit/php-file-iterator": "^6.0.1 || ^7", + "phpunit/php-timer": "^8 || ^9", + "phpunit/phpunit": "^12.5.14 || ^13.0.5", + "sebastian/environment": "^8.0.3 || ^9", + "symfony/console": "^7.4.7 || ^8.0.7", + "symfony/process": "^7.4.5 || ^8.0.5" + }, + "require-dev": { + "doctrine/coding-standard": "^14.0.0", + "ext-pcntl": "*", + "ext-pcov": "*", + "ext-posix": "*", + "phpstan/phpstan": "^2.1.44", + "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpstan/phpstan-phpunit": "^2.0.16", + "phpstan/phpstan-strict-rules": "^2.0.10", + "symfony/filesystem": "^7.4.6 || ^8.0.6" + }, + "bin": [ + "bin/paratest", + "bin/paratest_for_phpstorm" + ], + "type": "library", + "autoload": { + "psr-4": { + "ParaTest\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "role": "Developer" + }, + { + "name": "Filippo Tessarotto", + "email": "zoeslam@gmail.com", + "role": "Developer" + } + ], + "description": "Parallel testing for PHP", + "homepage": "https://github.com/paratestphp/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "support": { + "issues": "https://github.com/paratestphp/paratest/issues", + "source": "https://github.com/paratestphp/paratest/tree/v7.20.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/Slamdunk", + "type": "github" + }, + { + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" + } + ], + "time": "2026-03-29T15:46:14+00:00" + }, { "name": "fakerphp/faker", "version": "v1.24.1", @@ -7083,6 +7176,67 @@ }, "time": "2024-11-21T13:46:39+00:00" }, + { + "name": "fidry/cpu-core-counter", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678", + "reference": "db9508f7b1474469d9d3c53b86f817e344732678", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2025-08-14T07:29:31+00:00" + }, { "name": "filp/whoops", "version": "2.18.4", @@ -7205,6 +7359,66 @@ }, "time": "2025-04-30T06:54:44+00:00" }, + { + "name": "jean85/pretty-package-versions", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", + "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "rector/rector": "^2.0", + "vimeo/psalm": "^4.3 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1" + }, + "time": "2025-03-19T14:43:43+00:00" + }, { "name": "laravel/boost", "version": "v2.4.3", From de0c19a86b3ff20ed4d9df2d71b7753630d2bad1 Mon Sep 17 00:00:00 2001 From: Twyco Date: Wed, 16 Sep 2026 11:25:01 +0200 Subject: [PATCH 5/5] test concurrently --- .github/tests/test_and_check_app/action.yml | 14 ++++++++++---- composer.json | 14 +++++++++++++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/.github/tests/test_and_check_app/action.yml b/.github/tests/test_and_check_app/action.yml index 32a478f..9892b00 100644 --- a/.github/tests/test_and_check_app/action.yml +++ b/.github/tests/test_and_check_app/action.yml @@ -63,10 +63,16 @@ runs: run: php artisan wayfinder:generate --with-form shell: bash - - name: Build Vite app - run: pnpm run build + - name: Run independent application checks + run: | + pnpm exec concurrently \ + --names frontend,backend \ + --prefix-colors cyan,magenta \ + --kill-others-on-fail \ + "composer run ci:frontend" \ + "composer run ci:backend" shell: bash - - name: Run ci check - run: composer run ci:check + - name: Run Laravel tests + run: composer run ci:test shell: bash diff --git a/composer.json b/composer.json index 48535b3..3431833 100644 --- a/composer.json +++ b/composer.json @@ -68,10 +68,22 @@ ], "ci:check": [ "Composer\\Config::disableProcessTimeout", + "@ci:frontend", + "@ci:backend", + "@ci:test" + ], + "ci:frontend": [ "pnpm audit --audit-level=high", "pnpm run lint:check", "pnpm run types:check", - "@test" + "pnpm run build" + ], + "ci:backend": [ + "@lint:check" + ], + "ci:test": [ + "@php artisan config:clear --ansi", + "@php artisan test --parallel --processes=2" ], "test": [ "@php artisan config:clear --ansi",