10 KiB
AGENTS.md
Alcance y seguridad
Este repositorio es Presupuestador UECKO: una SPA para elaboración de presupuestos de mobiliario y una API REST para autenticación, catálogo, distribuidores, usuarios, perfiles, presupuestos y soporte.
Antes de editar:
- Ejecuta
git status --short. - Conserva los cambios existentes que no pertenezcan a la tarea.
- Inspecciona el patrón del contexto, feature o componente equivalente antes de introducir una abstracción nueva.
- No expongas ni copies secretos desde
stack.env, archivos.envo configuraciones de entorno.
No hagas commits, push, reset, rebase, instalaciones de dependencias, regeneración de lockfiles, migraciones ni operaciones Docker o de base de datos sin petición explícita.
Estructura
client/: SPA React 18 creada con Vite.server/: API REST Express, Passport y Sequelize.shared/: DTOs, entidades de valor, criterios de consulta, validadores y utilidades compartidas.doc/readme.adoc: especificación funcional e intención arquitectónica inicial. Contrasta siempre sus requisitos y endpoints con el código antes de asumir que están implementados.dist/: salida de build; no editar manualmente.docker-compose.yml,Dockerfile.server,Caddyfile: despliegue Docker/Caddy.
El package.json raíz solo declara shared como workspace. client y server tienen paquetes y lockfiles propios.
Runtime y gestor de paquetes
- Node.js: el raíz exige
>=18.19.0; servidor exige>=18. - TypeScript:
^5.5.4enclient,serveryshared. - Usa Yarn para los comandos existentes. Hay un
server/pnpm-lock.yamladicional: no lo elimines, regeneres ni deduzcas que pnpm es el gestor elegido sin una tarea específica. - No hay versión de Node fijada mediante
.nvmrc,.node-versiono.tool-versions. - El sistema operativo no está impuesto por el repositorio.
Arquitectura backend
El backend está organizado por contextos bajo server/src/contexts:
authcatalogprofilesalessupportuserscommon
En los contextos se repite la estructura:
domain: entidades, errores, interfaces de repositorio y reglas de dominio.application: casos de uso y servicios de aplicación.infrastructure: controladores Express, repositorios, mapeadores, modelos Sequelize y composición de dependencias.
El flujo observable es:
routes Express -> middleware -> controller -> caso de uso/servicio -> repositorio/adaptador -> Sequelize/modelo
Mantén esta separación cuando el contexto existente la use. No conviertas una tarea local en una reestructuración arquitectónica.
Las rutas API se montan en /api/v1 desde:
server/src/infrastructure/express/app.tsserver/src/infrastructure/express/api/v1.tsserver/src/infrastructure/express/api/routes/
Usa controladores, casos de uso, repositorios, mapeadores y DTOs ya existentes como referencia al extender un contexto.
Persistencia
- Sequelize usa dialecto
mysql; Docker suministra MariaDB mediantemariadb:latest. - La configuración de conexión está en
server/src/config/environments/. - El adaptador principal está en
server/src/contexts/common/infrastructure/sequelize/SequelizeAdapter.ts. - Los modelos se localizan dinámicamente mediante el patrón
**/*.model.{js,ts}. - Las asociaciones de modelos se configuran después del registro.
- La configuración Sequelize usa convenciones
underscored, timestamps,utf8mb4yutf8mb4_unicode_ci. - Los repositorios y la infraestructura Sequelize son el lugar habitual para el acceso a persistencia; evita introducir consultas de base de datos en rutas o componentes.
No hay migraciones ni seeds formales localizados. El arranque de server/src/infrastructure/http/server.ts ejecuta:
sequelizeConn.sync({ force: false, alter: true })
initStructure(...)
insertUsers()
Por ello, no inicies el backend, Docker Compose ni scripts de infraestructura contra una base de datos sin confirmar que la operación está dentro del alcance. No sustituyas este comportamiento por una estrategia de migraciones sin una tarea explícita.
Autenticación y autorización
- Passport se configura en
server/src/contexts/auth/infrastructure/express/passport/. - Existen estrategias local por email y JWT.
- Las rutas autenticadas usan el middleware
checkUser. - Las operaciones administrativas usan middleware como
checkIsAdmin; el acceso propio se controla concheckAdminOrSelfcuando corresponde. - En frontend, autenticación se centraliza en
client/src/lib/hooks/useAuth/y Axios añade la autorización desdeclient/src/lib/axios/setupInterceptors.ts. - Las rutas de la SPA se protegen con
ProtectedRoute.
No confundas autenticación con autorización. Al añadir una ruta o mutación protegida, reutiliza el middleware y patrón de permisos más cercano.
Frontend
- Punto de entrada:
client/src/main.tsx. - Providers globales:
client/src/App.tsx. - Rutas:
client/src/Routes.tsx, mediante React Router y carga diferida. - Features:
client/src/app/. - Componentes reutilizables:
client/src/components/. - Primitivas UI:
client/src/ui/. - Hooks, Context y utilidades:
client/src/lib/.
La comunicación HTTP se centraliza mediante:
client/src/lib/axios/client/src/lib/hooks/useDataSource/DataSourceProvider
No introduzcas peticiones Axios directas desde componentes si el proveedor de datos y hooks existentes pueden expresar la operación.
React Query gestiona datos remotos. Usa las claves de consulta de client/src/lib/hooks/useQueryKey/KeyBuilder.ts y los hooks existentes de useDataSource o del feature antes de crear claves o wrappers nuevos.
Los formularios usan React Hook Form y componentes en client/src/components/Forms/. Para tablas, reutiliza client/src/components/DataTable/, los hooks relacionados y TanStack React Table. Para diálogos, botones y primitivas visuales, busca primero equivalentes en components/ y ui/.
La internacionalización se configura en client/src/locales/i18n.ts; los idiomas disponibles son es, en y ca, con español como fallback. Todo texto nuevo visible para usuarios debe seguir el patrón de traducciones existente cuando afecte a una zona internacionalizada.
Convenciones de código
Backend
Patrones de nombres frecuentes:
- Casos de uso:
*.useCase.ts - Controladores:
*.controller.ts - Repositorios:
*.repository.ts - Modelos:
*.model.ts - Mapeadores:
*.mapper.ts - Presentadores:
*.presenter.ts
Los DTO compartidos usan habitualmente nombres como I..._Request_DTO e I..._Response_DTO.
La validación usa repetidamente Joi y RuleValidator, en DTOs, entidades y controladores. Sigue el patrón del endpoint o DTO equivalente.
Frontend
- Componentes React: PascalCase.
- Hooks: prefijo
use. - Barrel exports: hay numerosos
index.ts; manténlos cuando trabajes en directorios que ya los usen. - Alias configurados:
@,@shared,@uiy@lib. - Hay mezcla de nombres en inglés y comentarios/UI en español. No impongas una normalización global dentro de cambios acotados.
Tipado
TypeScript está en modo strict en cliente y servidor. El servidor mantiene noImplicitAny: false y ESLint permite any; el cliente lo reporta como advertencia. No amplíes any sin necesidad: prefiere tipos compartidos, DTOs, genéricos o unknown cuando el dato externo necesite validación.
Mantén las comprobaciones explícitas de null y undefined en rutas y datos opcionales; strictNullChecks está activo en el servidor.
Errores y asincronía
- El backend dispone de abstracciones de errores y respuesta HTTP bajo
server/src/contexts/common/infrastructure/express/. - Los controladores se ejecutan mediante
handleRequestcuando el patrón del endpoint lo utiliza. - Los errores de Axios se procesan en
client/src/lib/axios/setupInterceptors.ts. - React Query expone estados y errores a través de hooks; conserva el manejo de carga, error y mutación del feature equivalente.
Usa async/await o devuelve explícitamente promesas según el patrón cercano. No ocultes errores de operaciones remotas ni introduzcas manejadores globales paralelos sin necesidad.
Testing y validación
Jest y ts-jest están configurados en los tres paquetes.
Pruebas localizadas:
- Cliente: pruebas de tabla de catálogo y paginación.
- Shared: pruebas unitarias de entidades de valor y criterios de consulta.
- Servidor: no se localizaron pruebas bajo
server/src. - No se localizaron pruebas E2E ni configuración Cypress/Playwright.
Ejecuta la validación más acotada y pertinente para el cambio. Los comandos reales son:
# Tests
cd shared && yarn test
cd server && yarn test
cd client && yarn test
# Lint
cd server && yarn lint
cd client && yarn lint
# Build / comprobación TypeScript
cd server && yarn build
cd client && yarn build
No existe un script dedicado de typecheck ni de formato. El build de cliente elimina y recrea dist/client; no lo ejecutes si la tarea exige estrictamente no generar archivos.
Desarrollo y Docker
# Desarrollo backend
cd server && yarn dev
# Desarrollo frontend
cd client && yarn dev
# Docker desde la raíz
yarn docker:rebuild
yarn docker:start
yarn docker:stop
yarn docker:restart
yarn docker:logs
yarn docker:build
yarn docker:ps
Docker Compose incluye Caddy, backend, MariaDB, phpMyAdmin y un servicio de espera de base de datos. El servicio frontend está comentado: Caddy sirve dist/client directamente y actúa como reverse proxy del backend.
No reconstruyas contenedores, no levantes servicios y no ejecutes docker compose down como efecto colateral de cambios de código o revisiones.
Documentación y cambios funcionales
Consulta antes de modificar funcionalidades de presupuestos:
doc/readme.adoc: alcance e intención funcional inicial.- Rutas actuales en
server/src/infrastructure/express/api/routes/. - DTOs compartidos en
shared/lib/contexts/. - Feature frontend correspondiente bajo
client/src/app/. - Casos de uso y repositorios del contexto backend implicado.
La especificación describe más capacidades de las que se observan necesariamente en rutas actuales. No implementes ni presupongas contratos, gestión completa de catálogo, pedidos o contratos solo porque aparezcan en la documentación de planificación.
Entrega
Al finalizar una tarea:
- Resume los archivos modificados.
- Indica las validaciones ejecutadas y su resultado.
- Indica las validaciones no ejecutadas y por qué.
- Señala cualquier inconsistencia relevante encontrada, sin modificarla fuera del alcance.
- No incluyas secretos, tokens, contraseñas ni valores de entorno sensibles.