# CODEX.md — PHP / CorePHP Instructions for Codex when working with PHP code in this workspace. ## CorePHP Framework This project uses CorePHP (`core/php`) as its foundation. CorePHP is a Laravel package that provides: - Event-driven module loading (modules only load when their events fire) - Multi-tenant isolation via `BelongsToWorkspace` trait - Actions pattern for single-purpose business logic - Lifecycle events for route/panel/command registration ## Architecture ### Module Pattern ```php // app/Mod/{Name}/Boot.php class Boot extends ServiceProvider { public static array $listens = [ WebRoutesRegistering::class => 'onWebRoutes', AdminPanelBooting::class => 'onAdmin', ]; } ``` ### Website Pattern ```php // app/Website/{Name}/Boot.php class Boot extends ServiceProvider { public static array $domains = [ '/^api\.lthn\.(ai|test|sh)$/', ]; public static array $listens = [ DomainResolving::class => 'onDomain', WebRoutesRegistering::class => 'onWebRoutes', ApiRoutesRegistering::class => 'onApiRoutes', ]; } ``` ### Lifecycle Events | Event | Purpose | |-------|---------| | `DomainResolving` | Match domain → register website module | | `WebRoutesRegistering` | Public web routes (sessions, CSRF, Vite) | | `ApiRoutesRegistering` | Stateless API routes | | `AdminPanelBooting` | Admin panel resources | | `ClientRoutesRegistering` | Authenticated SaaS client routes | | `ConsoleBooting` | Artisan commands | | `McpToolsRegistering` | MCP tool handlers | ### Actions Pattern ```php use Core\Actions\Action; class CreateOrder { use Action; public function handle(User $user, array $data): Order { return Order::create($data); } } // Usage: CreateOrder::run($user, $validated); ``` ### Multi-Tenant Isolation ```php use Core\Mod\Tenant\Concerns\BelongsToWorkspace; class Memory extends Model { use BelongsToWorkspace; // Auto-scopes queries to current workspace // Auto-assigns workspace_id on create } ``` ## Mandatory Patterns ### Strict Types — every PHP file ```php