Aula multilenguaje, actualmente en desarrollo, para practicar Programación I y II con veinte misiones originales.
- Versión estable: eeminionn.github.io/tomatin-code-lab
- Aula 3.0 beta: eeminionn.github.io/tomatin-code-lab/beta
Proyecto independiente. No está afiliado ni respaldado por MIT. El temario toma como referencia conceptos habituales de cursos universitarios; los enunciados y recursos de esta plataforma son originales.
- React, TypeScript, Vite, rutas con hash y Monaco Editor cargado bajo demanda.
- Veinte misiones con variantes reales de JavaScript, Python y C++.
- Misiones guiadas con contexto, meta, contrato, ejemplos explicados, pasos, restricciones, criterios de éxito y tres pistas progresivas.
- Enunciado, editor, consola, tests, feedback e historial versionado en un mismo workspace.
- Borradores separados por lenguaje, guardados en IndexedDB y sincronizados al backend cuando está disponible.
- JavaScript en Web Worker, Python con Pyodide y ejecución remota con Judge0.
- Supabase Auth exclusivamente con GitHub, Postgres, Realtime, RLS,
invitaciones configurables y roles
owner,mentorystudent. - Asignaciones por estudiante, revisión, reentrega, XP idempotente y ranking basado únicamente en tareas aprobadas.
- Un único repositorio privado de resoluciones bajo
eeminionn, con carpetas aisladas por estudiante y actualización automática al entregar. - Panel del mentor con métricas reales, matriz filtrable, actividad reciente, detalle por estudiante, historial de código guardado y vista estudiante de solo lectura.
- Revisión con comentarios por línea, criterios reutilizables y enlaces directos desde Feedback a la entrega y versión revisada.
- Soluciones cargadas bajo demanda solo para
ownerymentor; nunca se incluyen en el catálogo público ni aparecen en vista estudiante.
Las soluciones de referencia y los tests ocultos solo aparecen en
private.mission_variants_secure. El catálogo que Vite entrega al navegador se
genera por separado y no contiene esos campos.
Requiere Node.js 20 o superior y pnpm 11:
pnpm install
pnpm devLa beta 3.0 queda disponible en
http://127.0.0.1:4173/tomatin-code-lab/beta/. Sin variables de entorno abre
un aula demostrativa local para diez estudiantes.
- Crea un proyecto Supabase y configura GitHub como proveedor OAuth.
- En la OAuth App de GitHub, usa como
Authorization callback URLla URL de callback que muestra Supabase. Para este proyecto eshttps://vowopvcxrzpuudtsraik.supabase.co/auth/v1/callback. - En Supabase, bajo
Authentication > URL Configuration, usahttps://eeminionn.github.io/tomatin-code-lab/beta/comoSite URLy añade esa misma URL exacta aRedirect URLs. - Copia
.env.examplea.env.localy completa:
VITE_SUPABASE_URL=https://PROJECT_REF.supabase.co
VITE_SUPABASE_PUBLISHABLE_KEY=sb_publishable_...- En GitHub, crea los secrets
SUPABASE_ACCESS_TOKEN,SUPABASE_DB_PASSWORDySUPABASE_PROJECT_ID. - En GitHub Actions, crea las variables
VITE_SUPABASE_URLyVITE_SUPABASE_PUBLISHABLE_KEY. - Ejecuta manualmente el workflow
Deploy Supabase; desde entonces los cambios ensupabase/se despliegan al hacer merge amain.
SUPABASE_URL y SUPABASE_SERVICE_ROLE_KEY son suministradas automáticamente
a las Edge Functions. JUDGE0_URL y JUDGE0_API_KEY son opcionales; por
defecto se usa la instancia pública de Judge0 CE.
La aplicación usa un único repositorio privado
eeminionn/tomatin-code-lab-resoluciones y guarda cada entrega en:
resoluciones/usuario-id-corto/misiones/slug-de-la-mision/solucion.js
resoluciones/usuario-id-corto/misiones/slug-de-la-mision/solucion.py
resoluciones/usuario-id-corto/misiones/slug-de-la-mision/solucion.cpp
Los estudiantes no son colaboradores del repositorio central. GitHub concede
permisos por repositorio, no por carpeta; invitarlos permitiría que vieran
respuestas ajenas. El estudiante consulta su código, historial y estado de
sincronización desde el aula, mientras que el mentor puede abrir la carpeta
privada desde /admin. Los commits usan el correo noreply verificado del
estudiante para conservar la atribución cuando GitHub puede asociarla.
Para activarlo, crea un fine-grained personal access token de GitHub cuyo
resource owner sea eeminionn, con acceso al repositorio central y permisos
Administration: Read and write y Contents: Read and write. Guárdalo como
el secret de Actions SUBMISSION_REPOSITORY_TOKEN y vuelve a ejecutar Deploy Supabase. Las variables opcionales SUBMISSION_REPOSITORY_OWNER y
SUBMISSION_REPOSITORY_NAME permiten cambiar el propietario y el nombre; sus
valores por defecto son eeminionn y tomatin-code-lab-resoluciones.
Los repositorios individuales creados por versiones anteriores no se eliminan automáticamente. La siguiente sesión o entrega migra el registro del estudiante al almacenamiento central; los repositorios anteriores pueden archivarse después de comprobar la copia y definir una política de conservación.
pnpm check
pnpm test:e2e
supabase db start
supabase test dbLa verificación incluye la aplicación estable, tipos, build y las 60 soluciones de referencia: JavaScript se ejecuta, Python se interpreta y C++ se compila con C++20. Playwright cubre en serie los recorridos de estudiante y mentor; pgTAP comprueba las políticas RLS contra una base temporal. El catálogo y la migración SQL se regeneran desde una única fuente para evitar que se desalineen.
El procedimiento y los criterios para ampliar el piloto están en
docs/BETA_ROLLOUT.md.
v2/: aplicación React de la beta 3.0.v2/src/data/programming-*.ts: fuente privada del catálogo y soluciones.v2/src/data/missions-public.generated.ts: catálogo apto para el navegador.supabase/migrations/: esquema, RLS y catálogo inicial.supabase/functions/: endpoints segurosrun-code,submit-code,provision-repositoryymission-admin.scripts/generate-supabase-seed.ts: generador reproducible del catálogo.index.html,styles.css,js/: versión estable, preservada durante el piloto.
El código se distribuye bajo licencia MIT. El contenido educativo original se publica bajo CC BY 4.0.