@polderlabs/bizar 7.0.4 → 8.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/agent-browser.md +1 -1
- package/.claude/agents/baldr.md +1 -1
- package/.claude/agents/forseti.md +1 -1
- package/.claude/agents/frigg.md +1 -1
- package/.claude/agents/heimdall.md +1 -1
- package/.claude/agents/hermod.md +1 -1
- package/.claude/agents/mimir.md +1 -1
- package/.claude/agents/odin.md +1 -1
- package/.claude/agents/quick.md +1 -1
- package/.claude/agents/semble-search.md +1 -1
- package/.claude/agents/thor.md +1 -1
- package/.claude/agents/tyr.md +1 -1
- package/.claude/agents/vidarr.md +1 -1
- package/.claude/agents/vor.md +1 -1
- package/.claude/commands/goal.md +98 -0
- package/.claude/settings.local.json +7 -0
- package/bizar-dash/DESIGN.md +729 -969
- package/bizar-dash/GLYPH.md +418 -0
- package/bizar-dash/PLAN.md +1135 -0
- package/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js +6 -0
- package/bizar-dash/dist/assets/ActivityFeed-CqF6iSDQ.js.map +1 -0
- package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js +1 -0
- package/bizar-dash/dist/assets/ActivityView-qdhDjRtL.js.map +1 -0
- package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js +28 -0
- package/bizar-dash/dist/assets/AgentsView-BwXkOayl.js.map +1 -0
- package/bizar-dash/dist/assets/Badge-BH4C3aUF.js +1 -0
- package/bizar-dash/dist/assets/Badge-BH4C3aUF.js.map +1 -0
- package/bizar-dash/dist/assets/Button-RmN1RKhE.js +6 -0
- package/bizar-dash/dist/assets/Button-RmN1RKhE.js.map +1 -0
- package/bizar-dash/dist/assets/Card-BzJeYR2D.js +1 -0
- package/bizar-dash/dist/assets/Card-BzJeYR2D.js.map +1 -0
- package/bizar-dash/dist/assets/Chip-CN2bvm7a.js +1 -0
- package/bizar-dash/dist/assets/Chip-CN2bvm7a.js.map +1 -0
- package/bizar-dash/dist/assets/EmptyState-DEiBv4-r.js +1 -0
- package/bizar-dash/dist/assets/EmptyState-DEiBv4-r.js.map +1 -0
- package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js +6 -0
- package/bizar-dash/dist/assets/GoalsView-CvsrzEez.js.map +1 -0
- package/bizar-dash/dist/assets/KanbanCard-DZEaAiEr.js +21 -0
- package/bizar-dash/dist/assets/KanbanCard-DZEaAiEr.js.map +1 -0
- package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js +67 -0
- package/bizar-dash/dist/assets/LibrariesView-CPgKGPpM.js.map +1 -0
- package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js +13 -0
- package/bizar-dash/dist/assets/MemoryView-Bbez5pMN.js.map +1 -0
- package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js +1 -0
- package/bizar-dash/dist/assets/OverviewView-BDegBWgg.js.map +1 -0
- package/bizar-dash/dist/assets/Select-xwxbK8Ed.js +16 -0
- package/bizar-dash/dist/assets/Select-xwxbK8Ed.js.map +1 -0
- package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js +10 -0
- package/bizar-dash/dist/assets/SettingsRow-CppSgkT_.js.map +1 -0
- package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js +43 -0
- package/bizar-dash/dist/assets/SettingsView-DUc2meHV.js.map +1 -0
- package/bizar-dash/dist/assets/Sheet-C_sIEw35.js +1 -0
- package/bizar-dash/dist/assets/Sheet-C_sIEw35.js.map +1 -0
- package/bizar-dash/dist/assets/Sparkline-D664vGWW.js +1 -0
- package/bizar-dash/dist/assets/Sparkline-D664vGWW.js.map +1 -0
- package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js +16 -0
- package/bizar-dash/dist/assets/StatTile-BRsUIA6P.js.map +1 -0
- package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js +1 -0
- package/bizar-dash/dist/assets/TasksView-DVyX5-DY.js.map +1 -0
- package/bizar-dash/dist/assets/Textarea-Dk97nmjO.js +1 -0
- package/bizar-dash/dist/assets/Textarea-Dk97nmjO.js.map +1 -0
- package/bizar-dash/dist/assets/ViewHeader-dPd4zAyj.js +6 -0
- package/bizar-dash/dist/assets/ViewHeader-dPd4zAyj.js.map +1 -0
- package/bizar-dash/dist/assets/brain-BajPVibR.js +6 -0
- package/bizar-dash/dist/assets/brain-BajPVibR.js.map +1 -0
- package/bizar-dash/dist/assets/calendar-CaP_Bbgc.js +6 -0
- package/bizar-dash/dist/assets/calendar-CaP_Bbgc.js.map +1 -0
- package/bizar-dash/dist/assets/cmdk-BLWIhKrV.js +80 -0
- package/bizar-dash/dist/assets/cmdk-BLWIhKrV.js.map +1 -0
- package/bizar-dash/dist/assets/dnd-kit-DU8GZk7s.js +5 -0
- package/bizar-dash/dist/assets/dnd-kit-DU8GZk7s.js.map +1 -0
- package/bizar-dash/dist/assets/git-pull-request-CFRRwdxp.js +11 -0
- package/bizar-dash/dist/assets/git-pull-request-CFRRwdxp.js.map +1 -0
- package/bizar-dash/dist/assets/index-AL3OLUfz.js +1 -0
- package/bizar-dash/dist/assets/index-AL3OLUfz.js.map +1 -0
- package/bizar-dash/dist/assets/main-CcQfRfIJ.css +1 -0
- package/bizar-dash/dist/assets/main-LxX9zTRk.js +109 -0
- package/bizar-dash/dist/assets/main-LxX9zTRk.js.map +1 -0
- package/bizar-dash/dist/assets/plus-CVH1JB04.js +6 -0
- package/bizar-dash/dist/assets/plus-CVH1JB04.js.map +1 -0
- package/bizar-dash/dist/assets/terminal-B2sSd5t7.js +11 -0
- package/bizar-dash/dist/assets/terminal-B2sSd5t7.js.map +1 -0
- package/bizar-dash/dist/assets/trash-2-JtYRQ79q.js +6 -0
- package/bizar-dash/dist/assets/trash-2-JtYRQ79q.js.map +1 -0
- package/bizar-dash/dist/assets/triangle-alert-Nzbrm0I2.js +6 -0
- package/bizar-dash/dist/assets/triangle-alert-Nzbrm0I2.js.map +1 -0
- package/bizar-dash/dist/assets/useFetch-CoVWwbml.js +1 -0
- package/bizar-dash/dist/assets/useFetch-CoVWwbml.js.map +1 -0
- package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js +1 -0
- package/bizar-dash/dist/assets/useWebSocket-CVIQB8yG.js.map +1 -0
- package/bizar-dash/dist/assets/wrench-B7go551L.js +6 -0
- package/bizar-dash/dist/assets/wrench-B7go551L.js.map +1 -0
- package/bizar-dash/dist/{mobile.html → v8.html} +6 -9
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/bizar-dash/src/server/api.mjs +10 -0
- package/bizar-dash/src/server/bg-poller.mjs +81 -1
- package/bizar-dash/src/server/bg-poller.test.mjs +28 -0
- package/bizar-dash/src/server/progress-parser.mjs +221 -0
- package/bizar-dash/src/server/progress-parser.test.mjs +105 -0
- package/bizar-dash/src/server/routes/agents-cc.mjs +381 -0
- package/bizar-dash/src/server/routes/agents-cc.test.mjs +35 -0
- package/bizar-dash/src/server/routes/goals.mjs +307 -0
- package/bizar-dash/src/server/routes/tasks.mjs +11 -0
- package/bizar-dash/src/server/server.mjs +1 -57
- package/bizar-dash/src/web/v8/App.tsx +188 -0
- package/bizar-dash/src/web/v8/__tests__/App.test.tsx +102 -0
- package/bizar-dash/src/web/v8/__tests__/AppShell.test.tsx +79 -0
- package/bizar-dash/src/web/v8/__tests__/PageSkeleton.test.tsx +12 -0
- package/bizar-dash/src/web/v8/__tests__/SettingsView.test.tsx +84 -0
- package/bizar-dash/src/web/v8/__tests__/Sidebar.test.tsx +95 -0
- package/bizar-dash/src/web/v8/__tests__/activity.test.tsx +63 -0
- package/bizar-dash/src/web/v8/__tests__/agents.test.tsx +90 -0
- package/bizar-dash/src/web/v8/__tests__/control-plane.test.tsx +104 -0
- package/bizar-dash/src/web/v8/__tests__/controls.test.tsx +135 -0
- package/bizar-dash/src/web/v8/__tests__/cx.test.ts +25 -0
- package/bizar-dash/src/web/v8/__tests__/data.test.tsx +293 -0
- package/bizar-dash/src/web/v8/__tests__/feedback.test.tsx +213 -0
- package/bizar-dash/src/web/v8/__tests__/goals.test.tsx +105 -0
- package/bizar-dash/src/web/v8/__tests__/kanban.test.tsx +176 -0
- package/bizar-dash/src/web/v8/__tests__/libraries.test.tsx +70 -0
- package/bizar-dash/src/web/v8/__tests__/memory.test.tsx +60 -0
- package/bizar-dash/src/web/v8/__tests__/navigation.test.tsx +137 -0
- package/bizar-dash/src/web/v8/__tests__/settings.test.tsx +104 -0
- package/bizar-dash/src/web/v8/__tests__/theme.test.tsx +98 -0
- package/bizar-dash/src/web/v8/__tests__/useFetch.test.ts +92 -0
- package/bizar-dash/src/web/v8/__tests__/useWebSocket.test.ts +87 -0
- package/bizar-dash/src/web/v8/__tests__/views.test.tsx +182 -0
- package/bizar-dash/src/web/v8/data/fetcher.ts +59 -0
- package/bizar-dash/src/web/v8/data/types.ts +154 -0
- package/bizar-dash/src/web/v8/data/useFetch.ts +62 -0
- package/bizar-dash/src/web/v8/data/useWebSocket.ts +153 -0
- package/bizar-dash/src/web/v8/main.tsx +28 -0
- package/bizar-dash/src/web/v8/shell/AppShell.tsx +90 -0
- package/bizar-dash/src/web/v8/shell/PageSkeleton.tsx +29 -0
- package/bizar-dash/src/web/v8/shell/Sidebar.tsx +361 -0
- package/bizar-dash/src/web/v8/shell/StatusBar.tsx +63 -0
- package/bizar-dash/src/web/v8/shell/Topbar.tsx +113 -0
- package/bizar-dash/src/web/v8/shell/index.ts +15 -0
- package/bizar-dash/src/web/v8/ui/activity/ActivityFeed.tsx +137 -0
- package/bizar-dash/src/web/v8/ui/agents/AgentActivity.tsx +101 -0
- package/bizar-dash/src/web/v8/ui/agents/AgentCard.tsx +158 -0
- package/bizar-dash/src/web/v8/ui/agents/AgentDetail.tsx +252 -0
- package/bizar-dash/src/web/v8/ui/agents/AgentStreamPanel.tsx +371 -0
- package/bizar-dash/src/web/v8/ui/controls/Button.tsx +141 -0
- package/bizar-dash/src/web/v8/ui/controls/ButtonGroup.tsx +32 -0
- package/bizar-dash/src/web/v8/ui/controls/Checkbox.tsx +49 -0
- package/bizar-dash/src/web/v8/ui/controls/Field.tsx +78 -0
- package/bizar-dash/src/web/v8/ui/controls/Form.tsx +23 -0
- package/bizar-dash/src/web/v8/ui/controls/IconButton.tsx +112 -0
- package/bizar-dash/src/web/v8/ui/controls/Input.tsx +94 -0
- package/bizar-dash/src/web/v8/ui/controls/RadioGroup.tsx +74 -0
- package/bizar-dash/src/web/v8/ui/controls/Select.tsx +171 -0
- package/bizar-dash/src/web/v8/ui/controls/Slider.tsx +68 -0
- package/bizar-dash/src/web/v8/ui/controls/Switch.tsx +56 -0
- package/bizar-dash/src/web/v8/ui/controls/Textarea.tsx +64 -0
- package/bizar-dash/src/web/v8/ui/controls/Toggle.tsx +36 -0
- package/bizar-dash/src/web/v8/ui/controls/ToggleGroup.tsx +85 -0
- package/bizar-dash/src/web/v8/ui/data/Accordion.tsx +134 -0
- package/bizar-dash/src/web/v8/ui/data/Avatar.tsx +175 -0
- package/bizar-dash/src/web/v8/ui/data/Badge.tsx +93 -0
- package/bizar-dash/src/web/v8/ui/data/BarList.tsx +101 -0
- package/bizar-dash/src/web/v8/ui/data/Card.tsx +140 -0
- package/bizar-dash/src/web/v8/ui/data/Chip.tsx +96 -0
- package/bizar-dash/src/web/v8/ui/data/Kbd.tsx +42 -0
- package/bizar-dash/src/web/v8/ui/data/ProgressBar.tsx +93 -0
- package/bizar-dash/src/web/v8/ui/data/Sparkline.tsx +98 -0
- package/bizar-dash/src/web/v8/ui/data/StatTile.tsx +150 -0
- package/bizar-dash/src/web/v8/ui/data/Table.tsx +170 -0
- package/bizar-dash/src/web/v8/ui/data/Timeline.tsx +130 -0
- package/bizar-dash/src/web/v8/ui/data/ViewHeader.tsx +122 -0
- package/bizar-dash/src/web/v8/ui/feedback/Alert.tsx +95 -0
- package/bizar-dash/src/web/v8/ui/feedback/Banner.tsx +39 -0
- package/bizar-dash/src/web/v8/ui/feedback/ContextMenu.tsx +143 -0
- package/bizar-dash/src/web/v8/ui/feedback/Dialog.tsx +149 -0
- package/bizar-dash/src/web/v8/ui/feedback/Drawer.tsx +8 -0
- package/bizar-dash/src/web/v8/ui/feedback/DropdownMenu.tsx +231 -0
- package/bizar-dash/src/web/v8/ui/feedback/EmptyState.tsx +48 -0
- package/bizar-dash/src/web/v8/ui/feedback/Popover.tsx +56 -0
- package/bizar-dash/src/web/v8/ui/feedback/Sheet.tsx +103 -0
- package/bizar-dash/src/web/v8/ui/feedback/Skeleton.tsx +67 -0
- package/bizar-dash/src/web/v8/ui/feedback/Spinner.tsx +30 -0
- package/bizar-dash/src/web/v8/ui/feedback/Toast.tsx +66 -0
- package/bizar-dash/src/web/v8/ui/feedback/Tooltip.tsx +89 -0
- package/bizar-dash/src/web/v8/ui/goals/GoalCard.tsx +176 -0
- package/bizar-dash/src/web/v8/ui/goals/GoalDetail.tsx +245 -0
- package/bizar-dash/src/web/v8/ui/goals/KeyResult.tsx +115 -0
- package/bizar-dash/src/web/v8/ui/index.ts +322 -0
- package/bizar-dash/src/web/v8/ui/kanban/KanbanBoard.tsx +83 -0
- package/bizar-dash/src/web/v8/ui/kanban/KanbanCard.tsx +247 -0
- package/bizar-dash/src/web/v8/ui/kanban/KanbanColumn.tsx +186 -0
- package/bizar-dash/src/web/v8/ui/kanban/KanbanContextMenu.tsx +122 -0
- package/bizar-dash/src/web/v8/ui/kanban/KanbanQuickAdd.tsx +141 -0
- package/bizar-dash/src/web/v8/ui/libraries/LibraryGrid.tsx +30 -0
- package/bizar-dash/src/web/v8/ui/libraries/LibraryItem.tsx +161 -0
- package/bizar-dash/src/web/v8/ui/memory/MemoryVault.tsx +144 -0
- package/bizar-dash/src/web/v8/ui/navigation/CommandPalette.tsx +224 -0
- package/bizar-dash/src/web/v8/ui/navigation/NavLink.tsx +81 -0
- package/bizar-dash/src/web/v8/ui/navigation/Pagination.tsx +164 -0
- package/bizar-dash/src/web/v8/ui/navigation/Tabs.tsx +128 -0
- package/bizar-dash/src/web/v8/ui/navigation/useCommandPaletteHotkey.test.ts +79 -0
- package/bizar-dash/src/web/v8/ui/primitives/Box.tsx +144 -0
- package/bizar-dash/src/web/v8/ui/primitives/Center.tsx +40 -0
- package/bizar-dash/src/web/v8/ui/primitives/Cluster.tsx +67 -0
- package/bizar-dash/src/web/v8/ui/primitives/Grid.tsx +104 -0
- package/bizar-dash/src/web/v8/ui/primitives/Inline.tsx +77 -0
- package/bizar-dash/src/web/v8/ui/primitives/Portal.tsx +33 -0
- package/bizar-dash/src/web/v8/ui/primitives/ScrollArea.tsx +62 -0
- package/bizar-dash/src/web/v8/ui/primitives/Separator.tsx +42 -0
- package/bizar-dash/src/web/v8/ui/primitives/Stack.tsx +73 -0
- package/bizar-dash/src/web/v8/ui/primitives/VisuallyHidden.tsx +49 -0
- package/bizar-dash/src/web/v8/ui/settings/SettingsNav.tsx +91 -0
- package/bizar-dash/src/web/v8/ui/settings/SettingsRow.tsx +88 -0
- package/bizar-dash/src/web/v8/ui/settings/SettingsSection.tsx +109 -0
- package/bizar-dash/src/web/v8/ui/styles/globals.css +225 -0
- package/bizar-dash/src/web/v8/ui/styles/reset.css +57 -0
- package/bizar-dash/src/web/v8/ui/styles/tokens.css +217 -0
- package/bizar-dash/src/web/v8/ui/theme/DensityProvider.test.tsx +74 -0
- package/bizar-dash/src/web/v8/ui/theme/DensityProvider.tsx +66 -0
- package/bizar-dash/src/web/v8/ui/theme/ThemeProvider.test.tsx +86 -0
- package/bizar-dash/src/web/v8/ui/theme/ThemeProvider.tsx +94 -0
- package/bizar-dash/src/web/v8/ui/theme/ThemeToggle.tsx +88 -0
- package/bizar-dash/src/web/v8/ui/theme/useDensity.ts +15 -0
- package/bizar-dash/src/web/v8/ui/theme/useTheme.ts +16 -0
- package/bizar-dash/src/web/v8/ui/utils/cx.ts +19 -0
- package/bizar-dash/src/web/v8/views/Activity/ActivityView.tsx +71 -0
- package/bizar-dash/src/web/v8/views/Agents/AgentsView.tsx +172 -0
- package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.test.tsx +142 -0
- package/bizar-dash/src/web/v8/views/CommandPalette/AppCommandPalette.tsx +247 -0
- package/bizar-dash/src/web/v8/views/Goals/GoalsView.tsx +193 -0
- package/bizar-dash/src/web/v8/views/Libraries/LibrariesView.tsx +108 -0
- package/bizar-dash/src/web/v8/views/Memory/MemoryView.tsx +77 -0
- package/bizar-dash/src/web/v8/views/Overview/OverviewView.tsx +152 -0
- package/bizar-dash/src/web/v8/views/Router.tsx +72 -0
- package/bizar-dash/src/web/v8/views/Settings/SettingsView.tsx +730 -0
- package/bizar-dash/src/web/v8/views/Tasks/CommandPalettePlaceholder.tsx +106 -0
- package/bizar-dash/src/web/v8/views/Tasks/TasksKanbanPlaceholder.tsx +62 -0
- package/bizar-dash/src/web/v8/views/Tasks/TasksView.tsx +165 -0
- package/bizar-dash/src/web/v8/vite-env.d.ts +15 -0
- package/bizar-dash/src/web/{mobile.html → v8.html} +4 -7
- package/bizar-dash/tests/components/Button.test.tsx +51 -14
- package/bizar-dash/tests/components/Card.test.tsx +37 -20
- package/bizar-dash/tests/components/Dialog.test.tsx +80 -0
- package/bizar-dash/tests/components/Toast.test.tsx +48 -95
- package/bizar-dash/tests/goals-decompose.test.mjs +177 -0
- package/bizar-dash/tests/setup.ts +47 -0
- package/bizar-dash/tests/ui/primitives/VisuallyHidden.test.tsx +30 -15
- package/bizar-dash/vite.config.ts +41 -2
- package/bizar-dash/vitest.config.ts +9 -4
- package/cli/bin.mjs +32 -0
- package/cli/install.mjs +26 -1
- package/cli/provision-claude.mjs +86 -0
- package/package.json +36 -3
- package/scripts/run-dev.mjs +84 -0
- package/bizar-dash/dist/assets/EnvVarsSection-BfhAz3ax.js +0 -114
- package/bizar-dash/dist/assets/EnvVarsSection-BfhAz3ax.js.map +0 -1
- package/bizar-dash/dist/assets/MobileChat-DLWdv6tQ.js +0 -1
- package/bizar-dash/dist/assets/MobileChat-DLWdv6tQ.js.map +0 -1
- package/bizar-dash/dist/assets/MobileSettings-Bxv62uPY.js +0 -1
- package/bizar-dash/dist/assets/MobileSettings-Bxv62uPY.js.map +0 -1
- package/bizar-dash/dist/assets/Toast-ATSAmbdi.js +0 -26
- package/bizar-dash/dist/assets/Toast-ATSAmbdi.js.map +0 -1
- package/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
- package/bizar-dash/dist/assets/__vite-browser-external-BIHI7g3E.js.map +0 -1
- package/bizar-dash/dist/assets/main-CJAtrosO.css +0 -1
- package/bizar-dash/dist/assets/main-DKKj9dsq.js +0 -430
- package/bizar-dash/dist/assets/main-DKKj9dsq.js.map +0 -1
- package/bizar-dash/dist/assets/mobile-C_naUN91.js +0 -1
- package/bizar-dash/dist/assets/mobile-C_naUN91.js.map +0 -1
- package/bizar-dash/dist/assets/mobile-layout-BWLtwtfQ.css +0 -1
- package/bizar-dash/dist/assets/mobile-layout-GZ3bE8L6.js +0 -211
- package/bizar-dash/dist/assets/mobile-layout-GZ3bE8L6.js.map +0 -1
- package/bizar-dash/dist/assets/useSlashCommands-BOwD7lNb.js +0 -65
- package/bizar-dash/dist/assets/useSlashCommands-BOwD7lNb.js.map +0 -1
- package/bizar-dash/dist/index.html +0 -43
- package/bizar-dash/src/web/App.tsx +0 -915
- package/bizar-dash/src/web/MobileApp.tsx +0 -414
- package/bizar-dash/src/web/components/ArtifactCreateDialog.tsx +0 -95
- package/bizar-dash/src/web/components/ArtifactListDialog.tsx +0 -55
- package/bizar-dash/src/web/components/ArtifactViewer.tsx +0 -144
- package/bizar-dash/src/web/components/AuditDialog.tsx +0 -79
- package/bizar-dash/src/web/components/AutosaveField.tsx +0 -50
- package/bizar-dash/src/web/components/BackupRestore.tsx +0 -330
- package/bizar-dash/src/web/components/BgStatusBadge.tsx +0 -32
- package/bizar-dash/src/web/components/Button.tsx +0 -56
- package/bizar-dash/src/web/components/CanvasContextMenu.tsx +0 -68
- package/bizar-dash/src/web/components/Card.tsx +0 -40
- package/bizar-dash/src/web/components/CollapsibleSection.tsx +0 -72
- package/bizar-dash/src/web/components/CommandDialog.tsx +0 -66
- package/bizar-dash/src/web/components/DoctorPanel.tsx +0 -160
- package/bizar-dash/src/web/components/EmptyState.tsx +0 -30
- package/bizar-dash/src/web/components/EnvVarManager.tsx +0 -430
- package/bizar-dash/src/web/components/EvalDiff.tsx +0 -157
- package/bizar-dash/src/web/components/EvalExportButton.tsx +0 -27
- package/bizar-dash/src/web/components/EvalRunCard.tsx +0 -78
- package/bizar-dash/src/web/components/FileBrowser.tsx +0 -633
- package/bizar-dash/src/web/components/HeadroomSettings.tsx +0 -418
- package/bizar-dash/src/web/components/HeadroomStatus.tsx +0 -158
- package/bizar-dash/src/web/components/HelpDialog.tsx +0 -55
- package/bizar-dash/src/web/components/InviteDialog.tsx +0 -205
- package/bizar-dash/src/web/components/KillConfirmDialog.tsx +0 -88
- package/bizar-dash/src/web/components/MobileBottomNav.tsx +0 -38
- package/bizar-dash/src/web/components/MobileDrawer.tsx +0 -68
- package/bizar-dash/src/web/components/MobileHeader.tsx +0 -50
- package/bizar-dash/src/web/components/MobileLayout.tsx +0 -63
- package/bizar-dash/src/web/components/Modal.tsx +0 -215
- package/bizar-dash/src/web/components/Notifications.tsx +0 -242
- package/bizar-dash/src/web/components/ScheduleTemplateCard.tsx +0 -72
- package/bizar-dash/src/web/components/ScreenshotCapture.tsx +0 -138
- package/bizar-dash/src/web/components/ScreenshotOCR.tsx +0 -42
- package/bizar-dash/src/web/components/SearchModal.tsx +0 -227
- package/bizar-dash/src/web/components/SettingsNav.tsx +0 -117
- package/bizar-dash/src/web/components/SettingsSearch.tsx +0 -328
- package/bizar-dash/src/web/components/Sidebar.tsx +0 -89
- package/bizar-dash/src/web/components/Spinner.tsx +0 -19
- package/bizar-dash/src/web/components/StatusBadge.tsx +0 -56
- package/bizar-dash/src/web/components/Tag.tsx +0 -41
- package/bizar-dash/src/web/components/TailscaleSettings.tsx +0 -161
- package/bizar-dash/src/web/components/TaskCard.tsx +0 -69
- package/bizar-dash/src/web/components/TaskCreateSheet.tsx +0 -76
- package/bizar-dash/src/web/components/Toast.tsx +0 -150
- package/bizar-dash/src/web/components/Toggle.tsx +0 -31
- package/bizar-dash/src/web/components/Topbar.tsx +0 -455
- package/bizar-dash/src/web/components/UsageChart.tsx +0 -250
- package/bizar-dash/src/web/components/UsageTable.tsx +0 -90
- package/bizar-dash/src/web/components/VirtualList.tsx +0 -53
- package/bizar-dash/src/web/components/VisualPlanDialog.tsx +0 -58
- package/bizar-dash/src/web/components/VoiceNotesPanel.tsx +0 -211
- package/bizar-dash/src/web/components/VoiceRecorder.tsx +0 -105
- package/bizar-dash/src/web/components/WorkspaceSelector.tsx +0 -158
- package/bizar-dash/src/web/components/agents/CommunicationLog.tsx +0 -126
- package/bizar-dash/src/web/components/agents/DependencyGraph.tsx +0 -163
- package/bizar-dash/src/web/components/agents/QualityGates.tsx +0 -123
- package/bizar-dash/src/web/components/agents/RealTimeEventLog.tsx +0 -127
- package/bizar-dash/src/web/components/agents/RoutingDecisions.test.tsx +0 -148
- package/bizar-dash/src/web/components/agents/RoutingDecisions.tsx +0 -160
- package/bizar-dash/src/web/components/background/AttachButton.tsx +0 -96
- package/bizar-dash/src/web/components/background/TmuxAttachCard.tsx +0 -122
- package/bizar-dash/src/web/components/chat/AgentChip.tsx +0 -68
- package/bizar-dash/src/web/components/chat/AgentNode.tsx +0 -127
- package/bizar-dash/src/web/components/chat/AgentTree.tsx +0 -80
- package/bizar-dash/src/web/components/chat/ChatBubble.tsx +0 -60
- package/bizar-dash/src/web/components/chat/ChatComposer.tsx +0 -72
- package/bizar-dash/src/web/components/chat/ChatInfoPanel.tsx +0 -370
- package/bizar-dash/src/web/components/chat/ChatRail.tsx +0 -387
- package/bizar-dash/src/web/components/chat/ChatThread.tsx +0 -127
- package/bizar-dash/src/web/components/chat/ChatTopBar.tsx +0 -50
- package/bizar-dash/src/web/components/chat/Composer.tsx +0 -166
- package/bizar-dash/src/web/components/chat/ConfirmModal.tsx +0 -54
- package/bizar-dash/src/web/components/chat/EmptyState.tsx +0 -21
- package/bizar-dash/src/web/components/chat/FirstRunGreeting.tsx +0 -18
- package/bizar-dash/src/web/components/chat/FloatingComposer.tsx +0 -38
- package/bizar-dash/src/web/components/chat/InfoPanel.tsx +0 -184
- package/bizar-dash/src/web/components/chat/JumpToLatest.tsx +0 -58
- package/bizar-dash/src/web/components/chat/LoadingSkeleton.tsx +0 -19
- package/bizar-dash/src/web/components/chat/MessageBlock.tsx +0 -260
- package/bizar-dash/src/web/components/chat/MessageBubble.tsx +0 -60
- package/bizar-dash/src/web/components/chat/SessionList.tsx +0 -163
- package/bizar-dash/src/web/components/chat/SessionRowMenu.tsx +0 -206
- package/bizar-dash/src/web/components/chat/StreamingIndicator.tsx +0 -37
- package/bizar-dash/src/web/components/chat/SuggestionCards.tsx +0 -55
- package/bizar-dash/src/web/components/chat/WelcomeScreen.tsx +0 -36
- package/bizar-dash/src/web/components/chat/_legacy.ts +0 -30
- package/bizar-dash/src/web/components/chat/index.ts +0 -31
- package/bizar-dash/src/web/components/chat/useAutoGrowTextarea.ts +0 -18
- package/bizar-dash/src/web/components/chat/useChat.ts +0 -1190
- package/bizar-dash/src/web/components/chat/useSlashCommands.ts +0 -47
- package/bizar-dash/src/web/components/goals/GoalInput.tsx +0 -86
- package/bizar-dash/src/web/components/goals/PlanVisualization.tsx +0 -111
- package/bizar-dash/src/web/components/tasks/BacklogPanel.css +0 -109
- package/bizar-dash/src/web/components/tasks/BacklogPanel.tsx +0 -209
- package/bizar-dash/src/web/hooks/useAutosave.ts +0 -107
- package/bizar-dash/src/web/hooks/useI18n.ts +0 -13
- package/bizar-dash/src/web/index.html +0 -37
- package/bizar-dash/src/web/lib/api.ts +0 -237
- package/bizar-dash/src/web/lib/goapPlanner.ts +0 -614
- package/bizar-dash/src/web/lib/i18n.ts +0 -25
- package/bizar-dash/src/web/lib/logger.ts +0 -30
- package/bizar-dash/src/web/lib/markdown.tsx +0 -59
- package/bizar-dash/src/web/lib/search.ts +0 -115
- package/bizar-dash/src/web/lib/types.ts +0 -894
- package/bizar-dash/src/web/lib/utils.ts +0 -114
- package/bizar-dash/src/web/lib/ws.ts +0 -177
- package/bizar-dash/src/web/locales/en.json +0 -52
- package/bizar-dash/src/web/main.tsx +0 -43
- package/bizar-dash/src/web/mobile/MobileApp.tsx +0 -309
- package/bizar-dash/src/web/mobile/MobileBottomNav.tsx +0 -38
- package/bizar-dash/src/web/mobile/MobileChat.tsx +0 -138
- package/bizar-dash/src/web/mobile/MobileDoctor.tsx +0 -80
- package/bizar-dash/src/web/mobile/MobileEval.tsx +0 -167
- package/bizar-dash/src/web/mobile/MobileMemory.tsx +0 -108
- package/bizar-dash/src/web/mobile/MobileOverview.tsx +0 -213
- package/bizar-dash/src/web/mobile/MobileSettings.tsx +0 -251
- package/bizar-dash/src/web/mobile/MobileTasks.tsx +0 -94
- package/bizar-dash/src/web/mobile/MobileTopbar.tsx +0 -115
- package/bizar-dash/src/web/mobile/components/MobileBottomSheet.tsx +0 -182
- package/bizar-dash/src/web/mobile/components/MobileListItem.tsx +0 -64
- package/bizar-dash/src/web/mobile/components/MobileModal.tsx +0 -123
- package/bizar-dash/src/web/mobile/views/MobileActivity.tsx +0 -273
- package/bizar-dash/src/web/mobile/views/MobileAgents.tsx +0 -374
- package/bizar-dash/src/web/mobile/views/MobileArtifactCanvas.tsx +0 -439
- package/bizar-dash/src/web/mobile/views/MobileArtifacts.tsx +0 -143
- package/bizar-dash/src/web/mobile/views/MobileChat.tsx +0 -257
- package/bizar-dash/src/web/mobile/views/MobileConfig.tsx +0 -175
- package/bizar-dash/src/web/mobile/views/MobileHistory.tsx +0 -191
- package/bizar-dash/src/web/mobile/views/MobileMods.tsx +0 -149
- package/bizar-dash/src/web/mobile/views/MobileMore.tsx +0 -121
- package/bizar-dash/src/web/mobile/views/MobileNotifications.tsx +0 -137
- package/bizar-dash/src/web/mobile/views/MobilePlans.tsx +0 -26
- package/bizar-dash/src/web/mobile/views/MobileSchedules.tsx +0 -685
- package/bizar-dash/src/web/mobile/views/MobileSearchModal.tsx +0 -172
- package/bizar-dash/src/web/mobile/views/MobileSettings.tsx +0 -363
- package/bizar-dash/src/web/mobile/views/MobileSkills.tsx +0 -153
- package/bizar-dash/src/web/mobile/views/MobileTasks.tsx +0 -564
- package/bizar-dash/src/web/mobile/views/QrCodePanel.tsx +0 -69
- package/bizar-dash/src/web/mobile.tsx +0 -14
- package/bizar-dash/src/web/styles/agents-redesign.css +0 -311
- package/bizar-dash/src/web/styles/chat.css +0 -1740
- package/bizar-dash/src/web/styles/glyphs.css +0 -960
- package/bizar-dash/src/web/styles/main.css +0 -10389
- package/bizar-dash/src/web/styles/memory.css +0 -1177
- package/bizar-dash/src/web/styles/minimax-usage.css +0 -842
- package/bizar-dash/src/web/styles/mobile-chat.css +0 -5
- package/bizar-dash/src/web/styles/mobile-layout.css +0 -233
- package/bizar-dash/src/web/styles/mobile.css +0 -2181
- package/bizar-dash/src/web/styles/settings.css +0 -775
- package/bizar-dash/src/web/styles/skills.css +0 -302
- package/bizar-dash/src/web/styles/tasks-redesign.css +0 -253
- package/bizar-dash/src/web/styles/tasks.css +0 -605
- package/bizar-dash/src/web/ui/controls/Button.tsx +0 -77
- package/bizar-dash/src/web/ui/controls/Checkbox.tsx +0 -95
- package/bizar-dash/src/web/ui/controls/IconButton.tsx +0 -66
- package/bizar-dash/src/web/ui/controls/Kbd.tsx +0 -24
- package/bizar-dash/src/web/ui/controls/NumberInput.tsx +0 -77
- package/bizar-dash/src/web/ui/controls/RadioGroup.tsx +0 -109
- package/bizar-dash/src/web/ui/controls/SearchInput.tsx +0 -91
- package/bizar-dash/src/web/ui/controls/Select.tsx +0 -92
- package/bizar-dash/src/web/ui/controls/Slider.tsx +0 -70
- package/bizar-dash/src/web/ui/controls/TextInput.tsx +0 -67
- package/bizar-dash/src/web/ui/controls/Textarea.tsx +0 -56
- package/bizar-dash/src/web/ui/controls/Toggle.tsx +0 -79
- package/bizar-dash/src/web/ui/controls/controls.css +0 -476
- package/bizar-dash/src/web/ui/controls/index.ts +0 -35
- package/bizar-dash/src/web/ui/data/BarChart.tsx +0 -60
- package/bizar-dash/src/web/ui/data/DataTable.tsx +0 -216
- package/bizar-dash/src/web/ui/data/EmptyState.tsx +0 -60
- package/bizar-dash/src/web/ui/data/ErrorState.tsx +0 -56
- package/bizar-dash/src/web/ui/data/KeyValueList.tsx +0 -106
- package/bizar-dash/src/web/ui/data/LoadingState.tsx +0 -65
- package/bizar-dash/src/web/ui/data/Sparkline.tsx +0 -87
- package/bizar-dash/src/web/ui/data/StatTile.tsx +0 -87
- package/bizar-dash/src/web/ui/data/data.css +0 -540
- package/bizar-dash/src/web/ui/data/index.ts +0 -31
- package/bizar-dash/src/web/ui/feedback/Badge.tsx +0 -49
- package/bizar-dash/src/web/ui/feedback/Dialog.tsx +0 -209
- package/bizar-dash/src/web/ui/feedback/ProgressBar.tsx +0 -69
- package/bizar-dash/src/web/ui/feedback/StatusDot.tsx +0 -50
- package/bizar-dash/src/web/ui/feedback/Toast.tsx +0 -200
- package/bizar-dash/src/web/ui/feedback/Tooltip.tsx +0 -126
- package/bizar-dash/src/web/ui/feedback/feedback.css +0 -314
- package/bizar-dash/src/web/ui/feedback/index.ts +0 -43
- package/bizar-dash/src/web/ui/index.ts +0 -57
- package/bizar-dash/src/web/ui/layout/AppShell.tsx +0 -51
- package/bizar-dash/src/web/ui/layout/Breadcrumbs.tsx +0 -97
- package/bizar-dash/src/web/ui/layout/Panel.tsx +0 -73
- package/bizar-dash/src/web/ui/layout/PanelHeader.tsx +0 -39
- package/bizar-dash/src/web/ui/layout/Sidebar.tsx +0 -131
- package/bizar-dash/src/web/ui/layout/Tabs.tsx +0 -133
- package/bizar-dash/src/web/ui/layout/Topbar.tsx +0 -42
- package/bizar-dash/src/web/ui/layout/ViewHeader.tsx +0 -48
- package/bizar-dash/src/web/ui/layout/index.ts +0 -34
- package/bizar-dash/src/web/ui/layout/layout.css +0 -464
- package/bizar-dash/src/web/ui/navigation/CommandPalette.tsx +0 -199
- package/bizar-dash/src/web/ui/navigation/NavGroup.tsx +0 -95
- package/bizar-dash/src/web/ui/navigation/NavLink.tsx +0 -93
- package/bizar-dash/src/web/ui/navigation/index.ts +0 -17
- package/bizar-dash/src/web/ui/navigation/navigation.css +0 -343
- package/bizar-dash/src/web/ui/primitives/Box.tsx +0 -91
- package/bizar-dash/src/web/ui/primitives/Grid.tsx +0 -49
- package/bizar-dash/src/web/ui/primitives/Inline.tsx +0 -55
- package/bizar-dash/src/web/ui/primitives/Separator.tsx +0 -46
- package/bizar-dash/src/web/ui/primitives/Stack.tsx +0 -54
- package/bizar-dash/src/web/ui/primitives/VisuallyHidden.tsx +0 -26
- package/bizar-dash/src/web/ui/primitives/index.ts +0 -23
- package/bizar-dash/src/web/ui/primitives/primitives.css +0 -183
- package/bizar-dash/src/web/ui/styles/globals.css +0 -86
- package/bizar-dash/src/web/ui/styles/reset.css +0 -125
- package/bizar-dash/src/web/ui/styles/tokens.css +0 -208
- package/bizar-dash/src/web/ui/theme/ThemeProvider.tsx +0 -142
- package/bizar-dash/src/web/ui/theme/tokens.ts +0 -131
- package/bizar-dash/src/web/ui/theme/useTheme.ts +0 -22
- package/bizar-dash/src/web/ui/utils/cx.ts +0 -42
- package/bizar-dash/src/web/views/Activity.tsx +0 -1221
- package/bizar-dash/src/web/views/Agents.tsx +0 -964
- package/bizar-dash/src/web/views/Artifacts.tsx +0 -1494
- package/bizar-dash/src/web/views/BackgroundAgents.tsx +0 -822
- package/bizar-dash/src/web/views/Chat.tsx +0 -532
- package/bizar-dash/src/web/views/Config.tsx +0 -3
- package/bizar-dash/src/web/views/Doctor.tsx +0 -317
- package/bizar-dash/src/web/views/Eval.tsx +0 -372
- package/bizar-dash/src/web/views/EvalReport.tsx +0 -353
- package/bizar-dash/src/web/views/GoalPlanner.tsx +0 -158
- package/bizar-dash/src/web/views/Harness.tsx +0 -306
- package/bizar-dash/src/web/views/History.tsx +0 -353
- package/bizar-dash/src/web/views/Memory.tsx +0 -193
- package/bizar-dash/src/web/views/MiniMaxUsage.tsx +0 -942
- package/bizar-dash/src/web/views/ModView.tsx +0 -207
- package/bizar-dash/src/web/views/Mods.tsx +0 -706
- package/bizar-dash/src/web/views/Overview.tsx +0 -1343
- package/bizar-dash/src/web/views/Providers.tsx +0 -302
- package/bizar-dash/src/web/views/Schedules.tsx +0 -902
- package/bizar-dash/src/web/views/Settings.tsx +0 -308
- package/bizar-dash/src/web/views/Skills.tsx +0 -383
- package/bizar-dash/src/web/views/SpawnAgentModal.tsx +0 -221
- package/bizar-dash/src/web/views/Tasks.tsx +0 -789
- package/bizar-dash/src/web/views/Workspace.tsx +0 -294
- package/bizar-dash/src/web/views/glyphs/GlyphRenderer.tsx +0 -844
- package/bizar-dash/src/web/views/glyphs/components.tsx +0 -1098
- package/bizar-dash/src/web/views/memory/ConfigPanel.tsx +0 -426
- package/bizar-dash/src/web/views/memory/FromScreenshotPanel.tsx +0 -23
- package/bizar-dash/src/web/views/memory/GitSyncPanel.tsx +0 -220
- package/bizar-dash/src/web/views/memory/LightragPanel.tsx +0 -310
- package/bizar-dash/src/web/views/memory/MemoryGraphLegend.tsx +0 -29
- package/bizar-dash/src/web/views/memory/MemoryGraphPanel.tsx +0 -192
- package/bizar-dash/src/web/views/memory/MemoryGraphView.tsx +0 -336
- package/bizar-dash/src/web/views/memory/MemoryOverview.tsx +0 -367
- package/bizar-dash/src/web/views/memory/MemoryStatusCard.tsx +0 -160
- package/bizar-dash/src/web/views/memory/ObsidianPanel.tsx +0 -650
- package/bizar-dash/src/web/views/memory/SemanticSearchPanel.tsx +0 -197
- package/bizar-dash/src/web/views/memory/VaultFromClipboardPanel.tsx +0 -101
- package/bizar-dash/src/web/views/settings/ActivitySection.tsx +0 -205
- package/bizar-dash/src/web/views/settings/AgentSection.tsx +0 -305
- package/bizar-dash/src/web/views/settings/AuthSection.tsx +0 -159
- package/bizar-dash/src/web/views/settings/EnvVarsSection.tsx +0 -15
- package/bizar-dash/src/web/views/settings/GeneralSection.tsx +0 -128
- package/bizar-dash/src/web/views/settings/HeadroomSection.tsx +0 -39
- package/bizar-dash/src/web/views/settings/MemorySection.tsx +0 -154
- package/bizar-dash/src/web/views/settings/NetworkSection.tsx +0 -87
- package/bizar-dash/src/web/views/settings/NotificationsSection.tsx +0 -34
- package/bizar-dash/src/web/views/settings/SystemLlmSection.tsx +0 -81
- package/bizar-dash/src/web/views/settings/ThemeSection.tsx +0 -168
- package/bizar-dash/src/web/views/settings/UpdatesSection.tsx +0 -256
- package/bizar-dash/src/web/views/settings/WorkspacesSection.tsx +0 -189
- package/packages/sdk/.harness/agents.json +0 -17
- package/packages/sdk/.harness/topology.json +0 -4
- /package/bizar-dash/tests/{BackgroundAgents.test.tsx → v7-archive/BackgroundAgents.test.tsx} +0 -0
- /package/bizar-dash/tests/{a11y → v7-archive/a11y}/forms.test.tsx +0 -0
- /package/bizar-dash/tests/{a11y.test.tsx → v7-archive/a11y.test.tsx} +0 -0
- /package/bizar-dash/tests/{autosave.test.tsx → v7-archive/autosave.test.tsx} +0 -0
- /package/bizar-dash/tests/{backup-restore.test.tsx → v7-archive/backup-restore.test.tsx} +0 -0
- /package/bizar-dash/tests/{chat-composer.test.tsx → v7-archive/chat-composer.test.tsx} +0 -0
- /package/bizar-dash/tests/{communication-log.test.tsx → v7-archive/communication-log.test.tsx} +0 -0
- /package/bizar-dash/tests/{components → v7-archive/components}/Modal.test.tsx +0 -0
- /package/bizar-dash/tests/{components → v7-archive/components}/Spinner.test.tsx +0 -0
- /package/bizar-dash/tests/{components → v7-archive/components}/StatusBadge.test.tsx +0 -0
- /package/bizar-dash/tests/{components → v7-archive/components}/doctor-panel.test.tsx +0 -0
- /package/bizar-dash/tests/{components → v7-archive/components}/screenshot-ocr.test.tsx +0 -0
- /package/bizar-dash/tests/{components → v7-archive/components}/settings-search.test.tsx +0 -0
- /package/bizar-dash/tests/{components → v7-archive/components}/workspace-selector.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/Button.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/Checkbox.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/IconButton.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/Kbd.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/NumberInput.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/RadioGroup.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/SearchInput.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/Select.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/Slider.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/TextInput.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/Textarea.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/controls/Toggle.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/data/BarChart.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/data/DataTable.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/data/EmptyState.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/data/ErrorState.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/data/KeyValueList.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/data/LoadingState.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/data/Sparkline.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/data/StatTile.test.tsx +0 -0
- /package/bizar-dash/tests/{dep-graph.test.tsx → v7-archive/dep-graph.test.tsx} +0 -0
- /package/bizar-dash/tests/{eval-web-ui.test.tsx → v7-archive/eval-web-ui.test.tsx} +0 -0
- /package/bizar-dash/tests/{event-log.test.tsx → v7-archive/event-log.test.tsx} +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/feedback/Badge.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/feedback/Dialog.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/feedback/ProgressBar.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/feedback/StatusDot.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/feedback/Toast.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/feedback/Tooltip.test.tsx +0 -0
- /package/bizar-dash/tests/{goal-input.test.tsx → v7-archive/goal-input.test.tsx} +0 -0
- /package/bizar-dash/tests/{goap-planner.test.ts → v7-archive/goap-planner.test.ts} +0 -0
- /package/bizar-dash/tests/{hooks → v7-archive/hooks}/useModal.test.tsx +0 -0
- /package/bizar-dash/tests/{hooks → v7-archive/hooks}/useToast.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/layout/AppShell.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/layout/Breadcrumbs.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/layout/Panel.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/layout/PanelHeader.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/layout/Sidebar.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/layout/Tabs.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/layout/Topbar.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/layout/ViewHeader.test.tsx +0 -0
- /package/bizar-dash/tests/{lib → v7-archive/lib}/i18n.test.ts +0 -0
- /package/bizar-dash/tests/{lib → v7-archive/lib}/search-fuzzy.test.ts +0 -0
- /package/bizar-dash/tests/{lib → v7-archive/lib}/utils.test.ts +0 -0
- /package/bizar-dash/tests/{memory-graph-view.test.tsx → v7-archive/memory-graph-view.test.tsx} +0 -0
- /package/bizar-dash/tests/{mobile-chat.test.tsx → v7-archive/mobile-chat.test.tsx} +0 -0
- /package/bizar-dash/tests/{mobile-layout.test.tsx → v7-archive/mobile-layout.test.tsx} +0 -0
- /package/bizar-dash/tests/{mobile-overview.test.tsx → v7-archive/mobile-overview.test.tsx} +0 -0
- /package/bizar-dash/tests/{mobile-settings.test.tsx → v7-archive/mobile-settings.test.tsx} +0 -0
- /package/bizar-dash/tests/{mobile-tasks.test.tsx → v7-archive/mobile-tasks.test.tsx} +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/navigation/CommandPalette.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/navigation/NavGroup.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive}/navigation/NavLink.test.tsx +0 -0
- /package/bizar-dash/tests/{quality-gates.test.tsx → v7-archive/quality-gates.test.tsx} +0 -0
- /package/bizar-dash/tests/{settings-layout.test.tsx → v7-archive/settings-layout.test.tsx} +0 -0
- /package/bizar-dash/tests/{settings-mode-wiring.test.tsx → v7-archive/settings-mode-wiring.test.tsx} +0 -0
- /package/bizar-dash/tests/{settings-nav.test.tsx → v7-archive/settings-nav.test.tsx} +0 -0
- /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Box.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Grid.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Inline.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Separator.test.tsx +0 -0
- /package/bizar-dash/tests/{ui → v7-archive/ui}/primitives/Stack.test.tsx +0 -0
- /package/bizar-dash/tests/{views → v7-archive/views}/Agents.test.tsx +0 -0
- /package/bizar-dash/tests/{views → v7-archive/views}/Memory.test.tsx +0 -0
- /package/bizar-dash/tests/{views → v7-archive/views}/Overview.test.tsx +0 -0
- /package/bizar-dash/tests/{views → v7-archive/views}/Tasks.test.tsx +0 -0
- /package/bizar-dash/tests/{views → v7-archive/views}/sidebar.test.tsx +0 -0
- /package/bizar-dash/tests/{views → v7-archive/views}/topbar.test.tsx +0 -0
- /package/bizar-dash/tests/{voice-recorder.test.tsx → v7-archive/voice-recorder.test.tsx} +0 -0
|
@@ -0,0 +1,1135 @@
|
|
|
1
|
+
# PLAN.md — Dashboard v8 Rewrite (Implementation Plan)
|
|
2
|
+
|
|
3
|
+
> Companion to `DESIGN.md`. This document covers **how** we build the
|
|
4
|
+
> rewrite; the design doc covers **what** it looks like. Read both
|
|
5
|
+
> together. Scope: complete deletion of the v7 dashboard (F-040 + F-041)
|
|
6
|
+
> and greenfield build of v8 in its place.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Table of contents
|
|
11
|
+
|
|
12
|
+
1. [Goals & non-goals](#1--goals--non-goals)
|
|
13
|
+
2. [Architecture decisions](#2--architecture-decisions)
|
|
14
|
+
3. [Tech stack](#3--tech-stack)
|
|
15
|
+
4. [File structure](#4--file-structure)
|
|
16
|
+
5. [Component library breakdown](#5--component-library-breakdown)
|
|
17
|
+
6. [Data model & API surface](#6--data-model--api-surface)
|
|
18
|
+
7. [Routing](#7--routing)
|
|
19
|
+
8. [State management](#8--state-management)
|
|
20
|
+
9. [Real-time updates](#9--real-time-updates)
|
|
21
|
+
10. [Theme system](#10--theme-system)
|
|
22
|
+
11. [Settings model](#11--settings-model)
|
|
23
|
+
12. [Migration / deletion of old dashboard](#12--migration--deletion-of-old-dashboard)
|
|
24
|
+
13. [Phased implementation plan](#13--phased-implementation-plan)
|
|
25
|
+
14. [Sprint schedule](#14--sprint-schedule)
|
|
26
|
+
15. [Testing strategy](#15--testing-strategy)
|
|
27
|
+
16. [Integration with Bizar harness](#16--integration-with-bizar-harness)
|
|
28
|
+
17. [Risks & open questions](#17--risks--open-questions)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 1 · Goals & non-goals
|
|
33
|
+
|
|
34
|
+
### Goals
|
|
35
|
+
|
|
36
|
+
1. **Replace v7 dashboard with a clean v8** built around the shadcn
|
|
37
|
+
preset `b7kBsBkh7b` and the user-supplied OKLch theme.
|
|
38
|
+
2. **Ship a custom component library** at `bizar-dash/src/web/ui/`
|
|
39
|
+
with 100+ primitives, controls, feedback, data, navigation,
|
|
40
|
+
kanban, and popup components.
|
|
41
|
+
3. **Topbar + sidebar shell** with six top-level nav groups and
|
|
42
|
+
hierarchical sub-routes.
|
|
43
|
+
4. **Kanban-first experience** — drag-and-drop, filters, group-by,
|
|
44
|
+
sort, density toggle, keyboard shortcuts, right-click context
|
|
45
|
+
menus on every card.
|
|
46
|
+
5. **Long-horizon goal tracking** as a first-class page with progress
|
|
47
|
+
visualization, milestones, and goal→task breakdown.
|
|
48
|
+
6. **Right-click context menus everywhere** — no browser defaults on
|
|
49
|
+
interactive surfaces, no `window.confirm` / `window.alert` /
|
|
50
|
+
`window.prompt`.
|
|
51
|
+
7. **Command palette (Cmd+K)** with three scopes: Actions, Navigate,
|
|
52
|
+
Settings.
|
|
53
|
+
8. **Hierarchical settings** with 16 sections, each with auto-saving
|
|
54
|
+
fields and Cmd+K discoverability.
|
|
55
|
+
9. **Real-time updates** via the existing WebSocket feed (no new
|
|
56
|
+
transport).
|
|
57
|
+
10. **Power-user density** by default, with a comfortable toggle.
|
|
58
|
+
|
|
59
|
+
### Non-goals (v8.0)
|
|
60
|
+
|
|
61
|
+
- No mobile native apps. Mobile web is responsive but desktop-first.
|
|
62
|
+
- No new backend endpoints. We consume the existing REST + WS surface.
|
|
63
|
+
- No new MCP tools. We surface existing tool outputs only.
|
|
64
|
+
- No auth/identity changes. Single-user local dashboard for now.
|
|
65
|
+
- No telemetry/analytics. Optional later via opt-in settings.
|
|
66
|
+
- No plugin/theme marketplace. Internal-only.
|
|
67
|
+
- No multi-tenant workspace switching UI (the data model supports it
|
|
68
|
+
via `workspace_id`, but the UI ships single-workspace for v8.0).
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 2 · Architecture decisions
|
|
73
|
+
|
|
74
|
+
| # | Decision | Why | Alternatives considered |
|
|
75
|
+
|--|--|--|--|
|
|
76
|
+
| AD-01 | **Delete the entire `bizar-dash/` v7 code, rebuild from scratch.** | The v7 design system (F-040) and mobile pass (F-041) conflict with the new aesthetic (green accent, no Norse dark mode, no gradients, gradient-free). Incremental migration would carry old patterns forward. | (a) Incremental rewrite (rejected: mixes generations). (b) Side-by-side `bizar-dash-v8/` (rejected: two trees to maintain). |
|
|
77
|
+
| AD-02 | **Use shadcn preset `b7kBsBkh7b` as bootstrap.** | User-specified. The preset ships OKLch tokens + Tailwind config matching the supplied theme. | Custom Tailwind config (rejected: reinvents the wheel). |
|
|
78
|
+
| AD-03 | **TanStack Router for routing.** | Type-safe routes, file-based or code-based, built-in loader/action model, first-class search-param typing. The settings tree, kanban filters, and goal detail views all benefit. | React Router (rejected: weaker type safety). |
|
|
79
|
+
| AD-04 | **TanStack Query for server state.** | Already in the Bizar ecosystem; cache invalidation on WS events is first-class; optimistic mutations are idiomatic. | SWR (rejected: weaker mutation story). Redux Toolkit Query (rejected: heavier, no use). |
|
|
80
|
+
| AD-05 | **Zustand for local UI state.** | Sidebar collapse, density mode, palette open/close, theme — small, fast, no boilerplate. | React Context only (rejected: prop drilling for cross-cutting state). Jotai (rejected: atoms too granular). |
|
|
81
|
+
| AD-06 | **dnd-kit for drag-and-drop.** | Accessible by default (keyboard sensors, screen-reader announcements), `useDraggable`/`useDroppable` are the right primitive for kanban, `restrictToVerticalAxis` for column drag, `DragOverlay` for the floating card. | react-beautiful-dnd (rejected: unmaintained). Native HTML5 DnD (rejected: accessibility nightmare). |
|
|
82
|
+
| AD-07 | **TanStack Table for the kanban's tabular view.** | Headless, sortable, filterable, virtualizable, supports row selection and column resize — all the power-user table features without imposing UI. | AG Grid (rejected: heavy, license-gated). |
|
|
83
|
+
| AD-08 | **Recharts for charts.** | Already used in v7. SVG-based, themeable via tokens, sufficient for our chart needs (line, bar, area, pie, sparkline). | Visx (rejected: too low-level for our time budget). D3 (rejected: hand-rolled charts cost more than they save). ECharts (rejected: not React-native). |
|
|
84
|
+
| AD-09 | **cmdk for the command palette.** | Used by Linear, Raycast, Vercel — the same UX we want. | Headless combobox (rejected: rebuild what cmdk already does). |
|
|
85
|
+
| AD-10 | **Radix UI primitives under every interactive component.** | Accessibility is solved (focus management, keyboard nav, ARIA), behavior is unstyled, theming is via our tokens. | Headless UI (rejected: smaller primitive set). React Aria (rejected: harder to compose). |
|
|
86
|
+
| AD-11 | **React Hook Form + Zod for forms.** | Already in the Bizar ecosystem. Schema-first validation matches our MCP tool registration. | Formik (rejected: legacy). |
|
|
87
|
+
| AD-12 | **date-fns for date math.** | Tree-shakeable, immutable, locale-aware. Used by the kanban and goal views. | Day.js (rejected: OOP-style chains, less composable). Luxon (rejected: heavier). |
|
|
88
|
+
| AD-13 | **No Tailwind in `ui/`.** | All `ui/` components consume CSS variables only. Tailwind utility classes are used at the page/view layer to compose components, never inside `ui/` itself. | (a) Tailwind everywhere (rejected: leaks utility classes into primitives). (b) CSS-in-JS (rejected: runtime cost). |
|
|
89
|
+
| AD-14 | **No CSS modules, no styled-components.** | Plain CSS files co-located with each component (`Button.tsx` + `Button.css`). Tokens are global. | CSS Modules (rejected: heavier, same outcome). |
|
|
90
|
+
| AD-15 | **No state-management library inside `ui/`.** | `ui/` is presentational. All data, WS, and mutation logic lives in `views/`, `hooks/`, and `stores/`. | (a) Allow data in `ui/` (rejected: leaks, untestable in isolation). |
|
|
91
|
+
| AD-16 | **Single WebSocket connection.** | All live data flows over `/ws/dashboard`. Per-feature subscriptions multiplexed via message-type discrimination. | (a) One WS per feature (rejected: connection overhead). (b) SSE (rejected: one-way). |
|
|
92
|
+
| AD-17 | **No new dependencies unless justified.** | The Bizar harness is conservative on deps. Each new dep must be approved in a sprint contract. | — |
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 3 · Tech stack
|
|
98
|
+
|
|
99
|
+
### Runtime
|
|
100
|
+
|
|
101
|
+
| Layer | Choice | Version |
|
|
102
|
+
|--|--|--|
|
|
103
|
+
| Build | Vite | 5+ |
|
|
104
|
+
| Language | TypeScript (strict) | 5.5+ |
|
|
105
|
+
| UI framework | React | 19 |
|
|
106
|
+
| Routing | TanStack Router | 1.x |
|
|
107
|
+
| Server state | TanStack Query | 5.x |
|
|
108
|
+
| UI state | Zustand | 4.x |
|
|
109
|
+
| Forms | React Hook Form + Zod | latest |
|
|
110
|
+
| DnD | dnd-kit | 6.x |
|
|
111
|
+
| Tables | TanStack Table | 8.x |
|
|
112
|
+
| Virtualization | TanStack Virtual | 3.x |
|
|
113
|
+
| Charts | Recharts | 2.x |
|
|
114
|
+
| Date | date-fns | 3.x |
|
|
115
|
+
| Icons | lucide-react | latest |
|
|
116
|
+
| Toasts | sonner | 1.x |
|
|
117
|
+
| Command palette | cmdk | 0.2.x |
|
|
118
|
+
| Primitives | Radix UI | latest |
|
|
119
|
+
| Class merge | clsx + tailwind-merge | latest |
|
|
120
|
+
|
|
121
|
+
### Why no Tailwind inside `ui/`
|
|
122
|
+
|
|
123
|
+
Tailwind utility classes leak implementation details. If a future
|
|
124
|
+
maintainer changes `Button.tsx` and removes a class, there's no
|
|
125
|
+
compiler error — just a silent regression. Co-located plain CSS
|
|
126
|
+
keeps the surface tight and reviewable.
|
|
127
|
+
|
|
128
|
+
### pnpm workspaces
|
|
129
|
+
|
|
130
|
+
The dashboard lives in `bizar-dash/` and shares the root
|
|
131
|
+
`pnpm-workspace.yaml`. All third-party deps are pinned at the root
|
|
132
|
+
in `pnpm-lock.yaml`.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 4 · File structure
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
bizar-dash/
|
|
140
|
+
├── DESIGN.md # this rewrite's design system
|
|
141
|
+
├── PLAN.md # this file
|
|
142
|
+
├── ARCHITECTURE.md # module-level doc (rewritten for v8)
|
|
143
|
+
├── CONSTRAINTS.md # module-level rules
|
|
144
|
+
├── README.md # developer quick-start
|
|
145
|
+
├── package.json
|
|
146
|
+
├── tsconfig.json
|
|
147
|
+
├── vite.config.ts
|
|
148
|
+
├── vitest.config.ts
|
|
149
|
+
├── playwright.config.ts # visual + keyboard E2E
|
|
150
|
+
├── public/
|
|
151
|
+
│ ├── favicon.svg
|
|
152
|
+
│ └── fonts/ # Inter + JetBrains Mono subsets
|
|
153
|
+
├── scripts/
|
|
154
|
+
│ ├── check-design-tropes.sh # banned-pattern audit (§12 DESIGN)
|
|
155
|
+
│ ├── check-arch.sh # moved from repo root
|
|
156
|
+
│ └── test-in-container.sh
|
|
157
|
+
├── src/
|
|
158
|
+
│ ├── server/ # unchanged from v7 (REST + WS)
|
|
159
|
+
│ │ ├── api.mjs
|
|
160
|
+
│ │ ├── ws.mjs
|
|
161
|
+
│ │ └── routes/
|
|
162
|
+
│ ├── web/
|
|
163
|
+
│ │ ├── main.tsx
|
|
164
|
+
│ │ ├── App.tsx
|
|
165
|
+
│ │ ├── routes.tsx
|
|
166
|
+
│ │ ├── lib/
|
|
167
|
+
│ │ │ ├── ws.ts # WS singleton + typed subscribe
|
|
168
|
+
│ │ │ ├── api.ts # typed fetch wrapper
|
|
169
|
+
│ │ │ ├── query-client.ts # TanStack Query setup
|
|
170
|
+
│ │ │ └── types.ts # shared TS types
|
|
171
|
+
│ │ ├── stores/
|
|
172
|
+
│ │ │ ├── theme.ts
|
|
173
|
+
│ │ │ ├── density.ts
|
|
174
|
+
│ │ │ ├── palette.ts # Cmd+K open state
|
|
175
|
+
│ │ │ ├── sidebar.ts # collapse state
|
|
176
|
+
│ │ │ └── selection.ts # current kanban/agents selection
|
|
177
|
+
│ │ ├── ui/ # the library (no business logic)
|
|
178
|
+
│ │ │ ├── index.ts # barrel
|
|
179
|
+
│ │ │ ├── primitives/
|
|
180
|
+
│ │ │ ├── controls/
|
|
181
|
+
│ │ │ ├── feedback/
|
|
182
|
+
│ │ │ ├── data/
|
|
183
|
+
│ │ │ ├── navigation/
|
|
184
|
+
│ │ │ ├── kanban/
|
|
185
|
+
│ │ │ ├── popups/
|
|
186
|
+
│ │ │ ├── theme/
|
|
187
|
+
│ │ │ ├── hooks/
|
|
188
|
+
│ │ │ ├── utils/
|
|
189
|
+
│ │ │ └── styles/
|
|
190
|
+
│ │ │ ├── reset.css
|
|
191
|
+
│ │ │ ├── tokens.css # generated from §3 DESIGN
|
|
192
|
+
│ │ │ └── globals.css
|
|
193
|
+
│ │ ├── views/
|
|
194
|
+
│ │ │ ├── Overview/
|
|
195
|
+
│ │ │ ├── Tasks/
|
|
196
|
+
│ │ │ ├── Goals/
|
|
197
|
+
│ │ │ ├── Agents/
|
|
198
|
+
│ │ │ ├── Activity/
|
|
199
|
+
│ │ │ ├── Memory/
|
|
200
|
+
│ │ │ ├── Libraries/
|
|
201
|
+
│ │ │ └── Settings/
|
|
202
|
+
│ │ ├── icons/ # domain icons
|
|
203
|
+
│ │ └── shell/ # AppShell + Topbar + Sidebar
|
|
204
|
+
│ │ ├── AppShell.tsx
|
|
205
|
+
│ │ ├── Topbar.tsx
|
|
206
|
+
│ │ ├── Sidebar.tsx
|
|
207
|
+
│ │ └── StatusBar.tsx
|
|
208
|
+
│ └── shared/
|
|
209
|
+
│ └── tokens.json # source of truth for tokens.css
|
|
210
|
+
└── tests/
|
|
211
|
+
├── unit/ # vitest
|
|
212
|
+
│ ├── ui/ # per-component
|
|
213
|
+
│ └── views/ # per-view
|
|
214
|
+
├── e2e/ # playwright
|
|
215
|
+
│ ├── smoke.spec.ts
|
|
216
|
+
│ ├── keyboard.spec.ts
|
|
217
|
+
│ └── visual.spec.ts
|
|
218
|
+
└── a11y/ # axe-core
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## 5 · Component library breakdown
|
|
225
|
+
|
|
226
|
+
The full inventory lives in DESIGN.md §8. This section is the
|
|
227
|
+
**build order** — which components ship in which sprint.
|
|
228
|
+
|
|
229
|
+
### Wave 1 — Foundation (Sprint 1)
|
|
230
|
+
|
|
231
|
+
Tokens, theme, layout shell, and the 11 primitives. Everything else
|
|
232
|
+
depends on these.
|
|
233
|
+
|
|
234
|
+
- `ui/styles/{reset,tokens,globals}.css`
|
|
235
|
+
- `ui/theme/{ThemeProvider,ThemeToggle,DensityProvider,useTheme,useDensity}.tsx`
|
|
236
|
+
- `ui/primitives/*` (11 components)
|
|
237
|
+
- `shell/{AppShell,Topbar,Sidebar,StatusBar}.tsx`
|
|
238
|
+
|
|
239
|
+
### Wave 2 — Controls & feedback (Sprint 2)
|
|
240
|
+
|
|
241
|
+
Buttons, inputs, dialogs, popovers — the bulk of the form system.
|
|
242
|
+
|
|
243
|
+
- `ui/controls/*` (20 components)
|
|
244
|
+
- `ui/feedback/*` (16 components)
|
|
245
|
+
- `ui/utils/{cx,formatters,useHotkeys,useFocusTrap,useMediaQuery,useReducedMotion,useDebouncedValue,useLocalStorage}.ts`
|
|
246
|
+
|
|
247
|
+
### Wave 3 — Data display (Sprint 3)
|
|
248
|
+
|
|
249
|
+
Cards, tables, charts, avatars, badges — everything for showing
|
|
250
|
+
information.
|
|
251
|
+
|
|
252
|
+
- `ui/data/*` (24 components)
|
|
253
|
+
|
|
254
|
+
### Wave 4 — Navigation (Sprint 4)
|
|
255
|
+
|
|
256
|
+
Sidebar/nav wiring, tabs, menus, command palette, pagination.
|
|
257
|
+
|
|
258
|
+
- `ui/navigation/*` (23 components)
|
|
259
|
+
- `ui/popups/*` (8 components)
|
|
260
|
+
- `stores/{palette,sidebar,selection}.ts`
|
|
261
|
+
|
|
262
|
+
### Wave 5 — Kanban (Sprint 5)
|
|
263
|
+
|
|
264
|
+
The centerpiece. Card, column, board, filters, group-by, sort,
|
|
265
|
+
density, context menu, drag overlay, detail drawer.
|
|
266
|
+
|
|
267
|
+
- `ui/kanban/*` (15 components)
|
|
268
|
+
- `hooks/useTasks.ts` (query + mutations)
|
|
269
|
+
- `views/Tasks/*`
|
|
270
|
+
|
|
271
|
+
### Wave 6 — Views (Sprint 6-8)
|
|
272
|
+
|
|
273
|
+
Overview, Goals, Agents, Activity, Memory, Libraries, Settings —
|
|
274
|
+
one sprint per major view.
|
|
275
|
+
|
|
276
|
+
### Wave 7 — Polish (Sprint 9)
|
|
277
|
+
|
|
278
|
+
Empty states, error states, motion audit, accessibility audit,
|
|
279
|
+
keyboard walkthrough, visual regression, banned-trope scan.
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 6 · Data model & API surface
|
|
285
|
+
|
|
286
|
+
The dashboard consumes the existing REST + WS surface. No new
|
|
287
|
+
endpoints in v8. The data model is documented per-view in
|
|
288
|
+
`views/<name>/README.md`.
|
|
289
|
+
|
|
290
|
+
### 6.1 Core entities
|
|
291
|
+
|
|
292
|
+
```ts
|
|
293
|
+
// Shared types — src/web/lib/types.ts
|
|
294
|
+
|
|
295
|
+
type ID = string; // UUID v4 or short slug
|
|
296
|
+
type ISODate = string; // ISO-8601 UTC
|
|
297
|
+
type Priority = 'p0' | 'p1' | 'p2' | 'p3' | 'p4';
|
|
298
|
+
type Status = 'backlog' | 'todo' | 'in_progress' | 'in_review' | 'done' | 'cancelled';
|
|
299
|
+
|
|
300
|
+
interface Task {
|
|
301
|
+
id: ID;
|
|
302
|
+
workspace_id: ID;
|
|
303
|
+
project_id: ID;
|
|
304
|
+
title: string;
|
|
305
|
+
description?: string;
|
|
306
|
+
status: Status;
|
|
307
|
+
priority: Priority;
|
|
308
|
+
assignee_agent_id?: ID;
|
|
309
|
+
labels: string[];
|
|
310
|
+
due_at?: ISODate;
|
|
311
|
+
estimate_min?: number;
|
|
312
|
+
parent_goal_id?: ID;
|
|
313
|
+
parent_task_id?: ID;
|
|
314
|
+
created_at: ISODate;
|
|
315
|
+
updated_at: ISODate;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
interface Goal {
|
|
319
|
+
id: ID;
|
|
320
|
+
workspace_id: ID;
|
|
321
|
+
title: string;
|
|
322
|
+
description?: string;
|
|
323
|
+
cadence: 'weekly' | 'monthly' | 'quarterly' | 'annual';
|
|
324
|
+
progress_pct: number; // 0..100, derived from task weights
|
|
325
|
+
milestones: Milestone[];
|
|
326
|
+
task_ids: ID[];
|
|
327
|
+
status: 'active' | 'paused' | 'completed' | 'archived';
|
|
328
|
+
review_at?: ISODate;
|
|
329
|
+
created_at: ISODate;
|
|
330
|
+
updated_at: ISODate;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
interface Agent {
|
|
334
|
+
id: ID;
|
|
335
|
+
type: 'coder' | 'tester' | 'reviewer' | 'system-architect'
|
|
336
|
+
| 'planner' | 'researcher' | 'performance-engineer'
|
|
337
|
+
| 'security-auditor' | 'memory-specialist';
|
|
338
|
+
display_name: string;
|
|
339
|
+
status: 'idle' | 'busy' | 'offline' | 'errored';
|
|
340
|
+
current_task_id?: ID;
|
|
341
|
+
tokens_used: number;
|
|
342
|
+
cost_usd: number;
|
|
343
|
+
registered_at: ISODate;
|
|
344
|
+
last_active_at: ISODate;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
interface ActivityEvent {
|
|
348
|
+
id: ID;
|
|
349
|
+
workspace_id: ID;
|
|
350
|
+
type: 'task_created' | 'task_updated' | 'task_completed'
|
|
351
|
+
| 'agent_spawned' | 'agent_terminated' | 'routing_decision'
|
|
352
|
+
| 'cost_reserved' | 'cost_committed' | 'memory_distilled'
|
|
353
|
+
| 'consensus_proposed' | 'goal_progress' | 'system';
|
|
354
|
+
actor: { kind: 'user' | 'agent' | 'system'; id?: ID };
|
|
355
|
+
target?: { kind: 'task' | 'goal' | 'agent' | 'memory'; id: ID };
|
|
356
|
+
payload: Record<string, unknown>;
|
|
357
|
+
created_at: ISODate;
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### 6.2 REST endpoints (consumed, unchanged)
|
|
362
|
+
|
|
363
|
+
| Method | Path | Purpose |
|
|
364
|
+
|--|--|--|
|
|
365
|
+
| GET | `/api/tasks` | List tasks (filters: `?status=&assignee=&label=`) |
|
|
366
|
+
| POST | `/api/tasks` | Create task |
|
|
367
|
+
| PATCH | `/api/tasks/:id` | Update task |
|
|
368
|
+
| DELETE | `/api/tasks/:id` | Archive task |
|
|
369
|
+
| POST | `/api/tasks/reorder` | Move task across columns |
|
|
370
|
+
| GET | `/api/goals` | List goals |
|
|
371
|
+
| POST | `/api/goals` | Create goal |
|
|
372
|
+
| PATCH | `/api/goals/:id` | Update goal |
|
|
373
|
+
| GET | `/api/agents` | List agents |
|
|
374
|
+
| GET | `/api/activity?since=` | Activity events since timestamp |
|
|
375
|
+
| GET | `/api/memory?q=` | Memory search |
|
|
376
|
+
| GET | `/api/distill/patterns` | Distilled patterns |
|
|
377
|
+
| GET | `/api/cost/status` | Cost gate status |
|
|
378
|
+
| GET | `/api/routing/decisions?limit=` | Recent routing decisions |
|
|
379
|
+
| GET | `/api/skills` | Skills |
|
|
380
|
+
| GET | `/api/mcps` | MCP servers |
|
|
381
|
+
| GET | `/api/hooks` | Hook config |
|
|
382
|
+
| GET/PATCH | `/api/settings/:section` | Settings CRUD |
|
|
383
|
+
|
|
384
|
+
### 6.3 WebSocket messages (consumed, unchanged)
|
|
385
|
+
|
|
386
|
+
| Type | Direction | Payload |
|
|
387
|
+
|--|--|--|
|
|
388
|
+
| `tasks:change` | server→client | `{ task: Task }` |
|
|
389
|
+
| `tasks:delete` | server→client | `{ id: ID }` |
|
|
390
|
+
| `agents:change` | server→client | `{ agent: Agent }` |
|
|
391
|
+
| `goals:change` | server→client | `{ goal: Goal }` |
|
|
392
|
+
| `activity:event` | server→client | `{ event: ActivityEvent }` |
|
|
393
|
+
| `routing:decision` | server→client | `{ decision: RoutingDecision }` |
|
|
394
|
+
| `cost:tick` | server→client | `{ reservation: CostReservation }` |
|
|
395
|
+
| `system:status` | server→client | `{ health, version, build }` |
|
|
396
|
+
|
|
397
|
+
### 6.4 Settings payload (v8)
|
|
398
|
+
|
|
399
|
+
Settings are stored under `/api/settings/:section`. v8 adds the
|
|
400
|
+
following sections: `general`, `appearance`, `agents`, `goals`,
|
|
401
|
+
`tasks`, `skills`, `mcps`, `hooks`, `routing`, `memory`,
|
|
402
|
+
`notifications`, `security`, `integrations`, `billing`, `team`,
|
|
403
|
+
`advanced`. Each is a Zod-validated object; the server rejects
|
|
404
|
+
unknown keys.
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## 7 · Routing
|
|
409
|
+
|
|
410
|
+
### 7.1 Route tree (TanStack Router, code-based)
|
|
411
|
+
|
|
412
|
+
```ts
|
|
413
|
+
// src/web/routes.tsx
|
|
414
|
+
const rootRoute = createRootRoute({ component: AppShell });
|
|
415
|
+
|
|
416
|
+
const indexRoute = createRoute({
|
|
417
|
+
getParentRoute: () => rootRoute,
|
|
418
|
+
path: '/',
|
|
419
|
+
component: OverviewPage,
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
const tasksRoute = createRoute({
|
|
423
|
+
getParentRoute: () => rootRoute,
|
|
424
|
+
path: 'tasks',
|
|
425
|
+
component: TasksLayout,
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
const tasksIndex = createRoute({
|
|
429
|
+
getParentRoute: () => tasksRoute,
|
|
430
|
+
path: '/',
|
|
431
|
+
component: TasksKanban, // default view
|
|
432
|
+
validateSearch: z.object({
|
|
433
|
+
group: z.enum(['status', 'assignee', 'label', 'priority', 'due', 'project']).optional(),
|
|
434
|
+
assignee: z.string().optional(),
|
|
435
|
+
label: z.string().optional(),
|
|
436
|
+
q: z.string().optional(),
|
|
437
|
+
}),
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
const tasksListRoute = createRoute({
|
|
441
|
+
getParentRoute: () => tasksRoute,
|
|
442
|
+
path: 'list',
|
|
443
|
+
component: TasksList,
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
const tasksCalendarRoute = createRoute({
|
|
447
|
+
getParentRoute: () => tasksRoute,
|
|
448
|
+
path: 'calendar',
|
|
449
|
+
component: TasksCalendar,
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
// ... goals, agents, activity, memory, libraries, settings ...
|
|
453
|
+
|
|
454
|
+
const routeTree = rootRoute.addChildren([
|
|
455
|
+
indexRoute,
|
|
456
|
+
tasksRoute.addChildren([tasksIndex, tasksListRoute, tasksCalendarRoute]),
|
|
457
|
+
// ...
|
|
458
|
+
]);
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### 7.2 Route guards
|
|
462
|
+
|
|
463
|
+
- `/settings/*` requires `localStorage.bizar_workspace_id` to be set;
|
|
464
|
+
otherwise redirects to `/setup`.
|
|
465
|
+
- `/agents/:id` validates `:id` is a valid agent id; otherwise 404.
|
|
466
|
+
- All other routes are open.
|
|
467
|
+
|
|
468
|
+
### 7.3 Search params
|
|
469
|
+
|
|
470
|
+
Each route that supports filters declares a `validateSearch` Zod
|
|
471
|
+
schema. Filters survive reloads via URL state. The kanban view
|
|
472
|
+
serializes its filters into the URL so a deep link reproduces the
|
|
473
|
+
exact view.
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
## 8 · State management
|
|
478
|
+
|
|
479
|
+
### 8.1 Server state (TanStack Query)
|
|
480
|
+
|
|
481
|
+
```ts
|
|
482
|
+
// src/web/lib/query-client.ts
|
|
483
|
+
export const queryClient = new QueryClient({
|
|
484
|
+
defaultOptions: {
|
|
485
|
+
queries: {
|
|
486
|
+
staleTime: 30_000,
|
|
487
|
+
gcTime: 5 * 60_000,
|
|
488
|
+
refetchOnWindowFocus: false,
|
|
489
|
+
retry: 1,
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
});
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
Query keys are namespaced: `['tasks']`, `['tasks', filters]`,
|
|
496
|
+
`['goals']`, `['agents']`, `['activity', since]`, `['settings', section]`.
|
|
497
|
+
|
|
498
|
+
WS events invalidate the relevant keys:
|
|
499
|
+
|
|
500
|
+
```ts
|
|
501
|
+
ws.on('tasks:change', () => {
|
|
502
|
+
queryClient.invalidateQueries({ queryKey: ['tasks'] });
|
|
503
|
+
});
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### 8.2 UI state (Zustand)
|
|
507
|
+
|
|
508
|
+
Stores live at `src/web/stores/`. Each store is a single Zustand
|
|
509
|
+
slice with no nested state.
|
|
510
|
+
|
|
511
|
+
```ts
|
|
512
|
+
// stores/palette.ts
|
|
513
|
+
interface PaletteState {
|
|
514
|
+
open: boolean;
|
|
515
|
+
scope: 'actions' | 'navigate' | 'settings';
|
|
516
|
+
toggle: () => void;
|
|
517
|
+
setScope: (scope: PaletteState['scope']) => void;
|
|
518
|
+
}
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
Other stores: `theme`, `density`, `sidebar` (collapsed), `selection`
|
|
522
|
+
(current kanban/agents selection for bulk actions).
|
|
523
|
+
|
|
524
|
+
### 8.3 Form state (React Hook Form)
|
|
525
|
+
|
|
526
|
+
Forms auto-save on blur; explicit save button is reserved for
|
|
527
|
+
multi-field forms in settings. Schema is Zod, error rendering uses
|
|
528
|
+
`react-hook-form`'s `formState.errors` mapped to `Field`'s error slot.
|
|
529
|
+
|
|
530
|
+
### 8.4 URL state (TanStack Router search params)
|
|
531
|
+
|
|
532
|
+
Anything filterable lives in the URL. The kanban view's group,
|
|
533
|
+
assignee, label, and search query are all in the URL.
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
---
|
|
537
|
+
|
|
538
|
+
## 9 · Real-time updates
|
|
539
|
+
|
|
540
|
+
### 9.1 WS singleton
|
|
541
|
+
|
|
542
|
+
```ts
|
|
543
|
+
// src/web/lib/ws.ts
|
|
544
|
+
class DashboardWS {
|
|
545
|
+
private ws: WebSocket | null = null;
|
|
546
|
+
private listeners = new Map<string, Set<(payload: unknown) => void>>();
|
|
547
|
+
private status: 'connecting' | 'open' | 'reconnecting' | 'closed' = 'closed';
|
|
548
|
+
private reconnectAttempts = 0;
|
|
549
|
+
|
|
550
|
+
connect() {
|
|
551
|
+
if (this.ws) return;
|
|
552
|
+
this.status = 'connecting';
|
|
553
|
+
this.ws = new WebSocket('/ws/dashboard');
|
|
554
|
+
this.ws.onopen = () => { this.status = 'open'; this.reconnectAttempts = 0; };
|
|
555
|
+
this.ws.onclose = () => {
|
|
556
|
+
this.status = 'closed';
|
|
557
|
+
const delay = Math.min(30_000, 1000 * 2 ** this.reconnectAttempts++);
|
|
558
|
+
setTimeout(() => this.connect(), delay);
|
|
559
|
+
};
|
|
560
|
+
this.ws.onmessage = (event) => {
|
|
561
|
+
const { type, payload } = JSON.parse(event.data);
|
|
562
|
+
this.listeners.get(type)?.forEach((cb) => cb(payload));
|
|
563
|
+
this.listeners.get('*')?.forEach((cb) => cb({ type, payload }));
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
on(type: string, cb: (payload: unknown) => void): () => void {
|
|
568
|
+
const set = this.listeners.get(type) ?? new Set();
|
|
569
|
+
set.add(cb);
|
|
570
|
+
this.listeners.set(type, set);
|
|
571
|
+
return () => set.delete(cb);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
getStatus() { return this.status; }
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
export const ws = new DashboardWS();
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
### 9.2 Hook
|
|
581
|
+
|
|
582
|
+
```ts
|
|
583
|
+
// src/web/ui/hooks/useWebSocket.ts
|
|
584
|
+
export function useWebSocket<T>(
|
|
585
|
+
type: string,
|
|
586
|
+
handler: (payload: T) => void,
|
|
587
|
+
) {
|
|
588
|
+
useEffect(() => {
|
|
589
|
+
ws.connect();
|
|
590
|
+
return ws.on(type, handler as (p: unknown) => void);
|
|
591
|
+
}, [type, handler]);
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
### 9.3 Cache invalidation pattern
|
|
596
|
+
|
|
597
|
+
```ts
|
|
598
|
+
// src/web/lib/ws-invalidate.ts
|
|
599
|
+
ws.on('tasks:change', () => queryClient.invalidateQueries({ queryKey: ['tasks'] }));
|
|
600
|
+
ws.on('tasks:delete', () => queryClient.invalidateQueries({ queryKey: ['tasks'] }));
|
|
601
|
+
ws.on('agents:change', () => queryClient.invalidateQueries({ queryKey: ['agents'] }));
|
|
602
|
+
ws.on('goals:change', () => queryClient.invalidateQueries({ queryKey: ['goals'] }));
|
|
603
|
+
ws.on('activity:event', () => queryClient.invalidateQueries({ queryKey: ['activity'] }));
|
|
604
|
+
ws.on('routing:decision', () => queryClient.invalidateQueries({ queryKey: ['routing'] }));
|
|
605
|
+
ws.on('cost:tick', () => queryClient.invalidateQueries({ queryKey: ['cost'] }));
|
|
606
|
+
ws.on('system:status', () => queryClient.invalidateQueries({ queryKey: ['system'] }));
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
### 9.4 Status indicator
|
|
610
|
+
|
|
611
|
+
The topbar shows a status pill driven by `ws.getStatus()`:
|
|
612
|
+
- `open` → green pulse, "Live"
|
|
613
|
+
- `reconnecting` → amber pulse, "Reconnecting"
|
|
614
|
+
- `closed` → red dot, "Offline"
|
|
615
|
+
|
|
616
|
+
---
|
|
617
|
+
|
|
618
|
+
## 10 · Theme system
|
|
619
|
+
|
|
620
|
+
### 10.1 Provider
|
|
621
|
+
|
|
622
|
+
```tsx
|
|
623
|
+
// src/web/ui/theme/ThemeProvider.tsx
|
|
624
|
+
export function ThemeProvider({ children }: { children: React.ReactNode }) {
|
|
625
|
+
const [theme, setTheme] = useState<'light' | 'dark' | 'system'>(
|
|
626
|
+
() => (localStorage.getItem('bizar.theme') as any) ?? 'system',
|
|
627
|
+
);
|
|
628
|
+
const resolved = useMemo(() => resolveTheme(theme), [theme]);
|
|
629
|
+
|
|
630
|
+
useEffect(() => {
|
|
631
|
+
document.documentElement.classList.toggle('dark', resolved === 'dark');
|
|
632
|
+
localStorage.setItem('bizar.theme', theme);
|
|
633
|
+
}, [theme, resolved]);
|
|
634
|
+
|
|
635
|
+
return (
|
|
636
|
+
<ThemeContext.Provider value={{ theme, setTheme, resolved }}>
|
|
637
|
+
{children}
|
|
638
|
+
</ThemeContext.Provider>
|
|
639
|
+
);
|
|
640
|
+
}
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
### 10.2 Tokens
|
|
644
|
+
|
|
645
|
+
`tokens.css` is generated from `src/shared/tokens.json` by a small
|
|
646
|
+
build script. The JSON is the source of truth; the CSS is generated
|
|
647
|
+
on every `pnpm build`. Any token added to the JSON must also be
|
|
648
|
+
added to DESIGN.md §3 — this is checked in CI.
|
|
649
|
+
|
|
650
|
+
### 10.3 Token generation
|
|
651
|
+
|
|
652
|
+
```ts
|
|
653
|
+
// scripts/generate-tokens.ts
|
|
654
|
+
import tokens from '../src/shared/tokens.json';
|
|
655
|
+
import fs from 'node:fs';
|
|
656
|
+
|
|
657
|
+
const light = generateCSS(':root', tokens.light);
|
|
658
|
+
const dark = generateCSS('.dark', tokens.dark);
|
|
659
|
+
const fs_write = `${light}\n\n${dark}\n`;
|
|
660
|
+
fs.writeFileSync('src/web/ui/styles/tokens.css', fs_write);
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
### 10.4 Density
|
|
664
|
+
|
|
665
|
+
Density is a separate concern, also a provider. The `<html>`
|
|
666
|
+
element carries `data-density="compact|comfortable"`. CSS reads
|
|
667
|
+
the attribute to swap row heights and padding.
|
|
668
|
+
|
|
669
|
+
---
|
|
670
|
+
|
|
671
|
+
## 11 · Settings model
|
|
672
|
+
|
|
673
|
+
### 11.1 Server-side schema
|
|
674
|
+
|
|
675
|
+
Each setting section is a Zod schema. The server validates on every
|
|
676
|
+
PATCH. The client mirrors the schema in `src/web/lib/settings-schemas.ts`.
|
|
677
|
+
|
|
678
|
+
```ts
|
|
679
|
+
// src/web/lib/settings-schemas.ts
|
|
680
|
+
import { z } from 'zod';
|
|
681
|
+
|
|
682
|
+
export const AgentsSettingsSchema = z.object({
|
|
683
|
+
defaultRosterSize: z.number().int().min(1).max(64).default(8),
|
|
684
|
+
maxConcurrent: z.number().int().min(1).max(64).default(16),
|
|
685
|
+
enabledTypes: z.array(z.enum(AGENT_TYPES)).default(AGENT_TYPES),
|
|
686
|
+
autoSpawnOnSession: z.boolean().default(true),
|
|
687
|
+
restartOnConfigChange: z.boolean().default(false),
|
|
688
|
+
});
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
### 11.2 Settings store
|
|
692
|
+
|
|
693
|
+
Settings are stored under `/api/settings/:section` (one file per
|
|
694
|
+
section). The UI hydrates from the server on mount, mirrors to
|
|
695
|
+
TanStack Query cache, and auto-saves on blur.
|
|
696
|
+
|
|
697
|
+
```ts
|
|
698
|
+
export function useSettings<T>(section: string) {
|
|
699
|
+
return useQuery({
|
|
700
|
+
queryKey: ['settings', section],
|
|
701
|
+
queryFn: () => api.get(`/api/settings/${section}`),
|
|
702
|
+
staleTime: Infinity, // settings rarely change
|
|
703
|
+
});
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
export function useUpdateSettings(section: string) {
|
|
707
|
+
return useMutation({
|
|
708
|
+
mutationFn: (data: unknown) => api.patch(`/api/settings/${section}`, data),
|
|
709
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['settings', section] }),
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
### 11.3 Auto-save
|
|
715
|
+
|
|
716
|
+
Field blur triggers `useUpdateSettings.mutate(fieldValue)`. On
|
|
717
|
+
success: green checkmark flash for 1s. On error: inline error,
|
|
718
|
+
toast, no revert (settings don't auto-revert).
|
|
719
|
+
|
|
720
|
+
### 11.4 Settings sidebar (in-page)
|
|
721
|
+
|
|
722
|
+
The settings layout (`views/Settings/SettingsLayout.tsx`) renders a
|
|
723
|
+
secondary sidebar on the left of the page with the 16 sections,
|
|
724
|
+
each linking to its route. Active section uses `--sidebar-accent`.
|
|
725
|
+
|
|
726
|
+
### 11.5 Cmd+K integration
|
|
727
|
+
|
|
728
|
+
Every settings key is a Command Palette entry. The palette's
|
|
729
|
+
Settings scope renders one entry per settings section with its
|
|
730
|
+
icon, name, and the parent breadcrumb.
|
|
731
|
+
|
|
732
|
+
|
|
733
|
+
---
|
|
734
|
+
|
|
735
|
+
## 12 · Migration / deletion of old dashboard
|
|
736
|
+
|
|
737
|
+
### 12.1 What gets deleted
|
|
738
|
+
|
|
739
|
+
Everything inside `bizar-dash/src/web/` from the v7 release:
|
|
740
|
+
|
|
741
|
+
```
|
|
742
|
+
bizar-dash/src/web/
|
|
743
|
+
├── ui/ # DELETE all (F-040 primitives, controls, data, feedback, layout, navigation, styles, theme, utils)
|
|
744
|
+
├── views/ # DELETE all (Overview, Tasks, Agents, Active, Skills, Memory, Mods, Schedules, Settings, Mobile*, Chat, Chat*)
|
|
745
|
+
├── components/ # DELETE all
|
|
746
|
+
├── hooks/ # DELETE all (replaced by ui/hooks + stores)
|
|
747
|
+
├── lib/ # KEEP only what v8 reuses (ws, api, types, query-client)
|
|
748
|
+
├── locales/ # DELETE all (v8 is en-only for now)
|
|
749
|
+
├── mobile/ # DELETE all (F-041 mobile pass — replaced by responsive web)
|
|
750
|
+
├── styles/ # KEEP only what v8 needs
|
|
751
|
+
├── App.tsx # REPLACE
|
|
752
|
+
├── MobileApp.tsx # DELETE
|
|
753
|
+
├── main.tsx # REPLACE
|
|
754
|
+
├── mobile.html # DELETE
|
|
755
|
+
├── mobile.tsx # DELETE
|
|
756
|
+
└── index.html # REPLACE
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
Plus:
|
|
760
|
+
|
|
761
|
+
- `bizar-dash/DESIGN.md` — replaced by the new DESIGN.md (this rewrite)
|
|
762
|
+
- `bizar-dash/ARCHITECTURE.md` — replaced with v8 module doc
|
|
763
|
+
- `bizar-dash/CONSTRAINTS.md` — replaced with v8 constraints
|
|
764
|
+
- `bizar-dash/README.md` — replaced
|
|
765
|
+
- `feature_list.json` — F-040 and F-041 entries are **reverted to not_started** and re-scoped as v8 sprints (§14)
|
|
766
|
+
|
|
767
|
+
### 12.2 What stays
|
|
768
|
+
|
|
769
|
+
- `bizar-dash/src/server/` — REST API and WebSocket server (unchanged).
|
|
770
|
+
- `bizar-dash/scripts/` — keeps `check-arch.sh` (renamed if needed);
|
|
771
|
+
deletes other shell helpers that v8 doesn't reuse.
|
|
772
|
+
- `bizar-dash/package.json`, `tsconfig.json`, `vite.config.ts`,
|
|
773
|
+
`vitest.config.ts` — replace with v8 versions.
|
|
774
|
+
- `bizar-dash/dist/` — generated; rebuilt on `pnpm build`.
|
|
775
|
+
- `bizar-dash/plans/`, `skills/`, `templates/`, `tests/` — module
|
|
776
|
+
metadata; preserve what v8 still consumes.
|
|
777
|
+
|
|
778
|
+
### 12.3 Migration script
|
|
779
|
+
|
|
780
|
+
A single bash script handles the destructive phase:
|
|
781
|
+
|
|
782
|
+
```sh
|
|
783
|
+
#!/usr/bin/env bash
|
|
784
|
+
# scripts/v8-migrate.sh — run once at the start of Sprint 0
|
|
785
|
+
set -euo pipefail
|
|
786
|
+
|
|
787
|
+
cd "$(dirname "$0")/.."
|
|
788
|
+
|
|
789
|
+
# 1. Delete the old web/ subtree (except shared lib/)
|
|
790
|
+
rm -rf src/web/ui src/web/views src/web/components src/web/hooks
|
|
791
|
+
rm -rf src/web/locales src/web/mobile src/web/styles
|
|
792
|
+
rm -f src/web/App.tsx src/web/MobileApp.tsx src/web/main.tsx
|
|
793
|
+
rm -f src/web/mobile.html src/web/mobile.tsx src/web/index.html
|
|
794
|
+
|
|
795
|
+
# 2. Reset F-040 and F-041 in feature_list.json
|
|
796
|
+
node scripts/v8-feature-list-reset.mjs
|
|
797
|
+
|
|
798
|
+
# 3. Clear v8 token
|
|
799
|
+
git mv DESIGN.md DESIGN.md.v7-bak || true
|
|
800
|
+
git mv ARCHITECTURE.md ARCHITECTURE.md.v7-bak || true
|
|
801
|
+
git mv CONSTRAINTS.md CONSTRAINTS.md.v7-bak || true
|
|
802
|
+
git mv README.md README.md.v7-bak || true
|
|
803
|
+
|
|
804
|
+
echo "v8 migration complete. Old artifacts in *.v7-bak; delete after v8.0 ships."
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
### 12.4 Rollback plan
|
|
808
|
+
|
|
809
|
+
If v8.0 fails its gate (post-Sprint 9), revert to v7.0.0 via git.
|
|
810
|
+
The `*.v7-bak` files preserve DESIGN.md, ARCHITECTURE.md,
|
|
811
|
+
CONSTRAINTS.md, README.md so a revert restores documentation as
|
|
812
|
+
well as code.
|
|
813
|
+
|
|
814
|
+
---
|
|
815
|
+
|
|
816
|
+
## 13 · Phased implementation plan
|
|
817
|
+
|
|
818
|
+
### Sprint 0 — Bootstrap (½ day)
|
|
819
|
+
|
|
820
|
+
- Branch `worktree-v8-dashboard-rewrite` off `master`.
|
|
821
|
+
- Run `scripts/v8-migrate.sh`.
|
|
822
|
+
- `pnpm dlx shadcn@latest init --preset b7kBsBkh7b` (creates
|
|
823
|
+
`components.json`, `tailwind.config.ts`, baseline `globals.css`).
|
|
824
|
+
- Override `tailwind.config.ts` to consume only our token CSS
|
|
825
|
+
variables (no utility classes leak into `ui/`).
|
|
826
|
+
- Replace generated `globals.css` with our `tokens.css` from §3
|
|
827
|
+
DESIGN.
|
|
828
|
+
|
|
829
|
+
**Exit gate:** `pnpm dev` boots a blank page with our token CSS
|
|
830
|
+
applied. `pnpm check:design-tropes` exits 0.
|
|
831
|
+
|
|
832
|
+
### Sprint 1 — Foundation
|
|
833
|
+
|
|
834
|
+
- `ui/styles/{reset,tokens,globals}.css` (delivered)
|
|
835
|
+
- `ui/theme/{ThemeProvider,ThemeToggle,DensityProvider,useTheme,useDensity}.tsx`
|
|
836
|
+
- `ui/primitives/*` (11 components, each with `.test.tsx`)
|
|
837
|
+
- `shell/{AppShell,Topbar,Sidebar,StatusBar}.tsx`
|
|
838
|
+
|
|
839
|
+
**Exit gate:** App shell renders with sidebar + topbar. Theme
|
|
840
|
+
toggle works. Density toggle works. 11 primitives have unit tests.
|
|
841
|
+
|
|
842
|
+
### Sprint 2 — Controls & feedback
|
|
843
|
+
|
|
844
|
+
- `ui/controls/*` (20 components)
|
|
845
|
+
- `ui/feedback/*` (16 components)
|
|
846
|
+
- `ui/utils/*` (8 utilities)
|
|
847
|
+
|
|
848
|
+
**Exit gate:** Form playground page exercises every control +
|
|
849
|
+
feedback component. Visual screenshot matches DESIGN §3 tokens.
|
|
850
|
+
|
|
851
|
+
### Sprint 3 — Data display
|
|
852
|
+
|
|
853
|
+
- `ui/data/*` (24 components)
|
|
854
|
+
- `views/Overview/*` (uses StatTile, Chart, DataTable, BarList)
|
|
855
|
+
|
|
856
|
+
**Exit gate:** Overview page renders against live `/api/agents`,
|
|
857
|
+
`/api/tasks`, `/api/cost/status`. Visual screenshot at 1440 / 1100.
|
|
858
|
+
|
|
859
|
+
### Sprint 4 — Navigation
|
|
860
|
+
|
|
861
|
+
- `ui/navigation/*` (23 components)
|
|
862
|
+
- `ui/popups/*` (8 components)
|
|
863
|
+
- `stores/{palette,sidebar,selection}.ts`
|
|
864
|
+
- Command palette wired with Actions + Navigate scopes.
|
|
865
|
+
|
|
866
|
+
**Exit gate:** Cmd+K opens palette with all 6 nav items + 10+
|
|
867
|
+
actions. Keyboard walkthrough passes for every nav item.
|
|
868
|
+
|
|
869
|
+
### Sprint 5 — Kanban (the main focus)
|
|
870
|
+
|
|
871
|
+
- `ui/kanban/*` (15 components)
|
|
872
|
+
- `hooks/useTasks.ts`
|
|
873
|
+
- `views/Tasks/*` (Kanban view + List view + Calendar view)
|
|
874
|
+
- Right-click context menu on every card
|
|
875
|
+
- Drag-and-drop across columns (with keyboard alternative)
|
|
876
|
+
- Filters: status, assignee, label, priority, due, search
|
|
877
|
+
- Group-by: status / assignee / label / priority / due / project
|
|
878
|
+
- Sort: created / updated / priority / due
|
|
879
|
+
- Density: compact / comfortable
|
|
880
|
+
- Detail drawer (right side)
|
|
881
|
+
|
|
882
|
+
**Exit gate:** 100 tasks in seeded data render in <100ms. Drag
|
|
883
|
+
works via mouse + keyboard. Right-click menu opens on every card.
|
|
884
|
+
URL state survives reload.
|
|
885
|
+
|
|
886
|
+
### Sprint 6 — Goals + Agents
|
|
887
|
+
|
|
888
|
+
- `views/Goals/*` — list, detail, milestones, progress
|
|
889
|
+
- `views/Agents/*` — roster, detail, live status
|
|
890
|
+
|
|
891
|
+
**Exit gate:** Goal → task breakdown visible. Agent roster shows
|
|
892
|
+
live status with WS updates. Detail drawer works for both.
|
|
893
|
+
|
|
894
|
+
### Sprint 7 — Activity + Memory + Libraries
|
|
895
|
+
|
|
896
|
+
- `views/Activity/*` — event log + comm log + routing decisions
|
|
897
|
+
- `views/Memory/*` — vault browser + distillation patterns
|
|
898
|
+
- `views/Libraries/*` — Skills / MCPs / Hooks in a tabbed page
|
|
899
|
+
|
|
900
|
+
**Exit gate:** Activity feed live-updates via WS. Memory search
|
|
901
|
+
hits the existing `/api/memory?q=`. Libraries page shows all
|
|
902
|
+
skills/MCPs/hooks with right-click context menus.
|
|
903
|
+
|
|
904
|
+
### Sprint 8 — Settings (16 sections)
|
|
905
|
+
|
|
906
|
+
- `views/Settings/*` — hierarchical with in-page sidebar
|
|
907
|
+
- `lib/settings-schemas.ts` — Zod schemas for all 16 sections
|
|
908
|
+
- Cmd+K Settings scope wired
|
|
909
|
+
|
|
910
|
+
**Exit gate:** Every settings section renders, auto-saves, and
|
|
911
|
+
survives reload. Cmd+K "Settings" scope lists every section.
|
|
912
|
+
|
|
913
|
+
### Sprint 9 — Polish & verification
|
|
914
|
+
|
|
915
|
+
- Empty/loading/error states for every view
|
|
916
|
+
- Motion audit (every transition matches §6)
|
|
917
|
+
- Accessibility audit (`pnpm check:a11y`)
|
|
918
|
+
- Visual regression at 1440 / 1100 / 768 / 390
|
|
919
|
+
- Keyboard walkthrough (`pnpm check:keyboard`)
|
|
920
|
+
- Banned-trope scan (`pnpm check:design-tropes`)
|
|
921
|
+
- Mobile responsive pass (single breakpoint at 768px; no mobile-
|
|
922
|
+
native apps)
|
|
923
|
+
- Performance: lighthouse > 90 on `/tasks`
|
|
924
|
+
|
|
925
|
+
**Exit gate:** All 5 checks green. L09 layers 1+2+3 all green.
|
|
926
|
+
PROGRESS.md updated; release notes drafted.
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
---
|
|
930
|
+
|
|
931
|
+
## 14 · Sprint schedule
|
|
932
|
+
|
|
933
|
+
Sprint length: **3 working days** each. Total: 9 sprints × 3 = ~27
|
|
934
|
+
working days, or roughly **5–6 calendar weeks** with a single full-
|
|
935
|
+
time engineer + review.
|
|
936
|
+
|
|
937
|
+
| Sprint | Focus | Feature IDs | Days |
|
|
938
|
+
|--|--|--|--|
|
|
939
|
+
| **S0** | Bootstrap (delete old, init preset) | F-042 | 0.5 |
|
|
940
|
+
| **S1** | Foundation (tokens, primitives, shell) | F-043 | 3 |
|
|
941
|
+
| **S2** | Controls + feedback | F-044 | 3 |
|
|
942
|
+
| **S3** | Data display + Overview | F-045 | 3 |
|
|
943
|
+
| **S4** | Navigation + palette + popups | F-046 | 3 |
|
|
944
|
+
| **S5** | Kanban (the centerpiece) | F-047 | 4 |
|
|
945
|
+
| **S6** | Goals + Agents | F-048 | 3 |
|
|
946
|
+
| **S7** | Activity + Memory + Libraries | F-049 | 3 |
|
|
947
|
+
| **S8** | Settings (16 sections) | F-050 | 3 |
|
|
948
|
+
| **S9** | Polish + verification | F-051 | 2.5 |
|
|
949
|
+
|
|
950
|
+
Total: **28 working days** ≈ **5.5 calendar weeks**.
|
|
951
|
+
|
|
952
|
+
### Feature ID assignments
|
|
953
|
+
|
|
954
|
+
`F-042` through `F-051` are reserved for the v8 sprint. `F-040`
|
|
955
|
+
(F-040 redesign) and `F-041` (mobile UI pass) are reset to
|
|
956
|
+
`not_started` and treated as historical context — their evidence
|
|
957
|
+
is preserved in `docs/decisions/DEC-026-v8-dashboard-rewrite.md`
|
|
958
|
+
but they do not count toward VCR.
|
|
959
|
+
|
|
960
|
+
### Sprint contracts
|
|
961
|
+
|
|
962
|
+
Each sprint starts with a sprint contract template (see
|
|
963
|
+
`templates/sprint-contract.md`). The contract includes:
|
|
964
|
+
- Scope (which files, which features)
|
|
965
|
+
- Definition of Done (L09 layers 1+2+3)
|
|
966
|
+
- Exclusions (what is *not* in scope)
|
|
967
|
+
- Risks + mitigations
|
|
968
|
+
- Reviewer (Forseti)
|
|
969
|
+
|
|
970
|
+
### WIP=1 rule
|
|
971
|
+
|
|
972
|
+
Per CLAUDE.md, only one feature active at a time. Each sprint ships
|
|
973
|
+
one feature (`F-NNN`) end-to-end. We do **not** ship partial
|
|
974
|
+
features; the gate is the gate.
|
|
975
|
+
|
|
976
|
+
---
|
|
977
|
+
|
|
978
|
+
## 15 · Testing strategy
|
|
979
|
+
|
|
980
|
+
### 15.1 Unit (vitest)
|
|
981
|
+
|
|
982
|
+
Every component in `ui/` has a colocated `.test.tsx`. Patterns:
|
|
983
|
+
- AAA (Arrange / Act / Assert).
|
|
984
|
+
- `@testing-library/react` for rendering + queries.
|
|
985
|
+
- `userEvent` (not `fireEvent`) for interactions.
|
|
986
|
+
- `vitest-axe` for a11y assertions.
|
|
987
|
+
- One snapshot per visual state (default, hover, focus, disabled,
|
|
988
|
+
loading, error).
|
|
989
|
+
- Aim: 80%+ coverage per component file.
|
|
990
|
+
|
|
991
|
+
### 15.2 Integration (vitest)
|
|
992
|
+
|
|
993
|
+
Per-view integration tests render the full view against a mocked
|
|
994
|
+
MSW server. Cover:
|
|
995
|
+
- Initial load → first paint
|
|
996
|
+
- User action → optimistic update → server confirm
|
|
997
|
+
- User action → server error → revert + toast
|
|
998
|
+
- WS event → cache invalidation → re-render
|
|
999
|
+
|
|
1000
|
+
### 15.3 E2E (playwright)
|
|
1001
|
+
|
|
1002
|
+
`tests/e2e/` covers the critical user flows:
|
|
1003
|
+
- `smoke.spec.ts` — boot the app, land on Overview, navigate to
|
|
1004
|
+
every route, no console errors.
|
|
1005
|
+
- `keyboard.spec.ts` — walk through every interactive element
|
|
1006
|
+
using only Tab + Enter + arrow keys. Cmd+K, Shift+F10, Esc.
|
|
1007
|
+
- `visual.spec.ts` — screenshot diff at 1440 / 1100 / 768 / 390.
|
|
1008
|
+
- `kanban.spec.ts` — drag a card across columns, verify URL state,
|
|
1009
|
+
verify the move persists after reload.
|
|
1010
|
+
- `settings.spec.ts` — change a setting, verify auto-save, verify
|
|
1011
|
+
Cmd+K shows it.
|
|
1012
|
+
|
|
1013
|
+
### 15.4 Accessibility (axe-core)
|
|
1014
|
+
|
|
1015
|
+
`tests/a11y/` runs axe-core against every route. CI fails if any
|
|
1016
|
+
page has a critical violation. Manual screen-reader pass on Tasks,
|
|
1017
|
+
Goals, Settings, and Command Palette before each release.
|
|
1018
|
+
|
|
1019
|
+
### 15.5 Visual regression (playwright visual)
|
|
1020
|
+
|
|
1021
|
+
Screenshot diff against committed baselines. Baseline PR is
|
|
1022
|
+
generated automatically; reviewer approves deltas before merge.
|
|
1023
|
+
|
|
1024
|
+
### 15.6 Performance
|
|
1025
|
+
|
|
1026
|
+
Lighthouse runs in CI on `/tasks` with seeded data. Targets:
|
|
1027
|
+
- LCP < 1.5s
|
|
1028
|
+
- TBT < 200ms
|
|
1029
|
+
- CLS < 0.05
|
|
1030
|
+
- Performance score ≥ 90
|
|
1031
|
+
|
|
1032
|
+
### 15.7 Banned-trope scan
|
|
1033
|
+
|
|
1034
|
+
`scripts/check-design-tropes.sh` greps the codebase for the §12
|
|
1035
|
+
DESIGN banned patterns. Runs on every PR; CI fails on hit.
|
|
1036
|
+
|
|
1037
|
+
---
|
|
1038
|
+
|
|
1039
|
+
## 16 · Integration with Bizar harness
|
|
1040
|
+
|
|
1041
|
+
### 16.1 MCP tools (no changes)
|
|
1042
|
+
|
|
1043
|
+
v8 consumes the same 22+ MCP tools that v7 did. No new tools.
|
|
1044
|
+
|
|
1045
|
+
### 16.2 Plugin shim
|
|
1046
|
+
|
|
1047
|
+
The dashboard never imports from `plugins/bizar/`. Per CLAUDE.md
|
|
1048
|
+
L10: "Skill must not import from `bizar-dash/` (cross-layer)."
|
|
1049
|
+
The reverse is also true — dashboard imports nothing from the
|
|
1050
|
+
plugin layer.
|
|
1051
|
+
|
|
1052
|
+
### 16.3 Data flow
|
|
1053
|
+
|
|
1054
|
+
```
|
|
1055
|
+
┌─────────────────┐ REST + WS ┌──────────────────┐
|
|
1056
|
+
│ bizar-dash │◄──────────────►│ bizar-dash │
|
|
1057
|
+
│ src/web/ │ │ src/server/ │
|
|
1058
|
+
│ (React SPA) │ │ (Express + WS) │
|
|
1059
|
+
└─────────────────┘ └──────────────────┘
|
|
1060
|
+
│
|
|
1061
|
+
▼
|
|
1062
|
+
┌──────────────────┐
|
|
1063
|
+
│ plugins/bizar │
|
|
1064
|
+
│ (MCP server) │
|
|
1065
|
+
└──────────────────┘
|
|
1066
|
+
│
|
|
1067
|
+
▼
|
|
1068
|
+
┌──────────────────┐
|
|
1069
|
+
│ packages/sdk │
|
|
1070
|
+
│ (Claude Code │
|
|
1071
|
+
│ Agent SDK) │
|
|
1072
|
+
└──────────────────┘
|
|
1073
|
+
```
|
|
1074
|
+
|
|
1075
|
+
### 16.4 Build pipeline
|
|
1076
|
+
|
|
1077
|
+
- `pnpm dev` — Vite dev server on `:5173`, proxied to `node
|
|
1078
|
+
src/server/main.mjs` on `:8787` for REST + WS.
|
|
1079
|
+
- `pnpm build` — Vite production build → `dist/`.
|
|
1080
|
+
- `pnpm preview` — serve `dist/` + `src/server/`.
|
|
1081
|
+
- `make dashboard-dev` — orchestrator target that runs both in
|
|
1082
|
+
watch mode.
|
|
1083
|
+
|
|
1084
|
+
### 16.5 CI gates
|
|
1085
|
+
|
|
1086
|
+
- `pnpm typecheck` — TypeScript strict, 0 errors.
|
|
1087
|
+
- `pnpm test` — vitest, all unit + integration.
|
|
1088
|
+
- `pnpm e2e` — playwright smoke + keyboard.
|
|
1089
|
+
- `pnpm check:design-tropes` — banned patterns.
|
|
1090
|
+
- `pnpm check:a11y` — axe-core.
|
|
1091
|
+
- `pnpm check:visual` — screenshot diff (advisory, manual approve).
|
|
1092
|
+
- `pnpm check:arch` — architectural rules (skill/dashboard/SDK
|
|
1093
|
+
boundaries).
|
|
1094
|
+
- `make check` — full pipeline; existing in CLAUDE.md.
|
|
1095
|
+
|
|
1096
|
+
### 16.6 Release
|
|
1097
|
+
|
|
1098
|
+
- v8.0 ships when all 10 sprints (F-042..F-051) are passing.
|
|
1099
|
+
- v8.0.1+ is patch-only on v8.0; no new features until v8.1.
|
|
1100
|
+
- The `*.v7-bak` files are deleted at v8.0 release.
|
|
1101
|
+
|
|
1102
|
+
---
|
|
1103
|
+
|
|
1104
|
+
## 17 · Risks & open questions
|
|
1105
|
+
|
|
1106
|
+
| # | Risk | Likelihood | Impact | Mitigation |
|
|
1107
|
+
|--|--|--|--|--|
|
|
1108
|
+
| R-01 | shadcn preset `b7kBsBkh7b` is unverified / doesn't resolve as expected | Med | High | Appendix A of DESIGN.md documents the fallback: override `components.json`, run `shadcn add` for each missing primitive. The plan still holds; §3 is the contract. |
|
|
1109
|
+
| R-02 | TanStack Router file-based routing is incompatible with the existing Vite build | Low | Med | Sprint 0 verifies routing setup before committing. Code-based routing works as fallback. |
|
|
1110
|
+
| R-03 | dnd-kit keyboard sensors don't cover all kanban interactions | Med | Med | Sprint 5 includes a manual keyboard walkthrough; we write a custom keyboard sensor if needed. |
|
|
1111
|
+
| R-04 | The existing REST endpoints don't match v8's data shape | Low | High | Sprint 0 includes an endpoint audit. Where shapes diverge, v8 adapts (Zod parse + map) without changing the server. |
|
|
1112
|
+
| R-05 | Performance regression on `/tasks` with 1000+ tasks | Med | Med | Virtualization via TanStack Virtual; pagination on the list view; lazy-render off-screen columns. Lighthouse gate in §15.6 catches it. |
|
|
1113
|
+
| R-06 | Custom-popup right-click interferes with browser gestures | Low | Low | `oncontextmenu` returns `false` only on our interactive surfaces. Long-press on touch (650ms) opens the same menu. |
|
|
1114
|
+
| R-07 | Settings schema sprawl — 16 sections × N fields each | High | Med | Settings schemas are Zod-validated end-to-end. Each section is its own Zod schema. Cmd+K surfaces them. We resist adding new sections unless justified. |
|
|
1115
|
+
| R-08 | v7 mobile users break (no MobileApp.tsx) | Med | Med | The new design is responsive web; mobile users get the same responsive UI at 390px. Communicate the change in v8 release notes. |
|
|
1116
|
+
| R-09 | Real-time updates overwhelm the kanban with WS events | Low | Med | WS events invalidate query keys; React Query batches invalidations. No re-render storm because TanStack Query debounces identical fetches. |
|
|
1117
|
+
| R-10 | Single-engineer timeline (5–6 weeks) slips | Med | Med | Each sprint ships a working app (compiles + boots + 1 view). If Sprint 5 (kanban) slips, v8.0 ships without goals/agents (deferred to v8.1). |
|
|
1118
|
+
|
|
1119
|
+
### Open questions for the operator
|
|
1120
|
+
|
|
1121
|
+
1. **shadcn preset ID.** Confirm `b7kBsBkh7b` is the intended
|
|
1122
|
+
preset; if not, provide the correct one and we re-run Sprint 0.
|
|
1123
|
+
2. **Mobile.** Confirm mobile-web responsive (no native app) is the
|
|
1124
|
+
right scope for v8.
|
|
1125
|
+
3. **Settings depth.** Are 16 sections the right level? Some teams
|
|
1126
|
+
prefer fewer, deeper sections; others prefer more, flatter ones.
|
|
1127
|
+
4. **Routing library.** Confirm TanStack Router (vs. React Router).
|
|
1128
|
+
5. **Drag-and-drop library.** Confirm dnd-kit (vs. Pragmatic drag
|
|
1129
|
+
and drop, the newer alternative).
|
|
1130
|
+
6. **Multi-workspace UI.** Confirm single-workspace for v8 (vs.
|
|
1131
|
+
switching UI in the topbar).
|
|
1132
|
+
|
|
1133
|
+
---
|
|
1134
|
+
|
|
1135
|
+
**End of PLAN.md — v8.0.0**
|