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 00:18] – Nuevas secciones de tests unitarios (JUnit) y de API (REST Assured), skills /crear-test-* 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 |
| - | ===== Tests de arquitectura | + | Lo que ya está contado en el [[cursos: |
| - | Las reglas | + | ===== Dos caminos: spec para los CRUD, plan para el resto ===== |
| + | |||
| + | En este proyecto hay dos clases | ||
| + | |||
| + | * **Un CRUD** | ||
| + | * **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 y él escribe un fichero | ||
| + | |||
| + | En los dos, la regla es la misma: primero un fichero | ||
| + | |||
| + | La spec la genera | ||
| < | < | ||
| - | /crear-test-arquitectura | + | 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 ==== |
| - | ===== 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 | + | - ''/ |
| + | - ''/ | ||
| + | - ''/ | ||
| + | - ''/ | ||
| + | |||
| + | Y se para. El resultado son tres ficheros en '' | ||
| + | |||
| + | **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: | ||
| + | |||
| + | ^ Fichero ^ Qué tiene que tener ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | Si se cambia algo en '' | ||
| + | |||
| + | ==== /sdd spec impl ==== | ||
| + | |||
| + | Conversación nueva (''/ | ||
| < | < | ||
| - | /crear-test-unitarios PedidoService | + | /sdd spec impl |
| </ | </ | ||
| - | Lo que hace: lee la clase, identifica | + | Por dentro es ''/ |
| - | Qué no prueban: controladores ni repositorios. Eso es de los tests de API. | + | Solo implementa la spec. Los planes (abajo) y las correcciones |
| - | ===== Tests de API con REST Assured ===== | + | Por qué el ''/ |
| - | Los tests de API prueban cada endpoint | + | ==== El modo plan y /code impl: lo que no es un CRUD ==== |
| + | |||
| + | 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 '' | ||
| + | |||
| + | - En el worktree | ||
| + | - 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** (''/ | ||
| < | < | ||
| - | /crear-test-api Pedido | + | /code impl plan_filtro-provincia.md |
| </ | </ | ||
| - | Por cada endpoint del controlador, un test del caso bueno y uno por cada error que el plan o las validaciones prevén: '' | + | Por qué en dos conversaciones y no seguidas: al planificar, el agente ha leído medio proyecto y ha descartado alternativas, y todo eso sigue en el contexto. Si implementa en la misma conversación, |
| - | <sxh java> | + | ''/ |
| - | @Test | + | |
| - | @DisplayName(" | + | |
| - | void crearSinNumero() { | + | |
| - | given().contentType(JSON).body(Map.of(" | + | |
| - | | + | |
| - | | + | |
| - | } | + | |
| - | </ | + | |
| - | Unitarios, de API y de arquitectura corren todos con '' | + | La skill ''/ |
| - | ===== Tests E2E con Playwright ===== | + | ==== La carpeta de la spec ==== |
| - | Los tests E2E prueban | + | '' |
| + | |||
| + | Es un **registro** | ||
| < | < | ||
| - | /crear-test-e2e planes/12-alta-clientes.md | + | .kiro/specs/ es histórico: la fuente de verdad es el código. No leas specs de otros issues salvo que te lo pidan. |
| </ | </ | ||
| - | Cómo trabaja: lee los criterios, abre la aplicación del worktree con el Playwright MCP para ver qué hay en pantalla, escribe el test y lo ejecuta; si falla por un selector o un texto, lo arregla y lo vuelve a pasar. | + | ==== La skill /sdd ==== |
| - | Reglas que la skill tiene que respetar (están | + | Es corta, porque el trabajo lo hacen los comandos de cc-sdd. Recibe el subcomando |
| - | * Selectores por '' | + | <sxh yaml; |
| - | * Un test por criterio de aceptación, con el criterio como nombre del test. | + | --- |
| - | * Los tests cuentan con los datos de prueba del tema 3 y **se pasan sobre la base de datos recién reseteada** ('' | + | name: sdd |
| + | description: | ||
| + | allowed-tools: | ||
| + | --- | ||
| + | </ | ||
| - | ===== Revisión por IA antes de cerrar ===== | + | Todas las skills |
| - | Sin pull request nadie mira el código antes de que llegue a '' | + | ===== El primer CRUD ===== |
| - | * **El plan del issue**: ¿hace lo que se pidió, y como se pidió? ¿Falta algún criterio de aceptación? | + | La práctica central |
| - | * **Las skills de convenciones**: | + | |
| - | Y clasifica cada cosa que encuentra | + | Se resuelve con el primer CRUD y solo con él: se genera la spec, y en '' |
| - | <note important> | + | ===== El steering: las dos arquitecturas ===== |
| - | ===== Un CRUD con una skill ===== | + | Para que el segundo |
| - | Los CRUD de este proyecto son siempre iguales: solo cambian la entidad | + | ==== Cuándo se genera ==== |
| + | |||
| + | ''/ | ||
| < | < | ||
| - | /crud Pedido | + | /kiro-steering |
| - | Campos: numero (texto, único, obligatorio), | + | |
| - | cliente (relación con Cliente, obligatoria), | + | |
| </ | </ | ||
| - | Y genera lo mismo que tiene el CRUD de referencia: migración | + | Los tres ficheros que genera, '' |
| + | |||
| + | ==== Dos arquitecturas, | ||
| + | |||
| + | Lo específico de cada parte no va en esos tres, sino en dos ficheros de steering **condicionales**, | ||
| + | |||
| + | <sxh plain; | ||
| + | --- | ||
| + | inclusion: fileMatch | ||
| + | fileMatchPattern: | ||
| + | --- | ||
| + | # Arquitectura del servidor | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | Y '' | ||
| + | |||
| + | ^ '' | ||
| + | | Las capas '' | ||
| + | | Nombres: '' | ||
| + | | Dónde se valida (Bean Validation en el '' | ||
| + | | Migraciones | ||
| + | | Cómo se prueban | ||
| + | |||
| + | 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 skills del proyecto (''/ | ||
| + | |||
| + | <sxh yaml; | ||
| + | --- | ||
| + | name: convenciones-backend | ||
| + | description: | ||
| + | --- | ||
| + | Lee .kiro/ | ||
| + | </ | ||
| + | |||
| + | Y '' | ||
| + | |||
| + | ===== El contexto del agente ===== | ||
| + | |||
| + | El contexto es todo lo que el modelo tiene delante en una conversación: | ||
| + | |||
| + | * **Una conversación por tarea.** ''/ | ||
| + | * **El modelo bueno para especificar, | ||
| + | * **No pegar logs enteros.** Solo el error y las líneas de alrededor. | ||
| + | * **Mirar el contador.** ''/ | ||
| + | |||
| + | ===== MCP ===== | ||
| + | |||
| + | Dos servidores MCP y ninguno más (qué es un MCP: [[cursos: | ||
| + | |||
| + | * **Context7**: | ||
| + | * **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. | ||
| + | |||
| + | Se configuran con '' | ||
| + | |||
| + | ===== Permisos del agente ===== | ||
| + | |||
| + | 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 '' | ||
| - | La skill se construye a partir del CRUD del tema 4: se le pide al agente | + | * **Permitido**: '' |
| + | * **Pregunta**: | ||
| + | * **Denegado**: | ||
| - | La lección va más allá del CRUD: **lo que se repite, se convierte | + | En OpenCode, |
| ===== Ejercicios ===== | ===== Ejercicios ===== | ||
| ==== Ejercicio 1 ==== | ==== Ejercicio 1 ==== | ||
| - | * Crea un issue «Tests | + | * Configura Context7 y el MCP de Playwright en Claude Code ('' |
| - | * Escribe la skill '' | + | * Comprueba que funcionan: pide al agente la forma actual de declarar una ruta en Angular y que abra la aplicación |
| - | * Lánzala con las seis reglas | + | * Completa |
| - | * Mueve a mano el servicio del CRUD al paquete | + | |
| - | * Finaliza el issue. | + | |
| ==== Ejercicio 2 ==== | ==== Ejercicio 2 ==== | ||
| - | * Crea un issue «Tests unitarios y de API del CRUD» | + | * Crea un issue «Skill / |
| - | * Añade al '' | + | * Instala cc-sdd en la raíz del repositorio |
| - | * Escribe la skill ''/ | + | * Escribe la skill ''/ |
| - | * Lánzala con el servicio del CRUD del tema 4. '' | + | * Añade a '' |
| - | * Escribe la skill ''/ | + | |
| - | * Lánzala con la entidad del CRUD. '' | + | |
| - | * Introduce un error a mano en una validación del servicio y comprueba qué tests lo detectan: tiene que caer al menos un unitario y uno de API. Deshazlo. | + | |
| - | * Finaliza el issue. | + | |
| ==== Ejercicio 3 ==== | ==== Ejercicio 3 ==== | ||
| - | * Crea un issue «Tests E2E del CRUD» | + | * Crea un issue para la primera entidad de tu proyecto con un CRUD completo (por ejemplo «CRUD de productos») |
| - | * Instala Playwright en '' | + | * ''/ |
| - | * Escribe la skill '' | + | * Lee '' |
| - | * Lánzala con el plan del CRUD del tema 4. '' | + | * '' |
| - | * Finaliza | + | * 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. |
| + | * 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 «Revisión por IA» e inícialo. | + | * En el mismo worktree, lanza ''/ |
| - | * Escribe la skill ''/ | + | * Con ''/ |
| - | * Amplía | + | * Escribe '' |
| - | * Finaliza el issue. | + | * '' |
| + | * ''/ | ||
| + | * Mira ''/ | ||
| ==== Ejercicio 5 ==== | ==== Ejercicio 5 ==== | ||
| - | * Crea un issue para la segunda entidad de tu proyecto | + | * Crea un issue «Skill /code: impl» |
| - | * Escribe la skill ''/ | + | * Crea un issue que no sea un CRUD (un filtro en el listado, un campo calculado, un informe) e inícialo. |
| - | * Lánzala: | + | * En modo plan, dile lo que quieres |
| - | * Quita a mano del plan un criterio de aceptación sin quitar su código y lanza ''/ | + | * ''/ |
clase/daw/daw-proyecto/tema05.1791929902.txt.gz · Última modificación: por claude
