# PROMPT: MIGRATION AGENT - GAMILIT **Proyecto:** Gamilit Platform **Fase:** 4.1 - Migracion de Gamilit **Version:** 1.0.0 --- ## PROMPT DE INICIALIZACION ```markdown Seras un agente de migracion trabajando en la migracion de Gamilit al nuevo modelo de repositorio independiente. ## CONTEXTO El proyecto Gamilit es una plataforma SaaS de gamificacion educativa. Es el proyecto mas avanzado (60% MVP) y servira como MODELO para migrar los demas proyectos. ### Ubicacion actual /home/adrian/Documentos/workspace/projects/gamilit/ ### Destino /home/adrian/Documentos/workspace-v1/repos/gamilit-platform/ ### Control Plane /home/adrian/Documentos/workspace-v1/control-plane/ ## TUS TAREAS ### 1. Crear Estructura Base ```bash # Crear directorios mkdir -p gamilit-platform/{apps/{backend,frontend,database/{ddl,seeds,migrations}},docker,orchestration,docs,.github/workflows} # Crear package.json root con workspaces # Crear README.md # Crear .gitignore ``` ### 2. Crear Service Descriptors Crear `service.descriptor.yml` en: - apps/backend/service.descriptor.yml - apps/frontend/service.descriptor.yml IMPORTANTE: Los descriptors DEBEN referenciar los registries correctos: - ports.registry_ref: "projects.gamilit.api" (para backend) - ports.registry_ref: "projects.gamilit.web" (para frontend) - database.registry_ref: "gamilit" Usar el standard definido en: /home/adrian/Documentos/workspace-v1/02-fase-core-orchestration/ARTEFACTOS/SERVICE-DESCRIPTOR-STANDARD.md ### 3. Migrar Codigo ```bash # Backend cp -r workspace/projects/gamilit/backend/* gamilit-platform/apps/backend/ # Frontend cp -r workspace/projects/gamilit/frontend/* gamilit-platform/apps/frontend/ # Database cp -r workspace/projects/gamilit/database/* gamilit-platform/apps/database/ ``` Despues de copiar: - Actualizar imports si es necesario - Actualizar paths en tsconfig.json - Verificar que no hay referencias hardcodeadas ### 4. Crear Docker Compose Crear en docker/: - docker-compose.yml (principal) - docker-compose.dev.yml (overrides para dev) - .env.example REGLAS IMPORTANTES: - NO usar "ports:", usar "expose:" - Conectar a redes: gamilit_${ENV:-local} e infra_shared - Las redes deben ser external: true - Usar labels de Traefik para routing ### 5. Migrar Orchestration ```bash cp -r workspace/projects/gamilit/orchestration/* gamilit-platform/orchestration/ ``` Actualizar paths en los archivos migrados. ### 6. Validacion ```bash # 1. Validar service descriptors python3 -c "import yaml; yaml.safe_load(open('apps/backend/service.descriptor.yml'))" # 2. Validar build cd apps/backend && npm install && npm run build cd apps/frontend && npm install && npm run build # 3. Validar docker cd docker && docker-compose config # 4. Probar localmente docker-compose up -d curl http://api.gamilit.localhost/health ``` ## REGISTRIES DE REFERENCIA ### ports.registry.yml (extracto) ```yaml projects: gamilit: services: api: internal: 3000 protocol: "http" healthcheck: "/health" web: internal: 3001 protocol: "http" websocket: internal: 3002 protocol: "ws" ``` ### domains.registry.yml (extracto) ```yaml gamilit: local: api: "api.gamilit.localhost" web: "gamilit.localhost" development: api: "api.gamilit.dev.example.com" web: "gamilit.dev.example.com" ``` ### databases.registry.yml (extracto) ```yaml gamilit: database: "gamilit_db" port: 5432 roles: owner: "gamilit_owner" runtime: "gamilit_app" migrator: "gamilit_migrator" schemas: - "public" - "auth" - "gamification" ``` ## RESTRICCIONES 1. NO modificar el workspace actual 2. NO exponer puertos directamente (solo via Traefik) 3. Service descriptors DEBEN referenciar registries existentes 4. Docker networks DEBEN ser external 5. Variables sensibles en .env, NO en compose ## ENTREGABLES 1. Estructura de carpetas completa 2. service.descriptor.yml para backend y frontend 3. Codigo migrado y funcional 4. docker-compose.yml con redes aisladas 5. .env.example documentado 6. orchestration/ migrado 7. Build exitoso 8. Docker compose levanta sin errores ## PROTOCOLO 1. Leer analisis en ANALISIS/ 2. Ejecutar tareas de PLANEACION/00-TAREAS.md 3. Documentar progreso en IMPLEMENTACION/00-EJECUCION.md 4. Validar contra VALIDACION/CHECKLIST.md 5. Reportar issues encontrados ``` --- ## TEMPLATE: docker-compose.yml ```yaml # ============================================================================== # docker-compose.yml - Gamilit Platform # ============================================================================== # Uso: docker-compose up -d # Prerequisitos: # - Redes creadas (gamilit_local, infra_shared) # - Traefik corriendo # - .env configurado # ============================================================================== version: "3.8" x-logging: &default-logging driver: "json-file" options: max-size: "10m" max-file: "3" services: # ========================================================================== # BACKEND - gamilit-api # ========================================================================== gamilit-api: build: context: ../apps/backend dockerfile: Dockerfile container_name: gamilit-api restart: unless-stopped # IMPORTANTE: usar expose, NO ports expose: - "3000" environment: - NODE_ENV=${NODE_ENV:-development} - PORT=3000 - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL:-redis://redis:6379} - JWT_SECRET=${JWT_SECRET} - JWT_EXPIRES_IN=${JWT_EXPIRES_IN:-1d} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 5s retries: 3 start_period: 10s # Labels para Traefik labels: - "traefik.enable=true" - "traefik.http.routers.gamilit-api.rule=Host(`api.gamilit.localhost`)" - "traefik.http.routers.gamilit-api.entrypoints=web" - "traefik.http.services.gamilit-api.loadbalancer.server.port=3000" networks: - gamilit_${ENV:-local} - infra_shared logging: <<: *default-logging # ========================================================================== # FRONTEND - gamilit-web # ========================================================================== gamilit-web: build: context: ../apps/frontend dockerfile: Dockerfile container_name: gamilit-web restart: unless-stopped expose: - "3001" environment: - NODE_ENV=${NODE_ENV:-development} - REACT_APP_API_URL=${REACT_APP_API_URL:-http://api.gamilit.localhost} labels: - "traefik.enable=true" - "traefik.http.routers.gamilit-web.rule=Host(`gamilit.localhost`)" - "traefik.http.routers.gamilit-web.entrypoints=web" - "traefik.http.services.gamilit-web.loadbalancer.server.port=3001" networks: - gamilit_${ENV:-local} - infra_shared depends_on: - gamilit-api logging: <<: *default-logging # ============================================================================== # NETWORKS # ============================================================================== networks: gamilit_${ENV:-local}: external: true infra_shared: external: true ``` --- ## NOTAS - Gamilit es el proyecto MODELO - lo que se defina aqui se replicara - Tomarse el tiempo para hacerlo bien - Documentar cualquier decision de diseno - Cualquier issue encontrado debe documentarse para evitarlo en otros proyectos --- **Documento generado por:** Tech-Leader