# Roadmap Dettagli dell'MVP in [MVP.md](MVP.md). ## Fase 0 — Doc-first - [x] Scrivere MVP.md e ROADMAP.md - [ ] Chiudere le domande aperte in MVP.md ## Fase 1 — MVP - [x] `dotnet new console`, `Program.cs` unico - [x] Lancio di `claude -p` nella cartella dell'exe, streaming, exit code - [ ] Publish single-file win-x64 e verifica dei criteri di accettazione - [x] GUI a chat: conversazione markdown in alto, input in basso, sessione con `--session-id`/`--resume` ## Fase 2 — Robustezza - [ ] Input del prompt da stdin e da file - [ ] Timeout e cancellazione (Ctrl+C propagato al figlio) - [x] GUI: scelta di modello (`--model`) ed effort (`--effort`) - [ ] CLI: stesse opzioni; inoltre `--allowedTools`, `--output-format` ## Fase 3 — Oltre - [x] GUI: cronologia chat (salvataggio JSON, barra laterale, riapertura con `--resume`, eliminazione) - [ ] GUI: streaming della risposta (`--output-format stream-json`), stop, rinomina/ricerca chat - [ ] Config file accanto all'exe - [ ] Test automatici e CI ## Fase 4 — Più motori (Claude Code, Codex, Antigravity) Obiettivo: oltre a Claude Code, usare **OpenAI Codex CLI** e **Antigravity CLI** (`agy`) dalla stessa chat, scegliendo il motore da una nuova schermata **Impostazioni** della GUI. Flag delle tre CLI (da verificare con `--help` delle versioni installate: derivano da documentazione e ricerche, non da prove su questo PC, dove `codex` e `agy` non sono ancora installati): | | Claude Code | Codex CLI | Antigravity CLI | |---|---|---|---| | Comando | `claude -p ` | `codex exec ` | `agy -p ` | | Continuare | `--session-id ` poi `--resume ` | `codex exec resume ` | da verificare | | Modello | `--model` | `-m` / `--model` | da verificare | | Effort | `--effort` | via `--config` (da verificare) | non noto | **Architettura** - [ ] Un'astrazione "motore" in C#: per ogni motore, eseguibile, argomenti per primo messaggio e per ripresa, elenco modelli, supporto effort, lettura dell'id di sessione. `RunClaude` diventa `RunEngine(engine, ...)`; la logica di avvio (cartella dell'exe, stdin chiuso) resta in un solo punto, eliminando la duplicazione CLI/GUI. - [ ] Rilevamento dei motori installati (PATH) e messaggio chiaro se mancano; i motori assenti sono disabilitati nelle Impostazioni. - [ ] Il file JSON di ogni chat memorizza il **motore**; riaprendo una chat si usa il suo motore. Il contesto di sessione non passa da un motore all'altro: cambiare motore apre una nuova chat. **GUI: Impostazioni** - [ ] Schermata/pannello Impostazioni (icona nella barra laterale) con selettore del **motore** attivo. - [ ] Il selettore Modello mostra solo i modelli del motore scelto; Effort compare solo se il motore lo supporta. - [ ] Impostazioni persistite su disco (motore, modello, effort), così si ritrovano alla riapertura. Si lega al "config file" della Fase 3. - [ ] Il motore della chat aperta è indicato nell'interfaccia (etichetta sull'intestazione o sulla voce in elenco). **Rischi e punti da verificare** - [ ] **Codex**: l'id di sessione non lo sceglie l'app (lo genera Codex): va letto dall'output (probabilmente con l'output JSON) per poter riprendere la chat. - [ ] **Antigravity**: segnalato un blocco di `agy -p` quando lanciato da sottoprocesso con output rediretto su Windows ([issue #318](https://github.com/google-antigravity/antigravity-cli/issues/318)); provare con un timeout (`--print-timeout`) e prevedere un messaggio d'errore. I flag vanno messi prima di `-p`. - [ ] **Permessi**: Codex e Antigravity chiedono conferma per le azioni; in modalità non interattiva serve decidere una politica (sola lettura di default, opzione esplicita per concedere di più) invece di usare flag che saltano ogni controllo. - [ ] Formato dell'output di ciascun motore (testo semplice o JSON) e normalizzazione prima del rendering markdown. - [ ] Autenticazione: ogni CLI deve essere già autenticata; l'app non gestisce login. - [ ] CLI (`LlmRun "prompt"`): opzione `--engine`, coerente con la GUI.