clase:daw:daw-proyecto:tema01
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:tema01 [2026/10/14 09:55] – Coherencia del flujo: /revisar-ci, npm run test:api|test:e2e, scripts arrancar/parar/estado/logs también en el servidor (sin manage.sh), tests y revisión de calidad en su fase claude | clase:daw:daw-proyecto:tema01 [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: | ||
| ====== 1. Introducción ====== | ====== 1. Introducción ====== | ||
| - | Este módulo no enseña a programar en Java ni en Angular: eso ya lo hacéis en otros módulos. Enseña **todo lo que rodea a programar** cuando se trabaja con un agente de IA: el repositorio, | + | Este módulo no enseña a programar en Java ni en Angular: eso ya lo hacéis en otros módulos. Enseña **todo lo que rodea a programar** cuando se trabaja con un agente de IA: el repositorio, |
| - | En la **1ª evaluación** cada alumno monta su **fábrica**: un repositorio preparado para trabajar así. En la **2ª evaluación** | + | En la **1ª evaluación** cada alumno monta su **arnés**: un repositorio preparado para trabajar así. A esto, a poner el esfuerzo en el entorno que rodea al agente (scripts, skills, tests, revisiones, CI) en vez de en programar a mano, se le llama **ingeniería de arneses**; en inglés, //harness engineering// |
| - | Para saber a dónde se llega, lo mejor es ver cómo se trabaja cuando | + | Para saber a dónde se llega, lo mejor es ver cómo se trabaja cuando |
| ===== Un día de trabajo en el proyecto ===== | ===== Un día de trabajo en el proyecto ===== | ||
| - | Lorenzo está haciendo | + | El proyecto es una tienda. Hoy toca el issue **#12, «Alta de clientes»**, |
| - | ==== 1. Empezar el issue ==== | + | ==== 1. Start ==== |
| En la carpeta del repositorio abre Claude Code y escribe: | En la carpeta del repositorio abre Claude Code y escribe: | ||
| < | < | ||
| - | / | + | / |
| </ | </ | ||
| Línea 23: | Línea 23: | ||
| < | < | ||
| Issue #12: Alta de clientes | Issue #12: Alta de clientes | ||
| - | Rama lorenzo-12-alta-clientes creada desde develop. | + | Rama < |
| Worktree en ../ | Worktree en ../ | ||
| - | Para arrancar la aplicación: | + | Para arrancar la aplicación: |
| </ | </ | ||
| Línea 32: | Línea 32: | ||
| < | < | ||
| cd ../ | cd ../ | ||
| - | ./arrancar.sh | + | ./app.sh start |
| </ | </ | ||
| Línea 39: | Línea 39: | ||
| </ | </ | ||
| - | Base de datos, backend y frontend, en Docker, con datos de prueba, en un puerto que no choca con nada. Si por la tarde empieza el #13, tendrá otra carpeta y otra aplicación en otro puerto, y las dos conviven. | + | Base de datos, backend y frontend, en Docker, con datos de prueba, en un puerto que no choca con nada. Si por la tarde empieza el #13, tendrá otra carpeta y otra aplicación en otro puerto, y las dos conviven. |
| - | ==== 2. Decidir qué se va a hacer ==== | + | ==== 2. Specification |
| - | Abre Claude Code en el worktree y pasa al **modo plan**: | + | Antes de escribir código, un fichero que diga qué se va a hacer. Hay **dos formas**, según el issue: la A, con una especificación, |
| + | |||
| + | === Forma A: SDD === | ||
| + | |||
| + | El #12 es un CRUD (una entidad con su listado, alta, edición y borrado), así que va por especificación. Se abre Claude Code en el worktree y se pide: | ||
| < | < | ||
| - | Quiero implementar el issue #12. Antes de proponer nada, pregúntame lo que no esté | + | /sdd spec create |
| - | claro. El resultado es solo el fichero planes/12-alta-clientes.md. | + | |
| </ | </ | ||
| - | El agente | + | El agente |
| < | < | ||
| - | # Alta de clientes (#12) | ||
| - | |||
| - | ## Base de datos | ||
| - | V3__clientes.sql: | ||
| - | |||
| - | ## Backend | ||
| - | ClienteController, | ||
| - | |||
| - | ## Frontend | ||
| - | Componente cliente-form en / | ||
| - | |||
| ## Criterios de aceptación | ## Criterios de aceptación | ||
| - Al guardar un cliente válido aparece en el listado. | - Al guardar un cliente válido aparece en el listado. | ||
| Línea 70: | Línea 62: | ||
| </ | </ | ||
| - | **Leer y corregir ese plan es el trabajo importante del día.** Arreglar una frase aquí cuesta un minuto; arreglar el código que sale de una frase mal escrita cuesta una tarde. | + | Y el de tareas, así: |
| - | ==== 3. Implementar | + | < |
| + | - [ ] 1. Migración V3__clientes.sql y datos de prueba R__clientes.sql | ||
| + | - [ ] 2. Backend: Cliente, ClienteRepository, | ||
| + | - [ ] 3. Frontend: componente cliente-form en / | ||
| + | </ | ||
| + | |||
| + | **Leer y corregir esos ficheros es el trabajo importante del día.** Arreglar una frase aquí cuesta un minuto; arreglar el código que sale de una frase mal escrita cuesta una tarde. Se añade un criterio que faltaba al de requisitos y se vuelve a lanzar ''/ | ||
| + | |||
| + | === Forma B: Plan === | ||
| - | Conversación nueva ('' | + | Cuando el issue no es un CRUD (por ejemplo, el #13: un filtro por provincia en el listado de clientes), en vez de usar SDD se crea directamente un **plan**. Se pone el agente en **modo plan**, en el que solo lee y no toca código, y se le dice lo que se quiere y que escriba el plan en '' |
| < | < | ||
| - | Ejecuta @planes/ | + | - [ ] 1. Backend: parámetro provincia en GET /api/clientes |
| + | - [ ] 2. Frontend: desplegable de provincia en el listado, enlazado al parámetro | ||
| </ | </ | ||
| - | El agente escribe la migración, las clases del backend en sus capas, el componente de Angular y los datos de prueba, siguiendo las **convenciones del proyecto** que tiene guardadas. Al acabar, ejecuta '' | + | Al salir del modo plan, el fichero queda guardado en el worktree. Se lee y se corrige igual que la spec: que no falte una tarea y que cada una se pueda hacer y probar sola. Y aquí acaba la fase: el plan **no se implementa en esta conversación**. Si se hiciera, el contexto estaría lleno de todo lo que el agente |
| + | |||
| + | ==== 3. Implementation ==== | ||
| + | |||
| + | Conversación nueva (''/ | ||
| + | |||
| + | < | ||
| + | /git-flow update | ||
| + | </ | ||
| + | |||
| + | Y una sola orden, que depende de la forma: | ||
| + | |||
| + | === Forma A: SDD === | ||
| + | |||
| + | < | ||
| + | /sdd spec impl | ||
| + | </ | ||
| + | |||
| + | Implementa las tareas de la spec del worktree. | ||
| + | |||
| + | === Forma B: Plan === | ||
| + | |||
| + | < | ||
| + | /code impl plan_filtro-provincia.md | ||
| + | </ | ||
| + | |||
| + | Implementa las tareas del plan que se le pasa, en una conversación nueva que solo contiene el plan y el código que toca, no la planificación. | ||
| + | |||
| + | En las dos el agente va tarea a tarea: | ||
| Como el backend ha cambiado, lo reconstruye: | Como el backend ha cambiado, lo reconstruye: | ||
| < | < | ||
| - | ./arrancar.sh | + | ./app.sh start |
| </ | </ | ||
| El mismo script: reconstruye lo que ha cambiado y lo vuelve a levantar. El frontend ni eso: se recarga solo al guardar. | El mismo script: reconstruye lo que ha cambiado y lo vuelve a levantar. El frontend ni eso: se recarga solo al guardar. | ||
| - | **La otra forma: con Kiro.** El alta de clientes es un CRUD, y los CRUD tienen una estructura fija que el agente | + | ==== 4. Testing ==== |
| + | |||
| + | Los tests también | ||
| < | < | ||
| - | /kiro-spec-init CRUD de clientes: nombre (obligatorio), | + | /test unit create |
| - | /kiro-spec-requirements | + | /test arch create < |
| - | /kiro-spec-design -y | + | /test api create < |
| - | /kiro-spec-tasks -y | + | /test e2e create < |
| - | /kiro-impl | + | |
| </ | </ | ||
| - | El criterio para elegir es siempre el mismo: | + | |
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| - | ==== 4. Los tests ==== | + | Cada test se ejecuta al crearlo y se deja pasando. |
| - | Los tests también los escribe el agente, a partir del plan: | + | Después, lanzarlos |
| < | < | ||
| - | /crear-test-unitarios ClienteService | + | /test unit run |
| - | /crear-test-api Cliente | + | /test arch run |
| - | /crear-test-e2e planes/ | + | /test api run |
| + | /test e2e run | ||
| </ | </ | ||
| - | Salen los tests unitarios del servicio (uno por comportamiento), los de la API (cada endpoint, con sus errores) | + | Todo en verde. Después se abre '' |
| < | < | ||
| - | mvn test | + | /test unit repair |
| - | npm run test:api | + | /test arch repair |
| - | npm run test:e2e | + | /test api repair |
| + | /test e2e repair | ||
| </ | </ | ||
| - | Todo en verde. Después abre '' | + | Como lo que ha fallado es un test E2E, se lanza ''/ |
| - | ==== 5. Cerrar el issue ==== | + | ==== 5. Review & Finish |
| - | Antes de cerrar, | + | Antes de cerrar, |
| < | < | ||
| - | /revisar-calidad backend/ | + | /code review |
| </ | </ | ||
| - | El informe trae dos hallazgos | + | Compara el código con la spec y con las reglas de calidad del proyecto, y los tests con los criterios de aceptación. No toca nada: deja cada hallazgo como una tarea en '' |
| < | < | ||
| - | /git-flow commit | + | /code impl review.md |
| </ | </ | ||
| - | El agente mira los cambios y los agrupa en tres commits | + | Luego los commits y el cierre: |
| < | < | ||
| - | / | + | / |
| + | /git-flow finish | ||
| </ | </ | ||
| - | Antes de fusionar, el agente | + | '' |
| - | Por la tarde empieza el #13 igual. No le da tiempo a terminarlo: '' | + | Por la tarde empieza el #13 igual. No le da tiempo a terminarlo: '' |
| - | ==== 6. Publicar | + | ==== 6. Publish |
| El viernes, con tres issues cerrados en '' | El viernes, con tres issues cerrados en '' | ||
| < | < | ||
| - | / | + | / |
| </ | </ | ||
| - | '' | + | '' |
| - | ===== Lo que Lorenzo | + | ===== Lo que no se ha hecho ===== |
| - | Esto es lo que vende la fábrica. En todo el día Lorenzo | + | Esto es lo que aporta el arnés. En todo el día **no** |
| * escrito un comando de git: ni '' | * escrito un comando de git: ni '' | ||
| * buscado un puerto libre ni tocado un '' | * buscado un puerto libre ni tocado un '' | ||
| * escrito una clase de Java ni un componente de Angular; | * escrito una clase de Java ni un componente de Angular; | ||
| - | * escrito un test; | + | * escrito un test, ni arreglado uno que se rompió; |
| * revisado a mano que el código sigue las convenciones del proyecto; | * revisado a mano que el código sigue las convenciones del proyecto; | ||
| * cerrado un issue ni movido una tarjeta en el tablero; | * cerrado un issue ni movido una tarjeta en el tablero; | ||
| * entrado al servidor. | * entrado al servidor. | ||
| - | Lo que sí ha hecho es lo que solo puede hacer él: **decidir qué se construye** (el issue y el plan), **comprobar que es lo que quería** (los tests y el navegador) y **dar el visto bueno** (leer la revisión y fusionar). Programar con esta arquitectura es eso: pensar y comprobar, y que el resto se ejecute solo. | + | Lo que sí se ha hecho es lo que solo puede hacer una persona: **decidir qué se construye** (el issue y la spec), **comprobar que es lo que quería** (los tests y el navegador) y **dar el visto bueno** (leer la revisión y cerrar). Programar con esta arquitectura es eso: pensar y comprobar, y que el resto se ejecute solo. Y hay una regla que lo hace posible: **ningún comando se queda esperando a nadie**. Los que generan trabajo lo dejan en ficheros del repositorio (la spec, las tareas, la revisión); los que hacen algo irreversible solo comprueban que esos ficheros están como tienen que estar. Se decide entre comandos, no dentro de ellos. |
| ===== El ciclo de vida de un cambio ===== | ===== El ciclo de vida de un cambio ===== | ||
| - | Lo de arriba, resumido. Es lo que se repite con cada issue: al finalizar uno se empieza el siguiente, y solo de vez en cuando, cuando hay una versión que sacar, se publica. | + | Lo de arriba, resumido. Es lo que se repite con cada issue: al finalizar uno se empieza el siguiente, y solo de vez en cuando, cuando hay una versión que sacar, se publica. La figura no lo dice, pero se da por hecho: **cada fase empieza con una conversación nueva**, ''/ |
| {{: | {{: | ||
| + | |||
| + | ===== La gramática de los comandos ===== | ||
| + | |||
| + | Todo lo que se ha escrito en el día tiene la misma forma: **familia, sustantivo y verbo**, como '' | ||
| + | |||
| + | ^ Familia ^ Subcomandos ^ De qué se ocupa ^ | ||
| + | | ''/ | ||
| + | | '' | ||
| + | | ''/ | ||
| + | | ''/ | ||
| + | | ''/ | ||
| + | |||
| + | Lo que empieza por ''/'' | ||
| ===== Lo que hay que montar ===== | ===== Lo que hay que montar ===== | ||
| Línea 181: | Línea 230: | ||
| ^ Tema ^ Pieza ^ Lo que hace posible ^ | ^ Tema ^ Pieza ^ Lo que hace posible ^ | ||
| - | | 2 | Repositorio con instrucciones para el agente, tablero de issues y la skill ''/ | + | | 2 | Qué es un agente, Claude Code y OpenCode, skills, MCP, subagentes y bucles | El vocabulario con el que se entiende todo lo demás | |
| - | | 3 | La aplicación en Docker, una copia por worktree, con datos de prueba, y los scripts | + | | 3 | Repositorio con instrucciones para el agente, tablero de issues y la skill ''/ |
| - | | 4 | El flujo del plan y las convenciones | + | | 4 | La aplicación en Docker, una copia por worktree, con datos de prueba, y el script |
| - | | 5 | Los tests y la revisión, generados por el agente | Pasos 4 y 5: ''/ | + | | 5 | La skill ''/ |
| - | | 6 | CI y despliegue automático, | + | | 6 | La skill ''/ |
| - | | 7 | Resumen y lista de comprobación | Todo junto, para tenerlo a mano en la 2ª evaluación | | + | | 7 | CI y despliegue automático, |
| + | | 8 | Resumen y lista de comprobación | Todo junto, para tenerlo a mano en la 2ª evaluación | | ||
| - | Las **skills** | + | Las **skills** son las instrucciones que le dicen al agente cómo se hace cada cosa en este proyecto. Las escribe el alumno durante el trimestre, con ayuda del propio agente, y son lo que convierte una lista de pasos en una sola orden. Lo que no necesita inteligencia (arrancar, parar, |
| ===== Herramientas ===== | ===== Herramientas ===== | ||
| - | Todo esto tiene que estar instalado y funcionando antes del tema 2: | + | Todo esto tiene que estar instalado y funcionando antes del tema 3: |
| - | * **git** y **gh** (la CLI de GitHub) autenticado: | + | * **git** y **gh** (la CLI de GitHub) autenticado: |
| * **Docker** con Docker Compose: '' | * **Docker** con Docker Compose: '' | ||
| * **JDK 25** y **Maven**: '' | * **JDK 25** y **Maven**: '' | ||
| Línea 200: | Línea 250: | ||
| * **Claude Code** u **OpenCode**, | * **Claude Code** u **OpenCode**, | ||
| - | Qué es una skill, un agente o un MCP y cómo se maneja OpenCode está contado en el [[cursos: | + | Qué es una skill, un agente o un MCP, cómo se maneja OpenCode |
| ===== Ejercicios ===== | ===== Ejercicios ===== | ||
| Línea 206: | Línea 256: | ||
| ==== Ejercicio 1 ==== | ==== Ejercicio 1 ==== | ||
| * Comprueba que tienes todas las herramientas: | * Comprueba que tienes todas las herramientas: | ||
| - | * Lee [[cursos: | + | * Lee [[cursos: |
| ==== Ejercicio 2 ==== | ==== Ejercicio 2 ==== | ||
| * Crea en GitHub el repositorio de tu proyecto, vacío, con '' | * Crea en GitHub el repositorio de tu proyecto, vacío, con '' | ||
| - | * Clónalo y pide al agente que genere en '' | + | |
| + | | ||
| * Arranca los dos a mano, '' | * Arranca los dos a mano, '' | ||
| * Haz commit y push. En este tema los commits se hacen a mano: ''/ | * Haz commit y push. En este tema los commits se hacen a mano: ''/ | ||
clase/daw/daw-proyecto/tema01.1791964550.txt.gz · Última modificación: por claude · Actualmente bloqueado por: Lorenzo
