Files
ClaudeDo/docs/superpowers/plans/2026-08-20-ux-struktur.md
T

7.4 KiB

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 200model_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).