diff --git a/CLAUDE.md b/CLAUDE.md
index 31ee8c0..e6bf868 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -9,18 +9,19 @@ 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.14
-- filament/filament (FILAMENT) - v3
+- filament/filament (FILAMENT) - v4
- laravel/cashier (CASHIER) - v15
- laravel/framework (LARAVEL) - v12
+- laravel/pint (PINT) - v1
- laravel/prompts (PROMPTS) - v0
- laravel/sanctum (SANCTUM) - v4
- livewire/flux (FLUXUI_FREE) - v2
- livewire/livewire (LIVEWIRE) - v3
- laravel/mcp (MCP) - v0
-- laravel/pint (PINT) - v1
- laravel/sail (SAIL) - v1
- pestphp/pest (PEST) - v3
- phpunit/phpunit (PHPUNIT) - v11
+- rector/rector (RECTOR) - v2
- tailwindcss (TAILWINDCSS) - v4
## Conventions
@@ -114,102 +115,12 @@ protected function isAccessible(User $user, ?string $path = null): bool
- Typically, keys in an Enum should be TitleCase. For example: `FavoritePerson`, `BestLake`, `Monthly`.
-=== filament/core rules ===
+=== herd rules ===
-## Filament
-- Filament is used by this application, check how and where to follow existing application conventions.
-- Filament is a Server-Driven UI (SDUI) framework for Laravel. It allows developers to define user interfaces in PHP using structured configuration objects. It is built on top of Livewire, Alpine.js, and Tailwind CSS.
-- You can use the `search-docs` tool to get information from the official Filament documentation when needed. This is very useful for Artisan command arguments, specific code examples, testing functionality, relationship management, and ensuring you're following idiomatic practices.
-- Utilize static `make()` methods for consistent component initialization.
+## Laravel Herd
-### Artisan
-- You must use the Filament specific Artisan commands to create new files or components for Filament. You can find these with the `list-artisan-commands` tool, or with `php artisan` and the `--help` option.
-- Inspect the required options, always pass `--no-interaction`, and valid arguments for other options when applicable.
-
-### Filament's Core Features
-- Actions: Handle doing something within the application, often with a button or link. Actions encapsulate the UI, the interactive modal window, and the logic that should be executed when the modal window is submitted. They can be used anywhere in the UI and are commonly used to perform one-time actions like deleting a record, sending an email, or updating data in the database based on modal form input.
-- Forms: Dynamic forms rendered within other features, such as resources, action modals, table filters, and more.
-- Infolists: Read-only lists of data.
-- Notifications: Flash notifications displayed to users within the application.
-- Panels: The top-level container in Filament that can include all other features like pages, resources, forms, tables, notifications, actions, infolists, and widgets.
-- Resources: Static classes that are used to build CRUD interfaces for Eloquent models. Typically live in `app/Filament/Resources`.
-- Schemas: Represent components that define the structure and behavior of the UI, such as forms, tables, or lists.
-- Tables: Interactive tables with filtering, sorting, pagination, and more.
-- Widgets: Small component included within dashboards, often used for displaying data in charts, tables, or as a stat.
-
-### Relationships
-- Determine if you can use the `relationship()` method on form components when you need `options` for a select, checkbox, repeater, or when building a `Fieldset`:
-
-
-Forms\Components\Select::make('user_id')
- ->label('Author')
- ->relationship('author')
- ->required(),
-
-
-
-## Testing
-- It's important to test Filament functionality for user satisfaction.
-- Ensure that you are authenticated to access the application within the test.
-- Filament uses Livewire, so start assertions with `livewire()` or `Livewire::test()`.
-
-### Example Tests
-
-
- livewire(ListUsers::class)
- ->assertCanSeeTableRecords($users)
- ->searchTable($users->first()->name)
- ->assertCanSeeTableRecords($users->take(1))
- ->assertCanNotSeeTableRecords($users->skip(1))
- ->searchTable($users->last()->email)
- ->assertCanSeeTableRecords($users->take(-1))
- ->assertCanNotSeeTableRecords($users->take($users->count() - 1));
-
-
-
- livewire(CreateUser::class)
- ->fillForm([
- 'name' => 'Howdy',
- 'email' => 'howdy@example.com',
- ])
- ->call('create')
- ->assertNotified()
- ->assertRedirect();
-
- assertDatabaseHas(User::class, [
- 'name' => 'Howdy',
- 'email' => 'howdy@example.com',
- ]);
-
-
-
- use Filament\Facades\Filament;
-
- Filament::setCurrentPanel('app');
-
-
-
- livewire(EditInvoice::class, [
- 'invoice' => $invoice,
- ])->callAction('send');
-
- expect($invoice->refresh())->isSent()->toBeTrue();
-
-
-
-=== filament/v3 rules ===
-
-## Filament 3
-
-## Version 3 Changes To Focus On
-- Resources are located in `app/Filament/Resources/` directory.
-- Resource pages (List, Create, Edit) are auto-generated within the resource's directory - e.g., `app/Filament/Resources/PostResource/Pages/`.
-- Forms use the `Forms\Components` namespace for form fields.
-- Tables use the `Tables\Columns` namespace for table columns.
-- A new `Filament\Forms\Components\RichEditor` component is available.
-- Form and table schemas now use fluent method chaining.
-- Added `php artisan filament:optimize` command for production optimization.
-- Requires implementing `FilamentUser` contract for production access control.
+- The application is served by Laravel Herd and will be available at: https?://[kebab-case-project-dir].test. Use the `get-absolute-url` tool to generate URLs for the user to ensure valid URLs.
+- You must not run any commands to make the site available via HTTP(s). It is _always_ available through Laravel Herd.
=== laravel/core rules ===
@@ -280,6 +191,14 @@ Forms\Components\Select::make('user_id')
- Casts can and likely should be set in a `casts()` method on a model rather than the `$casts` property. Follow existing conventions from other models.
+=== pint/core rules ===
+
+## Laravel Pint Code Formatter
+
+- You must run `vendor/bin/pint --dirty` before finalizing changes to ensure your code matches the project's expected style.
+- Do not run `vendor/bin/pint --test`, simply run `vendor/bin/pint` to fix any formatting issues.
+
+
=== fluxui-free/core rules ===
## Flux UI Free
@@ -308,7 +227,7 @@ avatar, badge, brand, breadcrumbs, button, callout, checkbox, dropdown, field, h
## Livewire Core
- Use the `search-docs` tool to find exact version specific documentation for how to write Livewire & Livewire tests.
-- Use the `php artisan make:livewire [Posts\\CreatePost]` artisan command to create new components
+- Use the `php artisan make:livewire [Posts\CreatePost]` artisan command to create new components
- State should live on the server, with the UI reflecting it.
- All Livewire requests hit the Laravel backend, they're like regular HTTP requests. Always validate form data, and run authorization checks in Livewire actions.
@@ -387,14 +306,6 @@ document.addEventListener('livewire:init', function () {
-=== pint/core rules ===
-
-## Laravel Pint Code Formatter
-
-- You must run `vendor/bin/pint --dirty` before finalizing changes to ensure your code matches the project's expected style.
-- Do not run `vendor/bin/pint --test`, simply run `vendor/bin/pint` to fix any formatting issues.
-
-
=== pest/core rules ===
## Pest
@@ -514,4 +425,12 @@ it('has emails', function (string $email) {
| overflow-ellipsis | text-ellipsis |
| decoration-slice | box-decoration-slice |
| decoration-clone | box-decoration-clone |
+
+
+=== tests rules ===
+
+## 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` with a specific filename or filter.