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:47] – Los CRUD con cc-sdd: steering con backend.md y frontend.md condicionales, en lugar de la skill /crud 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 de arquitectura (las de Programación y DWS: capas, nombres, sin ciclos, '' | + | ===== Dos caminos: spec para los CRUD, plan para el resto ===== |
| - | < | + | En este proyecto hay dos clases de issue y cada una tiene su camino: |
| - | / | + | |
| - | - 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 | + | |
| - | - Los repositorios de persistence acaban en RepositoryImpl e implementan | + | |
| - | - Sin ciclos entre paquetes. | + | |
| - | </ | + | |
| - | Cada test lleva en su '' | + | * **Un CRUD** (una entidad con su listado, alta, edición |
| + | | ||
| - | <sxh java> | + | En los dos, la regla es la misma: primero un fichero que el alumno lee y corrige, después la implementación con el contexto limpio. |
| - | @Test | + | |
| - | @DisplayName(" | + | |
| - | void domainSinSpring() { | + | |
| - | noClasses().that().resideInAPackage(" | + | |
| - | .should().dependOnClassesThat().resideInAPackage(" | + | |
| - | | + | |
| - | } | + | |
| - | </ | + | |
| - | **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 | + | La spec la genera |
| - | + | ||
| - | ===== Tests unitarios con JUnit ===== | + | |
| - | + | ||
| - | Los tests unitarios prueban la lógica | + | |
| < | < | ||
| - | /crear-test-unitarios PedidoService | + | npx cc-sdd@latest |
| </ | </ | ||
| - | 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 '' | + | Ese es el flujo de cada issue: |
| - | Qué no prueban: controladores ni repositorios. Eso es de los tests de API. | + | < |
| + | start | ||
| + | :/git-flow start N | ||
| + | y ./app.sh start; | ||
| + | if (¿es un CRUD?) then (sí) | ||
| + | :/sdd spec create | ||
| + | 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) | ||
| + | | ||
| + | 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 | ||
| + | :Probar en el navegador; | ||
| + | stop | ||
| + | </ | ||
| - | ===== Tests de API con Playwright ===== | + | ==== /sdd spec create |
| - | Los tests de API prueban cada endpoint **de verdad**: peticiones HTTP contra | + | Se lanza en el worktree |
| - | **No forman parte del build**: | + | - ''/ |
| + | - '' | ||
| + | - '' | ||
| + | - ''/ | ||
| - | <code> | + | Y se para. El resultado son tres ficheros en '' |
| - | /crear-test-api Pedido | + | |
| - | </code> | + | |
| - | Por cada endpoint | + | **Revisar esos ficheros es el trabajo humano |
| - | <sxh typescript> | + | ^ Fichero ^ Qué tiene que tener ^ |
| - | test('POST / | + | | '' |
| - | const res = await request.post('/ | + | | '' |
| - | expect(res.status()).toBe(400); | + | | '' |
| - | expect((await res.json()).errores.numero).toBeDefined(); | + | |
| - | }); | + | |
| - | </ | + | |
| - | + | ||
| - | Los de API y los E2E son dos **proyectos** del mismo '' | + | |
| - | + | ||
| - | <sxh typescript; | + | |
| - | export default defineConfig({ | + | |
| - | use: { baseURL: process.env.BASE_URL ?? ' | + | |
| - | | + | |
| - | { name: 'api', testDir: | + | |
| - | { name: ' | + | |
| - | ], | + | |
| - | }); | + | |
| - | </ | + | |
| - | '' | + | Si se cambia algo en '' |
| - | ===== Tests E2E con Playwright ===== | + | ==== /sdd spec impl ==== |
| - | Los tests E2E prueban la aplicación completa desde el navegador, como lo haría el usuario. Los criterios de aceptación del plan son frases comprobables. | + | Conversación nueva (''/ |
| < | < | ||
| - | /crear-test-e2e planes/ | + | /sdd spec impl |
| </ | </ | ||
| - | Cómo trabaja: lee los criterios, abre la aplicación | + | Por dentro es ''/ |
| - | Reglas que la skill tiene que respetar | + | Solo implementa |
| - | * Selectores por '' | + | Por qué el '' |
| - | * 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** ('' | + | |
| - | ===== Revisión por IA antes de cerrar ===== | + | ==== El modo plan y /code impl: lo que no es un CRUD ==== |
| - | Sin pull request nadie mira el código antes de que llegue a '' | + | 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 '' |
| - | | + | |
| - | | + | - 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. | |
| - | Y clasifica cada cosa que encuentra | + | - **Conversación nueva** ('' |
| - | + | ||
| - | <note important> | + | |
| - | + | ||
| - | ===== Calidad | + | |
| - | + | ||
| - | ''/ | + | |
| - | + | ||
| - | ==== 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 una vez y se va completando cuando una revisión saca algo que no estaba. '' | + | |
| < | < | ||
| - | .claude/skills/ | + | /code impl plan_filtro-provincia.md |
| - | ├── 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 | + | Por qué en dos conversaciones y no seguidas: al planificar, |
| - | + | ||
| - | Cuando dos reglas chocan, gana la primera de esta lista: mantenibilidad, | + | |
| - | ^ Fichero ^ Reglas (las que entran; se amplía con lo que salga en las revisiones) ^ | + | '' |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | Y en '' | + | La skill '' |
| - | La '' | + | ==== La carpeta |
| - | ==== /revisar-calidad: quien las aplica ==== | + | '' |
| - | Una skill de tarea que recibe una ruta (una clase, | + | Es un **registro** de lo que se pidió, no documentación: cuando |
| < | < | ||
| - | /revisar-calidad backend/src/ | + | .kiro/specs/ es histórico: la fuente de verdad es el código. No leas specs de otros issues salvo que te lo pidan. |
| </ | </ | ||
| - | Lo que hace, en orden: | + | ==== La skill /sdd ==== |
| - | - Carga '' | + | Es corta, porque |
| - | - Lee el código | + | |
| - | - Por cada cosa que encuentra, un hallazgo con: la **regla** incumplida (fichero y sección de '' | + | |
| - | - 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, | + | |
| - | - Clasifica en **grave** (rompe una regla con coste claro, o un olor de diseño) y **mejorable**, | + | |
| - | Un hallazgo bien hecho y dos mal hechos: | + | <sxh yaml;title:.claude/ |
| - | + | --- | |
| - | <code> | + | name: sdd |
| - | GRAVE PedidoService.java:48 metodos.md «cálculo puro y efectos secundarios» | + | description: |
| - | | + | allowed-tools: |
| - | Coste: no se puede probar la suma sin base de datos; | + | --- |
| - | + | </sxh> | |
| - | MAL | + | |
| - | (no mira las clases hermanas: todos los servicios lo escriben así; y no dice qué cuesta) | + | |
| - | MAL | + | |
| - | | + | |
| - | </code> | + | |
| - | Después | + | Todas las skills de tarea del proyecto son así: ''/< |
| - | **Cuándo se pasa**: después de cada ''/ | + | ===== El primer CRUD ===== |
| - | ===== Los CRUD con cc-sdd ===== | + | La práctica central del tema es el primer |
| - | Los CRUD de este proyecto son siempre iguales: | + | Se resuelve con el primer |
| - | Cómo se instala cc-sdd y cómo funcionan sus cinco fases está en el curso de SDD: [[cursos: | + | ===== El steering: las dos arquitecturas |
| - | ==== Cuándo se genera | + | 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 |
| - | Se instala y se lanza una vez, en la raíz del repositorio: | + | ''/ |
| < | < | ||
| - | npx cc-sdd@latest --claude-skills --lang es (OpenCode: --opencode-skills) | ||
| / | / | ||
| </ | </ | ||
| Línea 187: | Línea 145: | ||
| Los tres ficheros que genera, '' | Los tres ficheros que genera, '' | ||
| - | ==== Dos arquitecturas, | + | ==== Dos arquitecturas, |
| Lo específico de cada parte no va en esos tres, sino en dos ficheros de steering **condicionales**, | Lo específico de cada parte no va en esos tres, sino en dos ficheros de steering **condicionales**, | ||
| - | < | + | < |
| --- | --- | ||
| inclusion: fileMatch | inclusion: fileMatch | ||
| Línea 200: | Línea 158: | ||
| </ | </ | ||
| - | Y '' | + | Y '' |
| ^ '' | ^ '' | ||
| Línea 207: | Línea 165: | ||
| | Dónde se valida (Bean Validation en el '' | | Dónde se valida (Bean Validation en el '' | ||
| | Migraciones '' | | Migraciones '' | ||
| - | | Cómo se prueba: '' | + | | Cómo se prueban los unitarios: JUnit 5 y Mockito, sin Spring |
| - | Son exactamente las reglas de '' | + | La lección: |
| - | ==== Un CRUD de principio a fin ==== | + | ==== Las skills |
| - | < | + | El steering solo lo leen los comandos de cc-sdd. Las demás skills del proyecto |
| - | /kiro-spec-init CRUD de pedidos: numero | + | |
| - | cliente (relación con Cliente, obligatoria), | + | |
| - | / | + | |
| - | / | + | |
| - | / | + | |
| - | / | + | |
| - | </ | + | |
| - | * En **requirements** | + | <sxh yaml; |
| - | * En **design** se comprueba una sola cosa: que es igual que el CRUD de referencia. Si no lo es, lo que falla no es el diseño sino el steering: se añade la línea que faltaba en '' | + | --- |
| - | * Los tests se generan igual que en cualquier | + | name: convenciones-backend |
| + | description: | ||
| + | --- | ||
| + | Lee .kiro/steering/backend.md y aplícalo. Es la única fuente | ||
| + | </ | ||
| - | La lección: **lo que el steering | + | 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, el barato para implementar** cosas claras. ''/ | ||
| + | * **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: | ||
| + | |||
| + | | ||
| + | * **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 '' | ||
| + | |||
| + | * **Permitido**: | ||
| + | * **Pregunta**: | ||
| + | * **Denegado**: | ||
| + | |||
| + | En OpenCode, lo mismo en la clave '' | ||
| ===== 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 |
| - | * 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 «cc-sdd y steering» e inícialo. | + | |
| - | * Instala cc-sdd | + | |
| - | * Con ''/ | + | |
| - | * Finaliza el issue. | + | |
| - | + | ||
| - | ==== Ejercicio 7 ==== | + | |
| - | * Crea un issue para la segunda entidad de tu proyecto | + | |
| - | * Haz el CRUD con las cinco fases de cc-sdd. | + | |
| - | * Genera los tests con ''/ | + | |
| - | * Quita a mano de '' | + | |
clase/daw/daw-proyecto/tema05.1791935227.txt.gz · Última modificación: por claude
