josemoreupeso.es
00-module-analyze.md β€” TLOTP
# πŸ” MΓ³dulo: Inspeccionar el EjΓ©rcito β€” AnΓ‘lisis de Agentes con Scoring

## MisiΓ³n

Analizar los agentes instalados en el sistema (global y proyecto), puntuar su calidad
segΓΊn criterios oficiales, detectar oportunidades y guiar la aplicaciΓ³n de mejoras una a una.

---

## Paso 0 β€” DocumentaciΓ³n y marketplaces (on-the-fly)

**IMPORTANTE**: Comprobar primero si cada fuente ya estΓ‘ cargada en el contexto.

**Si ya estΓ‘ en contexto**: usar directamente sin re-fetchear.

**Si no estΓ‘ en contexto**, hacer WebFetch en paralelo:

> **WebFetch 1**: `https://code.claude.com/docs/en/sub-agents`
> **Extraer**: campos vΓ‘lidos del frontmatter YAML (name, description, tools, model, permissionMode,
> maxTurns, disallowedTools, skills, mcpServers, hooks, memory, background), scopes, invocaciΓ³n
> automΓ‘tica vs explΓ­cita, mejores prΓ‘cticas de description.

> **WebFetch 2**: `https://raw.githubusercontent.com/VoltAgent/awesome-claude-code-subagents/main/README.md`
> **Extraer**: lista completa de agentes por categorΓ­a, nombre y descripciΓ³n de cada uno.

> **WebFetch 3**: `https://aitmpl.com/agents`
> **Extraer**: agentes disponibles con nombre y descripciΓ³n.

**Fallback si WebFetch 1 falla**: Continuar marcando sugerencias con ⚠️ sin doc oficial.
**Fallback si WebFetch 2 o 3 fallan**: Mostrar en Paso 4 solo las URLs del marketplace como referencia, sin sugerir agentes concretos.

---

## Paso 1 β€” Detectar agentes instalados y stack del proyecto

Una sola llamada Bash para minimizar confirmaciones:

```bash
{
  echo "=== AGENTES GLOBAL ==="
  ls ~/.claude/agents/ 2>/dev/null || echo "(vacΓ­o)"

  echo "=== AGENTES PROYECTO ==="
  ls .claude/agents/ 2>/dev/null || echo "(vacΓ­o)"

  echo "=== STACK ==="
  ls package.json composer.json pyproject.toml go.mod Cargo.toml pom.xml 2>/dev/null
  cat package.json 2>/dev/null | head -10
  cat composer.json 2>/dev/null | head -8

  echo "=== ENV AGENT TEAMS ==="
  echo "${CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS:-no-definida}"
} 2>/dev/null
```

**Extraer**:
- **Agentes global**: lista de ficheros `.md` en `~/.claude/agents/`
- **Agentes proyecto**: lista de ficheros `.md` en `.claude/agents/`
- **Stack**: lenguajes, frameworks, DBs detectados
- **Agent Teams**: si estΓ‘ activo el experimental flag

---

## Paso 1b β€” Leer contenido de cada agente

Para cada fichero `.md` detectado, leerlo con la herramienta Read y extraer:

- `name` del frontmatter
- `description` del frontmatter
- `tools` del frontmatter
- `model` del frontmatter
- `permissionMode` del frontmatter
- `maxTurns` del frontmatter
- `type` del frontmatter (lead/worker β€” si no existe, tratar como worker)
- Cualquier otro campo relevante

Si un agente no tiene frontmatter delimitado por `---`, marcarlo como sin estructura vΓ‘lida.

---

## Paso 2 β€” Analizar y puntuar cada agente

Cada agente parte de **10 puntos** y se penaliza segΓΊn:

### Criterios de scoring

| Criterio | PenalizaciΓ³n | Severidad |
|----------|-------------|-----------|
| Sin campo `name` en frontmatter | -4 pts | ❌ Crítico |
| Sin campo `description` en frontmatter | -4 pts | ❌ Crítico |
| `description` demasiado vaga (< 30 chars, sin contexto de invocación) | -3 pts | ❌ Crítico |
| `tools` invÑlidos o inexistentes (no corresponden a herramientas reales de Claude Code) | -3 pts | ❌ Crítico |
| Sin frontmatter delimitado por `---` | -4 pts | ❌ Crítico |
| Sin campo `tools` (Claude usarΓ‘ todas las herramientas β€” riesgo de seguridad) | -2 pts | ⚠️ Mejorable |
| Sin campo `model` (Claude usarΓ‘ el modelo por defecto β€” puede ser subΓ³ptimo) | -1 pt | ℹ️ Revisable |
| `description` sin ejemplos de cuΓ‘ndo invocar al agente | -1 pt | ℹ️ Revisable |
| Agente redundante: misma funcionalidad que otro ya instalado | -2 pts | ⚠️ Mejorable |
| Agente relevante para el stack pero no instalado | -1 pt (global) | ℹ️ Oportunidad |

### Niveles de calidad

| Puntos | Nivel | DescripciΓ³n |
|--------|-------|-------------|
| 9–10 | πŸ‘‘ Guerrero de Gondor | Agente perfectamente forjado |
| 7–8 | βš”οΈ Soldado experimentado | Solo mejoras menores |
| 5–6 | πŸ—‘οΈ Recluta | Necesita entrenamiento |
| < 5 | πŸ’€ CaΓ­do en combate | Requiere refuerzo urgente |

### Score global

```
Score global = media de puntuaciones individuales (redondeado a 1 decimal)
```

---

## Paso 3 β€” Generar informe con scoring

```
══════════════════════════════════════════════════════════════
πŸ‘‘  ARAGORN β€” InspecciΓ³n del EjΓ©rcito
══════════════════════════════════════════════════════════════

πŸ“¦ STACK DETECTADO
──────────────────────────────────────────────────────────────
  PHP/Symfony Β· TypeScript Β· PostgreSQL

βš”οΈ  AGENTES INSTALADOS
──────────────────────────────────────────────────────────────
  🌍 Global (~/.claude/agents/):
    πŸ‘‘ 10/10  code-reviewer [πŸ‘‘ Lead]   β€” name βœ… Β· description clara βœ… Β· tools βœ…
    βš”οΈ  7/10  symfony-expert [βš™οΈ Worker] β€” name βœ… Β· description corta ⚠️ Β· tools βœ…
    πŸ’€  3/10  old-agent [βš™οΈ Worker]     β€” sin frontmatter ❌ Β· sin description ❌

  πŸ“ Proyecto (.claude/agents/):
    βš”οΈ  8/10  deploy-guardian   β€” name βœ… Β· sin tools ⚠️ Β· sin model ℹ️

══════════════════════════════════════════════════════════════
πŸ“Š Score global: 7.0/10 βš”οΈ β€” 4 agentes Β· 1 πŸ‘‘ Β· 2 βš”οΈ Β· 1 πŸ’€
══════════════════════════════════════════════════════════════
```

---

## Paso 4 β€” Agentes recomendados no instalados

Usando los datos obtenidos vΓ­a WebFetch en el Paso 0 (VoltAgent + aitmpl.com),
cruzar el stack detectado con los agentes disponibles en los marketplaces.

**CRÍTICO**: Los nombres y descripciones de los agentes recomendados deben extraerse
del contenido real de los WebFetch. No hardcodear nombres de agentes.

**Proceso de matching**:
1. Para cada tecnologΓ­a detectada en el stack (PHP, Symfony, TypeScript, Playwright, etc.)
2. Buscar en los datos de VoltAgent y aitmpl.com agentes cuyo nombre o descripciΓ³n
   mencione esa tecnologΓ­a o su dominio (testing, devops, backend, etc.)
3. Excluir los agentes ya instalados (comparar con la lista del Paso 1)
4. Ordenar por relevancia al stack

Mostrar resultado:

```
πŸ’‘ OPORTUNIDADES PARA TU STACK
──────────────────────────────────────────────────────────────
  Stack: PHP/Symfony Β· TypeScript Β· PostgreSQL

  πŸ“¦ VoltAgent:
    β€’ [nombre real del marketplace] β€” [descripciΓ³n real del marketplace]
    β€’ [nombre real del marketplace] β€” [descripciΓ³n real del marketplace]

  πŸ€– aitmpl.com:
    β€’ [nombre real del marketplace] β€” [descripciΓ³n real del marketplace]
──────────────────────────────────────────────────────────────
```

**Si el WebFetch del marketplace fallΓ³** (fallback):

```
πŸ’‘ OPORTUNIDADES PARA TU STACK
──────────────────────────────────────────────────────────────
  ⚠️  No se pudo consultar los marketplaces en tiempo real.
      ExplΓ³ralos directamente para encontrar agentes para tu stack:

  πŸ“¦ VoltAgent:  https://github.com/VoltAgent/awesome-claude-code-subagents
  πŸ€– aitmpl.com: https://aitmpl.com/agents
──────────────────────────────────────────────────────────────
```

**Si no hay matches tras el cruce**:

```
πŸ’‘ Tu stack no tiene coincidencias directas en los marketplaces
   o ya tienes instalados los agentes mΓ‘s relevantes.
   Explora el catΓ‘logo completo en "Buscar e instalar desde marketplaces".
```

---

## Paso 5 β€” Lista de mejoras priorizadas

Construir lista ordenada por severidad:
1. ❌ Críticos primero
2. ⚠️ Mejorables después
3. ℹ️ Oportunidades al final

Mostrar total: `X mejoras encontradas (Y ❌ crΓ­ticas Β· Z ⚠️ mejorables Β· W ℹ️ oportunidades)`

---

## Paso 6 β€” Opciones al usuario

```json
{
  "questions": [{
    "header": "Tras la inspecciΓ³n",
    "question": "πŸ‘‘ ΒΏCuΓ‘l es tu siguiente orden?",
    "multiSelect": false,
    "options": [
      {
        "label": "πŸ”§ Revisar y aplicar mejoras una a una",
        "description": ""
      },
      {
        "label": "πŸͺ Buscar e instalar agentes recomendados",
        "description": "Solo si se detectaron oportunidades"
      },
      {
        "label": "πŸ”™ Volver al menΓΊ de Aragorn",
        "description": ""
      }
    ]
  }]
}
```

> **Nota**: la opciΓ³n de instalar recomendados solo aparece si se detectaron oportunidades en el Paso 4.

---

## Paso 7 β€” Revisor uno a uno

Iterar por cada mejora de la lista del Paso 5, **en orden de severidad** (❌ primero, ⚠️ despuΓ©s, ℹ️ al final).

**Soluciones concretas por tipo de problema**:

| Problema detectado | SoluciΓ³n propuesta |
|--------------------|--------------------|
| Sin frontmatter | Mostrar estructura mΓ­nima correcta + proponer aΓ±adirla |
| Sin `name` | Proponer nombre basado en el fichero |
| Sin `description` o vaga | Proponer description detallada con ejemplos de cuΓ‘ndo invocar |
| Sin `tools` | Sugerir lista mΓ­nima segΓΊn el tipo de agente |
| `tools` invΓ‘lidos | Mostrar valor actual + lista de tools vΓ‘lidos de las docs |
| Description sin cuΓ‘ndo invocar | Proponer versiΓ³n mejorada con ejemplos de triggers |

**Mostrar para cada mejora**:

```
πŸ‘‘ MEJORA [X/N] β€” [❌/⚠️/ℹ️] [SEVERIDAD]
══════════════════════════════════════════════════════════════

πŸ“ Agente afectado: [nombre] ([ruta completa])

❌ Problema:
   [descripciΓ³n clara del problema detectado]

βœ… SoluciΓ³n propuesta:
   [quΓ© se aplicarΓ­a exactamente β€” incluir frontmatter o contenido si aplica]

🎯 Resultado esperado:
   [quΓ© mejorarΓ‘ β€” ej: "Claude lo invocarΓ‘ automΓ‘ticamente en contexto PHP"]

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

**AskUserQuestion por cada mejora**:

```json
{
  "questions": [{
    "header": "Mejora [X/N]",
    "question": "πŸ‘‘ ΒΏQuΓ© hacemos con este guerrero?",
    "multiSelect": false,
    "options": [
      {
        "label": "βœ… Aplicar",
        "description": "Aragorn aplicarΓ‘ esta mejora ahora"
      },
      {
        "label": "✏️ Modificar propuesta",
        "description": "Ajustar la soluciΓ³n antes de aplicar"
      },
      {
        "label": "⏭️ Saltar",
        "description": "Dejar sin cambios y pasar al siguiente"
      },
      {
        "label": "🚫 Cancelar todo",
        "description": "Abortar el revisor y ver resumen parcial"
      }
    ]
  }]
}
```

**Comportamiento por opciΓ³n**:

- **βœ… Aplicar**: Ejecutar el cambio (Edit/Write). Confirmar con frase Γ©pica variada:
  - *"πŸ‘‘ El guerrero ha sido forjado de nuevo."*
  - *"πŸ‘‘ Gondor aprueba. El ejΓ©rcito es mΓ‘s fuerte."*
  - *"πŸ‘‘ Un soldado mΓ‘s listo para la batalla."*
  - *"πŸ‘‘ Bien. Sauron no sobrevivirΓ­a a este ejΓ©rcito."*
  - Luego pasar a la siguiente mejora.
- **✏️ Modificar propuesta**: Preguntar qué cambiar. Mostrar propuesta actualizada y confirmar antes de aplicar.
- **⏭️ Saltar**: `πŸ‘‘ "Este guerrero puede esperar su entrenamiento..."` y pasar al siguiente.
- **🚫 Cancelar todo**: Saltar al resumen final (Paso 7b).

**IMPORTANTE**: Antes de aplicar cualquier cambio, indicar siempre la ruta exacta del archivo que se modificarΓ‘.

### Paso 7b β€” Resumen final del revisor

```
πŸ“‹ RESUMEN DEL EJΓ‰RCITO
══════════════════════════════════════════════════════════════
  βœ… Aplicadas:   [X]
  ✏️  Modificadas: [X]
  ⏭️  Saltadas:    [X]
══════════════════════════════════════════════════════════════
πŸ‘‘  "El ejΓ©rcito estΓ‘ listo. Gondor resistirΓ‘."
```

AskUserQuestion con opciones de continuaciΓ³n:
- `πŸ”™ Volver al menΓΊ de Aragorn`
- `πŸ”™ Volver a La Comunidad del CΓ³digo`

---

## Casos especiales

### Sin agentes instalados β€” Flujo de sugerencias uno a uno

Cuando no hay ningΓΊn agente instalado, NO mostrar solo el mensaje vacΓ­o.
En su lugar, iniciar automΓ‘ticamente un flujo de sugerencias:

**Paso A** β€” Mostrar estado y anunciar sugerencias:

```
πŸ‘‘ Los campamentos estΓ‘n vacΓ­os, seΓ±or.

   No se encontraron agentes en ningΓΊn scope.
   Rutas verificadas:
     β€’ ~/.claude/agents/ (global)
     β€’ .claude/agents/ (proyecto)

πŸ‡ Pero Aragorn ya conoce tu stack. Los heraldos parten al mercado...
   Un momento β€” consultando VoltAgent y aitmpl.com en tiempo real.
```

**Paso B** β€” Consultar marketplaces (si no estΓ‘n ya en contexto del Paso 0):
Reutilizar los datos de VoltAgent y aitmpl.com del Paso 0. Si el WebFetch fallΓ³,
ofrecer solo AskUserQuestion con opciones de ir al marketplace manualmente.

**Paso C** β€” Construir lista de sugerencias combinada:
1. Agentes del marketplace relevantes para el stack (matching nombre/descripciΓ³n con tecnologΓ­as detectadas)
2. Agentes de interΓ©s general independientes del stack (siempre ΓΊtiles para cualquier desarrollador):
   - code-reviewer (revisiΓ³n de cΓ³digo)
   - refactoring-specialist (mejora de cΓ³digo)
   - documentation-engineer (generar docs)
   - security-auditor (seguridad)
   - git-workflow-manager (gestiΓ³n de git)

Mezclar ambos grupos, priorizando los del stack primero.

**Paso D** β€” Sugerir uno a uno con AskUserQuestion:

Para cada agente de la lista (mostrar contador `Sugerencia [X/N]`):

```
πŸ‘‘ SUGERENCIA [X/N]
══════════════════════════════════════════════════════════════

[emoji personaje] [Personaje] dice:
   "[frase Γ©pica del personaje]"

  πŸ€– Agente: [nombre]
  πŸ“ [descripciΓ³n real del marketplace]
  🏷️  [categoría] · [fuente: VoltAgent / aitmpl.com]
  🎯 Por quΓ© para ti: [razΓ³n concreta β€” stack o uso general]

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

```json
{
  "questions": [{
    "header": "Sugerencia [X/N]",
    "question": "πŸ‘‘ ΒΏReclutamos a este guerrero?",
    "multiSelect": false,
    "options": [
      {
        "label": "βœ… SΓ­, reclutar ahora",
        "description": "Instalar en scope global (~/.claude/agents/)"
      },
      {
        "label": "πŸ“ SΓ­, pero en scope proyecto",
        "description": "Instalar solo en este repositorio"
      },
      {
        "label": "⏭️ Saltar β€” no me interesa",
        "description": "Pasar al siguiente"
      },
      {
        "label": "🚫 Parar sugerencias",
        "description": "Ver resumen e ir al menΓΊ"
      }
    ]
  }]
}
```

**Si elige instalar**: Descargar el agente (WebFetch al fichero raw del marketplace),
mostrar el personaje asignado con su frase Γ©pica (ver secciΓ³n "Lore al instalar agentes"),
y continuar con la siguiente sugerencia.

**Paso E** β€” Resumen final tras las sugerencias:

```
══════════════════════════════════════════════════════════════
πŸ‘‘ RECLUTAMIENTO INICIAL COMPLETADO
══════════════════════════════════════════════════════════════
  βœ… Reclutados: [X] guerreros
  ⏭️  Saltados:  [Y]

  El ejΓ©rcito de Gondor comienza a tomar forma, seΓ±or.
══════════════════════════════════════════════════════════════
```

AskUserQuestion:
- πŸͺ Ver mΓ‘s agentes en el marketplace
- πŸ” Inspeccionar el arsenal reciΓ©n creado
- πŸ”™ Volver al menΓΊ de Aragorn

### Arsenal perfecto

```
πŸ‘‘ Los heraldos inspeccionan el ejΓ©rcito...

βœ… Todos los agentes estΓ‘n correctamente forjados.
   Sauron no tiene ninguna posibilidad, seΓ±or.

Score global: 10/10 πŸ‘‘ β€” todos en estado Guerrero de Gondor
```

---

## πŸ”— Fuentes

Ver Γ­ndice completo en @prompts/docs-sources.md:
- Sub-agents: `https://code.claude.com/docs/en/sub-agents`
- VoltAgent:  `https://github.com/VoltAgent/awesome-claude-code-subagents`
- aitmpl.com: `https://aitmpl.com/agents`

---

**MΓ³dulo**: `00-module-analyze.md`
**Invocado desde**: `aragorn-main.md` (opciΓ³n "Inspeccionar arsenal de agentes")
**Requiere**: WebFetch on-demand, Read, Bash, Glob, Edit/Write (para aplicar mejoras)