All checks were successful
Release / release (push) Successful in 35s
Drop the removed tag system, fix the retired Manual status and the atomic queue-claim location, refresh the App DI registrations to the Islands VMs, update the Data table list, correct a stale test reference, and document the interface-folder and single-consumer-fold conventions plus the .NET 8 build path. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2.6 KiB
2.6 KiB
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<ClaudeDoDbContext>used by singleton consumers (e.g. Worker)- Entity configuration via
IEntityTypeConfiguration<T>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(withBlockedByTaskId 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.
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 specdocs/open.md— verification checklist and improvement backlogdocs/improvement-plan.md— prioritized improvement items