@polderlabs/bizar 3.23.1 → 4.2.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/README.md +83 -16
- package/bizar-dash/.bizar/activity.log +3 -0
- package/bizar-dash/.bizar/graph/.graphify_analysis.json +1540 -0
- package/bizar-dash/.bizar/graph/.graphify_labels.json +1 -0
- package/bizar-dash/.bizar/graph/GRAPH_REPORT.md +404 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/0661b816358db84dfdb7f10443db8a61152fd20b3fee950caf8fbf32920a1790.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/16da06d774142a6e5d74829ad982531286a6193ef798de8f593db029e123ec32.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/27e5697c01254c69c64c5a33896669073b40afb5ba88375102ae77fa5404136d.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/532997898027254aa4c0932243dc71d2f55888181232b65974961934997dc85b.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/84e3451a64c7f99f0cd6a88b0748d7426780486f53ab4935b7476b28c08f8293.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/88e5ea5f3e78fa69353fe9e6a8d1a05391d54605e25600cb125531eb5a6432ff.json +1 -0
- package/bizar-dash/.bizar/graph/cache/stat-index.json +1 -0
- package/bizar-dash/.bizar/graph/graph.html +307 -0
- package/bizar-dash/.bizar/graph/graph.json +40267 -0
- package/bizar-dash/.bizar/graph/manifest.json +762 -0
- package/bizar-dash/.graphifyignore +40 -0
- package/bizar-dash/.obsidian/README.md +14 -0
- package/bizar-dash/.obsidian/daily/2026-06-25.md +9 -0
- package/bizar-dash/.obsidian/vault.json +7 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/SKILL.md +103 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/assets/template.html +338 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/example.html +81 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/open-design.json +172 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/references/checklist.md +44 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/references/layouts.md +247 -0
- package/bizar-dash/CHANGELOG.md +474 -0
- package/bizar-dash/DESIGN.md +136 -0
- package/bizar-dash/dist/assets/main-B3RgW6FS.js +331 -0
- package/bizar-dash/dist/assets/main-B3RgW6FS.js.map +1 -0
- package/bizar-dash/dist/assets/main-DlJ8wgLR.css +1 -0
- package/bizar-dash/dist/assets/mobile-CsZQAswA.css +1 -0
- package/bizar-dash/dist/assets/mobile-DbxIw8BG.js +2 -0
- package/bizar-dash/dist/assets/mobile-DbxIw8BG.js.map +1 -0
- package/bizar-dash/dist/assets/mobile-Dvq2d53Y.js +354 -0
- package/bizar-dash/dist/assets/mobile-Dvq2d53Y.js.map +1 -0
- package/bizar-dash/dist/index.html +40 -0
- package/bizar-dash/dist/mobile.html +22 -0
- package/bizar-dash/plans/debug-plan/comments.json +1 -0
- package/bizar-dash/plans/debug-plan/meta.json +10 -0
- package/bizar-dash/plans/debug-plan/plan.json +174 -0
- package/bizar-dash/scripts/smoke-bg-retry.mjs +246 -0
- package/bizar-dash/src/cli/dashboard-ports.mjs +488 -0
- package/bizar-dash/src/cli.mjs +522 -0
- package/bizar-dash/src/server/activity-log.mjs +174 -0
- package/bizar-dash/src/server/agents-store.mjs +465 -0
- package/bizar-dash/src/server/api.mjs +138 -0
- package/bizar-dash/src/server/artifact-template.html +810 -0
- package/bizar-dash/src/server/artifacts-store.mjs +733 -0
- package/bizar-dash/src/server/auth.mjs +381 -0
- package/bizar-dash/src/server/background-store.mjs +447 -0
- package/bizar-dash/src/server/bg-poller.mjs +305 -0
- package/bizar-dash/src/server/bg-retry.mjs +574 -0
- package/bizar-dash/src/server/browser.mjs +40 -0
- package/bizar-dash/src/server/diagnostics-store.mjs +148 -0
- package/bizar-dash/src/server/dialog-poller.mjs +105 -0
- package/bizar-dash/src/server/dialog-store.mjs +177 -0
- package/bizar-dash/src/server/glyphs/mdx-compiler.mjs +583 -0
- package/bizar-dash/src/server/lib/path-safe.mjs +283 -0
- package/bizar-dash/src/server/memory-git.mjs +329 -0
- package/bizar-dash/src/server/memory-lightrag.mjs +767 -0
- package/bizar-dash/src/server/memory-schema.mjs +145 -0
- package/bizar-dash/src/server/memory-secrets.mjs +84 -0
- package/bizar-dash/src/server/memory-store.mjs +471 -0
- package/bizar-dash/src/server/mod-security.mjs +398 -0
- package/bizar-dash/src/server/mods-loader.mjs +1067 -0
- package/bizar-dash/src/server/notifications-store.mjs +243 -0
- package/bizar-dash/src/server/obsidian-store.mjs +318 -0
- package/bizar-dash/src/server/opencode-runner.mjs +279 -0
- package/bizar-dash/src/server/pair-store.mjs +138 -0
- package/bizar-dash/src/server/projects-store.mjs +364 -0
- package/bizar-dash/src/server/providers-store.mjs +789 -0
- package/bizar-dash/src/server/routes/_shared.mjs +415 -0
- package/bizar-dash/src/server/routes/activity.mjs +110 -0
- package/bizar-dash/src/server/routes/agents.mjs +134 -0
- package/bizar-dash/src/server/routes/artifacts.mjs +279 -0
- package/bizar-dash/src/server/routes/auth.mjs +69 -0
- package/bizar-dash/src/server/routes/background.mjs +165 -0
- package/bizar-dash/src/server/routes/chat.mjs +485 -0
- package/bizar-dash/src/server/routes/config.mjs +129 -0
- package/bizar-dash/src/server/routes/diagnostics.mjs +50 -0
- package/bizar-dash/src/server/routes/dialogs.mjs +86 -0
- package/bizar-dash/src/server/routes/fs.mjs +429 -0
- package/bizar-dash/src/server/routes/history.mjs +78 -0
- package/bizar-dash/src/server/routes/memory.mjs +658 -0
- package/bizar-dash/src/server/routes/misc.mjs +89 -0
- package/bizar-dash/src/server/routes/mods.mjs +359 -0
- package/bizar-dash/src/server/routes/notifications.mjs +54 -0
- package/bizar-dash/src/server/routes/obsidian.mjs +239 -0
- package/bizar-dash/src/server/routes/opencode-sessions.mjs +55 -0
- package/bizar-dash/src/server/routes/overview.mjs +91 -0
- package/bizar-dash/src/server/routes/pair.mjs +67 -0
- package/bizar-dash/src/server/routes/projects.mjs +175 -0
- package/bizar-dash/src/server/routes/providers.mjs +47 -0
- package/bizar-dash/src/server/routes/schedules.mjs +104 -0
- package/bizar-dash/src/server/routes/settings.mjs +51 -0
- package/bizar-dash/src/server/routes/skills.mjs +76 -0
- package/bizar-dash/src/server/routes/tasks.mjs +468 -0
- package/bizar-dash/src/server/routes/themes.mjs +51 -0
- package/bizar-dash/src/server/routes-v2/auth.mjs +59 -0
- package/bizar-dash/src/server/routes-v2/events.mjs +107 -0
- package/bizar-dash/src/server/routes-v2/health.mjs +21 -0
- package/bizar-dash/src/server/routes-v2/index.mjs +90 -0
- package/bizar-dash/src/server/routes-v2/sessions.mjs +111 -0
- package/bizar-dash/src/server/schedules-runner.mjs +369 -0
- package/bizar-dash/src/server/schedules-store.mjs +268 -0
- package/bizar-dash/src/server/search-store.mjs +220 -0
- package/bizar-dash/src/server/serve-info.mjs +684 -0
- package/bizar-dash/src/server/server.mjs +796 -0
- package/bizar-dash/src/server/settings-store.mjs +45 -0
- package/bizar-dash/src/server/skills-store.mjs +300 -0
- package/bizar-dash/src/server/state.mjs +437 -0
- package/bizar-dash/src/server/tailscale-store.mjs +113 -0
- package/bizar-dash/src/server/task-delegator.mjs +824 -0
- package/bizar-dash/src/server/tasks-store.mjs +508 -0
- package/bizar-dash/src/server/tui.mjs +923 -0
- package/bizar-dash/src/server/update-store.mjs +168 -0
- package/bizar-dash/src/server/v2-auth-file.mjs +99 -0
- package/bizar-dash/src/server/v2-event-bus.mjs +128 -0
- package/bizar-dash/src/server/watcher.mjs +81 -0
- package/bizar-dash/src/server/yaml.mjs +238 -0
- package/bizar-dash/src/web/App.tsx +718 -0
- package/bizar-dash/src/web/MobileApp.tsx +408 -0
- package/bizar-dash/src/web/components/ArtifactCreateDialog.tsx +95 -0
- package/bizar-dash/src/web/components/ArtifactListDialog.tsx +55 -0
- package/bizar-dash/src/web/components/ArtifactViewer.tsx +143 -0
- package/bizar-dash/src/web/components/AuditDialog.tsx +79 -0
- package/bizar-dash/src/web/components/BgStatusBadge.tsx +32 -0
- package/bizar-dash/src/web/components/Button.tsx +56 -0
- package/bizar-dash/src/web/components/CanvasContextMenu.tsx +68 -0
- package/bizar-dash/src/web/components/Card.tsx +40 -0
- package/bizar-dash/src/web/components/CollapsibleSection.tsx +72 -0
- package/bizar-dash/src/web/components/CommandDialog.tsx +66 -0
- package/bizar-dash/src/web/components/EmptyState.tsx +30 -0
- package/bizar-dash/src/web/components/FileBrowser.tsx +633 -0
- package/bizar-dash/src/web/components/HelpDialog.tsx +55 -0
- package/bizar-dash/src/web/components/KillConfirmDialog.tsx +88 -0
- package/bizar-dash/src/web/components/Modal.tsx +215 -0
- package/bizar-dash/src/web/components/Notifications.tsx +241 -0
- package/bizar-dash/src/web/components/SearchModal.tsx +224 -0
- package/bizar-dash/src/web/components/Sidebar.tsx +66 -0
- package/bizar-dash/src/web/components/Spinner.tsx +19 -0
- package/bizar-dash/src/web/components/StatusBadge.tsx +25 -0
- package/bizar-dash/src/web/components/Tag.tsx +28 -0
- package/bizar-dash/src/web/components/Toast.tsx +150 -0
- package/bizar-dash/src/web/components/Topbar.tsx +368 -0
- package/bizar-dash/src/web/components/VisualPlanDialog.tsx +58 -0
- package/bizar-dash/src/web/components/chat/AgentChip.tsx +68 -0
- package/bizar-dash/src/web/components/chat/ChatBubble.tsx +60 -0
- package/bizar-dash/src/web/components/chat/ChatThread.tsx +88 -0
- package/bizar-dash/src/web/components/chat/ChatTopBar.tsx +50 -0
- package/bizar-dash/src/web/components/chat/Composer.tsx +164 -0
- package/bizar-dash/src/web/components/chat/ConfirmModal.tsx +54 -0
- package/bizar-dash/src/web/components/chat/EmptyState.tsx +21 -0
- package/bizar-dash/src/web/components/chat/FirstRunGreeting.tsx +18 -0
- package/bizar-dash/src/web/components/chat/FloatingComposer.tsx +32 -0
- package/bizar-dash/src/web/components/chat/InfoPanel.tsx +119 -0
- package/bizar-dash/src/web/components/chat/LoadingSkeleton.tsx +19 -0
- package/bizar-dash/src/web/components/chat/MessageBubble.tsx +60 -0
- package/bizar-dash/src/web/components/chat/SessionList.tsx +153 -0
- package/bizar-dash/src/web/components/chat/StreamingIndicator.tsx +9 -0
- package/bizar-dash/src/web/components/chat/SuggestionCards.tsx +55 -0
- package/bizar-dash/src/web/components/chat/WelcomeScreen.tsx +36 -0
- package/bizar-dash/src/web/components/chat/index.ts +20 -0
- package/bizar-dash/src/web/components/chat/useAutoGrowTextarea.ts +18 -0
- package/bizar-dash/src/web/components/chat/useChat.ts +219 -0
- package/bizar-dash/src/web/components/chat/useSlashCommands.ts +47 -0
- package/bizar-dash/src/web/index.html +37 -0
- package/bizar-dash/src/web/lib/api.ts +193 -0
- package/bizar-dash/src/web/lib/markdown.tsx +59 -0
- package/bizar-dash/src/web/lib/types.ts +668 -0
- package/bizar-dash/src/web/lib/utils.ts +114 -0
- package/bizar-dash/src/web/lib/ws.ts +176 -0
- package/bizar-dash/src/web/main.tsx +34 -0
- package/bizar-dash/src/web/mobile/MobileApp.tsx +278 -0
- package/bizar-dash/src/web/mobile/MobileBottomNav.tsx +38 -0
- package/bizar-dash/src/web/mobile/MobileTopbar.tsx +115 -0
- package/bizar-dash/src/web/mobile/components/MobileBottomSheet.tsx +182 -0
- package/bizar-dash/src/web/mobile/components/MobileListItem.tsx +64 -0
- package/bizar-dash/src/web/mobile/components/MobileModal.tsx +123 -0
- package/bizar-dash/src/web/mobile/views/MobileActivity.tsx +273 -0
- package/bizar-dash/src/web/mobile/views/MobileAgents.tsx +374 -0
- package/bizar-dash/src/web/mobile/views/MobileArtifactCanvas.tsx +439 -0
- package/bizar-dash/src/web/mobile/views/MobileArtifacts.tsx +143 -0
- package/bizar-dash/src/web/mobile/views/MobileChat.tsx +180 -0
- package/bizar-dash/src/web/mobile/views/MobileConfig.tsx +175 -0
- package/bizar-dash/src/web/mobile/views/MobileHistory.tsx +191 -0
- package/bizar-dash/src/web/mobile/views/MobileMods.tsx +149 -0
- package/bizar-dash/src/web/mobile/views/MobileMore.tsx +121 -0
- package/bizar-dash/src/web/mobile/views/MobileNotifications.tsx +137 -0
- package/bizar-dash/src/web/mobile/views/MobilePlans.tsx +26 -0
- package/bizar-dash/src/web/mobile/views/MobileSchedules.tsx +685 -0
- package/bizar-dash/src/web/mobile/views/MobileSearchModal.tsx +172 -0
- package/bizar-dash/src/web/mobile/views/MobileSettings.tsx +388 -0
- package/bizar-dash/src/web/mobile/views/MobileSkills.tsx +153 -0
- package/bizar-dash/src/web/mobile/views/MobileTasks.tsx +564 -0
- package/bizar-dash/src/web/mobile.html +20 -0
- package/bizar-dash/src/web/mobile.tsx +13 -0
- package/bizar-dash/src/web/styles/chat.css +198 -0
- package/bizar-dash/src/web/styles/glyphs.css +960 -0
- package/bizar-dash/src/web/styles/main.css +8855 -0
- package/bizar-dash/src/web/styles/mobile-chat.css +5 -0
- package/bizar-dash/src/web/styles/mobile.css +1960 -0
- package/bizar-dash/src/web/views/Activity.tsx +1203 -0
- package/bizar-dash/src/web/views/Agents.tsx +701 -0
- package/bizar-dash/src/web/views/Artifacts.tsx +1480 -0
- package/bizar-dash/src/web/views/BackgroundAgents.tsx +450 -0
- package/bizar-dash/src/web/views/Chat.tsx +190 -0
- package/bizar-dash/src/web/views/Config.tsx +2063 -0
- package/bizar-dash/src/web/views/History.tsx +335 -0
- package/bizar-dash/src/web/views/ModView.tsx +207 -0
- package/bizar-dash/src/web/views/Mods.tsx +693 -0
- package/bizar-dash/src/web/views/Overview.tsx +812 -0
- package/bizar-dash/src/web/views/Providers.tsx +302 -0
- package/bizar-dash/src/web/views/Schedules.tsx +802 -0
- package/bizar-dash/src/web/views/Settings.tsx +1787 -0
- package/bizar-dash/src/web/views/Skills.tsx +431 -0
- package/bizar-dash/src/web/views/Tasks.tsx +1523 -0
- package/bizar-dash/src/web/views/glyphs/GlyphRenderer.tsx +613 -0
- package/bizar-dash/src/web/views/glyphs/components.tsx +1098 -0
- package/bizar-dash/templates/mod/FORMAT.md +76 -0
- package/bizar-dash/templates/mod/hello-mod/README.md +19 -0
- package/bizar-dash/templates/mod/hello-mod/agents/greeter.md +8 -0
- package/bizar-dash/templates/mod/hello-mod/commands/hello.md +6 -0
- package/bizar-dash/templates/mod/hello-mod/mod.json +20 -0
- package/bizar-dash/templates/mod/hello-mod/routes/ping.mjs +9 -0
- package/bizar-dash/templates/mod/hello-mod/views/HelloView.tsx +10 -0
- package/bizar-dash/tests/dashboard-ports.test.mjs +138 -0
- package/bizar-dash/tests/graphify-mod-spawn.node.test.mjs +90 -0
- package/bizar-dash/tests/memory-cli.test.mjs +542 -0
- package/bizar-dash/tests/memory-config.test.mjs +422 -0
- package/bizar-dash/tests/memory-git.test.mjs +246 -0
- package/bizar-dash/tests/memory-lightrag.test.mjs +153 -0
- package/bizar-dash/tests/memory-protocol-drift.test.mjs +45 -0
- package/bizar-dash/tests/memory-schema.test.mjs +198 -0
- package/bizar-dash/tests/memory-secrets.test.mjs +121 -0
- package/bizar-dash/tests/memory-store.test.mjs +390 -0
- package/bizar-dash/tests/memory-sync.test.mjs +141 -0
- package/bizar-dash/tests/mod-instructions.node.test.mjs +188 -0
- package/bizar-dash/tests/mod-security.test.mjs +273 -0
- package/bizar-dash/tests/mod-upgrade.node.test.mjs +357 -0
- package/bizar-dash/tests/no-agent-browser.node.test.mjs +98 -0
- package/bizar-dash/tests/obsidian-back-compat.test.mjs +199 -0
- package/bizar-dash/tests/opencode-runner.test.mjs +172 -0
- package/bizar-dash/tests/path-safe.test.mjs +108 -0
- package/bizar-dash/tests/providers-store-backup-keys.node.test.mjs +333 -0
- package/bizar-dash/tests/smoke-v2.mjs +212 -0
- package/bizar-dash/tests/strip-thinking.test.mjs +175 -0
- package/bizar-dash/tests/submit-feedback.test.mjs +353 -0
- package/bizar-dash/tests/tmux-wrap.test.mjs +145 -0
- package/bizar-dash/tests/yaml.test.mjs +128 -0
- package/bizar-dash/tsconfig.json +23 -0
- package/bizar-dash/vite.config.ts +27 -0
- package/cli/atomic.mjs +73 -0
- package/cli/banner.mjs +1 -1
- package/cli/bin.mjs +44 -47
- package/cli/bootstrap.mjs +1 -1
- package/cli/copy.mjs +25 -16
- package/cli/dev-link.mjs +17 -1
- package/cli/doctor.mjs +4 -4
- package/cli/doctor.test.mjs +2 -2
- package/cli/init.mjs +135 -1
- package/cli/install.mjs +31 -39
- package/cli/memory-constants.mjs +59 -0
- package/cli/memory.mjs +1436 -0
- package/cli/service.mjs +5 -6
- package/cli/utils.mjs +6 -3
- package/config/AGENTS.md +7 -7
- package/config/agents/_shared/AGENT_BASELINE.md +59 -61
- package/config/opencode.json +13 -38
- package/config/skills/memory-protocol/SKILL.md +105 -0
- package/config/skills/obsidian/SKILL.md +270 -65
- package/install.sh +59 -19
- package/package.json +49 -14
- package/packages/sdk/LICENSE +21 -0
- package/packages/sdk/README.md +80 -0
- package/packages/sdk/src/client.ts +183 -0
- package/packages/sdk/src/errors.ts +120 -0
- package/packages/sdk/src/events.ts +153 -0
- package/packages/sdk/src/index.ts +63 -0
- package/packages/sdk/src/types.ts +176 -0
- package/packages/sdk/src/version.ts +4 -0
- package/packages/sdk/tests/client.test.ts +217 -0
- package/packages/sdk/tests/errors.test.ts +108 -0
- package/packages/sdk/tests/events.test.ts +139 -0
- package/packages/sdk/tests/fixtures/fetch-mock.ts +152 -0
- package/packages/sdk/tests/fixtures/sse-mock.ts +30 -0
- package/packages/sdk/tsconfig.json +25 -0
- package/packages/sdk/vitest.config.ts +9 -0
- package/plugins/bizar/LICENSE +21 -0
- package/plugins/bizar/README.md +448 -0
- package/plugins/bizar/dist/index.js +29901 -0
- package/plugins/bizar/index.ts +1491 -0
- package/plugins/bizar/scripts/check-forbidden-imports.sh +33 -0
- package/plugins/bizar/src/background-state.ts +551 -0
- package/plugins/bizar/src/background.ts +1250 -0
- package/plugins/bizar/src/commands-impl.ts +464 -0
- package/plugins/bizar/src/commands.ts +1168 -0
- package/plugins/bizar/src/dashboard-client.ts +233 -0
- package/plugins/bizar/src/event-stream.ts +606 -0
- package/plugins/bizar/src/fingerprint.ts +120 -0
- package/plugins/bizar/src/handoff.ts +79 -0
- package/plugins/bizar/src/http-client.ts +467 -0
- package/plugins/bizar/src/key-rotation.ts +218 -0
- package/plugins/bizar/src/logger.ts +144 -0
- package/plugins/bizar/src/loop.ts +176 -0
- package/plugins/bizar/src/opencode-runner.ts +390 -0
- package/plugins/bizar/src/options.ts +421 -0
- package/plugins/bizar/src/plan-fs.ts +323 -0
- package/plugins/bizar/src/reasoning-clean.ts +454 -0
- package/plugins/bizar/src/report.ts +178 -0
- package/plugins/bizar/src/research-prompt.ts +35 -0
- package/plugins/bizar/src/serve-info.ts +228 -0
- package/plugins/bizar/src/serve.ts +496 -0
- package/plugins/bizar/src/settings.ts +349 -0
- package/plugins/bizar/src/state.ts +298 -0
- package/plugins/bizar/src/tools/bg-collect.ts +104 -0
- package/plugins/bizar/src/tools/bg-get-comments.ts +239 -0
- package/plugins/bizar/src/tools/bg-kill.ts +87 -0
- package/plugins/bizar/src/tools/bg-spawn.ts +401 -0
- package/plugins/bizar/src/tools/bg-status.ts +99 -0
- package/plugins/bizar/src/tools/open-kb.ts +191 -0
- package/plugins/bizar/src/tools/plan-action.ts +767 -0
- package/plugins/bizar/src/tools/read-glyph-feedback.ts +170 -0
- package/plugins/bizar/src/tools/wait-for-feedback.ts +402 -0
- package/plugins/bizar/tests/attach-handler-bug.test.ts +169 -0
- package/plugins/bizar/tests/background-state.test.ts +277 -0
- package/plugins/bizar/tests/background.test.ts +402 -0
- package/plugins/bizar/tests/block.test.ts +195 -0
- package/plugins/bizar/tests/canonical-key-order.test.ts +75 -0
- package/plugins/bizar/tests/commands-impl.test.ts +442 -0
- package/plugins/bizar/tests/commands.test.ts +584 -0
- package/plugins/bizar/tests/config.test.ts +122 -0
- package/plugins/bizar/tests/dashboard-client.test.ts +159 -0
- package/plugins/bizar/tests/dispose.test.ts +336 -0
- package/plugins/bizar/tests/event-stream.test.ts +409 -0
- package/plugins/bizar/tests/event.test.ts +262 -0
- package/plugins/bizar/tests/fingerprint.test.ts +162 -0
- package/plugins/bizar/tests/http-client.test.ts +404 -0
- package/plugins/bizar/tests/init-helpers.test.ts +203 -0
- package/plugins/bizar/tests/integration/slash-command.test.ts +348 -0
- package/plugins/bizar/tests/integration/tool-routing.test.ts +314 -0
- package/plugins/bizar/tests/key-rotation.test.ts +396 -0
- package/plugins/bizar/tests/loop.test.ts +397 -0
- package/plugins/bizar/tests/options.test.ts +276 -0
- package/plugins/bizar/tests/reasoning-clean.test.ts +422 -0
- package/plugins/bizar/tests/serve.test.ts +339 -0
- package/plugins/bizar/tests/settings.test.ts +351 -0
- package/plugins/bizar/tests/stall-think.test.ts +750 -0
- package/plugins/bizar/tests/state.test.ts +276 -0
- package/plugins/bizar/tests/tools/bg-collect.test.ts +337 -0
- package/plugins/bizar/tests/tools/bg-get-comments.test.ts +485 -0
- package/plugins/bizar/tests/tools/bg-kill.test.ts +235 -0
- package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +147 -0
- package/plugins/bizar/tests/tools/bg-spawn.test.ts +311 -0
- package/plugins/bizar/tests/tools/bg-status.test.ts +217 -0
- package/plugins/bizar/tests/tools/opencode-runner.test.ts +115 -0
- package/plugins/bizar/tests/tools/plan-action.test.ts +599 -0
- package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +253 -0
- package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +390 -0
- package/plugins/bizar/tests/update-deadlock.test.ts +145 -0
- package/plugins/bizar/tsconfig.json +29 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://open-design.ai/schemas/plugin.v1.json",
|
|
3
|
+
"specVersion": "1.0.0",
|
|
4
|
+
"name": "example-web-prototype",
|
|
5
|
+
"title": "Web Prototype",
|
|
6
|
+
"title_i18n": {
|
|
7
|
+
"zh-CN": "网页原型",
|
|
8
|
+
"zh-TW": "網頁原型",
|
|
9
|
+
"ja": "Webプロトタイプ",
|
|
10
|
+
"ko": "웹 프로토타입",
|
|
11
|
+
"de": "Web-Prototyp",
|
|
12
|
+
"fr": "Prototype Web",
|
|
13
|
+
"ru": "Веб-прототип",
|
|
14
|
+
"es": "Prototipo Web",
|
|
15
|
+
"pt-BR": "Protótipo Web",
|
|
16
|
+
"it": "Prototipo Web",
|
|
17
|
+
"vi": "Nguyên mẫu Web",
|
|
18
|
+
"pl": "Prototyp Web",
|
|
19
|
+
"id": "Prototipe Web",
|
|
20
|
+
"nl": "Webprototype",
|
|
21
|
+
"ar": "نموذج ويب أولي",
|
|
22
|
+
"tr": "Web Prototipi",
|
|
23
|
+
"uk": "Веб-прототип",
|
|
24
|
+
"en": "Web Prototype"
|
|
25
|
+
},
|
|
26
|
+
"version": "0.1.1",
|
|
27
|
+
"description": "General-purpose desktop web prototype. Single self-contained HTML file built by copying the seed `assets/template.html` and pasting section layouts from `references/layouts.md`. Default for any landing / marketing / docs / SaaS page when no more specific skill matches.",
|
|
28
|
+
"description_i18n": {
|
|
29
|
+
"zh-CN": "通用桌面网页原型。通过复制种子文件 `assets/template.html` 并粘贴 `references/layouts.md` 中的布局生成单个独立 HTML 文件。适用于落地页、营销页、文档或 SaaS 页面的默认选项。",
|
|
30
|
+
"zh-TW": "通用桌面網頁原型。透過複製種子檔案 `assets/template.html` 並貼上 `references/layouts.md` 中的版面配置生成單一獨立 HTML 檔案。適用於著陸頁、行銷頁、文件或 SaaS 頁面的預設選項。",
|
|
31
|
+
"ja": "汎用デスクトップWebプロトタイプ。`assets/template.html` をコピーし、`references/layouts.md` のレイアウトを貼り付けて単一の自己完結型 HTML ファイルを生成。ランディングページ、マーケティング、ドキュメント、SaaS ページのデフォルトオプション。",
|
|
32
|
+
"ko": "범용 데스크톱 웹 프로토타입. `assets/template.html`을 복사하고 `references/layouts.md`의 레이아웃을 붙여넣어 단일 독립형 HTML 파일 생성. 랜딩/마케팅/문서/SaaS 페이지의 기본 옵션.",
|
|
33
|
+
"de": "Allzweck-Desktop-Web-Prototyp. Einzelne eigenständige HTML-Datei durch Kopieren von `assets/template.html` und Einfügen von Layouts aus `references/layouts.md` erstellt. Standard für Landing-, Marketing-, Dokumentations- oder SaaS-Seiten.",
|
|
34
|
+
"fr": "Prototype web de bureau polyvalent. Fichier HTML autonome créé en copiant `assets/template.html` et en collant les mises en page de `references/layouts.md`. Option par défaut pour les pages de destination, marketing, documentation ou SaaS.",
|
|
35
|
+
"ru": "Универсальный веб-прототип для десктопа. Автономный HTML-файл создаётся копированием `assets/template.html` и вставкой макетов из `references/layouts.md`. По умолчанию для лендингов, маркетинга, документации и SaaS-страниц.",
|
|
36
|
+
"es": "Prototipo web de escritorio de propósito general. Archivo HTML autocontenido creado copiando `assets/template.html` y pegando diseños de `references/layouts.md`. Opción predeterminada para páginas de destino, marketing, documentación o SaaS.",
|
|
37
|
+
"pt-BR": "Protótipo web desktop de uso geral. Arquivo HTML autocontido criado copiando `assets/template.html` e colando layouts de `references/layouts.md`. Padrão para landing pages, marketing, documentação ou páginas SaaS.",
|
|
38
|
+
"it": "Prototipo web desktop generico. File HTML autonomo creato copiando `assets/template.html` e incollando layout da `references/layouts.md`. Opzione predefinita per landing page, marketing, documentazione o pagine SaaS.",
|
|
39
|
+
"vi": "Nguyên mẫu web desktop đa năng. Tệp HTML độc lập được tạo bằng cách sao chép `assets/template.html` và dán bố cục từ `references/layouts.md`. Mặc định cho trang đích, marketing, tài liệu hoặc SaaS.",
|
|
40
|
+
"pl": "Uniwersalny prototyp internetowy na desktop. Samodzielny plik HTML tworzony przez skopiowanie `assets/template.html` i wklejenie layoutów z `references/layouts.md`. Domyślny dla stron docelowych, marketingowych, dokumentacji lub SaaS.",
|
|
41
|
+
"id": "Prototipe web desktop serbaguna. File HTML mandiri yang dibuat dengan menyalin `assets/template.html` dan menempelkan layout dari `references/layouts.md`. Default untuk halaman landing, marketing, dokumentasi, atau SaaS.",
|
|
42
|
+
"nl": "Algemeen desktop webprototype. Zelfstandig HTML-bestand gemaakt door `assets/template.html` te kopiëren en lay-outs uit `references/layouts.md` te plakken. Standaard voor landingspagina's, marketing, documentatie of SaaS-pagina's.",
|
|
43
|
+
"ar": "نموذج أولي لموقع ويب سطح المكتب متعدد الأغراض. ملف HTML مستقل يتم إنشاؤه بنسخ `assets/template.html` ولصق التخطيطات من `references/layouts.md`. الخيار الافتراضي للصفحات المقصودة والتسويقية والتوثيقية أو SaaS.",
|
|
44
|
+
"tr": "Genel amaçlı masaüstü web prototipi. `assets/template.html` kopyalanıp `references/layouts.md` içindeki düzenler yapıştırılarak oluşturulan bağımsız HTML dosyası. Açılış, pazarlama, dokümantasyon veya SaaS sayfaları için varsayılan.",
|
|
45
|
+
"uk": "Універсальний веб-прототип для десктопа. Автономний HTML-файл створюється копіюванням `assets/template.html` та вставкою макетів з `references/layouts.md`. За замовчуванням для посадкових, маркетингових, документаційних або SaaS-сторінок.",
|
|
46
|
+
"en": "General-purpose desktop web prototype. Single self-contained HTML file built by copying the seed `assets/template.html` and pasting section layouts from `references/layouts.md`. Default for any landing / marketing / docs / SaaS page when no more specific skill matches."
|
|
47
|
+
},
|
|
48
|
+
"license": "MIT",
|
|
49
|
+
"author": {
|
|
50
|
+
"name": "Open Design",
|
|
51
|
+
"url": "https://github.com/nexu-io"
|
|
52
|
+
},
|
|
53
|
+
"homepage": "https://github.com/nexu-io/open-design/tree/main/plugins/_official/examples/web-prototype",
|
|
54
|
+
"tags": [
|
|
55
|
+
"example",
|
|
56
|
+
"first-party",
|
|
57
|
+
"prototype",
|
|
58
|
+
"design",
|
|
59
|
+
"web",
|
|
60
|
+
"desktop",
|
|
61
|
+
"mockup",
|
|
62
|
+
"landing",
|
|
63
|
+
"single-page",
|
|
64
|
+
"marketing-page",
|
|
65
|
+
"homepage"
|
|
66
|
+
],
|
|
67
|
+
"compat": {
|
|
68
|
+
"agentSkills": [
|
|
69
|
+
{
|
|
70
|
+
"path": "./SKILL.md"
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
"od": {
|
|
75
|
+
"kind": "scenario",
|
|
76
|
+
"taskKind": "new-generation",
|
|
77
|
+
"mode": "prototype",
|
|
78
|
+
"platform": "desktop",
|
|
79
|
+
"scenario": "design",
|
|
80
|
+
"surface": "web",
|
|
81
|
+
"preview": {
|
|
82
|
+
"type": "html",
|
|
83
|
+
"entry": "./example.html"
|
|
84
|
+
},
|
|
85
|
+
"useCase": {
|
|
86
|
+
"query": {
|
|
87
|
+
"en": "Create a premium product-studio {{fidelity}} {{artifactKind}} for {{audience}}: sharp information architecture, elegant visual hierarchy, polished interaction states, and a refined design-system-driven interface that feels shipped by a top-tier product team. Use {{designSystem}} as the design-system direction and start from {{template}}. Build one self-contained HTML file by copying the seed `assets/template.html` and pasting layouts from `references/layouts.md`.",
|
|
88
|
+
"zh-CN": "用高端产品工作室的完成度,为 {{audience}} 打磨一个 {{fidelity}} 的 {{artifactKind}}:信息架构清晰、视觉层级优雅、交互状态完整,整体像顶级产品团队交付的可演示原型。设计系统方向使用 {{designSystem}},从 {{template}} 开始。使用 `assets/template.html` 种子并从 `references/layouts.md` 粘贴版面,输出单文件 HTML。"
|
|
89
|
+
},
|
|
90
|
+
"exampleOutputs": [
|
|
91
|
+
{
|
|
92
|
+
"path": "./example.html",
|
|
93
|
+
"title": "Web Prototype"
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
"inputs": [
|
|
98
|
+
{
|
|
99
|
+
"name": "artifactKind",
|
|
100
|
+
"label": "Artifact kind",
|
|
101
|
+
"type": "string",
|
|
102
|
+
"required": true,
|
|
103
|
+
"placeholder": "SaaS landing page",
|
|
104
|
+
"default": "web prototype"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"name": "fidelity",
|
|
108
|
+
"label": "Fidelity",
|
|
109
|
+
"type": "select",
|
|
110
|
+
"required": true,
|
|
111
|
+
"options": [
|
|
112
|
+
"wireframe",
|
|
113
|
+
"high-fidelity"
|
|
114
|
+
],
|
|
115
|
+
"default": "high-fidelity"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"name": "audience",
|
|
119
|
+
"label": "Audience",
|
|
120
|
+
"type": "string",
|
|
121
|
+
"required": true,
|
|
122
|
+
"placeholder": "startup founders evaluating an AI CRM",
|
|
123
|
+
"default": "product evaluators"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "designSystem",
|
|
127
|
+
"label": "Design system",
|
|
128
|
+
"type": "string",
|
|
129
|
+
"placeholder": "OpenAI, Linear, shadcn, or custom brand notes",
|
|
130
|
+
"default": "the active project design system"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"name": "template",
|
|
134
|
+
"label": "Template",
|
|
135
|
+
"type": "string",
|
|
136
|
+
"placeholder": "marketing homepage, dashboard, docs page",
|
|
137
|
+
"default": "the bundled web prototype seed"
|
|
138
|
+
}
|
|
139
|
+
],
|
|
140
|
+
"context": {
|
|
141
|
+
"skills": [
|
|
142
|
+
{
|
|
143
|
+
"path": "./SKILL.md"
|
|
144
|
+
}
|
|
145
|
+
],
|
|
146
|
+
"designSystem": {
|
|
147
|
+
"primary": true
|
|
148
|
+
},
|
|
149
|
+
"assets": [
|
|
150
|
+
"./example.html",
|
|
151
|
+
"./assets/template.html",
|
|
152
|
+
"./references/checklist.md",
|
|
153
|
+
"./references/layouts.md"
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
"pipeline": {
|
|
157
|
+
"stages": [
|
|
158
|
+
{
|
|
159
|
+
"id": "generate",
|
|
160
|
+
"atoms": [
|
|
161
|
+
"file-write",
|
|
162
|
+
"live-artifact"
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
},
|
|
167
|
+
"capabilities": [
|
|
168
|
+
"prompt:inject",
|
|
169
|
+
"fs:write"
|
|
170
|
+
]
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Web prototype checklist
|
|
2
|
+
|
|
3
|
+
Run this before emitting `<artifact>`. P0 = must pass; P1 = should pass; P2 = nice to have.
|
|
4
|
+
|
|
5
|
+
## P0 — must pass
|
|
6
|
+
|
|
7
|
+
- [ ] **No raw hex outside `:root` token block.** Every color is `var(--bg)` / `var(--fg)` / `var(--muted)` / `var(--border)` / `var(--accent)` / `var(--surface)` (or a `color-mix()` of those). Grep `#[0-9a-fA-F]{3,8}` outside `:root{}` should return nothing.
|
|
8
|
+
- [ ] **All headings use `var(--font-display)`.** No sans-serif `<h1>` / `<h2>`. Inter / Roboto / system-sans never serve as a display face.
|
|
9
|
+
- [ ] **Accent appears at most twice per screen.** Count: eyebrow color, primary CTA fill, anything else? If three or more, demote one to `var(--fg)` or `var(--muted)`.
|
|
10
|
+
- [ ] **No purple/violet gradient backgrounds.** No `linear-gradient(... #a855f7 / #8b5cf6 / purple ...)`. The seed template has no gradients on backgrounds — keep it that way.
|
|
11
|
+
- [ ] **No emoji used as feature icons.** Use the inline SVG monoline marks shipped in Layout 3, or a tasteful single-character glyph in `--font-mono`. ✨ 🚀 🎯 are out.
|
|
12
|
+
- [ ] **No invented metrics.** Every number on the page came from the user, the brief, or is clearly labelled as a placeholder (e.g. `[REPLACE] · 38×`). "10× faster", "99.9% uptime" without source = remove.
|
|
13
|
+
- [ ] **No filler copy.** Zero "Feature One / Feature Two", lorem ipsum, "Lorem ipsum dolor". If a section feels empty, delete it; do not pad.
|
|
14
|
+
- [ ] **`data-od-id` on every top-level `<section>`.** Used by comment mode to target sections.
|
|
15
|
+
- [ ] **Mobile reflow works.** All `grid-2`, `grid-3`, `grid-4`, `grid-2-1`, `grid-1-2` collapse to one column at ≤920px (the default media query in `template.html` does this). Verify by mentally narrowing — no horizontal scroll.
|
|
16
|
+
- [ ] **No `scrollIntoView()` calls.** Breaks the OD preview iframe. Use `scrollTo({...})` if you need scroll behaviour.
|
|
17
|
+
|
|
18
|
+
## P1 — should pass
|
|
19
|
+
|
|
20
|
+
- [ ] **One decisive flourish.** A pull quote, a striking stat, a real-feeling photograph, one micro-animation on the hero. *One.* Not three.
|
|
21
|
+
- [ ] **Section rhythm alternates.** No two stat rows in a row. No two feature triplets in a row. No two quote blocks in a row.
|
|
22
|
+
- [ ] **Headlines under 14 words.** If longer, the writing is doing the design's job.
|
|
23
|
+
- [ ] **Lead text under 56 ch / two sentences.** `max-width: 60ch` on `.lead` enforces this; don't override.
|
|
24
|
+
- [ ] **CTA buttons say what happens.** "Start free" beats "Get Started". "Read the story" beats "Learn More".
|
|
25
|
+
- [ ] **Hover states present** for all `<a>` and `.btn`. Seed template covers this.
|
|
26
|
+
- [ ] **Numerics use `.num` (mono, tabular).** Prices, stats, version numbers, dates.
|
|
27
|
+
- [ ] **One image style per page.** Don't mix square portrait headshots with widescreen product hero with vertical phone mock — pick a lane.
|
|
28
|
+
|
|
29
|
+
## P2 — nice to have
|
|
30
|
+
|
|
31
|
+
- [ ] **`text-wrap: pretty` / `balance`** on long paragraphs / headings (already on `<p>` and `h*` in seed).
|
|
32
|
+
- [ ] **`color-mix()` for derived tones.** No additional `--accent-50` / `--accent-300` Bootstrap-style tokens — derive on the spot.
|
|
33
|
+
- [ ] **Sticky topnav has frosted glass** (already in seed via `backdrop-filter: blur()`).
|
|
34
|
+
- [ ] **Loaded fonts are system-first.** Iowan Old Style / Charter for serif, system stack for sans. Only pull a Google Font if DESIGN.md specifies one.
|
|
35
|
+
|
|
36
|
+
## Anti-slop spot-check
|
|
37
|
+
|
|
38
|
+
Look at the page for two seconds. If your gut says any of:
|
|
39
|
+
|
|
40
|
+
- "looks like every Cursor / Linear / Vercel ripoff I've seen this month"
|
|
41
|
+
- "this could be any AI startup's homepage"
|
|
42
|
+
- "the feature row has an icon, a heading, and three lines of vague benefit copy"
|
|
43
|
+
|
|
44
|
+
…go back, replace one feature cell with something more specific to *this* product (a screenshot, a concrete example, a sample of the actual output), and remove one accent.
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# Web prototype layouts
|
|
2
|
+
|
|
3
|
+
**8 paste-ready section skeletons.** Drop into `<main id="content">` of `assets/template.html`. Don't write sections from scratch — pick the closest layout, paste, swap copy.
|
|
4
|
+
|
|
5
|
+
## Pre-flight (do this once before pasting anything)
|
|
6
|
+
|
|
7
|
+
1. **Read `assets/template.html`** through the end of the `<style>` block. Every class used below must exist there. If one is missing, add it to `<style>` rather than inlining it on each section.
|
|
8
|
+
2. **Pick a section list before writing copy.** Default rhythms:
|
|
9
|
+
- **Landing**: 1 hero → 2 features → 3 stat-row OR quote → 4 split → 6 cta-strip → footer
|
|
10
|
+
- **Marketing / editorial**: 1 hero-center → 7 log-list → 4 split → 6 cta-strip
|
|
11
|
+
- **Pricing / docs**: 1 hero-center → table-driven → 6 cta-strip
|
|
12
|
+
3. **One accent per screen, used at most twice.** The hero eyebrow and the primary button already use it; budget any third usage carefully.
|
|
13
|
+
|
|
14
|
+
## Class inventory (must exist in `template.html`)
|
|
15
|
+
|
|
16
|
+
> `section` `container` `hero` `hero-center` `hero-split` `hero-cta` `eyebrow` `lead` `h1` `h2` `h3` `meta` `num` `btn` `btn-primary` `btn-secondary` `btn-ghost` `btn-arrow` `card` `card-flat` `card-rule` `feature` `feature-mark` `stat` `stat-num` `stat-label` `stat-unit` `quote` `quote-mark` `quote-author` `pill` `tag` `field` `input` `textarea` `ds-table` `num-col` `ph-img` `square` `portrait` `wide` `rule` `rule-strong` `grid-2` `grid-3` `grid-4` `grid-2-1` `grid-1-2` `row` `row-between` `stack` `log-row` `pull` `topnav` `pagefoot`
|
|
17
|
+
|
|
18
|
+
If you reach for a class not on this list, define it in `<style>` first or use `style="…"` inline. Never invent a global class on a `<section>` that isn't backed by CSS.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Layout 1 — Hero, centered
|
|
23
|
+
|
|
24
|
+
Use when the page leads with a thesis sentence (most landings, most marketing pages). One eyebrow, one h1 (≤14 words), one lead sentence, two CTAs.
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<section class="section hero" data-od-id="hero">
|
|
28
|
+
<div class="container hero-center">
|
|
29
|
+
<p class="eyebrow">EYEBROW · CONTEXT</p>
|
|
30
|
+
<h1>One sharp sentence about what this is.</h1>
|
|
31
|
+
<p class="lead">One concrete-value subhead — what changes for the reader.</p>
|
|
32
|
+
<div class="hero-cta">
|
|
33
|
+
<button class="btn btn-primary">Primary action</button>
|
|
34
|
+
<button class="btn btn-secondary">Secondary</button>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</section>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Layout 2 — Hero, split (text + visual)
|
|
41
|
+
|
|
42
|
+
Use when there is a real product visual (product UI, screenshot, photograph). Left half copy, right half a `ph-img` placeholder the user replaces.
|
|
43
|
+
|
|
44
|
+
```html
|
|
45
|
+
<section class="section" data-od-id="hero-split">
|
|
46
|
+
<div class="container hero-split">
|
|
47
|
+
<div>
|
|
48
|
+
<p class="eyebrow">EYEBROW · ROLE</p>
|
|
49
|
+
<h1>Headline that names the change.</h1>
|
|
50
|
+
<p class="lead" style="margin-top: 20px;">A short subhead — concrete, not corporate. Two sentences max.</p>
|
|
51
|
+
<div class="hero-cta" style="margin-top: 28px;">
|
|
52
|
+
<button class="btn btn-primary">Primary action</button>
|
|
53
|
+
<button class="btn btn-ghost btn-arrow">Read the story</button>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<div class="ph-img wide" aria-label="Hero visual placeholder">[ Hero visual · 16:9 ]</div>
|
|
57
|
+
</div>
|
|
58
|
+
</section>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Layout 3 — Feature triplet
|
|
62
|
+
|
|
63
|
+
Three feature cells. Lead with a small `<h2>` framing the row. Don't put an icon on every heading — one tasteful mark per cell, monoline.
|
|
64
|
+
|
|
65
|
+
```html
|
|
66
|
+
<section class="section" data-od-id="features">
|
|
67
|
+
<div class="container stack" style="gap: 56px;">
|
|
68
|
+
<div style="max-width: 36ch;">
|
|
69
|
+
<p class="eyebrow">WHAT'S DIFFERENT</p>
|
|
70
|
+
<h2>Three things you'll notice in the first ten minutes.</h2>
|
|
71
|
+
</div>
|
|
72
|
+
<div class="grid-3">
|
|
73
|
+
<div class="feature card-flat">
|
|
74
|
+
<div class="feature-mark">
|
|
75
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><path d="M12 3v18M3 12h18"/></svg>
|
|
76
|
+
</div>
|
|
77
|
+
<h3>Specific feature one</h3>
|
|
78
|
+
<p>Two-sentence description that names the user value, not the technology.</p>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="feature card-flat">
|
|
81
|
+
<div class="feature-mark">
|
|
82
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><circle cx="12" cy="12" r="8"/><path d="M12 8v4l3 2"/></svg>
|
|
83
|
+
</div>
|
|
84
|
+
<h3>Specific feature two</h3>
|
|
85
|
+
<p>Two-sentence description that names the user value, not the technology.</p>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="feature card-flat">
|
|
88
|
+
<div class="feature-mark">
|
|
89
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><path d="M4 7h16M4 12h10M4 17h16"/></svg>
|
|
90
|
+
</div>
|
|
91
|
+
<h3>Specific feature three</h3>
|
|
92
|
+
<p>Two-sentence description that names the user value, not the technology.</p>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</section>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Layout 4 — Stat row (data billboard)
|
|
100
|
+
|
|
101
|
+
Use when there are real numbers. Three stats max — four feels like a brochure. **Don't invent metrics.** If you don't have a number, use a different layout.
|
|
102
|
+
|
|
103
|
+
```html
|
|
104
|
+
<section class="section" data-od-id="stats">
|
|
105
|
+
<div class="container">
|
|
106
|
+
<p class="eyebrow" style="margin-bottom: 40px;">BY THE NUMBERS · 2026</p>
|
|
107
|
+
<div class="grid-3">
|
|
108
|
+
<div class="stat">
|
|
109
|
+
<div class="stat-num num">38<span class="stat-unit">×</span></div>
|
|
110
|
+
<p class="stat-label">less data moved over the wire vs. naive sync, on real customer workloads.</p>
|
|
111
|
+
</div>
|
|
112
|
+
<div class="stat">
|
|
113
|
+
<div class="stat-num num">3,184</div>
|
|
114
|
+
<p class="stat-label">paying teams, including 14 of the YC W26 batch.</p>
|
|
115
|
+
</div>
|
|
116
|
+
<div class="stat">
|
|
117
|
+
<div class="stat-num num">$0.04<span class="stat-unit">/GB</span></div>
|
|
118
|
+
<p class="stat-label">average egress saved — typical $1,800/mo bill drops to $200.</p>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
</section>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Layout 5 — Pull quote (testimonial)
|
|
126
|
+
|
|
127
|
+
A single decisive quote with attribution. Use sparingly — one per page, never two in a row.
|
|
128
|
+
|
|
129
|
+
```html
|
|
130
|
+
<section class="section" data-od-id="quote">
|
|
131
|
+
<div class="container" style="max-width: 800px;">
|
|
132
|
+
<div class="quote-mark">"</div>
|
|
133
|
+
<blockquote class="quote">Filebase pays for itself in the first month. We were going to hire a dedicated DevOps person to babysit our sync — instead we just switched.</blockquote>
|
|
134
|
+
<p class="quote-author">— Mira Hassan, CTO at Northwind Studios</p>
|
|
135
|
+
</div>
|
|
136
|
+
</section>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Layout 6 — CTA strip (closing)
|
|
140
|
+
|
|
141
|
+
End the page on one decisive ask. Centered, generous whitespace, one primary button. No secondary unless the page has zero other buttons.
|
|
142
|
+
|
|
143
|
+
```html
|
|
144
|
+
<section class="section" data-od-id="cta-strip" style="text-align: center;">
|
|
145
|
+
<div class="container" style="max-width: 600px;">
|
|
146
|
+
<h2>Stop measuring meetings. Start measuring focus.</h2>
|
|
147
|
+
<p class="lead" style="margin: 16px auto 32px;">Free for solo. $4/mo per teammate after that.</p>
|
|
148
|
+
<button class="btn btn-primary">Start free</button>
|
|
149
|
+
</div>
|
|
150
|
+
</section>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Layout 7 — Log list (changelog / blog index / posts)
|
|
154
|
+
|
|
155
|
+
Editorial layout for a list of dated entries. Date in mono on the left, title + dek in the middle, optional pull stat on the right. Borders on top, never around — boxes feel like a brochure.
|
|
156
|
+
|
|
157
|
+
```html
|
|
158
|
+
<section class="section" data-od-id="log">
|
|
159
|
+
<div class="container">
|
|
160
|
+
<div class="row-between" style="margin-bottom: 32px;">
|
|
161
|
+
<h2>Recent changes</h2>
|
|
162
|
+
<a class="btn btn-ghost btn-arrow" href="#">View all</a>
|
|
163
|
+
</div>
|
|
164
|
+
<div>
|
|
165
|
+
<article class="log-row">
|
|
166
|
+
<span class="meta">Apr 27, 2026</span>
|
|
167
|
+
<div>
|
|
168
|
+
<h3>Sync engine v3 — half the wire bytes</h3>
|
|
169
|
+
<p style="margin: 4px 0 0; color: var(--muted); font-size: 14px;">A new content-defined chunker that produces 38× fewer post-edit changes on Final Cut projects.</p>
|
|
170
|
+
</div>
|
|
171
|
+
<span class="pull meta">Engineering</span>
|
|
172
|
+
</article>
|
|
173
|
+
<article class="log-row">
|
|
174
|
+
<span class="meta">Apr 19, 2026</span>
|
|
175
|
+
<div>
|
|
176
|
+
<h3>Per-folder bandwidth budgets</h3>
|
|
177
|
+
<p style="margin: 4px 0 0; color: var(--muted); font-size: 14px;">Cap how much a single project can pull each month — useful for archive folders.</p>
|
|
178
|
+
</div>
|
|
179
|
+
<span class="pull meta">Product</span>
|
|
180
|
+
</article>
|
|
181
|
+
<article class="log-row">
|
|
182
|
+
<span class="meta">Apr 04, 2026</span>
|
|
183
|
+
<div>
|
|
184
|
+
<h3>S3 + R2 dual-region replication</h3>
|
|
185
|
+
<p style="margin: 4px 0 0; color: var(--muted); font-size: 14px;">Two providers, automatic failover. Enterprise tier only for now.</p>
|
|
186
|
+
</div>
|
|
187
|
+
<span class="pull meta">Infra</span>
|
|
188
|
+
</article>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
</section>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Layout 8 — Comparison table (pricing, plan matrix, before/after)
|
|
195
|
+
|
|
196
|
+
Hairline borders, mono numerics, one column highlighted via an accent border. Don't put the whole row in surface-color — that screams "table".
|
|
197
|
+
|
|
198
|
+
```html
|
|
199
|
+
<section class="section" data-od-id="pricing">
|
|
200
|
+
<div class="container">
|
|
201
|
+
<div style="text-align: center; max-width: 36ch; margin: 0 auto 56px;">
|
|
202
|
+
<p class="eyebrow">PRICING</p>
|
|
203
|
+
<h2>One row of features. Three lines of pricing.</h2>
|
|
204
|
+
</div>
|
|
205
|
+
<table class="ds-table">
|
|
206
|
+
<thead>
|
|
207
|
+
<tr>
|
|
208
|
+
<th>Feature</th>
|
|
209
|
+
<th class="num-col">Solo</th>
|
|
210
|
+
<th class="num-col">Team</th>
|
|
211
|
+
<th class="num-col">Enterprise</th>
|
|
212
|
+
</tr>
|
|
213
|
+
</thead>
|
|
214
|
+
<tbody>
|
|
215
|
+
<tr><td>Sync engine v3</td><td class="num-col">✓</td><td class="num-col">✓</td><td class="num-col">✓</td></tr>
|
|
216
|
+
<tr><td>Per-folder budgets</td><td class="num-col">—</td><td class="num-col">✓</td><td class="num-col">✓</td></tr>
|
|
217
|
+
<tr><td>SAML / SCIM</td><td class="num-col">—</td><td class="num-col">—</td><td class="num-col">✓</td></tr>
|
|
218
|
+
<tr><td>Dedicated infra</td><td class="num-col">—</td><td class="num-col">—</td><td class="num-col">✓</td></tr>
|
|
219
|
+
<tr style="border-top: 1px solid var(--fg);">
|
|
220
|
+
<td><strong>Monthly</strong></td>
|
|
221
|
+
<td class="num-col"><strong>$0</strong></td>
|
|
222
|
+
<td class="num-col"><strong>$4 / seat</strong></td>
|
|
223
|
+
<td class="num-col"><strong>Talk to us</strong></td>
|
|
224
|
+
</tr>
|
|
225
|
+
</tbody>
|
|
226
|
+
</table>
|
|
227
|
+
</div>
|
|
228
|
+
</section>
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Section rhythm — when in doubt
|
|
234
|
+
|
|
235
|
+
For a 5-section landing:
|
|
236
|
+
1. Hero (Layout 1 or 2)
|
|
237
|
+
2. Features (Layout 3)
|
|
238
|
+
3. Stats *or* quote (Layout 4 or 5)
|
|
239
|
+
4. Split detail (custom, using `grid-2-1` / `grid-1-2`)
|
|
240
|
+
5. CTA + footer (Layout 6)
|
|
241
|
+
|
|
242
|
+
For a 4-section docs/marketing index:
|
|
243
|
+
1. Hero center (Layout 1)
|
|
244
|
+
2. Log list (Layout 7)
|
|
245
|
+
3. CTA + footer (Layout 6)
|
|
246
|
+
|
|
247
|
+
Two stat rows in a row, two quote blocks in a row, two feature triplets in a row — all visual fatigue. Alternate.
|