- Replace Bun with pnpm 9 + Turborepo + tsx; apps/api renamed to apps/backend - Split backend into http/, modules/, lib/ layers mirroring tai-specguard - Add use-case + Result pattern, Problem Details RFC 7807, basePath /api/v1 - Mount Better Auth at /api/v1/auth, keep session-auth whitelist - Split Prisma schema into prisma/models/*, generate into generated/ - Rework packages/shared into lib/ + schemas/ with pagination DTOs - Implement health, groups, students, payments, waitlist modules - Add vitest suite with prisma mocks (21 tests), biome lint - Point web client to /api/v1/auth and /api/v1/groups/from-organization
4.7 KiB
4.7 KiB
Stack Architecture & Technical Specifications — Gruperly
Este documento define la arquitectura, convenciones y especificaciones del stack tecnológico para el desarrollo del monorepo de Gruperly. Debe ser utilizado como contexto principal por los agentes e instruccionales de IA para la generación de código y configuración del proyecto.
1. Stack Tecnológico Principal
Runtime & Monorepo Manager
- Runtime: Node.js (>=20)
- Package Manager: pnpm 9
- Monorepo Tooling: pnpm workspaces + Turborepo
Backend (apps/backend)
- Framework: Hono (servido con
@hono/node-server, ejecutado contsx) - ORM: Prisma
- Base de Datos: PostgreSQL
- Autenticación: Better Auth
- Validación de Entradas:
@hono/zod-validator
Frontend (apps/web)
- Framework / Library: React 19+ con TypeScript
- Routing: TanStack Router (File-based routing)
- Data Fetching & State: TanStack Query (v5)
- UI Components: Shadcn UI
- Styling: Tailwind CSS (v4)
- Form Management:
react-hook-formcon@hookform/resolvers/zod
Shared Package (packages/shared)
- Validación de Esquemas: Zod
- Tipos Compartidos: Tipos inferidos de Zod (
z.infer<typeof schema>) y tipos globales exportados de Prisma.
2. Estructura del Monorepo
gruperly/
├── apps/
│ ├── backend/ # Servicio Backend (Node + Hono + tsx)
│ │ ├── src/
│ │ │ ├── http/ # Infraestructura HTTP (validate, problem-details, session-auth, ...)
│ │ │ ├── lib/ # Prisma (cliente + UnitOfWork), pagination, email, helpers
│ │ │ ├── modules/ # Módulos: health-check, auth, groups, students, payments, waitlist
│ │ │ │ └── <módulo>/
│ │ │ │ ├── routes.ts
│ │ │ │ └── features/<accion>/{route,use-case}.ts
│ │ │ ├── app.ts # Monta basePath('/api/v1') + rutas + notFound/onError (RFC 7807)
│ │ │ ├── server.ts # Entry point (serve de @hono/node-server)
│ │ │ └── logger.ts # pino + pino-pretty
│ │ ├── prisma/
│ │ │ ├── schema.prisma # Generator + datasource simple
│ │ │ ├── models/ # Modelos multi-archivo (auth.prisma, domain.prisma)
│ │ │ └── migrations/
│ │ ├── generated/ # Cliente generado de Prisma (gitignoreado, alias @generated/*)
│ │ ├── prisma.config.ts # Config de Prisma CLI (datasource URL, migrations)
│ │ ├── test/ # Tests vitest
│ │ ├── tsconfig.json
│ │ └── package.json
│ │
│ └── web/ # Aplicación Frontend (React PWA)
│ ├── src/
│ │ ├── components/ # Componentes de Shadcn UI y UI propia
│ │ ├── routes/ # Rutas jerárquicas de TanStack Router
│ │ ├── lib/ # Cliente de API, TanStack Query client, etc.
│ │ ├── main.tsx
│ │ └── index.css # Tailwind CSS
│ ├── tsconfig.json
│ └── package.json
│
├── packages/
│ ├── shared/ # Código y esquemas compartidos
│ │ ├── src/
│ │ │ ├── schemas/ # Validaciones Zod compartidas
│ │ │ │ ├── group.schema.ts
│ │ │ │ ├── student.schema.ts
│ │ │ │ └── payment.schema.ts
│ │ │ └── index.ts
│ │ ├── tsconfig.json
│ │ └── package.json
│ │
│ └── config/ # Configuraciones compartidas de TS/ESLint
│ ├── tsconfig.base.json
│ └── package.json
│
├── package.json # Workspaces de Bun
├── turbo.json # Configuración de pipeline de Turborepo
└── README.md
---
## 3. Sistema de Diseño Visual (UI System Tokens)
* **Background:** `#F8FAFC` (Light Mode principal)
* **Primary Color (Nav, Headings, Textos oscuros):** `#0A2540` (Azul Marino del Isologo)
* **Accent Color (Botones de acción, enlaces activos, CTAs):** `#1E90FF` (Azul Celeste de la 'y')
* **Border Radius:** `0.75rem` (`rounded-xl` en tarjetas de Shadcn)
* **Status Badges:**
* **Paid / Al Día:** Fondo `#DCFCE7`, Texto `#10B981`
* **Pending / Lista Espera:** Fondo `#FEF3C7`, Texto `#F59E0B`