From 2b742706f2c67b2954ae39e3050a444dc960ec98 Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Mon, 20 Jul 2026 17:45:05 +0200 Subject: [PATCH] docs(board): v2 redesign spec + implementation plan --- .gitignore | 1 + .../plans/2026-07-20-board-v2-redesign.md | 928 ++++++++++++++++++ .../2026-07-20-board-v2-redesign-design.md | 104 ++ 3 files changed, 1033 insertions(+) create mode 100644 docs/superpowers/plans/2026-07-20-board-v2-redesign.md create mode 100644 docs/superpowers/specs/2026-07-20-board-v2-redesign-design.md diff --git a/.gitignore b/.gitignore index 1112d7c..2af316a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ dist/ coverage/ .agenthub/ .worktrees/ +.superpowers/ diff --git a/docs/superpowers/plans/2026-07-20-board-v2-redesign.md b/docs/superpowers/plans/2026-07-20-board-v2-redesign.md new file mode 100644 index 0000000..199429e --- /dev/null +++ b/docs/superpowers/plans/2026-07-20-board-v2-redesign.md @@ -0,0 +1,928 @@ +# AgentHub Board v2 Redesign — Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Die Board-Seite (`/board`) bekommt das freigegebene v2-Redesign (Glass-Dashboard, animierte KPIs, Tab-Sidebar, Live-Feed, Logo + Splash) als modularisierte Neuimplementierung von `src/server/board.ts` — ohne Funktionsverlust. + +**Architecture:** Fastify rendert weiterhin einen HTML-String beim Serverstart (kein Build-Step, kein Framework). `src/server/board.ts` (2098 Zeilen Monolith) wird ersetzt durch `src/server/board/` mit Fokus-Modulen. Browser-Logik, die berechenbar ist (KPI-Modelle, Chart-Pfade, Chip-Kappung), liegt als **reine TypeScript-Funktionen** in `viewmodel.ts` — diese werden per `fn.toString()` in das Inline-` + + +`; +} +``` + +- [ ] **Step 3: `columns.ts` + `v1Budget.ts` aus dem alten board.ts portieren** + +- `src/server/board/v1Budget.ts`: `export const v1BudgetJs = \`...\`` mit dem Budget-Block aus Task 5 Step 3. +- `src/server/board/columns.ts` exportiert `columnsHtml(columns)` (3 Spalten-Skeleton, Glass-Panels, Status-Punkt + Count-Pill — Markup aus Mockup v2.5), `columnsJs()` (Port aus altem `board.ts`: `taskCard()` ~1123 inkl. Live-Konsole/Timer/Agent-Tag/Reviewer-Badge, Drag&Drop mit Race-Guard-Revert, Agent-Chip-Drop, `metric-flash`-Wertänderungspuls — **nicht** die Lottie-KPI-Icons, die entfallen), `modalsHtml()`/`modalsJs()` (New-Task-, Delete-, Task-Detail-Modal, unveränderte Logik), `dataLayerJs()` (`refresh()` ~1373: fetch `/tasks`+`/agents`, SSE `/events`, SSE `task-log`; nach jedem erfolgreichen `refresh()` Aufruf von `window.__b2UpdateKpis(tasks, agentColor)`, `window.__b2RenderThroughput(tasks)` und einmalig `window.__b2SplashDone()`; SSE-Events zusätzlich an `window.__b2FeedPush(...)` als kompakte einzeilige Meldung, z.B. `TSK-0145 → in_progress`). +- Karten-Enter-Animation: wie v1 nur für `.card-new` (Kommentar im alten Code ~663-666 beachten), damit Poll-Updates nicht flackern. +- `agentColor(name)`: bestehende Agenten-Farbpalette aus dem alten board.ts übernehmen (claude `#D97757`, codex `#10A37F` etc.) und dem KPI-Modul als Funktion bereitstellen. + +- [ ] **Step 4: Verdrahtung + altes board.ts löschen** + +1. `src/server/routes.ts:16`: `import { renderBoardHtml } from './board.js';` → `import { renderBoardHtml } from './board/index.js';` +2. `src/server/board.ts` löschen. +3. Prüfen, dass keine andere Datei mehr `./board.js` (Datei) importiert: `grep -rn "from '.*board\.js'" src tests` — erwartete Treffer nur `board/index.js` und `board/*.js`-interne Importe. + +- [ ] **Step 5: Build + volle Testsuite** + +Run: `npx tsc --noEmit` — Expected: keine Fehler. +Run: `npx vitest run` — Expected: gesamte Suite grün (inkl. `tests/boardV2*.test.ts`; bestehende Tests, die v1-board-Strings assertieren, sind ggf. an die neuen Mount-Points anzupassen — nur die Assertions aktualisieren, keine Testlogik ändern). + +- [ ] **Step 6: Manueller Check** + +```bash +pnpm build 2>/dev/null || npx tsc +node bin/agenthub.js server start +# Browser: http://127.0.0.1:3377/board +``` + +Checkliste: Splash erscheint und faded aus · KPI-Karten füllen sich (Chips max 3 + „+n") · Open-Area-Chart zeichnet sich · Done-Bar animiert · Über-Tabs (Token Insights ↔ Verlauf) + Sub-Tabs (Token ↔ Kosten) + Session/Total + Reset funktionieren wie v1 · Drag&Drop Statuswechsel · Agent-Zuweisung per Drop · Live-Konsole läuft · Live-Feed zeigt Events · SSE-Dot grün · `prefers-reduced-motion` (DevTools-Emulation) schaltet Animationen ab. + +- [ ] **Step 7: Commit** + +```bash +git add src/server/board/ src/server/routes.ts tests/boardV2.test.ts +git rm src/server/board.ts 2>/dev/null || true +git commit -m "feat(board): replace v1 monolith with modular v2 glass dashboard" +``` + +--- + +## Self-Review (ausgeführt) + +- **Spec-Abdeckung:** Logo (T1/T3), Splash (T3), Header m. Projektzelle (T3), KPIs inkl. aller 4 Karten-Designs (T1+T4), Spalten/Karten/Drag&Drop/Konsole/Modals (T6), Sidebar-Tabs inkl. Reset + Session/Total + Sub-Tabs (T5), Verlauf-Chart (T5, als Tasks/Tag — `/budget` hat verifiziert keine Historie; Spec-Fallback greift), Live-Feed (T5/T6), Modularisierung (T2-T6), reduced-motion (T2), Lottie-Entfall dokumentiert (T6 Step 1 Test + Step 3), Multi-Projekt nur visuell (T3, v3-Spec). Keine Lücken. +- **Placeholder-Scan:** Task 2 Step 2 und Task 6 Step 3 sind bewusst Port-Anweisungen mit exakten Quell-Referenzen (Datei + Zeilen) statt dupliziertem Code — der Code existiert bereits in `src/server/board.ts` bzw. im Mockup; keine TBDs. +- **Typ-Konsistenz:** `capChips`, `doneStats`, `backlogSeries`, `throughputSeries`, `areaPath`, `laneChips`, `KpiTask`, `AgentChip` in T1 definiert und in T4/T5 identisch verwendet; `window.__b2UpdateKpis` / `__b2RenderThroughput` / `__b2FeedPush` / `__b2SplashDone` konsistent zwischen T3/T4/T5/T6. diff --git a/docs/superpowers/specs/2026-07-20-board-v2-redesign-design.md b/docs/superpowers/specs/2026-07-20-board-v2-redesign-design.md new file mode 100644 index 0000000..f3ea771 --- /dev/null +++ b/docs/superpowers/specs/2026-07-20-board-v2-redesign-design.md @@ -0,0 +1,104 @@ +# AgentHub Board v2 — Redesign (Spec) + +Datum: 2026-07-20 +Status: freigegeben durch User (Mockup-Iterationen v2 → v2.5 im Visual Companion) + +## Ziel + +Die Board-Seite (`/board`) sieht aus wie ein echtes, modernes Dashboard: Glas-Optik (Richtung „Modern SaaS / Glass"), dezente Animationen, mehr Daten-Leben (Charts, Live-Feed), Logo + Splash Screen. **Alle vorhandenen Funktionen bleiben erhalten** (KPIs, Drag & Drop, Agent-Zuweisung, Live-Konsole in Karten, Modals, Token-Budget, SSE). Die Team-Seite bleibt unverändert. + +## Nicht-Ziele (Out of Scope) + +- Multi-Projekt-Architektur (Projekt anlegen/wechseln per Dropdown) → separater v3-Spec. In v2 nur visuell vorbereitet: Projektname im Header mit Chevron (`▾`), ohne Funktion. +- Verlaufs-Charts auf der Activity-Page (später). +- Kein Frontend-Framework (bewusste Entscheidung: Fastify + String-Templates + Vanilla JS + SSE, kein Build-Step). + +## Architektur-Entscheidung + +`src/server/board.ts` (aktuell ~2100 Zeilen, monolithisch, nutzt `ui-shared.ts` nicht) wird in Module zerlegt, ohne das Serving-Modell zu ändern (Fastify rendert HTML-String beim Start, Daten via `/tasks`, `/agents`, `/budget`, SSE `/events`): + +``` +src/server/board/ + index.ts — renderBoardHtml(projectName), orchestriert Module + styles.ts — v2 Design-Tokens + Glass-CSS + Animations-Keyframes + header.ts — Header (Logo, Projektzelle mit Chevron, Nav, New-Task, SSE-Dot) + kpis.ts — KPI-Reihe (Markup + Update-JS) + columns.ts — Spalten + Task-Karten + Drag&Drop + Live-Konsole + sidebar.ts — Budget-Card (Tabs) + Live-Feed + splash.ts — Splash-Screen (Markup + CSS + JS) + modals.ts — New-Task / Delete / Task-Detail (unveränderte Logik, neues Styling) +assets/ + logo.svg — AgentHub-Logo (Hexagon-Gradient, Cyan #38bdf8 → Violett #8b5cf6) +``` + +Design-Tokens werden an `ui-shared.ts` angeglichen (gleiche Farbwerte, Glass-Surface als `--surface` etc.), damit Board und die übrigen Seiten konsistent bleiben. Team-Page wird nicht angefasst. + +## Layout (wie Mockup v2.5) + +Dunkler Gradient-Hintergrund (`radial-gradient`, #1c2547 → #0e1226 → #090c18). Glass-Surfaces: `rgba(255,255,255,.045)`, Border `rgba(255,255,255,.09)`, Radius 12px. + +### Header +- Logo (neu, SVG, Hexagon-Gradient), `agenthub` Wortmarke +- Projektzelle `/ ▾` (nur Optik; Dropdown-Funktion kommt mit v3) +- Nav: Board (aktiv) / Team / Activity / Decisions +- Rechts: `+ New task` Button (Indigo→Violett-Gradient), SSE-Live-Dot (grün, ping-Animation) + +### KPI-Reihe (4 Karten, nur über dem Board-Bereich, nicht über Sidebar) +1. **Open** — Zahl `/ gesamt`, Mini-Area-Chart (Backlog-Verlauf, 14 Tage, aus `/tasks` abgeleitet), Grau +2. **In Progress** — Zahl, Agent-Chips: max. 3 sichtbar, dann `+n`-Chip; jeder Chip: Avatar (Agent-Farbe), Live-Punkt (pulsierend), Laufzeit +3. **Review** — Zahl, gleiche Chip-Darstellung (Reviewer), max. 3 + `+n` +4. **Done** — Zahl `/ gesamt`, Progress-Bar (Anteil erledigt, Grün-Gradient, animierter Fill), Beschreibung („63% · +5 diese Woche") klein rechtsbündig direkt über dem Bar-Ende + +Karten erscheinen gestaffelt (rise-Animation, 70ms Versatz). + +### Board-Spalten (unveränderte Funktion) +3 Spalten (Open / In Progress / Review) als Glass-Panels, Header mit Status-Punkt + Count-Pill. Task-Karten: Glass, Hover-Lift, Status-Farbe am linken Rand (dezent), Agent-Tag, Reviewer-Badge, Timer, Glow (`rgba(56,189,248,.35)` Border + Shadow) auf aktiv bearbeiteten Karten. **In-Progress-Karten zeigen einen Progress-Ring** (SVG-Radial, Füllung = verstrichene Zeit / geschätzte Dauer, Mitte = tickende verstrichene Zeit). Schätzung = Median der realen Bearbeitungsdauer der letzten erledigten Tasks (`claimedAt`→`updatedAt`, clientseitig aus `/tasks`); Fallback = Zeit-Kappe analog `MAX_LIVE_ESTIMATE_MIN_PER_TASK` aus `budgetService`. Über der Schätzung kippt der Ring von Cyan nach Amber. (Änderung gegenüber Mockup: ersetzt den dortigen Fantasie-Prozentbalken — ein echter Prozentwert existiert in den Daten nicht.) Drag&Drop (Status) + Agent-Chip-Drop (Zuweisung) + Live-Konsole bleiben funktional identisch. + +### Sidebar rechts +**Budget-Card** mit zwei Ebenen, immer genau ein Chart sichtbar: +- Über-Tabs: `Token Insights` (Default) | `Verlauf` +- Token Insights: Sub-Tabs `Token` | `Kosten`, Session/Total-Segmented-Control und **Reset-Button** wie v1 + - Token: Half-Donut (animierter Arc) + Per-Agent-Bars (Agent-Farben, animierter Fill) + - Kosten: Half-Donut + Firmen-Legende (Anthropic/OpenAI/Moonshot mit Farbpunkten) +- Verlauf: Area-Chart (Tokens, 14 Tage) mit Sollwert-Zeile („Ø x/Tag") +- Tab-Persistenz in `localStorage` + +**Live-Feed-Card** darunter: letzte ~5 Events aus SSE `/events` (kompakte Zeilen, pulsierender Punkt beim neuesten). + +### Splash Screen +Beim Laden von `/board`: Fullscreen-Overlay im Hintergrund-Gradient, zentriertes Logo mit Einblend-/Puls-Animation + „agenthub" Schriftzug; nach DOMContentLoaded + erstem Daten-Fetch (oder max. ~1,2s) smooth ausfaden und Dashboard einblenden. Kein Blockieren der eigentlichen Daten-Requests. + +### Logo +`assets/logo.svg`: Hexagon mit Cyan→Violett-Verlauf, ausgestanzter Kern (Knoten-Metapher, passt zum Agenten-Netzwerk). Verwendet in Header, Splash, Favicon. + +## Animationen (dezent, respektiert `prefers-reduced-motion`) +- `rise` (opacity + translateY 8px, 0,5–0,6s) für Karten beim ersten Render — nicht bei SSE-/Poll-Updates (wie bisher nur `.card-new`) +- `fill` (width 0 → Ziel) für Bars, `draw` (stroke-dashoffset) für Charts/Arcs +- `ping` für Live-Dot, `blink` für Status-Punkte +- KPI-Wertänderung: kurzer Flash (bestehendes `metric-flash`-Verhalten beibehalten) +- Keine Animation bei `prefers-reduced-motion: reduce` + +## Datenfluss +Unverändert: initiales `refresh()` (`GET /tasks`, `/agents`, `/budget`), SSE `/events` für Live-Updates, `task-log` SSE für Karten-Konsole, 3s-Polling für Budget. Neu abgeleitet aus vorhandenen Daten: +- Backlog-Mini-Area (Open): Open-Count pro Tag der letzten 14 Tage aus Task-`createdAt`/Status-Historie — falls nicht aus den vorhandenen Endpunkten ableitbar, aus `/tasks` (created/status/updated) clientseitig approximiert; kein neuer Endpunkt in v2 (Fallback: flache Linie mit aktuellem Wert). +- Verlauf-Area-Chart (Tokens/Tag): aus `/budget`-Historie, falls vorhanden; sonst gleiche Fallback-Strategie. Implementierung klärt, was `/budget` tatsächlich liefert. +- „+5 diese Woche" bei Done: aus `/tasks` (done + `updatedAt` in den letzten 7 Tagen). + +## Fehlerbehandlung +- SSE-Reconnect-Verhalten wie v1 (Verbindungs-Dot im Header). +- Wenn Budget-Endpunkt leer/fehlschlägt: Sidebar-Panels zeigen vorhandene v1-Leerzustände. +- Splash hat harte Obergrenze (~1,5s), damit er nie blockiert. + +## Testing +- Bestehende Tests (`tests/`) müssen grün bleiben (Board-Rendering ist String-basiert; Snapshot-/String-Assertions ggf. anpassen). +- Neue Unit-Tests für: `kpis.ts` (Chip-Kappung 3+`+n`, Prozent-Berechnung Done, „+diese Woche"), `sidebar.ts` (Tab-Default, Reset-Button-Markup), `splash.ts` (Overlay-Markup, reduced-motion Guard), Logo-Einbettung im Header. +- Manueller Check: `agenthub server start` → `/board` im Browser (Splash, Tabs, Drag&Drop, Live-Updates). + +## Entscheidungen (Log aus dem Brainstorming) +- Design-Richtung: „Glass / Modern SaaS" (Basis B), kein Nuxt/Vue (Overkill, widerspricht Simplicity-Ziel) +- Active/Open zu einer Karte „Open" verschmolzen (Kanban-Struktur: Open / In Progress / Review / Done) +- Sparklines verworfen zugunsten: Mini-Area (Open), Progress-Bar (Done), Chips (In Progress/Review) +- Chips statt Avatar-Stacks, gekappt bei 3 + `+n` +- Verschachtelte Tabs rechts (Token Insights default), Reset-Button wie v1 +- Verlaufs-Charts später ggf. auf Activity-Page +- Multi-Projekt = v3 (eigener Spec)