Estructura del Monorepo
El monorepo usa Turborepo v2 con pnpm workspaces. Todas las apps y packages comparten tipos y schemas sin duplicar código.
Estructura de directorios
Section titled “Estructura de directorios”nappai-fluency/├── apps/│ ├── web/ ← React 19 + Vite (frontend)│ ├── api/ ← NestJS 11 + Prisma (backend)│ ├── ai-backend/ ← Motor IA propio (ADR-010)│ ├── e2e/ ← Playwright (tests E2E)│ └── docs/ ← Este portal (Astro Starlight)│├── packages/│ ├── shared-types/ ← Tipos TypeScript compartidos│ └── shared-schemas/ ← Schemas Zod compartidos│├── turbo.json ← Pipeline de tareas├── pnpm-workspace.yaml ← Workspaces└── package.json ← Scripts raízPipelines Turborepo (turbo.json)
Section titled “Pipelines Turborepo (turbo.json)”| Tarea | Dependencias | Cache | Uso |
|---|---|---|---|
build | ^build | Sí | Build de todas las apps |
@nappai/docs#build | ninguna | Sí | Build del portal de docs |
dev | — | No (persistent) | Arrancar en desarrollo |
test | ^build | Sí | Tests unitarios Jest |
e2e | build | No | Tests Playwright |
e2e:access-control | build | No | Suite crítica de acceso |
lint | — | Sí | ESLint en todo el monorepo |
db:migrate | — | No | Migraciones Prisma |
db:studio | — | No (persistent) | Prisma Studio |
Scripts raíz
Section titled “Scripts raíz”pnpm dev # Arranca web + api en paralelopnpm build # Build de todas las appspnpm test # Tests unitariospnpm e2e # Tests Playwright completospnpm e2e:access-control # Solo suite de access-control (blocking en CI)pnpm lint # ESLint globalpnpm db:migrate # Aplica migracionespnpm db:studio # Abre Prisma Studiopnpm docs:dev # Arranca el portal de docs en :4321pnpm docs:build # Build estático del portal de docsWorkspace packages
Section titled “Workspace packages”@nappai/shared-types
Section titled “@nappai/shared-types”Tipos TypeScript compartidos entre web y api:
UserRole,AccessLevel,OrgPlan— enums del dominioACCESS_HIERARCHY,CONTENT_LEVEL_REQUIREMENTS— tablas de permisos- DTOs de respuesta de la API
@nappai/shared-schemas
Section titled “@nappai/shared-schemas”Schemas Zod usados para validación en api y en formularios de web:
- Son la fuente de verdad de validación — un DTO NestJS siempre tiene su schema Zod equivalente
Reglas del monorepo
Section titled “Reglas del monorepo”- NUNCA queries raw a BD — siempre Prisma service
- NUNCA llamar LLMs directamente desde Fluency — todo pasa por
ai-backend - Los schemas Zod en
packages/shared-schemasson la fuente de verdad de validación - Antes de crear un módulo NestJS, verificar si ya existe en
apps/api/src/modules/