CLAUDE.md diventa AGENT.md, pensato per qualsiasi assistente di codice. CLAUDE.md e GEMINI.md restano come file puntatori che importano AGENT.md con @AGENT.md, perché Claude Code e Gemini CLI cercano file con il proprio nome. docs/README.md descrive la regola (nessun contenuto nei puntatori) e i riferimenti nei doc sono aggiornati. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
5.1 KiB
5.1 KiB
ADR-0001 — GUI multipiattaforma in solo C# con Avalonia
- Stato: Accettata (implementata; restano due verifiche, vedi sotto)
- Data: 2026-10-15
- Sostituisce: la parte "GUI WinForms + WebView2 +
ui.html" di MVP.md (le sezioni interessate rimandano a questo ADR)
Contesto
L'app nasce per Windows: GUI WinForms con un solo WebView2 che carica ui.html (HTML/CSS/JS), CLI in Program.cs. L'obiettivo ora è avere un eseguibile standalone per Windows e Linux nel modo più semplice, scritto interamente in C#, senza HTML.
Oggi non è possibile: WinForms e WebView2 sono solo Windows, il csproj punta a net10.0-windows, la cronologia usa %LOCALAPPDATA%. La CLI invece è già portabile.
Criteri di decisione
- Un solo codice sorgente, compilabile per
win-x64elinux-x64. - Standalone: publish single-file self-contained, senza runtime né librerie da installare oltre a quanto offre un normale desktop.
- Solo C# (e XAML per il layout): niente HTML/CSS/JS.
- Mantenere la GUI a finestra (chat con barra laterale, markdown, selettori modello/effort).
- Riuso massimo della logica esistente (
claude -p, sessioni, cronologia JSON, Markdig).
Opzioni considerate
| Opzione | Esito | Motivo |
|---|---|---|
| Mantenere WinForms + WebView2 | Scartata | Solo Windows, e richiede HTML. |
| Photino / WebView nativa | Scartata | Richiede HTML e, su Linux, webkit2gtk da installare: non standalone. |
| Server HTTP locale (Kestrel) + browser | Scartata | Portabile e semplice, ma la UI resta HTML e non è una finestra propria. |
| MAUI | Scartata | Nessun supporto desktop Linux ufficiale. |
| Terminal.Gui (TUI) | Alternativa | Puro C#, binario leggero, ma è un'interfaccia da terminale, non una finestra. |
| Avalonia UI | Scelta | GUI nativa, C# + XAML, render Skia, Windows e Linux, publish single-file self-contained. |
Decisione
La GUI viene riscritta con Avalonia UI:
- Layout in XAML, logica in C# con
ViewModele binding.ui.html, il protocolloWebMessagee le dipendenze WinForms/WebView2 spariscono. - Rendering markdown con un renderer proprio che trasforma l'albero di Markdig in controlli Avalonia (
Gui/MarkdownView.cs), al posto della conversione in HTML. Si è scelto di non usareMarkdown.Avaloniaperché l'ultima versione pubblicata (11.0.x) è per Avalonia 11, mentre si usa Avalonia 12. I linkhttp(s)si aprono nel browser di sistema. - Un solo progetto con target
net10.0(non piùnet10.0-windows). Due publish single-file self-contained:win-x64elinux-x64. - La CLI (
Program.cscon argomenti) resta com'è e funziona su entrambi i sistemi. - La cronologia usa
Environment.SpecialFolder.LocalApplicationData(%LOCALAPPDATA%su Windows,~/.local/sharesu Linux), sottocartella<nome-app>/chats. Il nome viene da un'unica costante (vedi Nome del progetto). - La logica di avvio del processo (cartella dell'exe, stdin chiuso,
ArgumentList) viene estratta in un solo punto condiviso da CLI e GUI, eliminando la duplicazione oggi segnalata inAGENT.md(giàCLAUDE.md). Si lega all'astrazione "motore" di ADR-0002. - L'aspetto (token di colore, tipografia, accessibilità) resta definito in MVP.md → "Design (UI/UX)", tradotto in risorse/stili Avalonia. Il tema segue il sistema (chiaro/scuro) tramite
ThemeVariant.
Conseguenze
Positive
- Un solo eseguibile per sistema, senza dipendenze di runtime.
- Nessun HTML/JS da mantenere; il vincolo STA di WinForms/WebView2 non c'è più.
- Pulizia della duplicazione CLI/GUI.
Negative / costi
- Riscrittura della sola parte GUI (
Gui.cs+ui.html), più ampia di una soluzione basata sul browser. - Eseguibile più pesante (include Avalonia/Skia).
- Perdita di alcune comodità del web: la resa del markdown (tabelle, blocchi di codice, pulsante Copia) dipende dalla libreria scelta e va riprodotta o adattata.
- Su Linux serve un desktop con X11 o XWayland e le librerie di base (fontconfig ecc.).
Da verificare (prima di passare a "Accettata")
- Rendering markdown: tabelle, citazioni, liste, codice, link ed enfasi verificati con uno screenshot headless in tema chiaro e scuro (libreria
Markdown.Avaloniascartata, vedi Decisione). - Il publish single-file
linux-x64(48 MB con compressione) parte; verificato su WSL2 con WSLg. Da verificare su una distribuzione desktop pulita. - Il publish single-file
win-x64si compila e la CLI parte (provata da WSL tramite interoperabilità). Da verificare la GUI su Windows nativo. claudeviene trovato nel PATH su Linux e la CLI mantiene exit code e codice 127 (provato con unclaudefinto).- Il tema chiaro/scuro segue il sistema anche su Linux (impostato con
RequestedThemeVariant="Default"; non verificato su un desktop reale). - Le chat esistenti restano leggibili (stesso formato JSON). Se il nome cambia cambia anche la cartella dati: la vecchia cartella viene migrata (fatto per
LlmRun→agent-wiki-ui).
Riferimenti
- Piano di lavoro: ROADMAP.md, Fase 5.
- Specifica funzionale della chat: MVP.md.