Setup local
Cómo levantar el repo platform de cero (scaffold Laravel + Inertia, tenancy en single-database, un host local) y el gate de calidad local.
El objetivo de F0 es un repo Laravel + Inertia/React corriendo local contra Postgres, listo para meterle dominio, con el gate de calidad enchufado desde el primer commit. Nada de tenancy real todavía (eso es F2): F0 deja el andamio.
Stack pineado
Todo se fija en el repo desde el día 1 para que humano y agentes trabajen sobre las mismas versiones. Nada de “la que tenga instalada la máquina”.
| Pieza | Versión | Dónde se pinea |
|---|---|---|
| PHP | 8.x | .tool-versions |
| Laravel | 13 | composer.json |
| Node | 20.x | .nvmrc / .tool-versions |
| Gestor JS | pnpm (nunca npm) | packageManager en package.json |
| Front | Inertia 3 + React 19 | scaffold Breeze |
| DB | PostgreSQL 18 | local + Laravel Cloud (Neon) |
Bootstrap del repo
composer create-project + Breeze con preset React deja Laravel + Inertia +
React andando con auth de ejemplo.
stancl/tenancy se agrega en F0 pero no se configura: solo queda la
dependencia. La configuración real (single-database + RLS) es F2.
El scaffold de dominio (app/Domain/{Labor,Contracts,Signing}/) se organiza por
dominio, no por capa: ver Arquitectura. En F0 solo se deja
el árbol vacío listo para F2 en adelante.
Postgres local
Una sola base de datos compartida (shared schema): stancl/tenancy va en modo
single-database, sin schemas por tenant. Todas las migraciones viven en una
carpeta (database/migrations/), no hay migrations/tenant/ separada.
Development es 100% local (Herd/Valet + Postgres, *.test), costo $0. No hay
ambiente cloud de dev: staging vive en Laravel Cloud y se levanta recién en F6.
Un solo host local
Con dominio único (decisión 0.10), el producto resuelve
tenants por sesión, no por subdominio. Local alcanza con un host
(platform.test): no hacen falta subdominios *.test, wildcard ni entradas por
tenant en /etc/hosts.
El staff entra al host, se loguea y elige empresa; a partir de ahí el current_tenant_id
de la sesión define el contexto. Los 2 tenants de prueba (acme, contoso) los
crea el seeder (F2-05), no un subdominio.
Gate de calidad local
La calidad se valida local antes de pushear, nunca usando el CI como test
runner (los repos comparten bolsa de minutos de Actions). Una sola fuente de
verdad del pipeline: composer ci:check.
El gate local se corre vía bin/ci-local.sh, que verifica versiones pineadas,
borra artefactos gitignored y corre ci:check en limpio. Un pre-push hook plano
en .githooks/ (sin lefthook) lo dispara antes de cada push.
Gate de F0
F0 cierra cuando estas tres cosas pasan a la vez. Sin el gate, no se avanza a F1.
php artisan serve + pnpm dev muestran la página de bienvenida de Breeze.
php artisan test (Pest) en verde, con el primer test tests/Pest.php
corriendo.
El tercer criterio: CI verde en un PR de prueba (un job con composer install
pnpm install+ Pint + tests +pnpm build). Con eso, la fundación está lista para F1 (auth) y F2 (tenancy). Ver Multi-tenancy para el siguiente escalón.