josemoreupeso.es
05-module-requirements.md β€” TLOTP
# πŸ“‹ MΓ³dulo G5 β€” Requirements.md β€” Editor EARS

## MisiΓ³n

Crear `requirements.md` en formato EARS de forma interactiva.
Los requisitos se infieren del contexto Rohirrim + objetivo G3.
El usuario revisa, modifica y aprueba uno a uno.

---

## Paso 0 β€” El formato EARS

Mostrar brevemente antes de empezar:

```
⚑ "Los pergaminos deben ser precisos.
   Gandalf usa el formato EARS para que cada requisito
   sea inambiguo, verificable y trazable."

EARS β€” Easy Approach to Requirements Syntax:

  UBIQUITOUS:   THE SYSTEM SHALL [acciΓ³n]
  EVENT-DRIVEN: WHEN [disparador] THE SYSTEM SHALL [acciΓ³n]
  UNWANTED:     IF [condiciΓ³n no deseada] THEN THE SYSTEM SHALL [acciΓ³n]
  OPTION:       WHERE [feature opcional] THE SYSTEM SHALL [acciΓ³n]
  COMPLEX:      WHILE [estado] WHEN [disparador] THE SYSTEM SHALL [acciΓ³n]
```

---

## Paso 1 β€” Inferir requisitos automΓ‘ticamente

A partir del `contexto_rohirrim` + objetivo G3, inferir automΓ‘ticamente
entre 3 y 5 requisitos funcionales relevantes para la aventura descrita.

**Criterios de inferencia segΓΊn tipo de aventura** (del G3):
- **Nueva feature**: requisitos de la funcionalidad descrita + integraciones detectadas
- **Greenfield**: requisitos de producto + autenticaciΓ³n/seguridad bΓ‘sica
- **Refactoring**: requisitos de comportamiento preservado + criterios de refactoring
- **Spike**: hipΓ³tesis tΓ©cnicas a validar + criterios de Γ©xito del spike

**Si `contexto_docs` estΓ‘ disponible**: usar la documentaciΓ³n oficial fetcheada
en G4b para enriquecer los requisitos inferidos con las mejores prΓ‘cticas del
stack real del proyecto (naming conventions, patrones recomendados, restricciones conocidas).

---

## Paso 2 β€” RevisiΓ³n uno a uno

Aplicar el patrón estÑndar de TLOTP (`Ítem X/N`):

```
══════════════════════════════════════════════════════════════
πŸ“‹ REQUISITO [X/N]
══════════════════════════════════════════════════════════════

  🏷️  Tipo:       [UBIQUITOUS / EVENT-DRIVEN / UNWANTED / ...]
  πŸ“Œ Prioridad:  [MUST / SHOULD / COULD]

  [WHEN el usuario envΓ­e el formulario de registro]
  [THE SYSTEM SHALL validar el email, crear la cuenta y enviar
   un correo de confirmaciΓ³n en menos de 2 segundos]

══════════════════════════════════════════════════════════════
```

AskUserQuestion:

```json
{
  "questions": [{
    "header": "Requisito X/N",
    "question": "⚑ ¿Aceptamos este requisito?",
    "multiSelect": false,
    "options": [
      {
        "label": "βœ… Aceptar β€” pasar al siguiente",
        "description": ""
      },
      {
        "label": "✏️  Modificar β€” ajustar antes de aceptar",
        "description": ""
      },
      {
        "label": "⏭️  Saltar β€” no incluir este requisito",
        "description": ""
      },
      {
        "label": "🚫 Cancelar todo",
        "description": "Volver al menΓΊ sin guardar"
      }
    ]
  }]
}
```

---

## Paso 3 β€” AΓ±adir requisitos nuevos

Tras revisar los inferidos, preguntar:

```json
{
  "questions": [{
    "header": "Requisitos adicionales",
    "question": "⚑ ¿Quieres añadir mÑs requisitos?",
    "multiSelect": false,
    "options": [
      {
        "label": "✍️  Añadir un requisito nuevo",
        "description": ""
      },
      {
        "label": "βœ… No, los requisitos son suficientes",
        "description": "Continuar al preview del fichero"
      },
      {
        "label": "πŸ”™ Volver a revisar los anteriores",
        "description": ""
      }
    ]
  }]
}
```

Repetir este paso en bucle hasta que el usuario confirme que son suficientes.

---

## Paso 4 β€” Requisitos No Funcionales

AΓ±adir siempre una secciΓ³n de Requisitos No Funcionales (RNF) con al menos:
- Performance (si hay datos del stack que lo impliquen)
- Seguridad (siempre presente β€” inferir del stack Rohirrim)
- Mantenibilidad (siempre presente)

---

## Paso 5 β€” Preview completo

Mostrar el fichero completo antes de escribir:

```
══════════════════════════════════════════════════════════════
πŸ“‹ PREVIEW β€” requirements.md
══════════════════════════════════════════════════════════════
[contenido completo del fichero]
══════════════════════════════════════════════════════════════
```

AskUserQuestion:
- βœ… Guardar fichero β†’ continuar a G6
- ✏️ Ajustar algo β†’ volver a la revisiΓ³n
- πŸ”™ Volver al menΓΊ sin guardar

---

## Paso 6 β€” Escribir fichero

Usar Write para crear el fichero. Si ya existe, preguntar:
- βœ… Sobrescribir
- ⏭️ Crear como requirements-v2.md
- 🚫 Cancelar

**Ruta por defecto**: `docs/requirements.md`
Si no existe carpeta `docs/`: crear en la raΓ­z o donde el usuario prefiera.

---

## Lore al guardar

```
══════════════════════════════════════════════════════════════
πŸ“œ EL PERGAMINO DE LOS DESEOS HA SIDO INSCRITO
══════════════════════════════════════════════════════════════

  ⚑ Gandalf sella el pergamino con su bastón blanco:
     "Los requisitos son la brΓΊjula de La Comunidad."

  πŸ₯” Sam: "Β‘El seΓ±or Frodo no irΓ‘ solo sin saber adΓ³nde va!"
     β†’ [N] requisitos funcionales aseguran el camino.

  πŸ“„ Fichero: [ruta]/requirements.md
  πŸ“Š Total:   [N] requisitos ([MUST: X Β· SHOULD: Y Β· COULD: Z])

══════════════════════════════════════════════════════════════
```

---

## Post-generaciΓ³n β€” CTA de revisiΓ³n adicional

Tras escribir el fichero, mostrar:

```
╔════════════════════════════════════════════════════════════╗
β•‘  πŸ“œ EL PERGAMINO DE LOS DESEOS HA SIDO INSCRITO           β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
```
[el lore existente al guardar va aquΓ­ β€” no eliminarlo]

Si `GANDALF_MODE=fast`: continuar directamente a G6 sin preguntar.
Si `GANDALF_MODE=review` o no definido: AskUserQuestion:
- βœ… Continuar al diseΓ±o β†’ G6
- πŸ” Revisar requirements.md generado β†’ abrir el fichero para ajustes adicionales
- πŸ”™ Volver al menΓΊ sin continuar

---

## TransiciΓ³n

β†’ Cargar @prompts/gandalf/sections/06-module-design.md

---

**MΓ³dulo**: `05-module-requirements.md`
**Invocado desde**: `03-module-objective.md` / `04-module-continue.md`
**Requiere**: Write, contexto_rohirrim, objetivo G3