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/13 23:55] – Escapar __ dentro de monoespaciado 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 | + | ==== La skill /sdd ==== |
| + | |||
| + | Es corta, porque el trabajo lo hacen los comandos de cc-sdd. Recibe el subcomando en '' | ||
| + | |||
| + | <sxh yaml; | ||
| + | --- | ||
| + | name: sdd | ||
| + | description: | ||
| + | allowed-tools: | ||
| + | --- | ||
| + | </ | ||
| + | |||
| + | Todas las skills de tarea del proyecto son así: ''/< | ||
| + | |||
| + | ===== El primer CRUD ===== | ||
| + | |||
| + | La práctica central del tema es el primer CRUD del proyecto, hecho con ''/ | ||
| + | |||
| + | Se resuelve con el primer | ||
| + | |||
| + | ===== 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 ==== | ||
| + | |||
| + | ''/ | ||
| + | |||
| + | <code> | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | 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 del primero, falta una línea en el steering, no un prompt mejor. | ||
| + | |||
| + | ==== Las skills de convenciones ==== | ||
| + | |||
| + | 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 | ||
| + | |||
| + | Se configuran con '' | ||
| + | |||
| + | ===== Permisos | ||
| + | |||
| + | 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 ===== | ||
| - | La skill se construye a partir del CRUD del tema 4: se le pide al agente que lo lea y escriba | + | ==== Ejercicio 1 ==== |
| + | * Configura Context7 y el MCP de Playwright en Claude Code ('' | ||
| + | * Comprueba que funcionan: pide al agente | ||
| + | * Completa | ||
| - | La lección va más allá del CRUD: **lo que se repite, se convierte | + | ==== Ejercicio 2 ==== |
| + | | ||
| + | | ||
| + | * Escribe | ||
| + | * Añade a '' | ||
| - | ===== Práctica ===== | + | ==== Ejercicio 3 ==== |
| + | * Crea un issue para la primera entidad de tu proyecto con un CRUD completo (por ejemplo «CRUD de productos») e inícialo. | ||
| + | * ''/ | ||
| + | * 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. | ||
| + | * Lee el código generado clase por clase y corrígelo: es la referencia de todos los CRUD que vienen después. | ||
| - | - Skill ''/ | + | ==== Ejercicio 4 ==== |
| - | - Skill '' | + | * En el mismo worktree, lanza ''/ |
| - | | + | * Con '' |
| - | | + | |
| + | * ''/ | ||
| + | | ||
| + | | ||
| - | **Prueba**: en el segundo CRUD, cambiar a mano una clase de capa (mover el servicio a '' | + | ==== Ejercicio 5 ==== |
| + | | ||
| + | * 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.1791928544.txt.gz · Última modificación: por claude
