92ce7a4a77b4aa6896c721eb8d402f0144128663
Dragging a task row onto a user list in the Lists island now reassigns it to that list. The task drag holds the pointer capture, so the release is resolved geometrically (new case between the Mission Control and reorder cases) instead of going through the Lists island's own DragDrop path, which never sees a DragEventArgs during a task drag. TaskRepository.MoveToListAsync reassigns the task plus every descendant (a child must never sit in a different list than its parent) and appends the task at the end of the target list. Guards: running tasks and tasks holding an Active/Kept worktree are rejected to the footer error strip; a move that changes repo asks for confirmation naming both repos. The source repo is read from the task's own list rather than the island's current list, which is a smart/virtual list with no working dir of its own whenever one of those is shown.
ClaudeDo
A desktop task management app that executes tasks autonomously via Claude CLI in isolated git worktrees.
Queue up coding tasks, and ClaudeDo picks them up one by one — each running in its own worktree so your main branch stays clean.
Architecture
Two-process system communicating over SignalR:
| Project | Role |
|---|---|
| ClaudeDo.App | Avalonia desktop entry point, DI container setup |
| ClaudeDo.Ui | Views, ViewModels, SignalR client (MVVM) |
| ClaudeDo.Data | SQLite data layer, repositories, models, GitService |
| ClaudeDo.Worker | ASP.NET Core hosted service, task queue, Claude CLI runner |
┌────────────────┐ SignalR ┌────────────────┐
│ ClaudeDo.App │◄───────────►│ ClaudeDo.Worker │
│ (Avalonia) │ 127.0.0.1 │ (ASP.NET Core) │
│ │ :47821 │ │
│ ┌────────────┐│ │ ┌────────────┐ │
│ │ Ui ││ │ │ TaskQueue │ │
│ │(ViewModels)││ │ │ Claude CLI │ │
│ └────────────┘│ │ └────────────┘ │
└───────┬────────┘ └───────┬────────┘
│ │
└──────────────┬───────────────┘
│
┌───────┴───────┐
│ ClaudeDo.Data │
│ (SQLite) │
└───────────────┘
Tech Stack
- .NET 8.0
- Avalonia 12.0.0 (Fluent theme)
- SQLite (WAL mode) via Entity Framework Core (EF Core + Migrations)
- SignalR for real-time IPC between UI and Worker
- CommunityToolkit.Mvvm for source-generated MVVM
- Git worktrees for task isolation
Prerequisites
- .NET 8.0 SDK
- Claude CLI installed and authenticated
- Git
Getting Started
# Build
dotnet build src/ClaudeDo.App
dotnet build src/ClaudeDo.Worker
# Run tests
dotnet test tests/ClaudeDo.Worker.Tests
# Run the app
dotnet run --project src/ClaudeDo.App
How It Works
- Create a task in the UI and tag it with "agent" to mark it for automated execution.
- The Worker picks up queued tasks and runs each one via Claude CLI in an isolated git worktree.
- When done, the worktree can be merged, kept for review, or discarded.
Task status flow: Manual | Queued → Running → Done | Failed
Worktree state flow: Active → Merged | Discarded | Kept
Configuration
All data and config lives under ~/.todo-app/:
| File | Purpose |
|---|---|
todo.db |
SQLite database |
ui.config.json |
UI settings |
worker.config.json |
Worker settings (worktree strategy, etc.) |
logs/ |
Application logs |
Project Structure
ClaudeDo.slnx
├── src/
│ ├── ClaudeDo.App/ # Desktop entry point
│ ├── ClaudeDo.Ui/ # Views & ViewModels
│ ├── ClaudeDo.Data/ # Data access layer
│ └── ClaudeDo.Worker/ # Background task runner
├── tests/
│ └── ClaudeDo.Worker.Tests/
├── schema/
│ └── schema.sql # Database schema
└── docs/
├── plan.md # Architecture & design spec
├── open.md # Verification checklist & backlog
└── improvement-plan.md # Prioritized improvements
License
Private — not licensed for redistribution.