
Explorando la Inteligencia Artificial en el Desarrollo: Mi Experiencia con PreparaULM
Durante los últimos meses, me embarqué en un proyecto personal llamado PreparaULM, una plataforma de tests en línea diseñada para ayudar a quienes desean obtener su licencia de piloto de ultraligero. En este artículo, comparto mi experiencia explorando las capacidades de la inteligencia artificial moderna en el desarrollo web.
El Nacimiento de PreparaULM
Durante los últimos meses, me embarqué en un proyecto personal llamado PreparaULM, una plataforma de tests en línea diseñada para ayudar a quienes desean obtener su licencia de piloto de ultraligero. Puedes acceder en https://www.preparaulm.com.
En mi trabajo habitual, había notado que las herramientas de inteligencia artificial que utilizábamos se estaban quedando un poco atrás, y tenía curiosidad por explorar qué tan lejos podía llegar con soluciones más actuales.

¿Es Viable Crear una Aplicación Web a Base de Prompts?
La pregunta que me rondaba era: ¿es viable crear una aplicación web a base de prompts sin picar código a mano? Esta curiosidad me llevó a experimentar con diferentes herramientas de IA para el desarrollo.
Comencé utilizando Bolt AI para dar forma a la interfaz gráfica de la plataforma. Sin embargo, cuando llegó el momento de integrar la base de datos, supe que necesitaba una herramienta que me permitiera profundizar más en código (a base de vibe coding). Fue ahí donde decidí enfocarme en aprender a utilizar Cursor, y la verdad es que ha sido una parte fundamental de todo mi aprendizaje en este proyecto.
Mi Experiencia con Cursor: Más que un Editor de Código
Al principio, Cursor cometía bastantes errores, pero una de sus grandes ventajas es la posibilidad de definir reglas (cursorrules) y trabajar con diferentes ficheros y documentación para afinar el resultado. Con el tiempo, fui perfeccionando la manera de crear los prompts y estableciendo distintos modos de trabajo.
El Modo “Planner”: Definiendo Requerimientos
En el modo “Planner”, por ejemplo, me concentro en que la herramienta me haga preguntas clarificadoras para entender bien los requerimientos y los refino, eligiendo por ejemplo si quiero test e2e, unitarios... y eso se resume en un fichero task_001.md
con la historia de usuario + las tareas a realizar.
El Modo “Executor”: Implementando Soluciones
Luego llega el modo “Executor” y Cursor se dedica a implementar el código según las directrices que definí. Es aquí donde le paso reglas más enfocadas a programación, por ejemplo, utilizar variables semánticas tipo isTestActive
, el uso de async
vs promesas, etc.
Personalizando el Workflow con Cursor
Cursor es un mundo y da muchas opciones para personalizar el prompt. Trabajo mucho con prompts tipo:
coge de base el fichero @path/del_fichero.ts
utiliza la @doc de Next.js o supabase
Otro de los aspectos clave es la documentación del proyecto. Una de mis reglas le dice a Cursor dónde tengo la carpeta de documentación y dónde tengo el schema de la base de datos.
Galería de imágenes






n8n: Automatizando la Generación de Contenido
Otro gran descubrimiento fue n8n, que me permitió automatizar muchos procesos, como la generación de preguntas para los tests. Esto fue un verdadero reto, porque implicaba ajustar bien los prompts para que las preguntas generadas estuvieran alineadas con el nivel y el tipo de contenido que buscaba.
Además, la inteligencia artificial fue clave para optimizar procesos de integración continua y despliegue, áreas en las que no tenía tanta experiencia previa.
Lecciones Aprendidas y Reflexiones
En resumen, PreparaULM ha sido una forma de demostrarme a mí mismo lo mucho que la inteligencia artificial puede aportar, especialmente en las primeras etapas de desarrollo y prototipado. Ha sido un viaje lleno de aprendizajes, y sin duda, seguiré explorando todo lo que la IA tiene por ofrecer en futuros proyectos.
Conclusiones
La experiencia con PreparaULM me ha demostrado que la inteligencia artificial no solo es una herramienta útil, sino que puede ser un verdadero compañero de desarrollo. Herramientas como Cursor y n8n han transformado mi forma de abordar proyectos, permitiéndome enfocarme más en la lógica de negocio y menos en tareas repetitivas.
El futuro del desarrollo web está claramente ligado a la IA, y proyectos como PreparaULM son solo el comienzo de lo que podemos lograr cuando combinamos creatividad humana con la potencia de la inteligencia artificial.
🎯 ¿Quieres probar PreparaULM?
Visita www.preparaulm.com y descubre cómo la IA puede ayudarte a preparar tu licencia de piloto de ultraligero.
Ejemplo de Documentación: Task Management
Como ejemplo del tipo de documentación que genero para trabajar con Cursor, aquí tienes un ejemplo de un archivo de task que utilizo en el proyecto:
Task 014: Cálculo de Promedio Real y Mejora Porcentual en Revisión de Tests
Descripción
Implementar el cálculo real del promedio de los últimos 10 tests completados del usuario y mostrar un indicador visual de mejora porcentual en la página de revisión de tests.
Problema Actual
En src/app/test/[uid]/review/page.tsx
línea 118, el promedio está hardcodeado:
const averageScore = 75 // Esto podría venir de una API
Objetivos
- Calcular el promedio real de los últimos 10 tests completados del usuario (excluyendo el actual)
- Mostrar indicador de mejora con color verde/rojo según el cambio porcentual
- Manejar casos especiales (primer test, promedio 0, etc.)
Reglas de Negocio
- Promedio: Últimos 10 tests completados (
completed_at IS NOT NULL
) excluyendo el test actual - Alcance: Promedio global (todos los tests del usuario, no por categoría)
- Casos especiales:
- Primer test: Mostrar solo datos actuales, sin indicador
- Promedio anterior 0: No mostrar indicador
- Test actual único completado: No mostrar cambio porcentual
- Cálculo mejora:
(scoreActual - promedioAnterior) / promedioAnterior * 100
- Colores: Verde para mejora (+), rojo para empeoramiento (-)
Subtareas
Subtarea 1: Crear UserTestScoreService
- Archivo:
src/domain/services/UserTestScoreService.ts
- Método:
getUserAverageScore(userId: string, excludeTestExecutionId?: number)
- Retorno:
{ averageScore: number, totalCompletedTests: number }
- Funcionalidad: Query a
test_executions
concompleted_at IS NOT NULL
Subtarea 2: Actualizar TestRepository
- Archivo:
src/domain/repositories/TestRepository.ts
- Método nuevo:
getLastCompletedTestExecutions(userId: string, limit: number, excludeId?: number)
- Implementación: En
TestRepositoryImpl
Subtarea 3: Crear ImprovementIndicator Component
- Archivo:
src/app/test/[uid]/review/_components/ImprovementIndicator.tsx
- Props:
{ currentScore: number, previousAverage: number, showIndicator: boolean }
- Funcionalidad: Mostrar cambio porcentual con colores
Subtarea 4: Actualizar ResultsSummary Component
- Archivo:
src/app/test/[uid]/review/_components/ResultsSummary.tsx
- Cambios: Integrar ImprovementIndicator junto al promedio
Subtarea 5: Actualizar Página de Revisión
- Archivo:
src/app/test/[uid]/review/page.tsx
- Cambios: Reemplazar promedio hardcodeado, integrar servicio
Archivos Modificados/Creados
Crear
src/domain/services/UserTestScoreService.ts
src/app/test/[uid]/review/_components/ImprovementIndicator.tsx
src/domain/services/__tests__/UserTestScoreService.test.ts
src/app/test/[uid]/review/_components/__tests__/ImprovementIndicator.test.tsx
Modificar
src/domain/repositories/TestRepository.ts
src/app/test/[uid]/review/_components/ResultsSummary.tsx
src/app/test/[uid]/review/page.tsx
src/app/test/[uid]/review/_components/__tests__/ResultsSummary.test.tsx
e2e/03-test-completion-flow.spec.ts
Casos de Uso
Caso 1: Usuario con múltiples tests
- Entrada: Usuario con 15 tests, test actual 85%
- Proceso: Promedio últimos 10 tests = 78%
- Salida: Promedio 78%, mejora +9.0% (verde)
Caso 2: Primer test del usuario
- Entrada: Usuario sin tests previos
- Salida: Solo score actual, sin indicador
Caso 3: Promedio anterior 0
- Entrada: Promedio anterior 0%
- Salida: Solo datos actuales
Análisis de Impactos
Rendimiento
- Impacto: Bajo - Una query adicional por página
- Optimización: Query indexada por
user_id
ycompleted_at
SEO
- Impacto: Neutral - No afecta indexación
- Beneficio: Mejor UX puede mejorar engagement
Testing
Tests Unitarios
UserTestScoreService.test.ts
: Casos con 10+ tests, <10 tests, sin testsImprovementIndicator.test.tsx
: Render con mejora +/-, no renderResultsSummary.test.tsx
: Integración con nuevo indicador
Tests E2E
- Modificar
03-test-completion-flow.spec.ts
- Verificar promedio mostrado correctamente
Criterios de Aceptación
✅ Funcionalidad
- Promedio calculado de últimos 10 tests completados
- Indicador de mejora con colores correctos
- Casos especiales manejados según reglas
✅ Calidad
- Tests unitarios >90% cobertura
- Tests E2E funcionando
- No regresiones
✅ UX/UI
- Indicador visualmente claro
- Responsive en todos dispositivos
- Consistente con diseño actual
Cronograma
- Subtarea 1-2: Backend (Servicio y Repository)
- Subtarea 3: ImprovementIndicator Component
- Subtarea 4: Actualizar ResultsSummary
- Subtarea 5: Integrar en página principal
- Tests unitarios y E2E
Notas Técnicas
- Usar
SupabaseClient
directamente en el servicio - Manejar errores con fallback a comportamiento actual
- Logging para debugging
- Accesibilidad con aria-labels y iconos