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>
3.2 KiB
3.2 KiB
MVP (doc-first)
Obiettivo
Eseguibile C# a riga di comando che inoltra un prompt a Claude Code (claude) lanciandolo nella directory dell'eseguibile, e ne mostra l'output.
Uso
llmrun.exe "spiega questo progetto"
Tutti gli argomenti sono uniti in un unico prompt.
Comportamento
- Se non ci sono argomenti: stampa l'uso ed esce con codice 2.
- Avvia
claude -p <prompt>(modalità non interattiva) conWorkingDirectory = AppContext.BaseDirectory. - Ritrasmette stdout e stderr del processo figlio in tempo reale.
- Esce con lo stesso exit code di
claude. - Se
claudenon è trovato: messaggio chiaro ed exit code 127.
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.
Invioinvia,Maiusc+Inviova 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
claudeesce 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 10 (WinForms).
Program.cs(CLI + avvio) eGui.cs(chat). Dipendenze NuGet solo per la GUI:Markdig(markdown→HTML) eMicrosoft.Web.WebView2(richiede il runtime WebView2, già presente su Windows 11). ProcessStartInfo.ArgumentListper passare il prompt (niente problemi di quoting).claudeè un .exe nativo (~/.local/bin): si avvia direttamente, senzacmd /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)
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,
claudeparte nella cartella dell'exe (verificabile chiedendo "pwd"). - L'output appare in streaming, non solo alla fine.
- L'exit code è propagato.
- Un prompt con virgolette e spazi arriva intatto.
Domande aperte
- Permessi: serve
--allowedToolso--permission-modeper l'uso non interattivo? - Formato output: testo semplice o
--output-format stream-json?