123 lines
7.4 KiB
Markdown
123 lines
7.4 KiB
Markdown
# UX-Struktur — Vorgaben für die Umsetzung
|
|
|
|
**Design:** `docs/superpowers/specs/2026-08-20-ux-struktur-design.md`. Dort stehen die
|
|
Entscheidungen und Belege; dieses Dokument wiederholt sie nicht, es schneidet die Arbeit.
|
|
|
|
**Ausführungsmodell: eine strikte Kette.** Alle drei Pakete ändern `locales/en.json` und
|
|
`locales/de.json` — die überlappen immer. Deshalb läuft nichts parallel.
|
|
|
|
```
|
|
#189 → #190 → #191 → #192 (mechanische Audit-Fixes, bereits delegiert)
|
|
│
|
|
└── A Task-Zeile + Kontextmenü
|
|
│
|
|
└── B Settings-Sidebar
|
|
│
|
|
└── C Erststart-Banner + Textkette
|
|
```
|
|
|
|
Jedes Paket hängt per `dependsOn` am Vorgänger. Der Picker holt es erst, wenn der Vorgänger
|
|
**Done** (also gemergt) ist.
|
|
|
|
## Datei-Eigentum (bindend)
|
|
|
|
| Paket | Besitzt | Darf **nicht** anfassen |
|
|
|---|---|---|
|
|
| **A** | `Ui/Views/Islands/TaskRowView.axaml(.cs)`, `Ui/ViewModels/Islands/TaskRowViewModel.cs`, `Ui/Views/Islands/Detail/TaskHeaderBar.axaml`, `locales/*` | `WorkConsole.axaml`, Settings-Dateien, `ListsIsland*` |
|
|
| **B** | `Ui/Views/Modals/SettingsModalView.axaml(.cs)`, `Ui/ViewModels/Modals/SettingsModalViewModel.cs`, `Ui/ViewModels/Modals/Settings/*`, `locales/*` | alles im Islands-Ordner |
|
|
| **C** | `Ui/Views/Islands/ListsIslandView.axaml(.cs)`, `Ui/ViewModels/Islands/ListsIslandViewModel.cs`, `Ui/Views/Islands/Detail/WorkConsole.axaml` (nur die eine Approve-Gate-Zeile), `Ui/Views/Islands/TasksIslandView.axaml` (nur Empty-State-Texte aus #192 nachschärfen), `locales/*` | `TaskRowView*`, Settings-Dateien |
|
|
|
|
Alle drei dürfen `tests/ClaudeDo.Ui.Tests` erweitern — aber nur eigene neue Testdateien bzw.
|
|
eigene neue Testmethoden anlegen, keine fremden umschreiben.
|
|
|
|
## Vorgaben für alle drei Pakete
|
|
|
|
- **Modell:** `sonnet`. **`maxTurns` explizit 200** — `model_presets` ist NULL, sonst gibt es
|
|
30 Turns und „exited with code 1 and no result".
|
|
- **Bauen** (`.slnx` scheitert auf .NET 8, laufender Worker sperrt `Debug`):
|
|
```
|
|
dotnet build src/ClaudeDo.App/ClaudeDo.App.csproj -c Release
|
|
dotnet test tests/ClaudeDo.Ui.Tests/ClaudeDo.Ui.Tests.csproj -c Release
|
|
dotnet test tests/ClaudeDo.Localization.Tests/ClaudeDo.Localization.Tests.csproj -c Release
|
|
```
|
|
- **Nur eigene Dateien stagen** (`git commit -- <pfade>`), nie `git add -A` — der `main`-Checkout
|
|
ist mit parallelen Sessions geteilt.
|
|
- **Keine Funktion still entfernen.** Wo etwas aus einer Oberfläche verschwindet, im
|
|
Abschlussbericht benennen, wo es jetzt liegt.
|
|
- **Locale-Parity** ist Testsache (Localization.Tests) — beide Dateien im gleichen Commit.
|
|
- **Visuelle Verifikation im Abschlussbericht als offen markieren.** Mika macht den visuellen
|
|
Pass; kein Task darf behaupten, die UI sei geprüft.
|
|
|
|
---
|
|
|
|
## Paket A — Task-Zeile + Kontextmenü
|
|
|
|
Themen 1 und 3 des Designs zusammen, weil sie dieselben drei Dateien anfassen.
|
|
|
|
- [ ] **A1 Kontextmenü umbauen.** Gruppe 1 (Send to queue, Remove from queue, Cancel execution,
|
|
Open quick session, Refine task) immer sichtbar, bei nicht erfüllter Bedingung
|
|
`IsEnabled=false` + Grund. Untermenüs „Mark as", „Planning", „Schedule" nach der Tabelle im
|
|
Design; Untermenü-Kopf disabled wenn leer. Der „Delete task…"-Eintrag aus #191 bleibt als
|
|
abgesetzte Gruppe unten. `MakeItem` bekommt einen `reason`-Parameter.
|
|
- [ ] **A2 Disabled-Gründe am VM.** `SendToQueueDisabledReason`, `CancelDisabledReason`,
|
|
`QuickSessionDisabledReason`, `RefineDisabledReason`, `PlanningDisabledReason` (`string?`)
|
|
auf `TaskRowViewModel`, mit Change-Notification an den passenden Stellen. Unit-Tests pro
|
|
Zustand.
|
|
- [ ] **A3 Tooltip-Fähigkeit verifizieren.** Headless prüfen, ob Avalonia 12 einen `ToolTip` auf
|
|
einem `IsEnabled=false` MenuItem anzeigt. Ja → Tooltip. Nein → Grund als Suffix im Header.
|
|
Das Ergebnis gehört in den Abschlussbericht (es ist eine Projekt-Erkenntnis, kein Detail).
|
|
- [ ] **A4 Hover-/Selektions-Aktionen.** `IsHovered` + `ShowRowActions => IsHovered || IsSelected`
|
|
am `TaskRowViewModel`; `PointerEntered`/`PointerExited` in `TaskRowView.axaml.cs`.
|
|
Refine-Button, ungesetzter Star und Dequeue-X werden damit AND-verknüpft; `IsRefining`-Spinner
|
|
bleibt ausgenommen. Grid-Spalten unverändert lassen, damit die Zeile nicht springt.
|
|
- [ ] **A5 Branch verlagern.** Branch-Chip aus `TaskRowView.axaml` entfernen und den Branch-Namen
|
|
in `TaskHeaderBar.axaml` als Meta-Zeile aufnehmen (er steht bisher nirgends im Detail-Pane).
|
|
Ohne A5 darf der Chip nicht entfernt werden.
|
|
|
|
**Fertig, wenn:** Build grün, Ui.Tests + Localization.Tests grün, und der Bericht sagt für jedes
|
|
verschwundene Zeilen-Element, wo es jetzt erreichbar ist.
|
|
|
|
---
|
|
|
|
## Paket B — Settings-Sidebar
|
|
|
|
- [ ] **B1 Host umbauen.** TabStrip des bestehenden `TabControl` ausblenden, links eine
|
|
Sidebar-`ListBox` mit Gruppen-Labels BASIS/ERWEITERT, die `SelectedIndex` bindet.
|
|
Panel-Inhalte bleiben, wo sie sind. Fensterbreite 580 → 700.
|
|
`SettingsCategory(Key, Label, Group, IsVisible, RequiresRepo)` + `Categories` +
|
|
`SelectedCategory` am `SettingsModalViewModel`.
|
|
- [ ] **B2 General aufteilen.** „Allgemein" (Sprache, Accent, Default-Instructions) und
|
|
„Ausführung" (Model, Permission, Model-Presets, MaxTurns-Ceiling, Parallelität, Usage-Gate).
|
|
Kategorie „Berichte" neu mit Standup-Wochentag + Report-Excluded-Paths. Reihenfolge der
|
|
Kategorien: Allgemein, Ausführung, Prime Claude | Worktrees, Dateien & Prompts,
|
|
Session Skills, Berichte, Online Inbox.
|
|
- [ ] **B3 Session Skills zusammenlegen.** Checkbox-Liste aus General entfernen; in der Kategorie
|
|
„Session Skills" pro installiertem Skill eine Zeile mit Checkbox (global aktiv) +
|
|
Update/Remove, darunter das Install-Feld. **Speichern/Laden der Auswahl muss nachweislich
|
|
unverändert funktionieren** — Test dafür ist Pflicht, das ist die einzige echte
|
|
Regressionsstelle des Pakets.
|
|
- [ ] **B4 Repo-Hinweis.** `HasLinkedRepo` am `SettingsModalViewModel` (keine Liste mit
|
|
`WorkingDir` → false). Hinweisstreifen oben in Worktrees, Prime Claude, Session Skills und
|
|
Berichte: „Wirkt erst mit verknüpftem Repo" + Link, der den Repo-Import öffnet.
|
|
|
|
**Fertig, wenn:** Build grün, Tests grün, jede der acht Kategorien einmal aufrufbar, und Save →
|
|
Reopen zeigt alle Werte unverändert (inkl. Skill-Auswahl).
|
|
|
|
---
|
|
|
|
## Paket C — Erststart-Banner + Textkette
|
|
|
|
- [ ] **C1 Banner.** `HasNoLinkedRepo` am `ListsIslandViewModel` (true, solange keine User-Liste
|
|
ein `WorkingDir` hat; neu berechnet beim Listen-Load und nach List-CRUD/List-Settings-Save).
|
|
Banner unter dem Lists-Island-Header, optisch wie das Update-Banner des Shells, Button ruft
|
|
`OpenRepoImportCommand`. Kein Dismiss.
|
|
- [ ] **C2 Textkette abstimmen.** Die Empty-State-Texte aus #192 so nachschärfen, dass Banner →
|
|
„Liste ohne Repo" → „Liste mit Repo, aber leer" als ein Weg lesbar sind; der letzte nennt
|
|
„Send to queue" und den Worktree.
|
|
- [ ] **C3 Review-Zeile.** Am Approve-Gate-Hinweis in `WorkConsole.axaml` (den #190 baut) eine
|
|
Zeile ergänzen, die sagt, dass Approve gleichzeitig das Mergen der ganzen Einheit ist.
|
|
Nur diese eine Stelle in der Datei anfassen.
|
|
|
|
**Fertig, wenn:** Build grün, Tests grün, und die vier Texte im Bericht als zusammenhängende
|
|
Kette zitiert sind (damit Mika sie ohne App lesen kann).
|