0d55002e5e53074cc36aeb7aa667eddf994a51cb
Three behavioral changes around stuck planning subtasks: - OrphanRecovery no longer clears ParentTaskId. Queued children of a parent that is not in a planning phase are dequeued (Status: Queued -> Idle, BlockedByTaskId cleared) but stay attached to the parent so the historical lineage is preserved. - DiscardPlanningAsync stops promoting terminal (Done/Failed/Cancelled) children to top-level for the same reason - they remain ChildTasks of the (now non-planning) parent. - New PlanningLineageRecovery hosted service scans ~/.todo-app/planning-sessions/ and re-attaches a single, unambiguous blocked-by chain to its original planning parent when the parent_task_id links were lost. Refuses to guess when multiple candidate chains exist. UI now exposes ConnectionRestoredEvent on IWorkerClient, fired on first connect and every reconnect. ListsIslandViewModel refreshes counters and TasksIslandViewModel reloads the current list - so stale counts no longer survive a worker restart. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.
Description