diff --git a/AGENTS.md b/AGENTS.md index 86893c3..38c64d7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ This version (16.2.6) has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. -# Contexto para asistentes de IA — Plataforma de Programación CETI +# Contexto para asistentes de IA — Índice Cero ## Qué es esto Plataforma web para que estudiantes del **CETI Guadalajara** aprendan a programar diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index 16ad460..22111d5 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -1,4 +1,4 @@ -# Guía de despliegue — Plataforma de Programación CETI +# Guía de despliegue — Índice Cero Esta guía te lleva de cero a tener la plataforma corriendo en producción. diff --git a/README.md b/README.md index dba0c2f..59070e2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Plataforma de Programación CETI +# Índice Cero Plataforma para **aprender a programar escribiendo código**, pensada para estudiantes del **CETI Guadalajara**. Lecciones cortas, un editor con compilador de verdad y retos diff --git a/prisma/content/courses/bases-de-datos/shared/local-lab-guides.ts b/prisma/content/courses/bases-de-datos/shared/local-lab-guides.ts index 1962fe9..69dc5b5 100644 --- a/prisma/content/courses/bases-de-datos/shared/local-lab-guides.ts +++ b/prisma/content/courses/bases-de-datos/shared/local-lab-guides.ts @@ -13,7 +13,7 @@ export const MYSQL_LOCAL_LAB_GUIDE = `## Laboratorio local: MySQL -Este bloque requiere **MySQL 8.x** corriendo en tu máquina — el editor web de CPP-CETI sólo ejecuta SQLite, así que esto NO corre ahí. +Este bloque requiere **MySQL 8.x** corriendo en tu máquina — el editor web de Índice Cero sólo ejecuta SQLite, así que esto NO corre ahí. 1. **Levanta el motor.** Instala \`mysql-server\` con el paquete de tu sistema, o usa un contenedor: \`docker run --name ceti-mysql -e MYSQL_ROOT_PASSWORD=ceti -p 3306:3306 -d mysql:8\`. 2. **Conéctate** con el cliente \`mysql\` (o MySQL Workbench): \`mysql -h 127.0.0.1 -u root -p\`. @@ -23,7 +23,7 @@ Este bloque requiere **MySQL 8.x** corriendo en tu máquina — el editor web de export const MONGODB_LOCAL_LAB_GUIDE = `## Laboratorio local: MongoDB -Este bloque requiere **MongoDB local** — el editor web de CPP-CETI sólo ejecuta SQLite, así que esto NO corre ahí. +Este bloque requiere **MongoDB local** — el editor web de Índice Cero sólo ejecuta SQLite, así que esto NO corre ahí. 1. **Levanta el motor.** Instala MongoDB Community Server, o usa un contenedor: \`docker run --name ceti-mongo -p 27017:27017 -d mongo:7\`. 2. **Conéctate** con \`mongosh\` (MongoDB Shell): \`mongosh "mongodb://localhost:27017"\`. diff --git a/prisma/content/unidad-09-archivos.ts b/prisma/content/unidad-09-archivos.ts index 7de6935..1e0415e 100644 --- a/prisma/content/unidad-09-archivos.ts +++ b/prisma/content/unidad-09-archivos.ts @@ -64,7 +64,7 @@ streams, separada de la consola). Para imprimir EN la TERMINAL ya usas > **Qué puedes probar aquí, y qué no.** Todos los ejemplos y retos de > esta unidad crean el archivo, escriben, cierran y vuelven a leer **en > el mismo programa, en una sola ejecución** — eso es exactamente lo que -> el editor en línea de CPP-CETI puede demostrar. Lo que el editor en +> el editor en línea de Índice Cero puede demostrar. Lo que el editor en > línea **no** garantiza es que ese archivo siga ahí para una ejecución > *distinta* (correr el programa hoy y que otro programa lo lea mañana, > o volver a correr el mismo reto esperando encontrar lo que dejó la vez diff --git a/src/app/(auth)/registro/page.tsx b/src/app/(auth)/registro/page.tsx index 1022823..ec4ec7b 100644 --- a/src/app/(auth)/registro/page.tsx +++ b/src/app/(auth)/registro/page.tsx @@ -1,5 +1,7 @@ import Link from "next/link"; +import { UNOFFICIAL_NOTICE } from "@/lib/branding"; + import { RegisterForm } from "./register-form"; export const metadata = { @@ -32,8 +34,15 @@ export default function RegisterPage() {

- Al registrarte aceptas que tus datos se usen únicamente para tu - progreso académico. + Al crear tu cuenta, usamos tus datos para tu cuenta, tu progreso + académico y mejorar la plataforma, como se explica en el{" "} + + aviso de privacidad + + . {UNOFFICIAL_NOTICE}

diff --git a/src/app/global-error.tsx b/src/app/global-error.tsx index b2aab7a..9131398 100644 --- a/src/app/global-error.tsx +++ b/src/app/global-error.tsx @@ -1,5 +1,7 @@ "use client"; +import { PRODUCT_MARK } from "@/lib/branding"; + /** * Last-resort error boundary. Renders its own / because * it can fire before the root layout renders. @@ -54,7 +56,7 @@ export default function GlobalError({ > C++ - CETI + {PRODUCT_MARK}

Algo salió mal diff --git a/src/app/privacidad/page.tsx b/src/app/privacidad/page.tsx new file mode 100644 index 0000000..ed2c8fd --- /dev/null +++ b/src/app/privacidad/page.tsx @@ -0,0 +1,261 @@ +import Link from "next/link"; + +import { LandingFooter } from "@/components/landing/footer"; +import { LandingNavbar } from "@/components/landing/navbar"; +import { PRODUCT_NAME, UNOFFICIAL_NOTICE } from "@/lib/branding"; + +export const metadata = { + title: "Aviso de privacidad", + description: + "Qué datos trata la plataforma, para qué los usa y cómo pedir acceso, corrección o eliminación. Proyecto independiente, no oficial del CETI.", +}; + +/** + * Describe fielmente lo que el producto YA hace, leído del schema y de los + * flujos reales (auth, progreso, analítica, social, feedback) — no una + * plantilla legal genérica. Donde falta un dato real (domicilio, correo + * dedicado) se deja una marca explícita en vez de inventarlo. + */ +export default function PrivacyPage() { + return ( + <> + +
+

Legal

+

+ Aviso de privacidad +

+

+ Última actualización: 13 de septiembre de 2026. +

+ +
+
+

+ {PRODUCT_NAME} es un proyecto independiente hecho por un solo + desarrollador para apoyar a estudiantes del CETI Guadalajara.{" "} + {UNOFFICIAL_NOTICE} Este aviso describe, sin + relleno legal, qué información recopila el producto realmente, + para qué la usa y cómo puedes pedir que la corrijamos o la + borremos. +

+
+ +
+

+ El responsable de esta plataforma y del tratamiento de tus + datos es César Manzo Olivares (usuario de GitHub{" "} + + CesarManzoCode + + ), quien la desarrolla y opera de forma independiente. No es + una empresa constituida ni una entidad del CETI ni de ninguna + institución educativa o gubernamental. +

+

+ Pendiente: este + proyecto no tiene un domicilio fiscal ni de operación + publicado. Complétalo aquí manualmente si el CETI u otra + autoridad lo requiere para fines de cumplimiento. +

+
+ +
+

Sólo la que el producto usa de verdad, agrupada por para qué sirve:

+
    +
  • + Cuenta y autenticación. Nombre, correo, + nombre de usuario, contraseña (guardada con hash, nunca en + claro) o el enlace con tu cuenta de Google si entras con + “Continuar con Google”, foto de perfil y + biografía opcionales. El sistema de sesiones guarda además un + token de sesión y, por sesión, la dirección IP y el user + agent del dispositivo — se usan para mantenerte conectado y + detectar accesos anómalos, nunca para analítica de producto. +
  • +
  • + Identidad académica (opcional). Campus, + programa, semestre y grupo, sólo si decides declararlos. + Nunca es obligatorio para aprender. +
  • +
  • + Progreso académico. Qué unidades, lecciones + y pasos completaste, tu racha de días, tu XP y tu nivel. +
  • +
  • + Intentos y actividad de aprendizaje. El + código que envías a calificar en un reto o práctica (se + guarda el envío calificado, no cada tecla que presionas), si + pasó las pruebas, y qué pistas pediste. +
  • +
  • + Sesiones de estudio. Tiempo activo + aproximado por visita a una lección o práctica —pestaña + visible y actividad reciente—, no tiempo de pantalla total ni + grabaciones de lo que haces. +
  • +
  • + Analítica de producto. Eventos internos como + qué lección viste o en qué paso estás, para entender dónde se + atoran los alumnos. No incluye tu IP, tu user agent, + grabaciones de pantalla ni las teclas que presionas. +
  • +
  • + Funciones sociales (opcionales). Amigos, + rachas compartidas, invitaciones, kudos y ligas — sólo + existen si tú decides usarlas. +
  • +
  • + Reportes y feedback. Si reportas un error de + contenido o mandas retroalimentación desde el botón dedicado, + guardamos tu mensaje, tu cuenta y la lección, ejercicio o + ruta (sin parámetros de la URL) donde lo enviaste, para darle + seguimiento. +
  • +
  • + Operación y seguridad. Conteos de uso por + endpoint (para evitar abuso del compilador) y los registros + de servidor necesarios para operar el servicio. +
  • +
+
+ +
+
    +
  • Darte acceso a tu cuenta y conservar tu progreso entre sesiones y dispositivos.
  • +
  • Compilar y ejecutar el código que envías a un reto o práctica, y calificarlo contra los casos de prueba.
  • +
  • Entender qué tan bien funciona el contenido —qué lección confunde, dónde se abandona un curso— para mejorarlo.
  • +
  • Darte seguimiento cuando reportas un error o mandas feedback.
  • +
  • Prevenir abuso del compilador con límites de envíos.
  • +
  • Si activas las funciones sociales, mostrar tu progreso a los amigos que agregaste.
  • +
+
+ +
+
    +
  • + El código que envías a un reto o práctica se manda al + proveedor de ejecución configurado (hoy, Wandbox) sólo para + compilarlo y correrlo contra los casos de prueba; recibe el + código y las entradas, no tu identidad. +
  • +
  • + Si entras con “Continuar con Google”, Google + procesa esa autenticación conforme a su propia política. +
  • +
  • + Si usas “olvidé mi contraseña”, ese correo se + envía a través de Resend, el proveedor de correo + transaccional del proyecto. +
  • +
  • + Todo lo demás —progreso, intentos, analítica, datos sociales, + reportes— vive únicamente en la base de datos del proyecto y + en su infraestructura de hosting. No se vende ni se comparte + con terceros para fines comerciales o publicitarios. +
  • +
+
+ +
+

+ Mientras tu cuenta exista, conservamos los datos anteriores + para que tu progreso no se pierda entre sesiones. Puedes + eliminar tu cuenta tú mismo, en cualquier momento, desde{" "} + + tu perfil + + , sin tener que escribirle a nadie. Al hacerlo se borra tu + cuenta y, en cascada, tu progreso, intentos, sesiones de + estudio, pistas vistas, reportes, feedback y datos sociales — + de forma permanente e inmediata. No existe una copia que se + restaure después. +

+
+ +
+
    +
  • + Acceder a lo que sabemos de ti: tu progreso, + tu perfil y tu actividad son visibles directamente en tu + cuenta. +
  • +
  • + Rectificar tu nombre, biografía, foto e + identidad académica desde tu perfil, en cualquier momento. +
  • +
  • + Cancelar (eliminar) tu cuenta y tus datos + desde tu perfil, con efecto inmediato, como se describe + arriba. +
  • +
  • + Oponerte al tratamiento, o pedir algo que la + interfaz no resuelva directamente (por ejemplo, corregir tu + correo), escribiendo por el medio de contacto de abajo. +
  • +
+
+ +
+
    +
  • + Para privacidad y solicitudes sobre tus datos —acceso, + rectificación, cancelación u oposición— que la interfaz no + resuelva directamente, escribe a{" "} + + indice0.ceti@gmail.com + + , la dirección dedicada del proyecto para este tipo de + solicitudes. +
  • +
  • + Para reportar un problema de contenido o dejar + retroalimentación general sobre una lección o ejercicio, usa + el botón de reporte dentro de la plataforma (lo ve cualquier + cuenta con sesión iniciada). +
  • +
+
+ +
+

+ Si el producto empieza a tratar datos de una forma distinta a + la descrita aquí, esta página se actualiza para reflejarlo — + no hay una versión “real” distinta a la publicada. +

+
+
+
+ + + ); +} + +function Section({ + title, + children, +}: { + title: string; + children: React.ReactNode; +}) { + return ( +
+

+ {title} +

+ {children} +
+ ); +} diff --git a/src/components/landing/footer.tsx b/src/components/landing/footer.tsx index d5ea4b9..2867218 100644 --- a/src/components/landing/footer.tsx +++ b/src/components/landing/footer.tsx @@ -7,6 +7,7 @@ const links: { href: string; label: string; external?: boolean }[] = [ { href: "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/login", label: "Iniciar sesión" }, { href: "/registro", label: "Crear cuenta" }, { href: "#temario", label: "Temario" }, + { href: "/privacidad", label: "Privacidad" }, { href: "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/CesarManzoCode/cpp-ceti", label: "GitHub", diff --git a/src/components/shared/logo.tsx b/src/components/shared/logo.tsx index df6b174..26a304a 100644 --- a/src/components/shared/logo.tsx +++ b/src/components/shared/logo.tsx @@ -1,4 +1,4 @@ -import { PRODUCT_NAME } from "@/lib/branding"; +import { PRODUCT_MARK, PRODUCT_NAME } from "@/lib/branding"; import { cn } from "@/lib/utils"; interface LogoProps { @@ -58,7 +58,7 @@ export function Logo({ className, size = "default", glyphOnly = false }: LogoPro layout.word, )} > - CETI + {PRODUCT_MARK} ); diff --git a/src/lib/branding.ts b/src/lib/branding.ts index 43482d8..735f13e 100644 --- a/src/lib/branding.ts +++ b/src/lib/branding.ts @@ -5,13 +5,20 @@ // de un solo lenguaje: el nombre no puede prometer C++ a alguien que // viene a POO I. Cada curso pone su propio título dentro de su ruta. // -// Esto es wording PROVISIONAL, no una marca definitiva. Los identificadores -// internos (paquete, base de datos, prefijo de cookie, slug del curso de -// C++) NO son marca visible y no se tocan. +// Nombre definitivo: Índice Cero. Los identificadores internos (paquete, +// base de datos, prefijo de cookie, slugs de curso) NO son marca visible +// y no se tocan. // ===================================================================== -/** Título neutral del producto. */ -export const PRODUCT_NAME = "Plataforma de Programación CETI"; +/** Nombre canónico del producto — el que va en texto y metadata. */ +export const PRODUCT_NAME = "Índice Cero"; + +/** + * Representación visual compacta, para donde el contexto lo permita + * (isotipo + wordmark, marcas pequeñas). El nombre textual/canónico + * sigue siendo `PRODUCT_NAME`. + */ +export const PRODUCT_MARK = "índice[0]"; /** Descripción corta, sin comprometerse con un lenguaje. */ export const PRODUCT_TAGLINE =