GUI a chat con rendering markdown, sessioni e correzione del thread STA

Sostituisce la GUI a singola richiesta con una chat in stile claude.ai:
conversazione in markdown (Markdig + WebView2) in alto, input in basso,
contesto mantenuto con --session-id / --resume. La GUI ora gira su un
thread STA, necessario a WebView2. Documentazione aggiornata.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5.5 committed 2026-10-08 12:24:03 +02:00
1 parent e4f75f5aa4
commit 5a18b9c23d
7 files changed
+190 -85

No files matched your search

+11 -7
View File
@@ -16,20 +16,24 @@ Tutti gli argomenti sono uniti in un unico prompt.
4. Esce con lo stesso exit code di `claude`.
5. Se `claude` non è trovato: messaggio chiaro ed exit code 127.
## GUI
Senza argomenti si apre una finestra WinForms (prompt, pulsante, output) che usa lo stesso lancio di `claude -p`. Con argomenti resta la CLI.
La GUI ha una barra impostazioni con due menu: **Modello** (predefinito, Fable 5.1, Opus 5.5, Sonnet 5.5, Haiku 5.5: ogni voce mostra versione e ID completo, che è ciò che viene passato a `claude`; oppure ID digitato a mano) e **Effort** (predefinito, low, medium, high, xhigh, max). Passati a `claude` come `--model` / `--effort`; con "predefinito" il flag viene omesso. Solo GUI: la CLI non li espone ancora.
La finestra si apre a 1000x700 e output e prompt si ridimensionano con essa.
## GUI (chat)
Senza argomenti si apre una finestra WinForms in stile claude.ai/ChatGPT. Con argomenti resta la CLI.
- **In alto**: la conversazione, a messaggi alternati utente/Claude. Le risposte di Claude sono renderizzate in markdown (titoli, liste, tabelle, blocchi di codice) con Markdig dentro un WebView2; i messaggi utente sono testo semplice. Il rendering segue il tema chiaro/scuro di Windows.
- **In basso**: campo di input multilinea e pulsante Invia. `Invio` invia, `Maiusc+Invio` va a capo.
- **Sopra l'input**: menu **Modello** (predefinito, Fable 5.1, Opus 5.5, Sonnet 5.5, Haiku 5.5: ogni voce mostra versione e ID completo, che è ciò che viene passato a `claude`; oppure ID digitato a mano), menu **Effort** (predefinito, low, medium, high, xhigh, max) e pulsante **Nuova chat**. Passati come `--model` / `--effort`; con "predefinito" il flag viene omesso. Solo GUI.
- **Contesto**: la conversazione prosegue con `claude -p --session-id <guid>` al primo messaggio e `--resume <guid>` ai successivi. "Nuova chat" svuota la vista e genera un nuovo guid.
- La risposta compare a fine generazione (nessuno streaming nella GUI); durante l'attesa si vede "Claude sta scrivendo…". Se `claude` esce con errore, lo stderr appare come messaggio di errore.
- I link nelle risposte si aprono nel browser di sistema, non nella finestra. L'HTML grezzo nel markdown è disabilitato.
- Finestra 1000x700.
## Scelte tecniche
- .NET 8+, un solo `Program.cs`, nessuna dipendenza esterna.
- .NET 10 (WinForms). `Program.cs` (CLI + avvio) e `Gui.cs` (chat). Dipendenze NuGet solo per la GUI: `Markdig` (markdown→HTML) e `Microsoft.Web.WebView2` (richiede il runtime WebView2, già presente su Windows 11).
- `ProcessStartInfo.ArgumentList` per passare il prompt (niente problemi di quoting).
- `claude` è un .exe nativo (`~/.local/bin`): si avvia direttamente, senza `cmd /c`. Lo stdin è chiuso subito per evitare l'attesa di 3s di claude.
- Working dir: `AppContext.BaseDirectory`, non la cwd del chiamante.
## Fuori scope (MVP)
Modalità interattiva (chat), sessioni/`--resume`, config file, logging su file, test automatici, supporto Linux/macOS.
Streaming token-per-token nella GUI, annullamento di una risposta in corso, salvataggio/riapertura delle chat, config file, logging su file, test automatici, supporto Linux/macOS.
## Criteri di accettazione
- [ ] Eseguito da un'altra cartella, `claude` parte nella cartella dell'exe (verificabile chiedendo "pwd").