josemoreupeso.es
00-module-analyze.md β€” TLOTP
# 🎯 MΓ³dulo: Inspeccionar el Arsenal β€” Analizar Stack, MCPs y Plugins

## MisiΓ³n

Detectar el stack tecnolΓ³gico del proyecto, analizar los MCPs y plugins instalados,
puntuar su estado actual y guiar la aplicaciΓ³n de mejoras una a una.

---

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

**IMPORTANTE**: Comprobar primero si la documentaciΓ³n ya estΓ‘ cargada en el contexto de esta sesiΓ³n.

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

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

> **WebFetch 1**: `https://code.claude.com/docs/en/mcp`
> **Extraer**: estructura de configuraciΓ³n MCP, scopes (user/project), transports (stdio/SSE/HTTP),
> campos vΓ‘lidos en ~/.claude.json y .mcp.json, autenticaciΓ³n, servidores populares.

> **WebFetch 2**: `https://code.claude.com/docs/en/plugins`
> **Extraer**: estructura de plugins, tipos, diferencias con MCPs y skills, campos de configuraciΓ³n.

> **WebFetch 3**: `https://code.claude.com/docs/en/discover-plugins`
> **Extraer**: cΓ³mo descubrir plugins, catΓ‘logo oficial, criterios de selecciΓ³n.

**Fallback si WebFetch falla**: Continuar con conocimiento interno marcando sugerencias con ⚠️ sin doc oficial.

---

## Paso 1 β€” Detectar stack y configuraciΓ³n actual

Una sola pasada para minimizar llamadas Bash:

```bash
{
  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 -20
  cat composer.json 2>/dev/null | head -10

  echo "=== MCP USER SCOPE ==="
  cat ~/.claude.json 2>/dev/null || echo "{}"

  echo "=== MCP PROJECT SCOPE ==="
  cat .mcp.json 2>/dev/null || echo "{}"

  echo "=== SETTINGS ==="
  cat .claude/settings.json 2>/dev/null || echo "{}"
  cat ~/.claude/settings.json 2>/dev/null || echo "{}"
} 2>/dev/null
```

**Extraer**:
- **Stack**: lenguajes, frameworks, DBs, servicios detectados
- **MCPs user scope**: lista de servidores MCP en `~/.claude.json β†’ mcpServers`
- **MCPs project scope**: lista de servidores MCP en `.mcp.json β†’ mcpServers`
- **Plugins**: plugins instalados desde settings.json

---

## Paso 1b β€” Health check de MCPs instalados

Para cada MCP detectado, verificar si realmente estΓ‘ funcionando segΓΊn su tipo de transport.
Ejecutar todas las comprobaciones en una sola llamada Bash:

```bash
# Para cada MCP con transport stdio: intentar ejecutar el comando con timeout
# Para cada MCP con transport HTTP/SSE: comprobar accesibilidad del endpoint
# Comprobar variables de entorno requeridas

{
  # MCPs stdio β€” verificar que el comando existe y responde
  # (sustituir [command] por el valor real de cada MCP)
  timeout 3 [command] --version 2>/dev/null && echo "OK" || echo "FAIL"

  # MCPs HTTP/SSE β€” verificar accesibilidad del endpoint
  curl -s --max-time 3 -o /dev/null -w "%{http_code}" [url] 2>/dev/null

  # Variables de entorno β€” comprobar que existen
  # (sustituir ENV_VAR por las definidas en el config de cada MCP)
  echo "${ENV_VAR:+defined}" 2>/dev/null
} 2>/dev/null
```

**Estados posibles por MCP**:
- βœ… **Responde** β€” comando ejecuta correctamente / endpoint accesible (HTTP 2xx)
- ❌ **No responde** β€” comando falla o timeout / endpoint inaccesible o error HTTP
- ⚠️ **Env var faltante** β€” variable de entorno requerida no estΓ‘ definida en el entorno actual
- ℹ️ **No verificable** β€” transport desconocido o configuraciΓ³n incompleta (se marca como revisar)

**Guardar resultado del health check** para usarlo en el scoring del Paso 2.

---

## Paso 2 β€” Analizar y puntuar cada Γ­tem

Cada MCP y plugin parte de **10 puntos** y se penaliza:

### Criterios de scoring

| Criterio | PenalizaciΓ³n | Severidad |
|----------|-------------|-----------|
| MCP sin campo `command` o `url` vÑlido | -4 pts | ❌ Crítico |
| MCP no responde (comando falla o timeout) | -4 pts | ❌ Crítico |
| MCP endpoint HTTP inaccesible (error de red, 4xx o 5xx) | -3 pts | ❌ Crítico |
| Variable de entorno requerida no definida en el entorno | -3 pts | ❌ Crítico |
| MCP en scope incorrecto (user cuando debería ser project o viceversa) | -2 pts | ⚠️ Mejorable |
| Plugin sin configuración recomendada según docs oficiales | -2 pts | ⚠️ Mejorable |
| Redundancia: MCP + plugin que cubren la misma funcionalidad | -2 pts | ⚠️ Mejorable |
| MCP no verificable (transport desconocido o config incompleta) | -1 pt | ℹ️ Revisable |
| MCP relevante para el stack pero no instalado | -1 pt (global) | ℹ️ Oportunidad |

### Niveles de calidad

| Puntos | Nivel | DescripciΓ³n |
|--------|-------|-------------|
| 9–10 | 🏹 Flecha Negra | Arsenal perfectamente afinado |
| 7–8 | βš”οΈ Bien afilado | Solo mejoras menores |
| 5–6 | πŸ—‘οΈ En proceso | Necesita trabajo |
| < 5 | πŸ‰ Presa del dragΓ³n | Requiere refuerzo urgente |

### Score global

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

---

## Paso 3 β€” Generar informe con scoring

```
══════════════════════════════════════════════════════════════
🏹  BARDO β€” InspecciΓ³n del Arsenal
══════════════════════════════════════════════════════════════

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

πŸ”— MCPs INSTALADOS
──────────────────────────────────────────────────────────────
  🌍 User scope (~/.claude.json):
    🏹 10/10  github-copilot   β€” responde βœ… Β· scope correcto βœ…
    βš”οΈ  7/10  sentry           β€” responde βœ… Β· scope user ⚠️ (recomendado: project)

  πŸ“‚ Project scope (.mcp.json):
    ❌  3/10  db-explorer      β€” no responde ❌ Β· env DB_URL no definida ❌
    ❌  2/10  old-api-mcp      β€” endpoint inaccesible ❌ Β· command invΓ‘lido ❌

πŸ”Œ PLUGINS INSTALADOS
──────────────────────────────────────────────────────────────
  βš”οΈ  8/10  git-lens          β€” sin configuraciΓ³n recomendada ⚠️

══════════════════════════════════════════════════════════════
πŸ“Š Score global: 6.0/10 πŸ—‘οΈ β€” 5 Γ­tems Β· 1 🏹 Β· 2 βš”οΈ Β· 2 ❌
══════════════════════════════════════════════════════════════
```

---

## Paso 4 β€” MCPs y plugins recomendados no instalados

Basado en el stack detectado y la documentaciΓ³n oficial, listar quΓ© podrΓ­a ser ΓΊtil:

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

  πŸ”— MCPs recomendados no instalados:
    β€’ slack-mcp       β€” si usas Slack como equipo
    β€’ postgres-mcp    β€” acceso directo a tu DB desde Claude

  πŸ”Œ Plugins recomendados no instalados:
    β€’ (basado en docs/en/discover-plugins, WebFetch ya cargado)
──────────────────────────────────────────────────────────────
```

---

## Paso 5 β€” Lista de mejoras priorizadas

Construir lista completa 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": "🏹 ¿Qué deseas hacer con los resultados?",
    "multiSelect": false,
    "options": [
      {
        "label": "πŸ”§ Revisar y aplicar mejoras una a una",
        "description": ""
      },
      {
        "label": "πŸ”Œ Buscar e instalar los recomendados",
        "description": "Solo si se detectaron oportunidades"
      },
      {
        "label": "πŸ”™ Volver al menΓΊ principal",
        "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 para problemas de health check**:

| Problema detectado | SoluciΓ³n propuesta en el revisor |
|--------------------|----------------------------------|
| MCP no responde (stdio) | Verificar que el comando estΓ‘ en PATH; reinstalar si es necesario |
| Endpoint HTTP inaccesible | Mostrar la URL configurada + sugerir verificarla manualmente; actualizar si hay nueva URL |
| Env var no definida | Mostrar exactamente quΓ© variable falta + cΓ³mo definirla (`export VAR=valor` en `.env` o `~/.profile`) |
| Command invΓ‘lido | Mostrar el valor actual + proponer correcciΓ³n segΓΊn docs oficiales del MCP |

**Mostrar para cada mejora**:

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

πŸ“ Ítem afectado: [nombre / ruta completa]

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

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

🎯 Resultado esperado:
   [quΓ© mejorarΓ‘ tras aplicar]

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

**AskUserQuestion por cada mejora**:

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

**Comportamiento por opciΓ³n**:

- **βœ… Aplicar**: Ejecutar el cambio (Edit/Write/Bash). Confirmar con frase de lore de Lake-town, variada:
  - *"🏹 La flecha ha encontrado su blanco."*
  - *"🏹 Bien. Smaug no sobreviviría a este arsenal."*
  - *"🏹 Lake-town aprueba. El dragón no tiene escapatoria."*
  - *"🏹 Una flecha mÑs afinada en el carcaj."*
  - *(Variar β€” breve, con el tono del Arquero)*
  - Luego pasar a la siguiente mejora.
- **✏️ Modificar propuesta**: Preguntar qué cambiar. Mostrar propuesta actualizada y confirmar antes de aplicar.
- **⏭️ Saltar**: `🏹 "Esta flecha puede esperar su momento..."` y pasar a la 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 ARSENAL
══════════════════════════════════════════════════════════════
  βœ… Aplicadas:   [X]
  ✏️  Modificadas: [X]
  ⏭️  Saltadas:    [X]
══════════════════════════════════════════════════════════════
🏹  "El carcaj de Bardo nunca estÑ vacío. Hasta la próxima cacería."
```

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

---

## Casos especiales

### Sin MCPs ni plugins instalados
```
🏹 El arsenal estÑ vacío, viajero.

   No se encontraron MCPs ni plugins configurados.

   Rutas verificadas:
     β€’ ~/.claude.json (MCPs user scope)
     β€’ .mcp.json (MCPs project scope)
     β€’ .claude/settings.json (plugins)

πŸ’‘ Usa "Conseguir un MCP" o "Conseguir un plugin" para equipar tu arsenal.
```

### Arsenal perfecto
```
🏹 Los arqueros de Lake-town inspeccionan el carcaj...

βœ… Todos los MCPs y plugins estΓ‘n correctamente configurados.
   Smaug no tiene ninguna posibilidad, viajero.

Score global: 10/10 🏹 β€” todos en estado Flecha Negra
```

---

## πŸ”— Fuentes

Ver Γ­ndice completo en @prompts/docs-sources.md:
- MCP: `https://code.claude.com/docs/en/mcp`
- Plugins: `https://code.claude.com/docs/en/plugins`
- Discover plugins: `https://code.claude.com/docs/en/discover-plugins`

---

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