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 01:20] – Nueva sección: skill de conocimiento calidad-codigo y skill /revisar-calidad, con ejercicio 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; |
| - | | + | if (¿es un CRUD?) then (sí) |
| - | | + | :/sdd spec create |
| - | .check(clases); | + | requisitos, diseño y tareas |
| - | } | + | en .kiro/ |
| - | </ | + | :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 | ||
| + | | ||
| + | :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 | ||
| + | </ | ||
| + | |||
| + | ==== /sdd spec create ==== | ||
| + | |||
| + | Se lanza en el worktree del issue, | ||
| + | |||
| + | - ''/ | ||
| + | - ''/ | ||
| + | - ''/ | ||
| + | - ''/ | ||
| + | |||
| + | 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 ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| - | **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, | + | Si se cambia algo en '' |
| - | ===== Tests unitarios con JUnit ===== | + | ==== /sdd spec impl ==== |
| - | Los tests unitarios prueban la lógica del dominio **sin Spring y sin base de datos**: un servicio con sus repositorios sustituidos por mocks de Mockito. Son los más rápidos y los que mejor localizan un error. | + | 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 Playwright ===== | + | Por qué el ''/ |
| - | Los tests de API prueban cada endpoint **de verdad**: peticiones HTTP contra el backend del worktree, comprobando el código de estado | + | ==== El modo plan y /code impl: lo que no es un CRUD ==== |
| - | **No forman parte del build**: '' | + | 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, en '' | + | Por qué en dos conversaciones y no seguidas: al planificar, el agente ha leído medio proyecto y ha descartado alternativas, |
| - | <sxh typescript> | + | ''/ |
| - | 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 '' | + | La skill '' |
| - | <sxh typescript; | + | ==== La carpeta de la spec ==== |
| - | export default defineConfig({ | + | |
| - | use: { baseURL: process.env.BASE_URL ?? ' | + | |
| - | projects: [ | + | |
| - | { name: ' | + | |
| - | { name: ' | + | |
| - | ], | + | |
| - | }); | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | ===== Tests E2E con Playwright ===== | + | '' |
| - | Los tests E2E prueban la aplicación completa desde el navegador, como lo haría | + | Es un **registro** de lo que se pidió, no documentación: |
| < | < | ||
| - | /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 con '' | + | ==== 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 ===== |
| - | ===== Calidad | + | 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 // |
| - | ''/ | + | ==== Cuándo |
| - | ==== calidad-codigo: las reglas ==== | + | ''/ |
| - | + | ||
| - | Una skill de conocimiento, como las de convenciones, pero sobre cómo se escribe código bueno en general. Se escribe | + | |
| < | < | ||
| - | .claude/skills/ | + | /kiro-steering |
| - | ├── 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** | + | Los tres ficheros |
| - | Cuando | + | ==== Dos arquitecturas, |
| - | ^ Fichero ^ Reglas (las que entran; se amplía con lo que salga en las revisiones) ^ | + | Lo específico |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | Y en '' | + | <sxh plain; |
| + | --- | ||
| + | inclusion: fileMatch | ||
| + | fileMatchPattern: | ||
| + | --- | ||
| + | # Arquitectura | ||
| + | ... | ||
| + | </ | ||
| - | La '' | + | Y '' |
| - | ==== /revisar-calidad: quien las aplica ==== | + | ^ '' |
| + | | Las capas '' | ||
| + | | Nombres: '' | ||
| + | | Dónde se valida (Bean Validation en el '' | ||
| + | | Migraciones '' | ||
| + | | Cómo se prueban los unitarios: JUnit 5 y Mockito, sin Spring | '' | ||
| - | Una skill de tarea que recibe una ruta (una clase, un paquete, '' | + | 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 de convenciones ==== |
| - | / | + | |
| - | </ | + | |
| - | Lo que hace, en orden: | + | El steering solo lo leen los comandos de cc-sdd. Las demás skills del proyecto (''/ |
| - | - Carga '' | + | <sxh yaml; |
| - | - Lee el código de la ruta. Solo lee: '' | + | --- |
| - | - Por cada cosa que encuentra, un hallazgo con: la **regla** incumplida (fichero y sección de '' | + | name: convenciones-backend |
| - | - Antes de proponer cambiar la **forma** de algo sin cambiar lo que hace (extraer, mover, renombrar), mira cómo lo resuelven tres clases hermanas (otros controladores, | + | description: Cómo se escribe |
| - | - Clasifica en **grave** (rompe una regla con coste claro, o un olor de diseño) | + | --- |
| + | Lee .kiro/ | ||
| + | </ | ||
| - | Un hallazgo bien hecho y dos mal hechos: | + | Y '' |
| - | < | + | ===== El contexto del agente ===== |
| - | GRAVE PedidoService.java: | + | |
| - | | + | |
| - | | + | |
| - | MAL " | + | El contexto es todo lo que el modelo tiene delante en una conversación: |
| - | (no mira las clases hermanas: todos los servicios | + | |
| - | MAL "el método es demasiado largo" | + | |
| - | (sin regla ni coste: es una opinión) | + | |
| - | </ | + | |
| - | Después del informe, el alumno lee, decide | + | * **Una conversación por tarea.** ''/ |
| + | * **El modelo bueno para especificar, el barato para implementar** cosas claras. ''/ | ||
| + | * **No pegar logs enteros.** Solo el error y las líneas de alrededor. | ||
| + | * **Mirar | ||
| - | **Cuándo se pasa**: después de cada ''/ | + | ===== MCP ===== |
| - | ===== Un CRUD con una skill ===== | + | Dos servidores MCP y ninguno más (qué es un MCP: [[cursos: |
| - | Los CRUD de este proyecto son siempre iguales: solo cambian la entidad | + | * **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. | ||
| - | < | + | Se configuran |
| - | /crud Pedido | + | |
| - | Campos: numero (texto, único, obligatorio), | + | ===== Permisos del agente ===== |
| - | cliente (relación | + | |
| - | </ | + | |
| - | Y genera | + | En el tema 3 se permitió |
| - | 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 / |
| - | * Instala Playwright en '' | + | * Instala cc-sdd en la raíz del repositorio y comprueba que ''/ |
| - | * Escribe | + | * 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, reconstruye el backend | + | |
| - | * 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») |
| - | * Escribe la skill ''/ | + | * ''/ |
| - | * Lánzala con el plan del CRUD del tema 4. '' | + | * Lee '' |
| - | * 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 «Revisión de calidad» | + | * Crea un issue «Skill /code: impl» |
| - | * Escribe la skill de conocimiento | + | * Crea un issue que no sea un CRUD (un filtro en el listado, un campo calculado, un informe) |
| - | * Escribe la skill ''/ | + | * En modo plan, dile lo que quieres |
| - | * Pásala sobre el paquete del CRUD del tema 4. Lee el informe: para cada hallazgo, decide | + | * ''/ |
| - | * Pide que corrija solo los graves y vuelve a pasarla: no deben salir. | + | |
| - | * Finaliza el issue. | + | |
| - | + | ||
| - | ==== Ejercicio 6 ==== | + | |
| - | * Crea un issue para la segunda entidad de tu proyecto | + | |
| - | * Escribe la skill ''/ | + | |
| - | * Lánzala: | + | |
| - | * Quita a mano del plan un criterio de aceptación sin quitar su código y lanza ''/ | + | |
clase/daw/daw-proyecto/tema05.1791933608.txt.gz · Última modificación: por claude
