Structure: - control-plane/: Registries, SIMCO directives, CI/CD templates - projects/: Gamilit, ERP-Suite, Trading-Platform, Betting-Analytics - shared/: Libs catalog, knowledge-base Key features: - Centralized port, domain, database, and service registries - 23 SIMCO directives + 6 fundamental principles - NEXUS agent profiles with delegation rules - Validation scripts for workspace integrity - Dockerfiles for all services - Path aliases for quick reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
9.3 KiB
DELEGACION: Frontend-Agent - Sprint P2
Proyecto: GAMILIT Fecha: 2025-12-05 De: Requirements-Analyst Para: Frontend-Agent Sprint: P2-A, P2-B, P2-C
CONTEXTO
El Sprint P1 ha sido completado exitosamente con ~12 componentes nuevos para el sistema de amigos. El proyecto ahora esta al 75% de completitud. Se requiere que Frontend-Agent complete las siguientes tareas para cerrar gaps criticos en portales Teacher y Admin.
PREREQUISITOS COMPLETADOS
- Sprint P1 - Componentes Friends implementados (7 componentes)
- Sprint P1 - TeacherProgressPage mejorada
- Sprint P1 - Avatar Upload implementado
- Backend APIs disponibles para todas las tareas
TAREAS ASIGNADAS
Sprint P2-A (Prioridad P0/P1)
FE-P2-001 a FE-P2-010: Eliminar Mock-Teacher-ID
Story: US-P2-001 SP: 3 Prioridad: P0
Archivos a modificar:
apps/frontend/src/features/teacher/pages/TeacherDashboardPage.tsx(linea 45)apps/frontend/src/features/teacher/pages/TeacherStudentsPage.tsx(linea 38)apps/frontend/src/features/teacher/pages/TeacherProgressPage.tsx(linea 52)apps/frontend/src/features/teacher/pages/TeacherActivitiesPage.tsx(linea 41)apps/frontend/src/features/teacher/pages/TeacherGamificationPage.tsx(linea 47)apps/frontend/src/features/teacher/pages/TeacherNotificationsPage.tsx(linea 35)apps/frontend/src/features/teacher/pages/TeacherCalendarPage.tsx(linea 43)apps/frontend/src/features/teacher/pages/TeacherAnalyticsPage.tsx(linea 56)apps/frontend/src/features/teacher/pages/TeacherMissionsPage.tsx(linea 39)apps/frontend/src/features/teacher/pages/TeacherClassroomsPage.tsx(linea 44)
Patron de correccion:
// ANTES (incorrecto)
const userId = user?.id || 'mock-teacher-id';
// DESPUES (correcto)
const { user, isLoading } = useAuth();
if (isLoading) return <LoadingSpinner />;
if (!user?.id) {
navigate('/login');
return null;
}
const userId = user.id;
Recomendacion: Crear hook useAuthenticatedUser() reutilizable.
FE-P2-011 a FE-P2-014: Transformacion Snake/Camel
Story: US-P2-002 SP: 3 Prioridad: P0
Archivos a crear:
apps/frontend/src/utils/
├── transformKeys.ts
├── intervalToMinutes.ts
└── index.ts (actualizar)
Implementacion transformKeys.ts:
export function snakeToCamel(obj: Record<string, any>): Record<string, any> {
if (Array.isArray(obj)) {
return obj.map(snakeToCamel);
}
if (obj !== null && typeof obj === 'object') {
return Object.keys(obj).reduce((acc, key) => {
const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
acc[camelKey] = snakeToCamel(obj[key]);
return acc;
}, {} as Record<string, any>);
}
return obj;
}
export function camelToSnake(obj: Record<string, any>): Record<string, any> {
// Implementacion inversa
}
Integrar en axios interceptors:
// apps/frontend/src/config/axios.config.ts
axios.interceptors.response.use((response) => {
response.data = snakeToCamel(response.data);
return response;
});
axios.interceptors.request.use((config) => {
if (config.data) {
config.data = camelToSnake(config.data);
}
return config;
});
FE-P2-015 a FE-P2-020: Tipos Canonicos
Story: US-P2-003 SP: 5 Prioridad: P0
Archivos a crear/modificar:
apps/frontend/src/types/userStats.ts(nuevo)
export interface UserStats {
id: string;
userId: string;
totalXp: number;
totalMlCoins: number;
currentRank: MayaRank;
currentLevel: number;
exercisesCompleted: number;
correctAnswers: number;
totalAnswers: number;
studyTimeMinutes: number;
currentStreak: number;
longestStreak: number;
lastActivityAt: Date;
createdAt: Date;
updatedAt: Date;
}
apps/frontend/src/types/classroom.ts(actualizar)
- Agregar campos: maxStudents, isActive, metadata, createdBy, academicYear
apps/frontend/src/types/user.ts(actualizar)
- Agregar campos: lastLogin, metadata, isVerified
apps/frontend/src/types/exerciseSubmission.ts(nuevo)
- Crear discriminated unions por tipo de ejercicio
apps/frontend/src/types/achievement.ts(actualizar)
- Estandarizar naming: unlockedAt (no dateUnlocked)
FE-ADMIN-001 a FE-ADMIN-005: AdminRolesPage
Story: US-ADMIN-P2-001 SP: 8 Prioridad: P1
Componentes a crear:
apps/frontend/src/apps/admin/components/roles/
├── RolesTable.tsx
├── RoleEditor.tsx
├── PermissionMatrix.tsx
└── index.ts
Hooks a usar: useRoles, useRolePermissions (ya existen)
Endpoints:
- GET /admin/roles
- GET /admin/roles/:id
- POST /admin/roles
- PUT /admin/roles/:id
- DELETE /admin/roles/:id
FE-ADMIN-006 a FE-ADMIN-010: AdminInstitutionsPage
Story: US-ADMIN-P2-002 SP: 8 Prioridad: P1
Componentes a crear:
apps/frontend/src/apps/admin/components/institutions/
├── InstitutionsTable.tsx
├── InstitutionFilters.tsx
├── InstitutionDetailModal.tsx
├── InstitutionStats.tsx
└── index.ts
Hook a usar: useOrganizations (ya existe)
Sprint P2-B (Prioridad P1)
FE-TEACHER-001: Habilitar TeacherCommunicationPage
Story: US-TEACHER-P2-001 SP: 3
Acciones:
- Modificar
apps/frontend/src/features/teacher/constants/featureFlags.ts - Cambiar
SHOW_COMMUNICATION: true - Verificar que componentes funcionan correctamente
- Agregar tests basicos
FE-TEACHER-002: Habilitar TeacherContentPage
Story: US-TEACHER-P2-002 SP: 3
Acciones:
- Cambiar
SHOW_CONTENT: trueen featureFlags.ts - Verificar integracion con backend
- Agregar tests basicos
FE-TEACHER-003: Implementar TeacherResourcesPage
Story: US-TEACHER-P2-003 SP: 8
Componentes a crear:
apps/frontend/src/features/teacher/pages/TeacherResourcesPage/
├── TeacherResourcesPage.tsx
├── ResourcesGrid.tsx
├── ResourceUploader.tsx
├── ResourceCard.tsx
└── index.ts
Funcionalidades:
- Subir archivos (PDF, DOCX, imágenes)
- Organizar por carpetas/categorias
- Compartir con estudiantes/aulas
- Preview de documentos
FE-ADMIN-011 a FE-ADMIN-016: AdminAdvancedPage
Story: US-ADMIN-P2-003 SP: 13
Componentes a crear:
apps/frontend/src/apps/admin/components/advanced/
├── FeatureFlagsPanel.tsx
├── FeatureFlagEditor.tsx
├── RolloutSlider.tsx
├── TargetingConfig.tsx
├── ABTestingDashboard.tsx
└── index.ts
Hook a crear: useFeatureFlags
Sprint P2-C (Prioridad P2)
FE-M4-001: Drag-Drop Infografia
Story: US-M4-P2-002 SP: 5
Archivo: apps/frontend/src/features/mechanics/module4/InfografiaInteractiva.tsx
Acciones:
- Reemplazar click-to-reveal con drag-drop
- Usar libreria como @dnd-kit/core
- Mantener fallback para dispositivos tactiles
FE-M4-002: Penalizacion Tiempo Quiz
Story: US-M4-P2-003 SP: 3
Archivo: apps/frontend/src/features/mechanics/module4/QuizTikTok.tsx
Linea: 145
Acciones:
- Implementar penalizacion de puntuacion por tiempo
- Formula: score = baseScore * (1 - timeElapsed/totalTime * 0.5)
- Mostrar indicador visual de penalizacion
FE-M5-001: Secciones Cronometradas Video
Story: US-M5-P2-002 SP: 5
Archivo: apps/frontend/src/features/mechanics/module5/VideoCartaCurie.tsx
Acciones:
- Dividir grabacion en 4 secciones
- Introduccion: 30s
- Mensaje Principal: 90s
- Reflexiones: 45s
- Cierre: 15s
- Mostrar timer por seccion
RESUMEN DE TAREAS
| ID | Tarea | SP | Sprint | Prioridad |
|---|---|---|---|---|
| FE-P2-001-010 | Eliminar mocks | 3 | P2-A | P0 |
| FE-P2-011-014 | Transform snake/camel | 3 | P2-A | P0 |
| FE-P2-015-020 | Tipos canonicos | 5 | P2-A | P0 |
| FE-ADMIN-001-005 | AdminRolesPage | 8 | P2-A | P1 |
| FE-ADMIN-006-010 | AdminInstitutionsPage | 8 | P2-A | P1 |
| FE-TEACHER-001 | Communication Page | 3 | P2-B | P1 |
| FE-TEACHER-002 | Content Page | 3 | P2-B | P1 |
| FE-TEACHER-003 | Resources Page | 8 | P2-B | P1 |
| FE-ADMIN-011-016 | AdminAdvancedPage | 13 | P2-B | P1 |
| FE-M4-001 | Drag-drop infografia | 5 | P2-C | P2 |
| FE-M4-002 | Penalizacion tiempo | 3 | P2-C | P2 |
| FE-M5-001 | Secciones video | 5 | P2-C | P2 |
Total Frontend P2: 67 SP
ARCHIVOS DE REFERENCIA
- Analisis completo:
orchestration/agentes/requirements-analyst/ANALISIS-ALCANCES-P2-POST-SPRINT-P1-2025-12-05.md - Historias P0:
orchestration/agentes/requirements-analyst/historias-usuario/US-P2-CRITICAS.md - Historias Admin:
orchestration/agentes/requirements-analyst/historias-usuario/US-P2-ADMIN.md
CRITERIOS DE ACEPTACION GENERALES
- Componentes con TypeScript estricto
- Tests unitarios para componentes criticos
- Responsive design verificado
- Accesibilidad basica (ARIA labels)
- Sin errores en npm run lint
- Build exitoso
Generado por: Requirements-Analyst Fecha: 2025-12-05 Revision: Despues de Sprint P2-A