fc9029de97e993d80572b9ac3047391d73865ce5
After `sc delete`, the service stays in "marked for deletion" state until every open handle (services.msc, Task Manager Services tab, Event Viewer, prior sc query process) is closed. The installer used to immediately call `sc create` and hit a silent hang / confusing "specified service has been marked for deletion" error. Poll `sc query` for up to 30s after delete; if the service is still registered past that, fail with actionable guidance (close the offending console or reboot). Also translate exit 1072 from `sc create` into the same human-readable hint. Co-Authored-By: Claude Opus 4.6 (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) │
│ │ :47821 │ │
│ ┌──────────┐│ │ ┌──────────┐ │
│ │ Ui ││ │ │ TaskQueue│ │
│ │(ViewModels)│ │ │ Claude CLI│ │
│ └──────────┘│ │ └──────────┘ │
└──────┬───────┘ └──────┬───────┘
│ │
└───────────┬───────────────┘
│
┌──────┴──────┐
│ ClaudeDo.Data│
│ (SQLite) │
└─────────────┘
Tech Stack
- .NET 8.0
- Avalonia 12.0.0 (Fluent theme)
- SQLite (WAL mode) via Microsoft.Data.Sqlite — raw ADO.NET, no ORM
- 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 ClaudeDo.slnx
# 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