Files
renato97 07929b6c60 feat: fase 4 — overhaul, docker, seguridad, métodos europeos
- Eliminada ruta duplicada /sebastian/sumas (código muerto)
- Removido topic 'sumas' del engine (reemplazado por 'matematicas')
- Creado docker-compose.yml (PostgreSQL + app, 1 comando install)
- Dockerfile: copiado prisma CLI al runner stage para db push
- APIs debug protegidas: 403 en producción (reset, state, seed)
- Audit métodos europeos: 24 archivos corregidos al 100%
  - Montessori: matemática Francesca + Sebastián
  - Decroly: lectura, ortografía, historia, geografía, banderas
  - Borel-Maisonny: lectura inicial Isabella (ya existía)
  - Freinet: expresión escrita Sebastián (ya existía)
- Validación prerequisitos: 0 rotos en contenido nuevo (157 ejercicios)
- INSTALL.md: guía completa de instalación
- fase4.md: documentación del overhaul
- E2E: 2 tests corregidos, 61/61 pasan
- TypeScript: exit 0, Build: exit 0
2026-07-25 22:34:05 -03:00

132 lines
4.4 KiB
TypeScript

import type { Stage } from "../types"
const cuentos = [
{
titulo: "El patito feo",
secuencia: [
"Un patito nació diferente a sus hermanos.",
"Todos se burlaban de él por ser distinto.",
"El patito se fue triste a vivir solo.",
"Creció y se convirtió en un hermoso cisne.",
"Todos los patos lo admiraban por su belleza.",
],
orden: [0, 1, 2, 3, 4],
emoji: "🦆",
},
{
titulo: "La liebre y la tortuga",
secuencia: [
"La liebre se burlaba de la tortuga por lenta.",
"La tortuga la desafió a una carrera.",
"La liebre salió corriendo muy rápido.",
"La liebre se confió y se durmió.",
"La tortuga pasó a la liebre y ganó la carrera.",
],
orden: [0, 1, 2, 3, 4],
emoji: "🐢",
},
{
titulo: "Los tres chanchitos",
secuencia: [
"Tres chanchitos construyeron sus casas.",
"Uno la hizo de paja, otro de madera y otro de ladrillos.",
"El lobo sopló y derribó la casa de paja.",
"El lobo sopló y derribó la casa de madera.",
"El lobo no pudo derribar la casa de ladrillos.",
],
orden: [0, 1, 2, 3, 4],
emoji: "🐷",
},
{
titulo: "La cigarra y la hormiga",
secuencia: [
"La cigarra cantaba todo el verano sin trabajar.",
"La hormiga juntaba comida para el invierno.",
"Llegó el invierno y la cigarra no tenía comida.",
"La cigarra fue a pedirle comida a la hormiga.",
"La hormiga le dio comida pero le enseñó a trabajar.",
],
orden: [0, 1, 2, 3, 4],
emoji: "🐜",
},
]
const exercises: any[] = []
let idx = 0
for (const cuento of cuentos) {
// Part 1: ordenar secuencia (secuencia type)
const shuffled = [...cuento.orden].sort(() => Math.random() - 0.5)
exercises.push({
id: `fra9-secuencia-${idx}`,
stage: 9,
skillCode: `secuencia-cuento-${idx}`,
type: "secuencia",
prerequisites: idx === 0 ? [`fra8-sinonimo-24`] : [exercises[idx - 1].id],
content: {
instruction: `Ordená los eventos de "${cuento.titulo}"`,
text: cuento.secuencia.join(". "),
audioText: `Ordená los eventos del cuento ${cuento.titulo}`,
emoji: cuento.emoji,
sequence: shuffled.map((s) => cuento.secuencia[s]),
},
functionalContext: "Ordenar eventos de un cuento clásico en secuencia narrativa.. Centro de interés Decroly.",
errorType: "omision-letra",
})
idx++
// Part 2: comprensión (lectura type) — 2 preguntas por cuento
const preguntas = cuento.titulo === "El patito feo"
? [
{ q: "¿Cómo nació el patito?", op: ["Diferente", "Igual", "Más grande"], correcta: "Diferente" },
{ q: "¿En qué se convirtió?", op: ["Cisne", "Pato", "Ganso"], correcta: "Cisne" },
]
: cuento.titulo === "La liebre y la tortuga"
? [
{ q: "¿Quién ganó la carrera?", op: ["La tortuga", "La liebre", "Las dos"], correcta: "La tortuga" },
{ q: "¿Por qué perdió la liebre?", op: ["Se durmió", "Corrió lento", "Se perdió"], correcta: "Se durmió" },
]
: cuento.titulo === "Los tres chanchitos"
? [
{ q: "¿Qué casa no pudo derribar el lobo?", op: ["La de ladrillos", "La de paja", "La de madera"], correcta: "La de ladrillos" },
{ q: "¿De qué hizo la casa el primer chanchito?", op: ["Paja", "Madera", "Ladrillos"], correcta: "Paja" },
]
: [
{ q: "¿Qué hizo la cigarra en verano?", op: ["Cantar", "Trabajar", "Dormir"], correcta: "Cantar" },
{ q: "¿Qué le enseñó la hormiga?", op: ["A trabajar", "A cantar", "A bailar"], correcta: "A trabajar" },
]
for (const p of preguntas) {
exercises.push({
id: `fra9-cuento-p${idx}`,
stage: 9,
skillCode: `cuento-pregunta-${idx}`,
type: "lectura",
prerequisites: [exercises[idx - 1].id],
content: {
instruction: `Sobre "${cuento.titulo}":`,
text: p.q,
audioText: p.q,
emoji: cuento.emoji,
options: p.op.map((o) => ({
label: o,
correct: o === p.correcta,
id: o.toLowerCase().slice(0, 12),
})),
},
functionalContext: "Comprensión de cuentos clásicos: responder preguntas sobre la trama.. Centro de interés Decroly.",
errorType: "omision-letra",
})
idx++
}
}
const stage: Stage = {
id: 9,
name: "Secuencia narrativa",
description: "Ordenar eventos de cuentos clásicos y responder preguntas de comprensión.",
exercises,
}
export default stage