From 2718c3d2fbddd3099ba4ea95c849aa5dc9f82587 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Thu, 8 Oct 2026 11:29:42 +0200 Subject: [PATCH] Commit iniziale --- CLAUDE.md | 31 +++++++++++++++++++++++++++++++ docs/MVP.md | 36 ++++++++++++++++++++++++++++++++++++ docs/ROADMAP.md | 22 ++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 CLAUDE.md create mode 100644 docs/MVP.md create mode 100644 docs/ROADMAP.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..5df9193 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,31 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Stato del progetto + +Repository vuoto (nessun codice, nessun git). Obiettivo: MVP di un eseguibile C# che, "sotto il cofano", invoca Claude Code (CLI `claude`) da terminale. + +## Approccio doc-first + +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. + +Design deciso: un solo `Program.cs`, nessuna dipendenza, lancio di `claude -p ` con `ProcessStartInfo.ArgumentList`, output in streaming, exit code propagato. + +## 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` +- Publish single-file: `dotnet publish -c Release -r win-x64 --self-contained -p:PublishSingleFile=true` + +Aggiornare questa sezione quando esisteranno il `.csproj` e i test. + +## Ambiente + +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. diff --git a/docs/MVP.md b/docs/MVP.md new file mode 100644 index 0000000..58a16a9 --- /dev/null +++ b/docs/MVP.md @@ -0,0 +1,36 @@ +# 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 +1. Se non ci sono argomenti: stampa l'uso ed esce con codice 2. +2. Avvia `claude -p ` (modalità non interattiva) con `WorkingDirectory = AppContext.BaseDirectory`. +3. Ritrasmette stdout e stderr del processo figlio in tempo reale. +4. Esce con lo stesso exit code di `claude`. +5. Se `claude` non è trovato: messaggio chiaro ed exit code 127. + +## Scelte tecniche +- .NET 8+, un solo `Program.cs`, nessuna dipendenza esterna. +- `ProcessStartInfo.ArgumentList` per passare il prompt (niente problemi di quoting). +- Windows: `claude` è `claude.cmd`, quindi si avvia `cmd.exe /c claude ...`. +- Working dir: `AppContext.BaseDirectory`, non la cwd del chiamante. + +## Fuori scope (MVP) +Modalità interattiva, sessioni/`--resume`, 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"). +- [ ] 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 `--allowedTools` o `--permission-mode` per l'uso non interattivo? +- Formato output: testo semplice o `--output-format stream-json`? diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md new file mode 100644 index 0000000..bdfe5fc --- /dev/null +++ b/docs/ROADMAP.md @@ -0,0 +1,22 @@ +# Roadmap + +Dettagli dell'MVP in [MVP.md](MVP.md). + +## Fase 0 — Doc-first +- [x] Scrivere MVP.md e ROADMAP.md +- [ ] Chiudere le domande aperte in MVP.md + +## Fase 1 — MVP +- [ ] `dotnet new console`, `Program.cs` unico +- [ ] Lancio di `claude -p` nella cartella dell'exe, streaming, exit code +- [ ] Publish single-file win-x64 e verifica dei criteri di accettazione + +## Fase 2 — Robustezza +- [ ] Input del prompt da stdin e da file +- [ ] Timeout e cancellazione (Ctrl+C propagato al figlio) +- [ ] Opzioni passate a `claude` (`--model`, `--allowedTools`, `--output-format`) + +## Fase 3 — Oltre +- [ ] Modalità sessione (`--resume` / `--continue`) +- [ ] Config file accanto all'exe +- [ ] Test automatici e CI