4.5 KiB
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.csWorker/Queue/QueueService.cs(FilterWHERE 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 Defaultagentbekommen
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 (~10–15 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,TaskEditorVieweinbinden- 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: klein–mittel — AvaloniaContextMenu+ 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: klein–mittel
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
- IP-1 (Auto-Reconnect) — sofortiger UX-Win, isoliert, klein
- IP-3 (Doppelklick) — trivial, sofort spürbar
- IP-5 (Kontextmenü) — kompakt, hebt Bedienkomfort deutlich
- IP-6 (Migrations) — Voraussetzung für IP-2
- IP-2 (Notes-Mode) — größerer Brocken, braucht Schema-Migration
- IP-8 → IP-4 (Tag-Repo, dann Multi-Select-Control)
- IP-7 (Reconnect-Status in StatusBar) — Polish nach IP-1
Block 1 (IP-1, IP-3, IP-5) ist ein realistischer Session-Block.