Files
ClaudeDo/docs/improvement-plan.md

93 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ClaudeDo — Improvement Plan (Session 2026-04-13)
Erfasst während manuellem Walkthrough der App. Priorisiert nach Schmerz/Aufwand.
---
## P1 — UX-Blocker (sollten zuerst)
### IP-1: UI ↔ Worker Auto-Reconnect
**Symptom:** Wenn UI vor Worker startet, bleibt die Verbindung tot. Manueller UI-Restart nötig.
**Soll:** SignalR-Client mit `WithAutomaticReconnect()` + Reconnect-Versuche im Hintergrund (exponential backoff). Status-Bar zeigt "verbinde…" während Retry.
**Dateien:** `src/ClaudeDo.Ui/Services/WorkerClient.cs` (oder wo `HubConnection` gebaut wird)
**Aufwand:** klein (~30 Zeilen, primär `HubConnectionBuilder`-Konfig + Reconnect-Handler)
**Risiko:** klein
### IP-2: Listen-Modus „Notes" (non-autonomous)
**Symptom:** Jede Liste ist Agent-gesteuert. Keine reine Notiz-Liste möglich.
**Soll:** Neues Feld `lists.kind` (`agent` | `notes`).
- `agent`: aktuelles Verhalten (Worker pickt Tasks)
- `notes`: Worker ignoriert die Liste komplett, UI versteckt Run-/Schedule-/Worktree-Felder, Tasks haben nur Title + Description + done-Checkbox.
**Dateien:**
- Schema: neue Spalte + Migration (siehe IP-9)
- `Data/Entities/TaskList.cs`, `Repositories/ListRepository.cs`
- `Worker/Queue/QueueService.cs` (Filter `WHERE list.kind = 'agent'`)
- UI: `ListEditorView` (Radio/ComboBox), `TaskListView` (conditional Columns), `TaskDetailView` (verstecken)
**Aufwand:** mittel (~Schema + Repo + UI an mehreren Stellen)
**Risiko:** mittel — bestehende Listen müssen Default `agent` bekommen
### IP-3: Doppelklick öffnet Edit-Dialog
**Symptom:** Edit nur über separaten Button/Menüpunkt.
**Soll:** `DoubleTapped`-Handler auf ListBox-Items (Listen-Pane) und auf TaskRows (Task-Pane) → öffnet jeweiligen Editor.
**Dateien:** `Views/MainWindow.axaml(.cs)`, `Views/TaskListView.axaml(.cs)`
**Aufwand:** klein (~1015 Zeilen pro Stelle)
**Risiko:** klein
### IP-4: Tag-Multi-Select statt Freitext
**Symptom:** Tags müssen getippt werden, keine Auto-Vervollständigung, Typos möglich.
**Soll:** Multi-Select-Control:
- Zeigt alle in DB existierenden Tags (DISTINCT aus `lists.tags` `tasks.tags`)
- Erlaubt Anlegen neuer Tags (Free-Text-Add)
- Chip/Token-Darstellung der ausgewählten Tags
**Dateien:**
- *neu* `Views/Controls/TagPicker.axaml` (wiederverwendbar)
- `ListEditorView`, `TaskEditorView` einbinden
- Repo-Methode `GetAllKnownTagsAsync()`
**Aufwand:** mittel (Custom-Control lohnt sich, da 2× verwendet)
**Risiko:** klein
### IP-5: Rechtsklick-Kontextmenü
**Symptom:** Quick-Actions nur über Buttons im Detail-Pane oder Toolbar.
**Soll:**
- **Liste:** Edit, Delete, New Task, ggf. „Mark all done" (für Notes-Listen aus IP-2)
- **Task:** Edit, Delete, Run Now, Show Diff, Merge, Cancel (je nach Status)
- Items kontext-sensitiv enabled/disabled je nach Task-Status & List-Kind
**Dateien:** `Views/MainWindow.axaml` (List-Pane), `Views/TaskListView.axaml` (Task-Pane)
**Aufwand:** kleinmittel — Avalonia `ContextMenu` + Command-Bindings
**Risiko:** klein
---
## P2 — Folge-Arbeiten (durch P1 ausgelöst)
### IP-6: Schema-Migration-Mechanismus
**Trigger:** IP-2 fügt eine Spalte zu `lists` hinzu. Aktuell `schema.sql` ist Drop-and-Create-Style.
**Soll:** Mini-Migrations-System: `migrations/0001_initial.sql`, `0002_lists_kind.sql`, … + `_schema_version` Tabelle.
**Aufwand:** kleinmittel
**Querverweis:** `open.md` Sektion 7 (Schulden-Tabelle: „Embedded schema.sql ohne Versionierung")
### IP-7: Status-Bar zeigt Reconnect-State
**Trigger:** IP-1 — User soll sehen, dass Verbindung gerade aufgebaut wird (statt nur „offline").
**Soll:** States: `connected` | `connecting` | `reconnecting` | `offline`. Farb-codiert.
**Datei:** `ViewModels/StatusBarViewModel.cs`
**Aufwand:** klein
### IP-8: Tag-Repository für `GetAllKnownTagsAsync`
**Trigger:** IP-4 braucht eine Quelle aller bekannten Tags.
**Soll:** Methode in `ListRepository`/`TaskRepository` ODER neuer `TagRepository`. SQL: `SELECT DISTINCT trim(value) FROM lists, json_each(lists.tags) UNION ...`.
**Aufwand:** klein
---
## Empfohlene Reihenfolge
1. **IP-1** (Auto-Reconnect) — sofortiger UX-Win, isoliert, klein
2. **IP-3** (Doppelklick) — trivial, sofort spürbar
3. **IP-5** (Kontextmenü) — kompakt, hebt Bedienkomfort deutlich
4. **IP-6** (Migrations) — Voraussetzung für IP-2
5. **IP-2** (Notes-Mode) — größerer Brocken, braucht Schema-Migration
6. **IP-8 → IP-4** (Tag-Repo, dann Multi-Select-Control)
7. **IP-7** (Reconnect-Status in StatusBar) — Polish nach IP-1
Block 1 (IP-1, IP-3, IP-5) ist ein realistischer Session-Block.