MVP LlmRun: CLI/GUI che lancia claude -p nella cartella dell'exe, con docs

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5.5 committed 2026-10-08 11:50:57 +02:00
1 parent 2718c3d2fb
commit 7d557b906f
7 files changed
+158 -22

No files matched your search

+20 -18
View File
@@ -2,30 +2,32 @@
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Stato del progetto
## Progetto
Repository vuoto (nessun codice, nessun git). Obiettivo: MVP di un eseguibile C# che, "sotto il cofano", invoca Claude Code (CLI `claude`) da terminale.
LlmRun: eseguibile C# (.NET 10, Windows) che invoca Claude Code (`claude -p`) da terminale. Senza argomenti apre una GUI WinForms, con argomenti funziona da CLI. Non è un repo git.
## Approccio doc-first
## Workflow doc-first (obbligatorio)
Prima si aggiorna la documentazione, poi il codice. Specifica e criteri di accettazione: [docs/MVP.md](docs/MVP.md). Fasi e stato: [docs/ROADMAP.md](docs/ROADMAP.md). Se il codice diverge dall'MVP, aggiornare prima i doc.
- Specifica e criteri di accettazione: [docs/MVP.md](docs/MVP.md). Fasi e stato: [docs/ROADMAP.md](docs/ROADMAP.md). Uso: [README.md](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), poi il codice, poi questo file se cambiano comandi, design o vincoli. Nessuna modifica deve lasciare i doc disallineati.
Design deciso: un solo `Program.cs`, nessuna dipendenza, lancio di `claude -p <prompt>` con `ProcessStartInfo.ArgumentList`, output in streaming, exit code propagato.
## Comandi
## Requisito chiave
Claude Code deve essere lanciato con working directory = la directory in cui risiede l'eseguibile, non la current directory del chiamante. In C# usare `AppContext.BaseDirectory` (non `Environment.CurrentDirectory`) come `ProcessStartInfo.WorkingDirectory`.
Nota: con single-file publish `Assembly.Location` è vuoto, quindi `AppContext.BaseDirectory` è la scelta corretta.
## Comandi (da .NET SDK, una volta creato il progetto)
- Build: `dotnet build`
- Run: `dotnet run`
- Build: `dotnet build` (LlmRun.csproj, net10.0-windows, WinForms)
- GUI: `dotnet run`; CLI: `dotnet run -- "prompt"`
- Publish single-file: `dotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=true`
- Test: non esistono ancora.
Aggiornare questa sezione quando esisteranno il `.csproj` e i test.
## Architettura
## Ambiente
Tutto in [Program.cs](Program.cs): top-level statements per la CLI e la classe `Gui` (Form) per la GUI. Entrambe costruiscono un `ProcessStartInfo` per `claude -p <prompt>` con `ArgumentList` (niente quoting manuale). Nessuna dipendenza esterna.
Windows. `claude` è installato come script npm (`claude.cmd`): con `Process.Start` e `UseShellExecute=false` può servire lanciare via `cmd.exe /c claude ...` oppure risolvere il percorso completo, altrimenti il processo non viene trovato.
- CLI: stdout/stderr ereditati (streaming), exit code propagato, 127 se `claude` non è nel PATH.
- GUI: output rediretto e mostrato riga per riga.
## Vincoli non ovvi
- La working directory di `claude` deve essere la cartella dell'exe: usare `AppContext.BaseDirectory`, mai `Environment.CurrentDirectory` né `Assembly.Location` (vuoto in single-file).
- Lo stdin di `claude` va redirezionato e chiuso subito, altrimenti aspetta 3s.
- `claude` è un .exe nativo (`~/.local/bin`), avviabile direttamente. Se fosse `claude.cmd` serve `cmd.exe /c`.
- La logica di avvio processo è duplicata tra CLI e GUI (volutamente, per restare in un file solo): se cambia, modificarla in entrambi i punti.