afea / filament-cms-starter
Meta package for the Afea Filament CMS package ecosystem: aggregates every module and ships an interactive Laravel Prompts installer.
Requires
- php: ^8.4
- afea/filament-activity-log: @dev
- afea/filament-blog: @dev
- afea/filament-cms-core: @dev
- afea/filament-faq: @dev
- afea/filament-files: @dev
- afea/filament-hero: @dev
- afea/filament-media: @dev
- afea/filament-pages: @dev
- afea/filament-partners: @dev
- afea/filament-popup: @dev
- afea/filament-positions: @dev
- afea/filament-redirect: @dev
- afea/filament-settings: @dev
- afea/filament-testimonials: @dev
- afea/filament-users: @dev
- filament/filament: ^4.0
- illuminate/contracts: ^12.0
- illuminate/support: ^12.0
- laravel/prompts: ^0.3
Requires (Dev)
- laravel/pint: ^1.0
- orchestra/testbench: ^10.0
- pestphp/pest: ^4.0
- pestphp/pest-plugin-laravel: ^4.0
README
Meta package that aggregates the entire Afea Filament CMS ecosystem and ships the interactive afea:install orchestrator. No business code of its own — its only job is to make "new agency project" a ten-minute affair.
The ten-minute setup
laravel new acme-site cd acme-site # 1. Install Filament itself and create a panel (standard Filament steps) composer require filament/filament php artisan filament:install --panels # 2. Install the Afea CMS starter composer require afea/filament-cms-starter php artisan afea:install
The installer walks you through:
- Panel provider path — defaults to
app/Providers/Filament/AdminPanelProvider.php. - Module selection — checkbox list of every first-party module (all selected by default except
positions). - Per-module routing — for modules with public routes (blog, pages, positions) you pick
slug,resourceorlocalizedand the URL prefix. - Media disk default — prints the
AFEA_CMS_MEDIA_DISKenv hint. - Cascade install — runs
afea:install:corethen each module's own installer, passing your routing choices through. - Panel patch — appends
->plugin(...)calls to your panel provider for each selected module, skipping any already present. - Admin user (optional) — cascades to
make:filament-user.
Running the command a second time is safe: existing configuration files are kept unless you pass --force, migrations skip already-run entries, and plugin injections are deduplicated by class name.
Non-interactive usage
php artisan afea:install \ --modules=blog,pages,popup,redirect,faq,testimonials,settings \ --panel=app/Providers/Filament/AdminPanelProvider.php \ --no-migrate \ --force
With --modules the multiselect prompt is skipped. Routing strategies for routed modules still prompt individually — use the per-module installers (afea:install:blog --routing=resource --prefix=blog) if you need the whole thing scripted.
Adding a custom module
The module list is data-driven (ModuleRegistry). If you ship your own afea/filament-something module that follows the same conventions (an afea:install:something command + a ::make()able plugin class), extend the registry in your app's service provider:
use Afea\Cms\Starter\Modules\Module; use Afea\Cms\Starter\Modules\ModuleRegistry; // Prepend your module to the registry by wrapping the class — for small // installs, simply copy-paste the registry and edit. For team-wide reuse, // contribute an entry upstream.
What the installer will never do
- Write to
.envdirectly. We print the env keys you should set, but your credentials stay yours. - Skip hook or permission checks. The command runs each module's installer through Artisan, so every migration, config publish and notification fires normally.
- Overwrite an existing plugin registration. Re-running won't duplicate
->plugin(...)lines.
Uninstalling a module later
composer remove afea/filament-popup
Delete the corresponding ->plugin(...) line from your panel provider and run php artisan migrate:rollback --path=… if you want the tables gone. The starter has no "uninstall" subcommand by design — the goal is to leave clean Laravel/Composer primitives in charge.