clase:daw:daw-proyecto:tema05
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previa | |||
| clase:daw:daw-proyecto:tema05 [2026/10/14 13:22] – Specification e Implementation con Forma A (SDD) y Forma B (Plan) por separado; Testing con los cuatro tipos y los tres verbos: unit create sin argumento, arch <reglas>, api/e2e <escenarios> claude | clase:daw:daw-proyecto:tema05 [2026/10/14 14:08] (actual) – Tema nuevo «2. IA y agentes»: los temas 2 a 7 pasan a ser 3 a 8, con sus referencias cruzadas renumeradas claude | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ====== 5. Automatizando | + | ====== 5. IA en el proyecto ====== |
| - | Objetivo del tema: que la calidad la vigilen | + | Objetivo del tema: usar bien al agente para programar. No se enseña a programar; se enseña a **pedir** el trabajo como una especificación |
| - | Una skill nueva, ''/ | + | Lo que ya está contado en el [[cursos: |
| - | ^ Skill ^ Sustantivos ^ Verbos ^ | + | ===== Dos caminos: spec para los CRUD, plan para el resto ===== |
| - | | ''/ | + | |
| - | | ''/ | + | |
| - | ===== Los cuatro tipos de tests ===== | + | En este proyecto hay dos clases |
| - | ^ Tipo ^ Qué prueba ^ Con qué ^ Necesita ^ Lo ejecuta ^ | + | * **Un CRUD** (una entidad con su listado, alta, edición |
| - | | '' | + | * **Todo lo demás** (un filtro, un informe, una regla de negocio, un cambio en una pantalla) va por **plan**: en modo plan se le dice al agente lo que se quiere |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | Los dos primeros forman parte del build de Maven: corren en cada compilación y no necesitan nada levantado. Los dos últimos **no forman parte del build**: son lentos, necesitan | + | En los dos, la regla es la misma: primero un fichero que el alumno |
| - | ===== Crear los tests: /test < | + | La spec la genera **cc-sdd** |
| - | + | ||
| - | ==== arch: tests de arquitectura con ArchUnit ==== | + | |
| - | + | ||
| - | Las reglas de arquitectura | + | |
| < | < | ||
| - | /test arch create | + | npx cc-sdd@latest |
| - | - Las clases de controller solo dependen de domain. | + | |
| - | - Las de persistence solo dependen de domain. | + | |
| - | - Nada en domain importa org.springframework ni jakarta.persistence. | + | |
| - | - Los controladores acaban en Controller y están en ..controller.. | + | |
| - | - Los repositorios de persistence acaban en RepositoryImpl e implementan una interfaz de domain. | + | |
| - | - Sin ciclos entre paquetes. | + | |
| </ | </ | ||
| - | Cada test lleva en su '' | + | Ese es el flujo de cada issue: |
| - | <sxh java> | + | <uml> |
| - | @Test | + | start |
| - | @DisplayName(" | + | :/git-flow start N |
| - | void domainSinSpring() { | + | y ./app.sh start; |
| - | noClasses().that().resideInAPackage(" | + | if (¿es un CRUD?) then (sí) |
| - | | + | :/sdd spec create |
| - | .check(clases); | + | requisitos, diseño y tareas |
| - | } | + | en .kiro/ |
| - | </sxh> | + | :Leer y corregir los tres ficheros; |
| + | :/clear y /git-flow update; | ||
| + | :/sdd spec impl | ||
| + | una tarea tras otra; | ||
| + | else (no) | ||
| + | :Modo plan: el agente lee el código | ||
| + | y escribe plan_< | ||
| + | :Leer y corregir el plan; | ||
| + | :/clear y /git-flow update; | ||
| + | :/code impl plan_< | ||
| + | una tarea tras otra; | ||
| + | endif | ||
| + | :Tests unitarios y de arquitectura | ||
| + | después de cada tarea; | ||
| + | :Probar en el navegador; | ||
| + | stop | ||
| + | </uml> | ||
| - | **No hay un documento aparte con la arquitectura.** Mantener un Markdown sincronizado con los tests es un trabajo que nadie hace, así que la fuente de verdad son los tests con su descripción. Para cambiar una regla se le pide a la skill que cambie el test. Cuando se añade una regla que el código actual aún no cumple, '' | + | ==== /sdd spec create ==== |
| - | ==== unit: tests unitarios con JUnit ==== | + | Se lanza en el worktree del issue, sin argumentos: el número del issue está en el nombre de la rama. Lo que hace, por dentro, son las cuatro fases de cc-sdd encadenadas: |
| - | Los tests unitarios prueban la lógica | + | - ''/ |
| + | - ''/ | ||
| + | - ''/ | ||
| + | - ''/ | ||
| - | <code> | + | Y se para. El resultado son tres ficheros en '' |
| - | /test unit create | + | |
| - | </code> | + | |
| - | Sin argumento genera los de todas las clases | + | **Revisar esos ficheros es el trabajo humano del flujo.** Es mucho más barato corregir una frase de la spec que corregir el código que sale de ella. Qué mirar en cada uno: |
| - | Lo que hace: lee la clase, identifica cada comportamiento | + | ^ Fichero ^ Qué tiene que tener ^ |
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| - | Qué no prueban: controladores ni repositorios. Eso es de los tests de API. | + | Si se cambia algo en '' |
| - | ==== api: tests de API con Playwright | + | ==== /sdd spec impl ==== |
| - | Los tests de API prueban cada endpoint **de verdad**: peticiones HTTP contra el backend del worktree, comprobando el código de estado y el JSON. Se escriben con Playwright, igual que los E2E (mismo lenguaje, misma configuración, | + | Conversación nueva ('' |
| < | < | ||
| - | /test api create Pedido: alta válida, sin cliente, cliente que no existe, borrar uno con líneas | + | /sdd spec impl |
| </ | </ | ||
| - | El argumento son los **escenarios**: | + | Por dentro es ''/ |
| - | <sxh typescript> | + | Solo implementa la spec. Los planes |
| - | test('POST / | + | |
| - | const res = await request.post('/api/pedidos', { data: { fecha: | + | |
| - | expect(res.status()).toBe(400); | + | |
| - | expect((await res.json()).errores.numero).toBeDefined(); | + | |
| - | }); | + | |
| - | </ | + | |
| - | Los de API y los E2E son dos **proyectos** del mismo '' | + | Por qué el '' |
| - | <sxh typescript; | + | ==== El modo plan y /code impl: lo que no es un CRUD ==== |
| - | export default defineConfig({ | + | |
| - | use: { baseURL: process.env.BASE_URL ?? ' | + | |
| - | projects: [ | + | |
| - | { name: ' | + | |
| - | { name: ' | + | |
| - | ], | + | |
| - | }); | + | |
| - | </ | + | |
| - | ==== e2e: tests E2E con Playwright ==== | + | Claude Code y OpenCode tienen un **modo plan** en el que el agente solo lee: explora el código, piensa y propone, pero no toca nada. En Claude Code se entra con '' |
| - | Los tests E2E prueban la aplicación completa desde el navegador, como lo haría | + | - En el worktree del issue, modo plan, y se le dice lo que se quiere (lo que pone el issue) y que escriba el plan como **lista |
| + | - Se sale del modo plan. El fichero queda en el worktree. | ||
| + | - Se lee y se corrige a mano, igual que una spec: tareas pequeñas, en orden, y que no falte ninguna pantalla ni ningún caso de error. | ||
| + | - **Conversación nueva** (''/ | ||
| < | < | ||
| - | /test e2e create los criterios de aceptación de requirements.md | + | /code impl plan_filtro-provincia.md |
| </ | </ | ||
| - | Cómo trabaja: lee los criterios, abre la aplicación del worktree con el Playwright MCP para ver qué hay en pantalla, escribe | + | Por qué en dos conversaciones y no seguidas: al planificar, el agente ha leído medio proyecto |
| - | Reglas | + | ''/ |
| - | * Selectores por '' | + | La skill '' |
| - | * Un test por criterio de aceptación, | + | |
| - | * Los tests cuentan con los datos de prueba del tema 3 y **se pasan sobre la base de datos recién reseteada**. | + | |
| - | ===== Ejecutarlos: | + | ==== La carpeta de la spec ==== |
| - | Ejecuta los tests de un tipo y, si algo sale en rojo, lo explica: qué test, qué esperaba, qué ha pasado | + | '' |
| - | ^ Verbo ^ Comando ^ | + | Es un **registro** de lo que se pidió, no documentación: |
| - | | ''/ | + | |
| - | | ''/ | + | |
| - | | ''/ | + | |
| - | | ''/ | + | |
| - | + | ||
| - | No hay un «todos» a propósito: los tipos se lanzan | + | |
| - | + | ||
| - | ===== Repararlos: /test < | + | |
| - | + | ||
| - | Pasa mucho: se cambia algo del código, se refactoriza, | + | |
| < | < | ||
| - | /test e2e repair | + | .kiro/specs/ es histórico: la fuente de verdad es el código. No leas specs de otros issues salvo que te lo pidan. |
| </ | </ | ||
| - | El criterio es la **intención**: | + | ==== La skill /sdd ==== |
| - | * Un test está desactualizado solo si un cambio **intencionado** del código (un commit, o un cambio sin commitear que el alumno ha hecho a propósito) modificó o eliminó | + | Es corta, porque |
| - | * Sin un cambio intencionado que lo justifique, el fallo es una **regresión**: se arregla el código y el test no se toca. | + | |
| - | * Si no se sabe, **no se toca nada** y se pregunta. | + | |
| - | Y tres reglas que no se negocian, porque sin ellas «reparar» acaba siendo «hacer que pase»: | + | <sxh yaml; |
| + | --- | ||
| + | name: sdd | ||
| + | description: | ||
| + | allowed-tools: Bash(gh issue view:*), Bash(git branch:*), Bash(mvn: | ||
| + | --- | ||
| + | </ | ||
| - | * Nunca quita, comenta ni relaja una aserción, salvo que el cambio intencionado lo obligue. Nunca crea tests nuevos: para eso está '' | + | Todas las skills de tarea del proyecto son así: '' |
| - | * Borra un test solo si lo que comprobaba ya no existe en la aplicación, | + | |
| - | * Un test cada vez, sin commits, | + | |
| - | '' | + | ===== El primer CRUD ===== |
| - | ===== La revisión: | + | La práctica central del tema es el primer CRUD del proyecto, hecho con '' |
| - | Sin pull request nadie mira el código antes de que llegue | + | Se resuelve con el primer CRUD y solo con él: se genera la spec, y en '' |
| - | < | + | ===== El steering: las dos arquitecturas ===== |
| - | /code review | + | |
| - | </ | + | |
| - | Una sola revisión | + | Para que el segundo CRUD salga igual que el primero |
| - | ==== El código: contra la spec y las reglas | + | ==== Cuándo se genera |
| - | Compara el diff de la rama contra | + | '' |
| - | * **La spec del issue**: ¿hace lo que se pidió, y como se pidió? ¿Falta algún criterio de aceptación? | + | < |
| - | * **Las convenciones** ('' | + | /kiro-steering |
| - | * **Las reglas de calidad** de '' | + | </ |
| - | Cada hallazgo lleva la **regla** incumplida, el **sitio** ('' | + | Los tres ficheros que genera, '' |
| - | Un hallazgo bien hecho y dos mal hechos: | + | ==== Dos arquitecturas, |
| - | < | + | Lo específico |
| - | GRAVE PedidoService.java: | + | |
| - | | + | |
| - | | + | |
| - | MAL " | + | <sxh plain; |
| - | (no mira las clases hermanas: todos los servicios lo escriben así; y no dice qué cuesta) | + | --- |
| - | MAL | + | inclusion: fileMatch |
| - | (sin regla ni coste: es una opinión) | + | fileMatchPattern: |
| - | </code> | + | --- |
| + | # Arquitectura del servidor | ||
| + | ... | ||
| + | </sxh> | ||
| - | Los graves se corrigen. Los mejorables los decide el alumno: | + | Y '' |
| - | <note important> | + | ^ '' |
| + | | Las capas '' | ||
| + | | Nombres: '' | ||
| + | | Dónde se valida (Bean Validation | ||
| + | | Migraciones '' | ||
| + | | Cómo se prueban los unitarios: JUnit 5 y Mockito, sin Spring | '' | ||
| - | ==== calidad-codigo: las reglas ==== | + | La lección: **lo que el steering no dice, el agente lo inventa distinto cada vez.** Si el segundo CRUD sale distinto del primero, falta una línea en el steering, no un prompt mejor. |
| - | '' | + | ==== Las skills |
| - | < | + | El steering solo lo leen los comandos de cc-sdd. Las demás |
| - | .claude/skills/calidad-codigo/ | + | |
| - | ├── SKILL.md <- la máxima, | + | |
| - | ├── metodos.md | + | |
| - | ├── clases.md | + | |
| - | ├── comentarios.md | + | |
| - | └── tests.md | + | |
| - | </ | + | |
| - | **La máxima**: el código se escribe para que **una persona lo entienda al leerlo** y para que **un agente lo pueda modificar sin equivocarse**. Consecuencia que lo cambia todo: una repetición pequeña y visible es aceptable; una indirección para ahorrar dos líneas | + | <sxh yaml;title:.claude/ |
| + | --- | ||
| + | name: convenciones-backend | ||
| + | description: | ||
| + | --- | ||
| + | Lee .kiro/ | ||
| + | </ | ||
| - | Cuando dos reglas chocan, gana la primera de esta lista: mantenibilidad, testabilidad, | + | Y '' |
| - | ^ Fichero ^ Reglas (las que entran; se amplía con lo que salga en las revisiones) ^ | + | ===== El contexto |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | Y en '' | + | El contexto es todo lo que el modelo tiene delante |
| - | La '' | + | * **Una conversación por tarea.** |
| + | * **El modelo bueno para especificar, | ||
| + | * **No pegar logs enteros.** Solo el error y las líneas | ||
| + | * **Mirar el contador.** ''/ | ||
| - | ==== Los tests: contra los criterios | + | ===== MCP ===== |
| - | La misma revisión mira después los tests del issue: que **cada criterio de aceptación** de '' | + | Dos servidores MCP y ninguno más (qué es un MCP: [[cursos: |
| - | ==== Las correcciones: /code impl < | + | * **Context7**: documentación actualizada de Spring Boot y Angular. Sin él, el agente escribe código de la versión que recuerda, que no es la que usáis. |
| - | + | * **Playwright MCP**: el agente abre la aplicación en un navegador y la ve. Sirve para que compruebe por sí mismo que una pantalla funciona, y en el tema 6 para generar los tests E2E. | |
| - | < | + | |
| - | /code impl .kiro/ | + | |
| - | </ | + | |
| - | El mismo '' | + | Se configuran con '' |
| - | ===== Lo que comprueba /git-flow finish | + | ===== Permisos del agente |
| - | Con los tests y la revisión, | + | En el tema 3 se permitió lo básico. Para programar, el agente tiene que poder compilar, pasar tests y levantar |
| - | | + | |
| - | - '' | + | |
| - | | + | * **Denegado**: |
| - | Si está todo, hace lo del tema 2: '' | + | En OpenCode, lo mismo en la clave '' |
| ===== Ejercicios ===== | ===== Ejercicios ===== | ||
| ==== Ejercicio 1 ==== | ==== Ejercicio 1 ==== | ||
| - | * Crea un issue «Skill /test: create» e inícialo. | + | * Configura Context7 y el MCP de Playwright en Claude Code ('' |
| - | * Instala | + | * Comprueba que funcionan: pide al agente la forma actual de declarar una ruta en Angular |
| - | * Escribe la skill ''/ | + | * Completa |
| - | * ''/ | + | |
| - | * ''/ | + | |
| - | * Finaliza el issue. | + | |
| ==== Ejercicio 2 ==== | ==== Ejercicio 2 ==== | ||
| - | * Crea un issue «Skill /test: run y repair» | + | * Crea un issue «Skill /sdd» e inícialo |
| - | * Añade el verbo '' | + | * Instala cc-sdd |
| - | * Introduce un error a mano en una validación | + | * Escribe la skill ''/ |
| - | * Añade el verbo '' | + | * Añade |
| - | * Cambia | + | |
| - | * Finaliza el issue. | + | |
| ==== Ejercicio 3 ==== | ==== Ejercicio 3 ==== | ||
| - | * Crea un issue «Skill / | + | * Crea un issue para la primera entidad de tu proyecto con un CRUD completo (por ejemplo «CRUD de productos») |
| - | * Escribe la skill de conocimiento | + | * '' |
| - | * Añade a la skill '' | + | * Lee '' |
| - | * ''/ | + | * ''/ |
| - | * ''/ | + | * Prueba la aplicación en la URL del worktree: listado, alta, edición, borrado y las validaciones. Lo que no esté bien se pide en la misma conversación. |
| - | * Finaliza | + | * Lee el código generado clase por clase y corrígelo: es la referencia de todos los CRUD que vienen después. |
| ==== Ejercicio 4 ==== | ==== Ejercicio 4 ==== | ||
| - | * Crea un issue «finish comprueba» e inícialo. | + | * En el mismo worktree, lanza ''/ |
| - | * Amplía | + | * Con ''/ |
| - | * Deja una tarea sin marcar en '' | + | * Escribe |
| + | * ''/ | ||
| + | * ''/ | ||
| + | * Mira ''/ | ||
| ==== Ejercicio 5 ==== | ==== Ejercicio 5 ==== | ||
| - | * Crea un issue para la segunda entidad de tu proyecto | + | * Crea un issue «Skill /code: impl» |
| - | * ''/ | + | * Crea un issue que no sea un CRUD (un filtro en el listado, un campo calculado, un informe) e inícialo. |
| - | * ''/ | + | * En modo plan, dile lo que quieres |
| - | * ''/ | + | * ''/ |
| - | * ''/ | + | |
clase/daw/daw-proyecto/tema05.1791976924.txt.gz · Última modificación: por claude
