clase:daw:daw-proyecto:tema05
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| clase:daw:daw-proyecto:tema05 [2026/10/14 12:01] – Orden sustantivo-verbo en todos los subcomandos (/test unit run, /developer code review); los tests siempre por tipo, sin «todos» 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 |
| - | Dos skills nuevas, con la gramática | + | 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 PedidoService | + | |
| - | </code> | + | |
| - | Lo que hace: lee la clase, identifica cada comportamiento (lo que devuelve, lo que valida, lo que lanza) y escribe un test por comportamiento en '' | + | **Revisar esos ficheros es el trabajo humano del flujo.** Es mucho más barato corregir una frase de la spec que corregir |
| - | Qué no prueban: controladores ni repositorios. Eso es de los tests de API. | + | ^ Fichero ^ Qué tiene que tener ^ |
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| - | ==== api: tests de API con Playwright ==== | + | Si se cambia algo en '' |
| - | 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, | + | ==== /sdd spec impl ==== |
| + | |||
| + | Conversación nueva ('' | ||
| < | < | ||
| - | /test api create Pedido | + | /sdd spec impl |
| </ | </ | ||
| - | Por cada endpoint del controlador, | + | 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 | + | /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: cuando el código cambie después, |
| - | | ''/ | + | |
| - | | ''/ | + | |
| - | | ''/ | + | |
| - | | '' | + | |
| - | No hay un «todos» a propósito: los tipos se lanzan **uno a uno**, en ese orden, para saber en cada momento qué se está probando y contra qué. Para que '' | + | < |
| + | .kiro/specs/ es histórico: la fuente | ||
| + | </ | ||
| - | ===== Repararlos: | + | ==== La skill /sdd ==== |
| - | Pasa mucho: se cambia algo del código, se refactoriza, | + | Es corta, porque el trabajo lo hacen los comandos de cc-sdd. Recibe el subcomando en '' |
| - | <code> | + | <sxh yaml; |
| - | /test e2e repair | + | --- |
| - | </code> | + | name: sdd |
| + | description: | ||
| + | allowed-tools: | ||
| + | --- | ||
| + | </sxh> | ||
| - | El criterio es la **intención**: | + | Todas las skills de tarea del proyecto son así: ''/< |
| - | * 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ó lo que el test comprueba: el texto de un mensaje, un campo, un flujo. Entonces se actualiza el test. | + | ===== El primer CRUD ===== |
| - | * Sin un cambio intencionado que lo justifique, el fallo es una **regresión**: | + | |
| - | * Si no se sabe, **no se toca nada** y se pregunta. | + | |
| - | Y tres reglas | + | La práctica central del tema es el primer CRUD del proyecto, hecho con ''/ |
| - | * Nunca quita, comenta ni relaja una aserción, salvo que el cambio intencionado lo obligue. Nunca crea tests nuevos: para eso está '' | + | Se resuelve con el primer CRUD y solo con él: se genera la spec, y en '' |
| - | | + | |
| - | * Un test cada vez, sin commits, y al final una tabla: test, diagnóstico (desactualizado / regresión / sin determinar) y qué se ha cambiado. El alumno la lee y decide si está de acuerdo. | + | |
| - | '' | + | ===== El steering: las dos arquitecturas ===== |
| - | ===== Las revisiones: /developer < | + | Para que el segundo CRUD salga igual que el primero **de verdad**, con las mismas capas, los mismos nombres y los mismos tests, no basta con pedirlo bien: el agente tiene que tener la arquitectura escrita y leerla antes de diseñar. Eso es el //steering// de cc-sdd, y ''/ |
| - | Sin pull request nadie mira el código antes de que llegue a '' | + | ==== Cuándo |
| - | ==== code review: | + | ''/ |
| < | < | ||
| - | /developer code review | + | /kiro-steering |
| </ | </ | ||
| - | Compara el diff de la rama contra | + | Los tres ficheros que genera, |
| - | * **La spec del issue**: ¿hace lo que se pidió, y como se pidió? ¿Falta algún criterio de aceptación? | + | ==== Dos arquitecturas, dos ficheros ==== |
| - | * **Las convenciones** ('' | + | |
| - | * **Las reglas de calidad** de '' | + | |
| - | Cada hallazgo lleva la **regla** incumplida, el **sitio** ('' | + | Lo específico de cada parte no va en esos tres, sino en dos ficheros de steering |
| - | Un hallazgo bien hecho y dos mal hechos: | + | <sxh plain;title:.kiro/ |
| + | --- | ||
| + | inclusion: fileMatch | ||
| + | fileMatchPattern: | ||
| + | --- | ||
| + | # Arquitectura del servidor | ||
| + | ... | ||
| + | </ | ||
| - | < | + | Y '' |
| - | GRAVE PedidoService.java:48 metodos.md «cálculo puro y efectos secundarios» | + | |
| - | | + | |
| - | | + | |
| - | MAL " | + | ^ '' |
| - | (no mira las clases hermanas: todos los servicios lo escriben así; y no dice qué cuesta) | + | | Las capas '' |
| - | MAL "el método es demasiado largo" | + | | Nombres: '' |
| - | (sin regla ni coste: es una opinión) | + | | Dónde se valida (Bean Validation en el '' |
| - | </code> | + | | Migraciones '' |
| + | | Cómo se prueban los unitarios: JUnit 5 y Mockito, sin Spring | '' | ||
| - | Los graves van a '' | + | 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 |
| - | <note important> | + | ==== Las skills |
| - | ==== calidad-codigo: las reglas ==== | + | El steering solo lo leen los comandos de cc-sdd. Las demás skills del proyecto (''/ |
| - | '' | + | <sxh yaml;title:.claude/ |
| + | --- | ||
| + | name: convenciones-backend | ||
| + | description: | ||
| + | --- | ||
| + | Lee .kiro/ | ||
| + | </ | ||
| - | < | + | Y '' |
| - | .claude/ | + | |
| - | ├── SKILL.md | + | |
| - | ├── 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 | + | ===== El contexto del agente |
| - | Cuando dos reglas chocan, gana la primera de esta lista: mantenibilidad, testabilidad, determinismo, separación | + | El contexto es todo lo que el modelo tiene delante en una conversación: '' |
| - | ^ Fichero ^ Reglas (las que entran; se amplía con lo que salga en las revisiones) ^ | + | |
| - | | '' | + | * **El modelo bueno para especificar, |
| - | | '' | + | * **No pegar logs enteros.** Solo el error y las líneas de alrededor. |
| - | | '' | + | |
| - | | '' | + | |
| - | Y en '' | + | ===== MCP ===== |
| - | La '' | + | Dos servidores MCP y ninguno más (qué es un MCP: [[cursos: |
| - | ==== test review: los tests contra los criterios ==== | + | * **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 | |
| - | < | + | |
| - | /developer test review | + | |
| - | </ | + | |
| - | Revisa los tests del issue, no el código: que **cada criterio de aceptación** de '' | + | Se configuran con '' |
| - | ===== Lo que comprueba /git-flow finish | + | ===== Permisos del agente |
| - | Con los tests y las revisiones, | + | En el tema 3 se permitió lo básico. Para programar, el agente tiene que poder compilar, pasar tests y levantar la aplicación sin preguntar en cada paso. La lista de '' |
| - | | + | |
| - | - '' | + | |
| - | | + | * **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 /developer review» e inícialo. | + | * Crea un issue para la primera entidad |
| - | * Escribe | + | * ''/ |
| - | * Escribe la skill ''/ | + | * Lee '' |
| - | * Pásala sobre el CRUD del tema 4. 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.1791972075.txt.gz · Última modificación: por claude
