# boogiepop-cli

CLI para gestionar versiones y updates de seeds Boogiepop en proyectos downstream. Funciona con los tres seeds de la plataforma: **React (Vite)**, **Next.js** y **Streamlit**.

---

## Instalación

### React (Vite) / Next.js
```bash
npm install -g boogiepop-cli
```

### Streamlit (o sin Node.js)
Descargar el binario standalone desde [GitHub Releases](https://github.com/blanck1945/boogiepop-cli/releases):

| Sistema | Archivo |
|---------|---------|
| Windows | `boogiepop-win.exe` |
| Linux   | `boogiepop-linux`   |
| macOS   | `boogiepop-macos`   |

---

## Setup por seed

Una vez instalado, configurar el template de origen en el proyecto:

**React (Vite):**
```bash
boogiepop config -u https://github.com/blanck1945/boogiepop-react-seed
```

**Next.js:**
```bash
boogiepop config -u https://github.com/blanck1945/boogiepop-next-seed
```

**Streamlit:**
```bash
boogiepop config -u https://github.com/blanck1945/boogiepop-streamlit-seed
```

Esto crea `boogiepop.json` en la raíz del proyecto con la versión actual y el remote del template.

---

## Comandos

| Comando | Descripción |
|---------|-------------|
| `boogiepop config -u <url>` | Configura el template seed del proyecto (crea `boogiepop.json`) |
| `boogiepop version` | Muestra la versión del seed que tiene el proyecto actual |
| `boogiepop versions` | Lista todas las versiones disponibles en el template con descripción y badges |
| `boogiepop update` | Selector interactivo de versión + detecta conflictos + aplica el update |
| `boogiepop abort` | Aborta un update en progreso (merge activo o squash staged) |
| `boogiepop docs` | Sirve la documentación local en un servidor HTTP |
| `boogiepop bootstrap config` | Configura URL + API key del Bootstrap MS (**solo `boogiepop new`**) |
| `boogiepop platform config` | Credenciales admin contra la API desplegada (**register / publish / hide**) |
| `boogiepop new` | Wizard GitHub (Bootstrap MS) + **register-app** al final (`hubVisible=false`) |
| `boogiepop register-app [name]` | Registra app en **https://boogiepop.cloud** (pública, `hubVisible=false`) |
| `boogiepop publish [name]` | Muestra la app en el hub (`hubVisible=true`) |
| `boogiepop hide [name]` | Oculta la app del hub (`hubVisible=false`) |

**Documentación**

| Doc | Contenido |
|-----|-----------|
| [docs/CLI-BOOTSTRAP-INFRA.md](docs/CLI-BOOTSTRAP-INFRA.md) | Arquitectura, pasos del MS, Terraform, costos, troubleshooting |
| [docs/bootstrap-new.md](docs/bootstrap-new.md) | Setup rápido del Bootstrap MS |
| [docs/APP-STORAGE.md](docs/APP-STORAGE.md) | S3 por app vía API central (upload / list / download) |
| [docs/README.md](docs/README.md) | Índice de documentación |
| [AGENTS.md](AGENTS.md) | Guía para agentes de IA (flujo `new`, `publish`, reglas) |

---

## Diagrama de uso

```mermaid
flowchart TD
    subgraph SEEDS ["Templates disponibles"]
        S1["boogiepop-react-seed\nVite + React + Module Federation"]
        S2["boogiepop-next-seed\nNext.js 15 App Router"]
        S3["boogiepop-streamlit-seed\nPython + Streamlit"]
    end

    subgraph INSTALL ["Instalación (una sola vez)"]
        I1["npm install -g boogiepop-cli\n(React / Next.js)"]
        I2["Descargar binario standalone\n(Streamlit / sin Node.js)"]
    end

    subgraph SETUP ["Setup del proyecto (una sola vez)"]
        C["boogiepop config -u url\ncrea boogiepop.json\nregistra version + remote"]
    end

    S1 & S2 --> I1
    S3 --> I2
    I1 & I2 --> C

    C --> CHECK

    subgraph DAILY ["Uso cotidiano"]
        CHECK["boogiepop version\n¿en qué versión estoy?"]
        LIST["boogiepop versions\n¿qué versiones hay?"]

        CHECK --> COMP{¿hay updates\ndisponibles?}
        LIST  --> COMP

        COMP -->|No — ya en latest| DONE([Nada que hacer ✅])

        COMP -->|Sí| UPD["boogiepop update\nselector interactivo"]

        UPD --> CONF{¿archivos locales\nse solapan con el update?}

        CONF -->|Sin conflictos| APPLY["Aplica el update\narchivos propios preservados"]
        CONF -->|Conflictos detectados| WARN["⚠ Avisa al usuario\npide confirmación"]

        WARN -->|Cancela| DONE
        WARN -->|Confirma| APPLY

        APPLY --> MERGE{¿merge limpio?}

        MERGE -->|Sí| COMMIT["✅ git commit\npara finalizar"]
        MERGE -->|Conflictos git| RESOLVE["Resolver conflictos\nmanualmente"]

        RESOLVE --> ABORT{¿abortar?}
        ABORT -->|Sí| BACK["boogiepop abort\nvuelve al último commit"]
        ABORT -->|No| COMMIT
    end
```

---

## boogiepop.json

Archivo de configuración creado por `boogiepop config`. Vive en la raíz del proyecto.

```json
{
  "version": "1.0.1",
  "template": {
    "url": "https://github.com/blanck1945/boogiepop-react-seed",
    "remote": "template-origin",
    "branch": "main"
  }
}
```

| Campo | Descripción |
|-------|-------------|
| `version` | Versión del seed que tiene el proyecto actualmente |
| `template.url` | URL del seed template de origen |
| `template.remote` | Nombre del git remote del template (default: `template-origin`) |

---

## seed-manifest.json

Archivo en el repo del seed template que define overrides sobre las versiones tagueadas. Las versiones se obtienen automáticamente de los **git tags** del template — el manifest solo es necesario para marcar versiones como `mandatory` o `security`.

```json
{
  "overrides": {
    "1.0.0": {
      "mandatory": true,
      "severity": "security",
      "description": "Critical CORS fix",
      "link": "https://github.com/..."
    }
  }
}
```

| Campo | Descripción |
|-------|-------------|
| `overrides` | Map de `version → metadata`. Solo se agrega para versiones especiales |
| `mandatory` | Si `true`, el CLI muestra badge `⚠ mandatory` |
| `severity` | `"security"` muestra badge `🔴 security` |
| `description` | Sobreescribe el mensaje del tag anotado |
| `link` | Link opcional a documentación o release notes |

Si una versión no tiene override, se muestra como **optional** con el mensaje del git tag anotado como descripción.

---

## Distribución

### npm (automático en cada tag `v*`)

Al pushear un tag `v*` (ej. `v1.1.0`), GitHub Actions publica en npm **y** sube los binarios a la release.

Requisito único (una vez por repo): secreto **`NPM_TOKEN`** en GitHub → Settings → Secrets → Actions.  
Usá el mismo token de [npmjs.com](https://www.npmjs.com/) con permiso **Publish** que ya usaste para `boogiepop-ui` / `boogiepop-auth-sdk` (cuenta `virtualsnake9`).

```bash
npm install -g boogiepop-cli
boogiepop --version
```

Re-publicar un tag existente (si falló npm por falta de token):

```bash
# Opción A: re-disparar manualmente en GitHub → Actions → Release → Run workflow
# Opción B: mover el tag
git tag -d v1.1.0 && git push origin :refs/tags/v1.1.0
git tag v1.1.0 && git push origin v1.1.0
```

### Binarios standalone (.exe / linux / macos)

```bash
npm run build:bin   # local (requiere Node 22+)

# Release automática al pushear tag:
git tag v1.1.0
git push origin v1.1.0
# → boogiepop-win.exe, boogiepop-linux, boogiepop-macos en GitHub Releases
```
