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:06] – Sección Práctica convertida en Ejercicios, con la estructura de los demás módulos 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 | ||
| < | < | ||
| - | /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 E2E con Playwright ===== | + | 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 criterios de aceptación del plan son frases comprobables. ''/ | + | - ''/ |
| + | - ''/ | ||
| + | - ''/ | ||
| + | - ''/ | ||
| + | |||
| + | 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 (''/ | ||
| < | < | ||
| - | /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. | ||
| + | - **Conversación nueva** ('' | ||
| - | Y clasifica cada cosa que encuentra en **grave** (no cumple el plan, rompe una convención, | + | < |
| + | /code impl plan_filtro-provincia.md | ||
| + | </code> | ||
| - | <note important> | + | Por qué en dos conversaciones y no seguidas: al planificar, el agente |
| - | ===== Un CRUD con una skill ===== | + | ''/ |
| - | Los CRUD de este proyecto son siempre iguales: solo cambian | + | La skill ''/ |
| + | |||
| + | ==== La carpeta de la spec ==== | ||
| + | |||
| + | '' | ||
| + | |||
| + | Es un **registro** de lo que se pidió, | ||
| < | < | ||
| - | /crud Pedido | + | .kiro/specs/ es histórico: la fuente de verdad es el código. No leas specs de otros issues salvo que te lo pidan. |
| - | Campos: numero (texto, único, obligatorio), | + | |
| - | cliente (relación con Cliente, obligatoria), | + | |
| </ | </ | ||
| - | Y genera lo mismo que tiene el CRUD de referencia: migración '' | + | ==== La skill /sdd ==== |
| - | La skill se construye a partir del CRUD del tema 4: se le pide al agente que lo lea y escriba | + | Es corta, porque el trabajo |
| - | La lección va más allá del CRUD: **lo que se repite, se convierte | + | <sxh yaml; |
| + | --- | ||
| + | name: sdd | ||
| + | description: | ||
| + | allowed-tools: | ||
| + | --- | ||
| + | </ | ||
| + | |||
| + | Todas las skills de tarea del proyecto son así: ''/< | ||
| + | |||
| + | ===== El primer CRUD ===== | ||
| + | |||
| + | La práctica central | ||
| + | |||
| + | Se resuelve con el primer CRUD y solo con él: se genera la spec, y en '' | ||
| + | |||
| + | ===== El steering: las dos arquitecturas ===== | ||
| + | |||
| + | 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 genera ==== | ||
| + | |||
| + | ''/ | ||
| + | |||
| + | < | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | 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 los unitarios: JUnit 5 y Mockito, sin Spring | '' | ||
| + | |||
| + | La lección: **lo que el steering no dice, el agente lo inventa distinto cada vez.** Si el segundo CRUD sale distinto | ||
| + | |||
| + | ==== 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 | ||
| + | |||
| + | * **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 '' | ||
| + | |||
| + | * **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 E2E del CRUD» | + | * Crea un issue «Skill / |
| - | * Instala | + | * Instala |
| - | * Escribe la skill ''/ | + | * Escribe la skill ''/ |
| - | * Lánzala con el plan del CRUD del tema 4. '' | + | * Añade a '' |
| - | * Finaliza el issue. | + | |
| ==== Ejercicio 3 ==== | ==== Ejercicio 3 ==== | ||
| - | * Crea un issue «Revisión | + | * Crea un issue para la primera entidad de tu proyecto con un CRUD completo (por ejemplo «CRUD de productos») |
| - | * Escribe la skill ''/ | + | * ''/ |
| - | * Amplía | + | * 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 para la segunda entidad | + | * En el mismo worktree, lanza ''/ |
| - | * Escribe | + | * Con ''/ |
| - | * Lánzala: ''/ | + | * Escribe '' |
| - | * Quita a mano del plan un criterio de aceptación sin quitar su código | + | * ''/ |
| + | * ''/ | ||
| + | * Mira ''/ | ||
| + | |||
| + | ==== Ejercicio 5 ==== | ||
| + | * Crea un issue «Skill /code: impl» e inícialo. Escribe la skill ''/ | ||
| + | * 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 y que escriba el plan en '' | ||
| + | * ''/ | ||
clase/daw/daw-proyecto/tema05.1791929182.txt.gz · Última modificación: por claude
