MVP.md descrive ora la GUI Avalonia al posto di WinForms/WebView2 e il protocollo pagina-C# sparisce. ADR-0001 passa ad Accettata con l'esito delle verifiche (renderer markdown proprio, perché Markdown.Avalonia è per Avalonia 11). Il nome ha un'unica sorgente in docs/README.md, con la checklist di rinomina e la migrazione della cartella dati. README e CLAUDE.md seguono la nuova struttura Core/Gui e i due publish single-file. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
4.6 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Progetto
agent-wiki-ui (già LlmRun; il nome ha un'unica sorgente, vedi docs/README.md): eseguibile C# (.NET 10, Windows e Linux) che invoca Claude Code (claude -p) da terminale. Senza argomenti apre una GUI di chat Avalonia, con argomenti funziona da CLI.
Workflow doc-first (obbligatorio)
- Specifica e criteri di accettazione: docs/MVP.md. Fasi e stato: docs/ROADMAP.md. Indice dei doc e regole (SSOT, ADR): docs/README.md; una decisione architetturale si scrive solo nel suo ADR, gli altri doc la richiamano con un link. Uso: README.md.
- Ad ogni richiesta di modifica: aggiornare prima i doc interessati (MVP.md, ROADMAP.md con le spunte, README.md se cambia l'uso; un nuovo ADR in
docs/adr/per ogni scelta architetturale), poi il codice, poi questo file se cambiano comandi, design o vincoli. Nessuna modifica deve lasciare i doc disallineati.
Comandi
- Build:
dotnet build(agent-wiki-ui.csproj,net10.0, Avalonia) - GUI:
dotnet run; CLI:dotnet run -- "prompt" - Publish single-file (uno per sistema):
dotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=truee-r linux-x64 - Test: non esistono ancora. Per verificare la GUI senza schermo si può usare
Avalonia.HeadlessconCaptureRenderedFrame()in un progetto di prova fuori dal repo.
Architettura
Decisioni e motivazioni negli ADR (docs/adr/); qui solo la mappa del codice.
- Program.cs: top-level statements. Con argomenti è la CLI (
Claude.RunInherited); senza avvia Avalonia (App). - Core/Claude.cs: unico punto di avvio di
claude(cartella dell'exe, stdin chiuso,ArgumentList,--session-id/--resume,--model/--effortomessi se vuoti). Contiene anche l'elenco modelliCatalog.Models, da aggiornare quando escono nuovi modelli. - Core/ChatStore.cs: cronologia, un JSON per chat in
<LocalApplicationData>/<nome-app>/chats/<guid>.json(nome file = id di sessione, validato come Guid prima dell'uso). - Core/AppInfo.cs: nome dell'app, letto dall'
AssemblyNamedel csproj (unica sorgente). - Gui/MainViewModel.cs: stato e logica della chat (invio, apertura/eliminazione, salvataggio subito all'invio e di nuovo alla risposta, riapertura dell'ultima chat all'avvio).
- Gui/MainWindow.axaml (+
.cs): layout XAML con binding compilati. Gui/App.axaml: token di colore come risorse di tema chiaro/scuro e stili; specifiche indocs/MVP.md→ "Design (UI/UX)". Cambiando l'aspetto aggiornare quella sezione. - Gui/MarkdownView.cs: renderer markdown proprio (albero Markdig → controlli Avalonia,
DisableHtml). - Dipendenze NuGet: Avalonia (+ Desktop, Themes.Fluent), Markdig.
Vincoli non ovvi
- La working directory di
claudedeve essere la cartella dell'exe: usareAppContext.BaseDirectory, maiEnvironment.CurrentDirectorynéAssembly.Location(vuoto in single-file). - Lo stdin di
claudeva redirezionato e chiuso subito, altrimenti aspetta 3s. claudeè un eseguibile nativo (~/.local/bin), avviabile direttamente. Se fosseclaude.cmd(Windows) servecmd.exe /c.- Il nome dell'app non va scritto a mano nel codice: usare
AppInfo.Name. Cambiare nome cambia la cartella dati (vedi checklist in docs/README.md;ChatStoremigra le cartelle dei nomi precedenti). - Avalonia 12: la clipboard si usa con
using Avalonia.Input.Platform;(SetTextAsyncè un'estensione);TextBox.Watermarkè obsoleto, usarePlaceholderText. - Nel renderer markdown i colori si risolvono al momento del rendering (
TryFindResourceconActualThemeVariant) e la vista si ricostruisce al cambio di tema. - I link nel markdown si aprono con hit-test sul testo (
TextLayout.HitTestPoint) solo sehttp(s)e se non c'è una selezione in corso. - Il publish single-file richiede
IncludeNativeLibrariesForSelfExtract(nel csproj): Skia e HarfBuzz sono librerie native.
Skill del repo
.claude/settings.json abilita il plugin ui-ux-pro-max (marketplace nextlevelbuilder/ui-ux-pro-max-skill). Usarlo per le modifiche alla GUI WinForms (layout, usabilità, accessibilità).
Commit
Messaggi di commit in italiano: titolo breve all'indicativo o in forma nominale, eventuale corpo che spiega il perché. Mantenere la riga finale Co-Authored-By prevista dall'ambiente. Fare commit solo su richiesta.