Metadata-Version: 2.4
Name: sintropi-bootstrap
Version: 2605.11.1626
Summary: Bootstrap and launcher for the sintropi-code CLI — authenticates via Keycloak PKCE and pulls the right engine version from each Sintropi gateway.
Project-URL: Homepage, https://bitbucket.org/eight-twenty/sintropi-bootstrap
Author-email: Eight20 <dev@eight-twenty.com>
License: Proprietary
Requires-Python: >=3.10
Requires-Dist: click>=8.0
Requires-Dist: requests>=2.28
Description-Content-Type: text/markdown

# sintropi-bootstrap

Bootstrap pubblico per la CLI `sintropi-code` — l'engine multi-agent di **Sintropi**.

Permette a uno sviluppatore di installare, autenticare e mantenere allineata la versione di `sintropi-code` corretta per ogni ambiente Sintropi (dev, qa, prod, tenant cliente).

## Installazione

```bash
pip install sintropi-bootstrap
```

## Uso

```bash
# Primo setup o switch ambiente (idempotente)
sintropi-bootstrap https://gateway.acme.eight20.com

# Comando principale — auto-detect versione, auto-download se cambiata
sintropi-code generate "App per la gestione ordini"
sintropi-code bootstrap my-app -o ./output/my-app
```

## Come funziona

1. `sintropi-bootstrap <gateway>`
   - Legge `GET {gateway}/api/bootstrap/config` (pubblico) → `{ keycloak_url, realm, client_id, current_sha, current_version }`
   - Avvia Authorization Code + PKCE su loopback `http://localhost:PORT` (RFC 8252) — apre il browser sulla pagina Keycloak standard
   - Verifica che l'utente abbia il ruolo realm `sintropi-code`
   - Scarica il wheel via `GET {gateway}/api/bootstrap/download` (Bearer JWT)
   - Crea un venv isolato in `~/.sintropi/versions/{sha}/.venv/` e ci installa `sintropi-agents`
   - Registra il gateway in `~/.sintropi/config.json`

2. `sintropi-code [args]`
   - Legge il gateway corrente da `~/.sintropi/config.json`
   - Verifica (con cache TTL 5 min) il SHA dell'engine corrente del gateway
   - Se diverso o assente → re-auth + download + install (transparente)
   - `exec` in `~/.sintropi/versions/{sha}/.venv/bin/python -m sintropi_agents.main <args>`

## Layout filesystem

```
~/.sintropi/
├── credentials.json    # token per-gateway (chmod 600)
├── config.json         # gateway noti + current + ultimo check
└── versions/
    ├── {sha-abc123}/
    │   ├── .venv/      # venv isolato con sintropi-agents installato
    │   └── manifest.json
    └── {sha-def456}/
        ├── .venv/
        └── manifest.json
```

Ogni gateway può avere una versione diversa dell'engine. La cache locale supporta più ambienti simultaneamente: switchare è istantaneo se la versione è già scaricata.

## Switch ambiente

`sintropi-bootstrap` è **idempotente**. Rilanciarlo con un URL diverso fa lo switch:

```bash
sintropi-bootstrap https://gateway.dev.acme.eight20.com    # ambiente dev
sintropi-code generate "..."

sintropi-bootstrap https://gateway.prod.acme.eight20.com   # switch a prod
sintropi-code generate "..."   # ora usa l'engine di prod
```

In alternativa, override puntuale con flag:

```bash
sintropi-code --gateway https://gateway.qa.acme.eight20.com generate "..."
```

## Sicurezza

- **Client public + PKCE**: nessun secret nel pacchetto né nella cache
- **Loopback**: il redirect torna su `http://localhost:PORT` random, niente esposizione di rete
- **State + PKCE verifier**: protezione CSRF e code interception
- **Role check server-side**: il gateway nega il download senza ruolo `sintropi-code`
- **SHA-256 verificato** sul wheel scaricato (oltre al TLS)

## Da Claude Cowork / shell remota

Il flow PKCE richiede un loopback HTTP. In una sessione remota senza browser:
- `sintropi-bootstrap` stampa l'URL Keycloak da aprire dalla workstation locale
- Serve un port-forward verso la sessione remota: `ssh -L PORT:localhost:PORT user@host`
- Il redirect a `http://localhost:PORT` torna alla sessione remota via il tunnel

## Licenza

Proprietary — © Eight20.
