# ClaudeDo A desktop task management app that executes tasks autonomously via Claude CLI in isolated git worktrees. ## Architecture Two-process system communicating over SignalR (`127.0.0.1:47821`): - **ClaudeDo.App** — Avalonia desktop entry point, DI container setup - **ClaudeDo.Ui** — Views, ViewModels, SignalR client (MVVM with CommunityToolkit.Mvvm) - **ClaudeDo.Data** — SQLite data layer, repositories, models, GitService - **ClaudeDo.Worker** — ASP.NET Core hosted service, task queue, Claude CLI runner - **ClaudeDo.Worker.Tests** — xUnit integration tests with real SQLite and real git ## Tech Stack - .NET 8.0, Avalonia 12.0.0 (Fluent theme) - SQLite (WAL mode) via Entity Framework Core (Microsoft.EntityFrameworkCore.Sqlite) - SignalR for real-time IPC - CommunityToolkit.Mvvm (`[ObservableProperty]`, `[RelayCommand]`) - Git worktrees for task isolation ## Key Paths - DB: `~/.todo-app/todo.db` - UI config: `~/.todo-app/ui.config.json` - Worker config: `~/.todo-app/worker.config.json` - Logs: `~/.todo-app/logs/` - Worktrees: configured per worker (sibling or central strategy) ## Conventions - Repository pattern — each entity has its own async repository - All data operations are async with CancellationToken support - EF Core migrations manage schema (Migrations/ folder in ClaudeDo.Data) - `IDbContextFactory` used by singleton consumers (e.g. Worker) - Entity configuration via `IEntityTypeConfiguration` in Configuration/ folder - Task status flow: Idle | Queued -> Running -> Done | Failed | Cancelled - Worktree state flow: Active -> Merged | Discarded | Kept - The queue picker claims tasks by `Status=Queued` (with `BlockedByTaskId IS NULL`); the legacy tag system was removed - Interfaces live in an `Interfaces/` subfolder beside their consumers (namespace unchanged) - Small single-consumer helper types live in their consumer's file, not standalone files - Commit messages use conventional format: `{commitType}(slug): title` - Views use compiled bindings (`x:DataType`) - ViewModels use `[ObservableProperty]` and `[RelayCommand]` source generators ## Building & Testing `dotnet build ClaudeDo.slnx` requires .NET 9; on .NET 8 build individual projects instead. ```bash dotnet build src/ClaudeDo.App/ClaudeDo.App.csproj # pulls in Ui + Data dotnet build src/ClaudeDo.Worker/ClaudeDo.Worker.csproj dotnet test tests/ClaudeDo.Worker.Tests # also: Data.Tests, Ui.Tests, Installer.Tests, Releases.Tests ``` ## Docs - `docs/plan.md` — full architecture and design spec - `docs/open.md` — verification checklist and improvement backlog - `docs/improvement-plan.md` — prioritized improvement items