{"owner":"spatie","repo":"laravel-permission","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["resources/boost/skills/laravel-permission-development/SKILL.md"],"skills":{"resources/boost/skills/laravel-permission-development/SKILL.md":"---\nname: laravel-permission-development\ndescription: Build and work with Spatie Laravel Permission features, including roles, permissions, middleware, policies, teams, and Blade directives.\n---\n\n# Laravel Permission Development\n\n## When to use this skill\n\nUse this skill when working with authorization, roles, permissions, access control, middleware guards, or Blade permission directives using spatie/laravel-permission.\n\n## Core Concepts\n\n- **Users have Roles, Roles have Permissions, Apps check Permissions** (not Roles).\n- Direct permissions on users are an anti-pattern; assign permissions to roles instead.\n- Use `$user->can('permission-name')` for all authorization checks (supports Super Admin via Gate).\n- The `HasRoles` trait (which includes `HasPermissions`) is added to User models.\n\n## Setup\n\nAdd the `HasRoles` trait to your User model:\n\n```php\nuse Spatie\\Permission\\Traits\\HasRoles;\n\nclass User extends Authenticatable\n{\n    use HasRoles;\n}\n```\n\n## Creating Roles and Permissions\n\n```php\nuse Spatie\\Permission\\Models\\Role;\nuse Spatie\\Permission\\Models\\Permission;\n\n$role = Role::create(['name' => 'writer']);\n$permission = Permission::create(['name' => 'edit articles']);\n\n// findOrCreate is idempotent (safe for seeders)\n$role = Role::findOrCreate('writer', 'web');\n$permission = Permission::findOrCreate('edit articles', 'web');\n```\n\n## Assigning Roles and Permissions\n\n```php\n// Assign roles to users\n$user->assignRole('writer');\n$user->assignRole('writer', 'admin');\n$user->assignRole(['writer', 'admin']);\n$user->syncRoles(['writer', 'admin']); // replaces all\n$user->removeRole('writer');\n\n// Assign permissions to roles (preferred)\n$role->givePermissionTo('edit articles');\n$role->givePermissionTo(['edit articles', 'delete articles']);\n$role->syncPermissions(['edit articles', 'delete articles']);\n$role->revokePermissionTo('edit articles');\n\n// Reverse assignment\n$permission->assignRole('writer');\n$permission->syncRoles(['writer', 'editor']);\n$permission->removeRole('writer');\n```\n\n## Checking Roles and Permissions\n\n```php\n// Permission checks (preferred - supports Super Admin via Gate)\n$user->can('edit articles');\n$user->canAny(['edit articles', 'delete articles']);\n\n// Direct package methods (bypass Gate, no Super Admin support)\n$user->hasPermissionTo('edit articles');\n$user->hasAnyPermission(['edit articles', 'publish articles']);\n$user->hasAllPermissions(['edit articles', 'publish articles']);\n$user->hasDirectPermission('edit articles');\n\n// Role checks\n$user->hasRole('writer');\n$user->hasAnyRole(['writer', 'editor']);\n$user->hasAllRoles(['writer', 'editor']);\n$user->hasExactRoles(['writer', 'editor']);\n\n// Get assigned roles and permissions\n$user->getRoleNames();           // Collection of role name strings\n$user->getPermissionNames();     // Collection of permission name strings\n$user->getDirectPermissions();   // Direct permissions only\n$user->getPermissionsViaRoles(); // Inherited via roles\n$user->getAllPermissions();      // Both direct and inherited\n```\n\n## Query Scopes\n\n```php\n$users = User::role('writer')->get();\n$users = User::withoutRole('writer')->get();\n$users = User::permission('edit articles')->get();\n$users = User::withoutPermission('edit articles')->get();\n```\n\n## Middleware\n\nRegister middleware aliases in `bootstrap/app.php`:\n\n```php\n->withMiddleware(function (Middleware $middleware) {\n    $middleware->alias([\n        'role' => \\Spatie\\Permission\\Middleware\\RoleMiddleware::class,\n        'permission' => \\Spatie\\Permission\\Middleware\\PermissionMiddleware::class,\n        'role_or_permission' => \\Spatie\\Permission\\Middleware\\RoleOrPermissionMiddleware::class,\n    ]);\n})\n```\n\nUse in routes (pipe `|` for OR logic):\n\n```php\nRoute::middleware(['permission:edit articles'])->group(function () { ... });\nRoute::middleware(['role:manager|writer'])->group(function () { ... });\nRoute::middleware(['role_or_permission:manager|edit articles'])->group(function () { ... });\n\n// With specific guard\nRoute::middleware(['role:manager,api'])->group(function () { ... });\n```\n\nFor single permissions, Laravel's built-in `can` middleware also works:\n\n```php\nRoute::middleware(['can:edit articles'])->group(function () { ... });\n```\n\n## Blade Directives\n\nPrefer `@can` (permission-based) over `@role` (role-based):\n\n```blade\n@can('edit articles')\n    {{-- User can edit articles (supports Super Admin) --}}\n@endcan\n\n@canany(['edit articles', 'delete articles'])\n    {{-- User can do at least one --}}\n@endcanany\n\n@role('admin')\n    {{-- Only use for super-admin type checks --}}\n@endrole\n\n@hasanyrole('writer|admin')\n    {{-- Has writer or admin --}}\n@endhasanyrole\n```\n\n## Super Admin\n\nUse `Gate::before` in `AppServiceProvider::boot()`:\n\n```php\nuse Illuminate\\Support\\Facades\\Gate;\n\npublic function boot(): void\n{\n    Gate::before(function ($user, $ability) {\n        return $user->hasRole('Super Admin') ? true : null;\n    });\n}\n```\n\nThis makes `$user->can()` and `@can` always return true for Super Admins. Must return `null` (not `false`) to allow normal checks for other users.\n\n## Policies\n\nUse `$user->can()` inside policy methods to check permissions:\n\n```php\nclass PostPolicy\n{\n    public function update(User $user, Post $post): bool\n    {\n        if ($user->can('edit all posts')) {\n            return true;\n        }\n\n        return $user->can('edit own posts') && $user->id === $post->user_id;\n    }\n}\n```\n\n## Enums\n\n```php\nenum RolesEnum: string\n{\n    case WRITER = 'writer';\n    case EDITOR = 'editor';\n}\n\nenum PermissionsEnum: string\n{\n    case EDIT_POSTS = 'edit posts';\n    case DELETE_POSTS = 'delete posts';\n}\n\n// Most methods accept enums directly\nPermission::findOrCreate(PermissionsEnum::EDIT_POSTS, 'web');\n$user->assignRole(RolesEnum::WRITER);\n$user->hasRole(RolesEnum::WRITER);\n$role->givePermissionTo(PermissionsEnum::EDIT_POSTS);\n$user->hasPermissionTo(PermissionsEnum::EDIT_POSTS);\n```\n\n## Seeding\n\nAlways flush the permission cache when seeding:\n\n```php\nclass RolesAndPermissionsSeeder extends Seeder\n{\n    public function run(): void\n    {\n        // Reset cache\n        app()[\\Spatie\\Permission\\PermissionRegistrar::class]->forgetCachedPermissions();\n\n        // Create permissions\n        Permission::findOrCreate('edit articles', 'web');\n        Permission::findOrCreate('delete articles', 'web');\n\n        // Create roles and assign permissions\n        Role::findOrCreate('writer', 'web')\n            ->givePermissionTo(['edit articles']);\n\n        Role::findOrCreate('admin', 'web')\n            ->givePermissionTo(Permission::all());\n    }\n}\n```\n\n## Teams (Multi-Tenancy)\n\nEnable in `config/permission.php` before running migrations:\n\n```php\n'teams' => true,\n```\n\nSet the active team in middleware:\n\n```php\nsetPermissionsTeamId($teamId);\n```\n\nWhen switching teams, unset cached relations:\n\n```php\n$user->unsetRelation('roles')->unsetRelation('permissions');\n```\n\n## Events\n\nEnable in `config/permission.php`:\n\n```php\n'events_enabled' => true,\n```\n\nAvailable events: `RoleAttachedEvent`, `RoleDetachedEvent`, `PermissionAttachedEvent`, `PermissionDetachedEvent` in the `Spatie\\Permission\\Events` namespace.\n\n## Performance\n\n- Permissions are cached automatically. The cache is flushed when roles/permissions change via package methods.\n- After direct DB operations, flush manually: `app()[\\Spatie\\Permission\\PermissionRegistrar::class]->forgetCachedPermissions()`\n- For bulk seeding, use `Permission::insert()` for speed, but flush the cache afterward.\n"},"files":{"resources/boost/skills/laravel-permission-development/SKILL.md":"---\nname: laravel-permission-development\ndescription: Build and work with Spatie Laravel Permission features, including roles, permissions, middleware, policies, teams, and Blade directives.\n---\n\n# Laravel Permission Development\n\n## When to use this skill\n\nUse this skill when working with authorization, roles, permissions, access control, middleware guards, or Blade permission directives using spatie/laravel-permission.\n\n## Core Concepts\n\n- **Users have Roles, Roles have Permissions, Apps check Permissions** (not Roles).\n- Direct permissions on users are an anti-pattern; assign permissions to roles instead.\n- Use `$user->can('permission-name')` for all authorization checks (supports Super Admin via Gate).\n- The `HasRoles` trait (which includes `HasPermissions`) is added to User models.\n\n## Setup\n\nAdd the `HasRoles` trait to your User model:\n\n```php\nuse Spatie\\Permission\\Traits\\HasRoles;\n\nclass User extends Authenticatable\n{\n    use HasRoles;\n}\n```\n\n## Creating Roles and Permissions\n\n```php\nuse Spatie\\Permission\\Models\\Role;\nuse Spatie\\Permission\\Models\\Permission;\n\n$role = Role::create(['name' => 'writer']);\n$permission = Permission::create(['name' => 'edit articles']);\n\n// findOrCreate is idempotent (safe for seeders)\n$role = Role::findOrCreate('writer', 'web');\n$permission = Permission::findOrCreate('edit articles', 'web');\n```\n\n## Assigning Roles and Permissions\n\n```php\n// Assign roles to users\n$user->assignRole('writer');\n$user->assignRole('writer', 'admin');\n$user->assignRole(['writer', 'admin']);\n$user->syncRoles(['writer', 'admin']); // replaces all\n$user->removeRole('writer');\n\n// Assign permissions to roles (preferred)\n$role->givePermissionTo('edit articles');\n$role->givePermissionTo(['edit articles', 'delete articles']);\n$role->syncPermissions(['edit articles', 'delete articles']);\n$role->revokePermissionTo('edit articles');\n\n// Reverse assignment\n$permission->assignRole('writer');\n$permission->syncRoles(['writer', 'editor']);\n$permission->removeRole('writer');\n```\n\n## Checking Roles and Permissions\n\n```php\n// Permission checks (preferred - supports Super Admin via Gate)\n$user->can('edit articles');\n$user->canAny(['edit articles', 'delete articles']);\n\n// Direct package methods (bypass Gate, no Super Admin support)\n$user->hasPermissionTo('edit articles');\n$user->hasAnyPermission(['edit articles', 'publish articles']);\n$user->hasAllPermissions(['edit articles', 'publish articles']);\n$user->hasDirectPermission('edit articles');\n\n// Role checks\n$user->hasRole('writer');\n$user->hasAnyRole(['writer', 'editor']);\n$user->hasAllRoles(['writer', 'editor']);\n$user->hasExactRoles(['writer', 'editor']);\n\n// Get assigned roles and permissions\n$user->getRoleNames();           // Collection of role name strings\n$user->getPermissionNames();     // Collection of permission name strings\n$user->getDirectPermissions();   // Direct permissions only\n$user->getPermissionsViaRoles(); // Inherited via roles\n$user->getAllPermissions();      // Both direct and inherited\n```\n\n## Query Scopes\n\n```php\n$users = User::role('writer')->get();\n$users = User::withoutRole('writer')->get();\n$users = User::permission('edit articles')->get();\n$users = User::withoutPermission('edit articles')->get();\n```\n\n## Middleware\n\nRegister middleware aliases in `bootstrap/app.php`:\n\n```php\n->withMiddleware(function (Middleware $middleware) {\n    $middleware->alias([\n        'role' => \\Spatie\\Permission\\Middleware\\RoleMiddleware::class,\n        'permission' => \\Spatie\\Permission\\Middleware\\PermissionMiddleware::class,\n        'role_or_permission' => \\Spatie\\Permission\\Middleware\\RoleOrPermissionMiddleware::class,\n    ]);\n})\n```\n\nUse in routes (pipe `|` for OR logic):\n\n```php\nRoute::middleware(['permission:edit articles'])->group(function () { ... });\nRoute::middleware(['role:manager|writer'])->group(function () { ... });\nRoute::middleware(['role_or_permission:manager|edit articles'])->group(function () { ... });\n\n// With specific guard\nRoute::middleware(['role:manager,api'])->group(function () { ... });\n```\n\nFor single permissions, Laravel's built-in `can` middleware also works:\n\n```php\nRoute::middleware(['can:edit articles'])->group(function () { ... });\n```\n\n## Blade Directives\n\nPrefer `@can` (permission-based) over `@role` (role-based):\n\n```blade\n@can('edit articles')\n    {{-- User can edit articles (supports Super Admin) --}}\n@endcan\n\n@canany(['edit articles', 'delete articles'])\n    {{-- User can do at least one --}}\n@endcanany\n\n@role('admin')\n    {{-- Only use for super-admin type checks --}}\n@endrole\n\n@hasanyrole('writer|admin')\n    {{-- Has writer or admin --}}\n@endhasanyrole\n```\n\n## Super Admin\n\nUse `Gate::before` in `AppServiceProvider::boot()`:\n\n```php\nuse Illuminate\\Support\\Facades\\Gate;\n\npublic function boot(): void\n{\n    Gate::before(function ($user, $ability) {\n        return $user->hasRole('Super Admin') ? true : null;\n    });\n}\n```\n\nThis makes `$user->can()` and `@can` always return true for Super Admins. Must return `null` (not `false`) to allow normal checks for other users.\n\n## Policies\n\nUse `$user->can()` inside policy methods to check permissions:\n\n```php\nclass PostPolicy\n{\n    public function update(User $user, Post $post): bool\n    {\n        if ($user->can('edit all posts')) {\n            return true;\n        }\n\n        return $user->can('edit own posts') && $user->id === $post->user_id;\n    }\n}\n```\n\n## Enums\n\n```php\nenum RolesEnum: string\n{\n    case WRITER = 'writer';\n    case EDITOR = 'editor';\n}\n\nenum PermissionsEnum: string\n{\n    case EDIT_POSTS = 'edit posts';\n    case DELETE_POSTS = 'delete posts';\n}\n\n// Most methods accept enums directly\nPermission::findOrCreate(PermissionsEnum::EDIT_POSTS, 'web');\n$user->assignRole(RolesEnum::WRITER);\n$user->hasRole(RolesEnum::WRITER);\n$role->givePermissionTo(PermissionsEnum::EDIT_POSTS);\n$user->hasPermissionTo(PermissionsEnum::EDIT_POSTS);\n```\n\n## Seeding\n\nAlways flush the permission cache when seeding:\n\n```php\nclass RolesAndPermissionsSeeder extends Seeder\n{\n    public function run(): void\n    {\n        // Reset cache\n        app()[\\Spatie\\Permission\\PermissionRegistrar::class]->forgetCachedPermissions();\n\n        // Create permissions\n        Permission::findOrCreate('edit articles', 'web');\n        Permission::findOrCreate('delete articles', 'web');\n\n        // Create roles and assign permissions\n        Role::findOrCreate('writer', 'web')\n            ->givePermissionTo(['edit articles']);\n\n        Role::findOrCreate('admin', 'web')\n            ->givePermissionTo(Permission::all());\n    }\n}\n```\n\n## Teams (Multi-Tenancy)\n\nEnable in `config/permission.php` before running migrations:\n\n```php\n'teams' => true,\n```\n\nSet the active team in middleware:\n\n```php\nsetPermissionsTeamId($teamId);\n```\n\nWhen switching teams, unset cached relations:\n\n```php\n$user->unsetRelation('roles')->unsetRelation('permissions');\n```\n\n## Events\n\nEnable in `config/permission.php`:\n\n```php\n'events_enabled' => true,\n```\n\nAvailable events: `RoleAttachedEvent`, `RoleDetachedEvent`, `PermissionAttachedEvent`, `PermissionDetachedEvent` in the `Spatie\\Permission\\Events` namespace.\n\n## Performance\n\n- Permissions are cached automatically. The cache is flushed when roles/permissions change via package methods.\n- After direct DB operations, flush manually: `app()[\\Spatie\\Permission\\PermissionRegistrar::class]->forgetCachedPermissions()`\n- For bulk seeding, use `Permission::insert()` for speed, but flush the cache afterward.\n"},"items":[{"name":"SKILL.md","path":"resources/boost/skills/laravel-permission-development/SKILL.md","title":"laravel-permission-development Skill","content":"---\nname: laravel-permission-development\ndescription: Build and work with Spatie Laravel Permission features, including roles, permissions, middleware, policies, teams, and Blade directives.\n---\n\n# Laravel Permission Development\n\n## When to use this skill\n\nUse this skill when working with authorization, roles, permissions, access control, middleware guards, or Blade permission directives using spatie/laravel-permission.\n\n## Core Concepts\n\n- **Users have Roles, Roles have Permissions, Apps check Permissions** (not Roles).\n- Direct permissions on users are an anti-pattern; assign permissions to roles instead.\n- Use `$user->can('permission-name')` for all authorization checks (supports Super Admin via Gate).\n- The `HasRoles` trait (which includes `HasPermissions`) is added to User models.\n\n## Setup\n\nAdd the `HasRoles` trait to your User model:\n\n```php\nuse Spatie\\Permission\\Traits\\HasRoles;\n\nclass User extends Authenticatable\n{\n    use HasRoles;\n}\n```\n\n## Creating Roles and Permissions\n\n```php\nuse Spatie\\Permission\\Models\\Role;\nuse Spatie\\Permission\\Models\\Permission;\n\n$role = Role::create(['name' => 'writer']);\n$permission = Permission::create(['name' => 'edit articles']);\n\n// findOrCreate is idempotent (safe for seeders)\n$role = Role::findOrCreate('writer', 'web');\n$permission = Permission::findOrCreate('edit articles', 'web');\n```\n\n## Assigning Roles and Permissions\n\n```php\n// Assign roles to users\n$user->assignRole('writer');\n$user->assignRole('writer', 'admin');\n$user->assignRole(['writer', 'admin']);\n$user->syncRoles(['writer', 'admin']); // replaces all\n$user->removeRole('writer');\n\n// Assign permissions to roles (preferred)\n$role->givePermissionTo('edit articles');\n$role->givePermissionTo(['edit articles', 'delete articles']);\n$role->syncPermissions(['edit articles', 'delete articles']);\n$role->revokePermissionTo('edit articles');\n\n// Reverse assignment\n$permission->assignRole('writer');\n$permission->syncRoles(['writer', 'editor']);\n$permission->removeRole('writer');\n```\n\n## Checking Roles and Permissions\n\n```php\n// Permission checks (preferred - supports Super Admin via Gate)\n$user->can('edit articles');\n$user->canAny(['edit articles', 'delete articles']);\n\n// Direct package methods (bypass Gate, no Super Admin support)\n$user->hasPermissionTo('edit articles');\n$user->hasAnyPermission(['edit articles', 'publish articles']);\n$user->hasAllPermissions(['edit articles', 'publish articles']);\n$user->hasDirectPermission('edit articles');\n\n// Role checks\n$user->hasRole('writer');\n$user->hasAnyRole(['writer', 'editor']);\n$user->hasAllRoles(['writer', 'editor']);\n$user->hasExactRoles(['writer', 'editor']);\n\n// Get assigned roles and permissions\n$user->getRoleNames();           // Collection of role name strings\n$user->getPermissionNames();     // Collection of permission name strings\n$user->getDirectPermissions();   // Direct permissions only\n$user->getPermissionsViaRoles(); // Inherited via roles\n$user->getAllPermissions();      // Both direct and inherited\n```\n\n## Query Scopes\n\n```php\n$users = User::role('writer')->get();\n$users = User::withoutRole('writer')->get();\n$users = User::permission('edit articles')->get();\n$users = User::withoutPermission('edit articles')->get();\n```\n\n## Middleware\n\nRegister middleware aliases in `bootstrap/app.php`:\n\n```php\n->withMiddleware(function (Middleware $middleware) {\n    $middleware->alias([\n        'role' => \\Spatie\\Permission\\Middleware\\RoleMiddleware::class,\n        'permission' => \\Spatie\\Permission\\Middleware\\PermissionMiddleware::class,\n        'role_or_permission' => \\Spatie\\Permission\\Middleware\\RoleOrPermissionMiddleware::class,\n    ]);\n})\n```\n\nUse in routes (pipe `|` for OR logic):\n\n```php\nRoute::middleware(['permission:edit articles'])->group(function () { ... });\nRoute::middleware(['role:manager|writer'])->group(function () { ... });\nRoute::middleware(['role_or_permission:manager|edit articles'])->group(function () { ... });\n\n// With specific guard\nRoute::middleware(['role:manager,api'])->group(function () { ... });\n```\n\nFor single permissions, Laravel's built-in `can` middleware also works:\n\n```php\nRoute::middleware(['can:edit articles'])->group(function () { ... });\n```\n\n## Blade Directives\n\nPrefer `@can` (permission-based) over `@role` (role-based):\n\n```blade\n@can('edit articles')\n    {{-- User can edit articles (supports Super Admin) --}}\n@endcan\n\n@canany(['edit articles', 'delete articles'])\n    {{-- User can do at least one --}}\n@endcanany\n\n@role('admin')\n    {{-- Only use for super-admin type checks --}}\n@endrole\n\n@hasanyrole('writer|admin')\n    {{-- Has writer or admin --}}\n@endhasanyrole\n```\n\n## Super Admin\n\nUse `Gate::before` in `AppServiceProvider::boot()`:\n\n```php\nuse Illuminate\\Support\\Facades\\Gate;\n\npublic function boot(): void\n{\n    Gate::before(function ($user, $ability) {\n        return $user->hasRole('Super Admin') ? true : null;\n    });\n}\n```\n\nThis makes `$user->can()` and `@can` always return true for Super Admins. Must return `null` (not `false`) to allow normal checks for other users.\n\n## Policies\n\nUse `$user->can()` inside policy methods to check permissions:\n\n```php\nclass PostPolicy\n{\n    public function update(User $user, Post $post): bool\n    {\n        if ($user->can('edit all posts')) {\n            return true;\n        }\n\n        return $user->can('edit own posts') && $user->id === $post->user_id;\n    }\n}\n```\n\n## Enums\n\n```php\nenum RolesEnum: string\n{\n    case WRITER = 'writer';\n    case EDITOR = 'editor';\n}\n\nenum PermissionsEnum: string\n{\n    case EDIT_POSTS = 'edit posts';\n    case DELETE_POSTS = 'delete posts';\n}\n\n// Most methods accept enums directly\nPermission::findOrCreate(PermissionsEnum::EDIT_POSTS, 'web');\n$user->assignRole(RolesEnum::WRITER);\n$user->hasRole(RolesEnum::WRITER);\n$role->givePermissionTo(PermissionsEnum::EDIT_POSTS);\n$user->hasPermissionTo(PermissionsEnum::EDIT_POSTS);\n```\n\n## Seeding\n\nAlways flush the permission cache when seeding:\n\n```php\nclass RolesAndPermissionsSeeder extends Seeder\n{\n    public function run(): void\n    {\n        // Reset cache\n        app()[\\Spatie\\Permission\\PermissionRegistrar::class]->forgetCachedPermissions();\n\n        // Create permissions\n        Permission::findOrCreate('edit articles', 'web');\n        Permission::findOrCreate('delete articles', 'web');\n\n        // Create roles and assign permissions\n        Role::findOrCreate('writer', 'web')\n            ->givePermissionTo(['edit articles']);\n\n        Role::findOrCreate('admin', 'web')\n            ->givePermissionTo(Permission::all());\n    }\n}\n```\n\n## Teams (Multi-Tenancy)\n\nEnable in `config/permission.php` before running migrations:\n\n```php\n'teams' => true,\n```\n\nSet the active team in middleware:\n\n```php\nsetPermissionsTeamId($teamId);\n```\n\nWhen switching teams, unset cached relations:\n\n```php\n$user->unsetRelation('roles')->unsetRelation('permissions');\n```\n\n## Events\n\nEnable in `config/permission.php`:\n\n```php\n'events_enabled' => true,\n```\n\nAvailable events: `RoleAttachedEvent`, `RoleDetachedEvent`, `PermissionAttachedEvent`, `PermissionDetachedEvent` in the `Spatie\\Permission\\Events` namespace.\n\n## Performance\n\n- Permissions are cached automatically. The cache is flushed when roles/permissions change via package methods.\n- After direct DB operations, flush manually: `app()[\\Spatie\\Permission\\PermissionRegistrar::class]->forgetCachedPermissions()`\n- For bulk seeding, use `Permission::insert()` for speed, but flush the cache afterward.\n","category":"resources","tokens":1863}]}