@leanspec/ui 0.2.7-dev.20251126090633 → 0.2.7
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/.next/standalone/node_modules/.pnpm/@img+sharp-darwin-arm64@0.34.5/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-linux-x64@0.34.5/node_modules/@img/sharp-linux-x64 → @img+sharp-darwin-arm64@0.34.5/node_modules/@img/sharp-darwin-arm64}/package.json +7 -13
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64}/README.md +2 -2
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64}/lib/glib-2.0/include/glibconfig.h +8 -9
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib} +0 -0
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64}/package.json +5 -11
- package/.next/standalone/node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/build/Release/better_sqlite3.node +0 -0
- package/.next/standalone/packages/ui/.next/BUILD_ID +1 -1
- package/.next/standalone/packages/ui/.next/build-manifest.json +2 -2
- package/.next/standalone/packages/ui/.next/prerender-manifest.json +3 -3
- package/.next/standalone/packages/ui/.next/required-server-files.json +4 -4
- package/.next/standalone/packages/ui/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.html +2 -2
- package/.next/standalone/packages/ui/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/packages/ui/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/[id]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/discover/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/list-directory/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/status/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/stats/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/revalidate/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/dependency-graph/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/subspecs/[file]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/stats/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/[specId]/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.html +2 -2
- package/.next/standalone/packages/ui/.next/server/app/projects.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_full.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_index.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/specs/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/stats/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/pages/404.html +2 -2
- package/.next/standalone/packages/ui/.next/server/pages/500.html +2 -2
- package/.next/standalone/packages/ui/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/packages/ui/dist/standalone/packages/web/README.md +196 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/components.json +20 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/0000_reflective_thena.sql +59 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/0001_fresh_carmella_unuscione.sql +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/0000_snapshot.json +427 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/0001_snapshot.json +436 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/_journal.json +20 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle.config.ts +10 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/eslint.config.mjs +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/next.config.ts +7 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/package.json +83 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/postcss.config.mjs +8 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/f864aa7e7061c0600e35cf3d879b27cf.txt +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/favicon.ico +0 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/file.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/github-mark-white.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/github-mark.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/globe.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/icon.svg +7 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/logo-dark-bg.svg +17 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/logo-with-bg.svg +17 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/logo.svg +17 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/next.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/vercel.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/window.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/server.js +44 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/projects/[id]/specs/route.ts +23 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/projects/route.ts +19 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/revalidate/route.ts +63 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/dependency-graph/route.test.ts +51 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/dependency-graph/route.ts +171 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/route.ts +36 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/subspecs/[file]/route.ts +46 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/stats/route.ts +19 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/board-client.tsx +162 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/loading.tsx +43 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/page.tsx +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/dashboard-client.tsx +364 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/error.tsx +43 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/globals.css +531 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/home-client.tsx +277 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/layout.tsx +70 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/loading.tsx +87 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/not-found.tsx +27 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/page.tsx +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/[id]/loading.tsx +5 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/[id]/page.tsx +43 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/page.tsx +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/specs-client.tsx +425 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/stats/page.tsx +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/stats/stats-client.tsx +283 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/back-to-top.tsx +46 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/empty-state.tsx +52 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/main-sidebar.tsx +175 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/markdown-link.test.ts +96 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/markdown-link.tsx +95 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/navigation.tsx +210 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/priority-badge.tsx +53 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/quick-search.tsx +180 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/skeletons.tsx +119 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-dependency-graph.tsx +369 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-client.tsx +372 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-loading-shell.tsx +42 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-wrapper.tsx +70 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-metadata.tsx +136 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-sidebar.tsx +127 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-timeline.tsx +186 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/specs-nav-sidebar.tsx +561 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/status-badge.tsx +53 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/sub-spec-tabs.tsx +143 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/table-of-contents.tsx +130 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/theme-provider.tsx +11 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/theme-toggle.tsx +37 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/avatar.tsx +50 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/badge.tsx +36 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/breadcrumb.tsx +110 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/button.tsx +57 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/card.tsx +76 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/command.tsx +153 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/dialog.tsx +122 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/input.tsx +24 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/select.tsx +159 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/separator.tsx +31 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/skeleton.tsx +15 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/tabs.tsx +55 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/toast.tsx +30 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/tooltip.tsx +32 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/date-utils.ts +76 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/index.ts +42 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/migrate.ts +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/queries.ts +114 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/schema.ts +123 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/seed.ts +156 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/service-queries.ts +216 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/dependency-graph.ts +105 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/service.ts +120 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/sources/database-source.ts +94 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/sources/filesystem-source.ts +249 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/types.ts +55 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/stores/specs-sidebar-store.ts +152 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/sub-specs.ts +171 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/utils.ts +17 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/types/specs.ts +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/tailwind.config.ts +58 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/tsconfig.json +34 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/tsconfig.tsbuildinfo +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/vitest.config.ts +14 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/014-complete-custom-frontmatter/README.md +175 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/016-github-action/README.md +317 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/017-vscode-extension/README.md +261 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/CLI-DESIGN.md +380 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/CONFIGURATION-EXAMPLES.md +230 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/CONFIGURATION.md +285 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/IMPLEMENTATION.md +358 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/README.md +303 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/TESTING.md +368 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/VALIDATION-RULES.md +327 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/024-pattern-aware-list-grouping/README.md +117 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/025-template-config-updates/README.md +73 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/026-init-pattern-selection/README.md +109 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/034-copilot-slash-commands/README.md +107 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/035-live-specs-showcase/ARCHITECTURE.md +244 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/035-live-specs-showcase/IMPLEMENTATION.md +429 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/035-live-specs-showcase/README.md +306 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/036-pm-integrations/README.md +158 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-AI-ASSISTED.md +359 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-FULL-LIFECYCLE.md +86 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-REAL-FEATURE.md +437 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-SCRIPT.md +365 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DOGFOODING-FINAL.md +203 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DOGFOODING-SESSION-2025-11-06.md +174 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DOGFOODING-SUMMARY.md +156 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/IMPLEMENTATION.md +183 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/MARKETING.md +229 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/NEXT-STEPS-DEMO.md +243 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/README.md +217 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/SESSION-2025-11-06.md +166 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/TESTING.md +126 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/ACTUAL-IMPLEMENTATION.md +108 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/DESIGN.md +382 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/IMPLEMENTATION.md +144 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/RATIONALE.md +146 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/README.md +208 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/TESTING.md +182 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/047-git-backfill-timestamps/README.md +314 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/048-spec-complexity-analysis/FINDINGS.md +113 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/048-spec-complexity-analysis/GUIDELINES.md +237 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/048-spec-complexity-analysis/README.md +149 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/ANALYSIS-COMPARISONS.md +175 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/ANALYSIS-CONSTRAINTS.md +254 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/FIRST-PRINCIPLES.md +376 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/OPERATIONALIZATION-ROADMAP.md +240 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/OPERATIONALIZATION-TOOLS.md +175 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/README.md +374 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/051-docs-system-prompt-principles/README.md +339 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/052-branding-assets/README.md +128 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/053-spec-assets-philosophy/README.md +97 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/054-validate-output-lint-style/DESIGN-DECISIONS.md +93 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/054-validate-output-lint-style/OUTPUT-FORMAT-SPEC.md +146 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/054-validate-output-lint-style/README.md +175 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/ANALYSIS-PART1.md +397 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/ANALYSIS-PART2.md +342 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/ANALYSIS.md +44 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/CHANGES.md +150 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/CONCERNS-ANALYSIS.md +351 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/DOCS-ALIGNMENT-ANALYSIS.md +238 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/README.md +280 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/REDESIGN-DRAFT.md +372 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/REDESIGN-REFINED.md +466 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/056-docs-site-accuracy-audit/AUDIT-RESULTS.md +178 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/056-docs-site-accuracy-audit/README.md +174 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/057-docs-validation-comprehensive/README.md +295 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/057-docs-validation-comprehensive/VALIDATION-RESULTS.md +487 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/ANALYSIS.md +241 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/DESIGN.md +279 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/IMPLEMENTATION.md +642 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/NOTES.md +125 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/README.md +286 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/ARCHITECTURE.md +392 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/COMMANDS.md +1002 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/CONTEXT-ENGINEERING.md +411 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/IMPLEMENTATION.md +812 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/README.md +504 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/TESTING.md +724 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/060-core-concepts-coherence/README.md +125 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/061-ai-assisted-spec-writing/README.md +299 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/IMPLEMENTATION-PLAN.md +174 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/PAGE-SPECIFICATIONS.md +265 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/PROBLEM-ANALYSIS.md +36 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/README.md +243 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/SOLUTION-DESIGN.md +82 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/DESIGN.md +338 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/EXAMPLES.md +354 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/IMPLEMENTATION.md +189 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/README.md +119 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/064-docs-site-zh-translation/README.md +170 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/065-v03-planning/README.md +158 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/066-context-economy-thresholds-refinement/README.md +842 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/067-monorepo-core-extraction/README.md +358 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/068-live-specs-ux-enhancements/DESIGN.md +444 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/068-live-specs-ux-enhancements/README.md +357 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/069-token-counting-utils/README.md +551 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/070-mcp-token-counting-tool/README.md +372 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/071-simplified-token-validation/README.md +489 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/072-ai-agent-first-use-workflow/README.md +287 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/073-template-engine-agents-md/README.md +323 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/074-content-at-creation/README.md +136 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/075-intelligent-search-engine/README.md +399 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/076-programmatic-spec-relationships/README.md +301 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/077-archiving-strategy/README.md +235 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/078-sub-spec-template-system/README.md +303 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/079-cli-alphabetical-organization/README.md +196 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/080-mcp-server-modular-architecture/README.md +388 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/081-web-app-ux-redesign/README.md +825 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/DATABASE.md +111 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/DEPLOYMENT.md +69 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/FILESYSTEM.md +77 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/IMPLEMENTATION.md +184 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/README.md +501 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/083-web-navigation-performance/README.md +490 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/084-sub-spec-visibility-in-tools/README.md +389 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/085-cli-relationship-commands/README.md +920 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/086-template-component-deduplication/README.md +146 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/087-cli-ui-command/README.md +421 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/088-core-concepts-terminology-only/README.md +106 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/089-sdd-practical-tutorials/README.md +126 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/090-leanspec-sdd-case-studies/README.md +131 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/091-chinese-localization-strategy/README.md +254 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/092-docs-site-submodule-migration/README.md +152 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/093-spec-detail-ui-improvements/README.md +65 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/094-ai-chatbot-web-integration/README.md +332 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/095-pr-migration-verification/README.md +339 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/096-docs-beginner-first-reorg/README.md +399 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/097-dag-visualization-library/README.md +525 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/098-github-multi-project-integration/README.md +387 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/099-enhanced-dependency-commands-cli-mcp/README.md +613 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/100-release-process-typecheck-failure/README.md +266 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/101-sidebar-scroll-position-drift/README.md +100 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/102-mcp-wrapper-package/README.md +172 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/001-typescript-cli-migration/README.md +37 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/002-template-system-redesign/README.md +60 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/003-init-system-redesign/README.md +113 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/004-existing-project-integration/README.md +69 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/004-existing-project-integration/SUMMARY.md +112 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/005-structured-frontmatter/README.md +229 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/006-pm-visualization-tools/README.md +406 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/007-system-prompt-updates/README.md +168 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/008-commander-migration/README.md +174 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/009-cli-ux-enhancement/README.md +212 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/010-commands-refactor/README.md +249 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/011-test-results/README.md +60 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/011-test-results/TEST_SUMMARY.md +139 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/012-sub-spec-files/README.md +722 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/013-custom-spec-templates/README.md +413 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/015-npm-publishing/README.md +255 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/019-readme-improvement/README.md +252 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/020-documentation-website/README.md +253 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/021-docusaurus-vercel-migration/README.md +612 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/022-flexible-folder-structure/README.md +794 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/023-folder-structure-improvements/DESIGN.md +834 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/023-folder-structure-improvements/README.md +255 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/027-cli-ui-ux-optimization/README.md +454 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/028-cli-ui-modernization/README.md +172 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/029-visualization-improvements/IMPLEMENTATION.md +152 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/029-visualization-improvements/README.md +95 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/030-created-date-format-bug/README.md +87 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/031-gantt-ux-improvements/README.md +230 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/032-console-log-chalk-security/README.md +89 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/033-mcp-server/README.md +89 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/037-docs-overhaul/README.md +166 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/038-flat-structure-migration/README.md +276 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/038-mcp-frontmatter-bug-fix/README.md +122 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/039-simplify-viewer-commands/README.md +198 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/039-template-variable-sync/README.md +192 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/040-spec-viewer-commands/README.md +171 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/042-mcp-error-handling/README.md +200 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/044-spec-relationships-clarity/README.md +317 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/DESIGN.md +276 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/IMPLEMENTATION.md +241 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/README.md +139 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/TESTING.md +328 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/050-tool-redesign-first-principles/README.md +400 -0
- package/.next/standalone/packages/ui/package.json +1 -1
- package/.next/standalone/packages/ui/server.js +1 -1
- package/.next/standalone/packages/ui/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
- package/.next/standalone/node_modules/.pnpm/@img+sharp-linux-x64@0.34.5/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-linuxmusl-x64@0.34.5/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-linuxmusl-x64@0.34.5/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
- /package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64}/lib/index.js +0 -0
- /package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64}/versions.json +0 -0
- /package/.next/standalone/packages/ui/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_buildManifest.js +0 -0
- /package/.next/standalone/packages/ui/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/packages/ui/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_ssgManifest.js +0 -0
- /package/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_buildManifest.js +0 -0
- /package/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_ssgManifest.js +0 -0
package/.next/standalone/packages/ui/dist/standalone/specs/083-web-navigation-performance/README.md
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: complete
|
|
3
|
+
created: '2025-11-16'
|
|
4
|
+
tags:
|
|
5
|
+
- web
|
|
6
|
+
- performance
|
|
7
|
+
- ux
|
|
8
|
+
- v0.3
|
|
9
|
+
priority: high
|
|
10
|
+
created_at: '2025-11-16T13:27:26.767Z'
|
|
11
|
+
updated_at: '2025-11-17T01:09:49.197Z'
|
|
12
|
+
completed_at: '2025-11-17T01:09:49.197Z'
|
|
13
|
+
completed: '2025-11-17'
|
|
14
|
+
transitions:
|
|
15
|
+
- status: complete
|
|
16
|
+
at: '2025-11-17T01:09:49.197Z'
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Web App Navigation Performance Optimization
|
|
20
|
+
|
|
21
|
+
> **Status**: ✅ Complete · **Priority**: High · **Created**: 2025-11-16 · **Tags**: web, performance, ux, v0.3
|
|
22
|
+
|
|
23
|
+
**Project**: lean-spec
|
|
24
|
+
**Team**: Core Development
|
|
25
|
+
|
|
26
|
+
## Overview
|
|
27
|
+
|
|
28
|
+
**The Problem**: Navigating between specs and sub-specs on https://lean-spec-web.vercel.app feels slow (600ms-1.2s per navigation), creating a sluggish user experience that undermines the "realtime" feel we want for v0.3.
|
|
29
|
+
|
|
30
|
+
**Root Cause**: The spec detail page (`/specs/[id]`) uses full server-side rendering with `export const dynamic = 'force-dynamic'`, meaning every navigation:
|
|
31
|
+
|
|
32
|
+
1. Makes a full page server request (no client-side navigation)
|
|
33
|
+
2. Triggers filesystem reads even with 60s cache (cold starts: ~500ms-1s)
|
|
34
|
+
3. Fetches ALL specs for sidebar on every page load
|
|
35
|
+
4. Parses markdown on server for every render
|
|
36
|
+
5. No prefetching, no client-side caching, no optimistic UI
|
|
37
|
+
|
|
38
|
+
**Why It Matters**:
|
|
39
|
+
- Users navigate between specs frequently during spec review/writing
|
|
40
|
+
- Slow navigation breaks flow state and creates frustration
|
|
41
|
+
- Competitive apps (Notion, Linear, GitHub) feel instant (<100ms)
|
|
42
|
+
- Critical for v0.3 launch credibility
|
|
43
|
+
|
|
44
|
+
**What We Need**: Hybrid rendering architecture that achieves:
|
|
45
|
+
- **Initial load**: Server-rendered for SEO and fast first paint (~200ms)
|
|
46
|
+
- **Subsequent navigation**: Client-side transitions (<100ms)
|
|
47
|
+
- **Data fetching**: API routes with aggressive caching and prefetching
|
|
48
|
+
- **Optimistic UI**: Instant feedback while data loads in background
|
|
49
|
+
|
|
50
|
+
## Design
|
|
51
|
+
|
|
52
|
+
### Current Architecture (Slow)
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
User clicks spec → Full page request → Vercel serverless function
|
|
56
|
+
↓
|
|
57
|
+
Cold start (~500ms)
|
|
58
|
+
↓
|
|
59
|
+
Filesystem read (~50-100ms)
|
|
60
|
+
↓
|
|
61
|
+
Load ALL specs for sidebar (~50ms)
|
|
62
|
+
↓
|
|
63
|
+
Parse markdown (~50-100ms)
|
|
64
|
+
↓
|
|
65
|
+
Server render HTML
|
|
66
|
+
↓
|
|
67
|
+
Send to client
|
|
68
|
+
↓
|
|
69
|
+
Client hydrates
|
|
70
|
+
|
|
71
|
+
Total: 600ms-1.2s per navigation 😱
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Target Architecture (Fast)
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
Initial Load (Server-Rendered):
|
|
78
|
+
User → Server → Filesystem → Parse → HTML (200ms)
|
|
79
|
+
|
|
80
|
+
Subsequent Navigation (Client-Side):
|
|
81
|
+
User clicks → Client state update (instant)
|
|
82
|
+
↓
|
|
83
|
+
Check cache → Hit? Render immediately (<50ms)
|
|
84
|
+
↓
|
|
85
|
+
Miss? → API request → Response (~100ms)
|
|
86
|
+
↓
|
|
87
|
+
Background: Prefetch adjacent specs
|
|
88
|
+
|
|
89
|
+
Total: <100ms per navigation ✨
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Three-Tier Optimization Strategy
|
|
93
|
+
|
|
94
|
+
**Tier 1: Route Segment Config (Immediate - 30 min)**
|
|
95
|
+
```tsx
|
|
96
|
+
// packages/web/src/app/specs/[id]/page.tsx
|
|
97
|
+
export const revalidate = 60; // Cache rendered pages for 60s
|
|
98
|
+
export const dynamicParams = true; // Generate new pages on demand
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Impact**: 50-70% faster for repeat visits to same spec
|
|
102
|
+
**Trade-off**: Stale data for up to 60s (acceptable given filesystem cache is also 60s)
|
|
103
|
+
|
|
104
|
+
**Tier 2: Hybrid Rendering (Primary - 1-2 days)**
|
|
105
|
+
|
|
106
|
+
Split page into server + client components:
|
|
107
|
+
|
|
108
|
+
```tsx
|
|
109
|
+
// Server component (initial load only)
|
|
110
|
+
export default async function SpecDetailPage({ params }) {
|
|
111
|
+
const [spec, allSpecs] = await Promise.all([
|
|
112
|
+
getSpecById(id),
|
|
113
|
+
getSpecs() // For sidebar
|
|
114
|
+
]);
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<SpecDetailClient
|
|
118
|
+
initialSpec={spec}
|
|
119
|
+
initialSpecs={allSpecs}
|
|
120
|
+
/>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Client component (handles all navigation)
|
|
125
|
+
'use client';
|
|
126
|
+
function SpecDetailClient({ initialSpec, initialSpecs }) {
|
|
127
|
+
const [currentSpec, setCurrentSpec] = useState(initialSpec);
|
|
128
|
+
const [currentSubSpec, setCurrentSubSpec] = useState<string | null>(null);
|
|
129
|
+
|
|
130
|
+
// Client-side cache with SWR
|
|
131
|
+
const { data: spec, isLoading } = useSWR(
|
|
132
|
+
`/api/specs/${currentSpec.id}`,
|
|
133
|
+
{ fallbackData: currentSpec, revalidateOnFocus: false }
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
// Prefetch on hover
|
|
137
|
+
const prefetchSpec = (specId: string) => {
|
|
138
|
+
fetch(`/api/specs/${specId}`); // Warm cache
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
// Instant sub-spec switching (no network)
|
|
142
|
+
const switchSubSpec = (fileName: string) => {
|
|
143
|
+
setCurrentSubSpec(fileName); // Instant UI update
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
return (
|
|
147
|
+
<div>
|
|
148
|
+
<SpecsNavSidebar
|
|
149
|
+
specs={initialSpecs}
|
|
150
|
+
onSpecHover={prefetchSpec}
|
|
151
|
+
onSpecClick={(id) => {
|
|
152
|
+
setCurrentSpec(specs.find(s => s.id === id)!);
|
|
153
|
+
router.push(`/specs/${id}`, { scroll: false });
|
|
154
|
+
}}
|
|
155
|
+
/>
|
|
156
|
+
|
|
157
|
+
<SubSpecTabs
|
|
158
|
+
subSpecs={spec.subSpecs}
|
|
159
|
+
current={currentSubSpec}
|
|
160
|
+
onChange={switchSubSpec} // Instant
|
|
161
|
+
/>
|
|
162
|
+
|
|
163
|
+
<MarkdownContent content={currentContent} />
|
|
164
|
+
</div>
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Key Changes:**
|
|
170
|
+
1. **API routes** for data fetching (not in page component)
|
|
171
|
+
2. **SWR** for client-side caching with stale-while-revalidate
|
|
172
|
+
3. **Prefetching** on sidebar hover (warm cache before click)
|
|
173
|
+
4. **Optimistic UI** for sub-spec switching (instant, no network)
|
|
174
|
+
5. **Shallow routing** (`scroll: false`) to avoid full page loads
|
|
175
|
+
|
|
176
|
+
**Tier 3: Advanced Optimizations (Future - 2-3 days)**
|
|
177
|
+
|
|
178
|
+
1. **React Query** (more powerful than SWR)
|
|
179
|
+
- Automatic background refetching
|
|
180
|
+
- Optimistic updates
|
|
181
|
+
- Mutation support for future edit features
|
|
182
|
+
|
|
183
|
+
2. **Virtual scrolling** for sidebar (if >100 specs)
|
|
184
|
+
|
|
185
|
+
3. **Service worker caching** for offline support
|
|
186
|
+
|
|
187
|
+
### API Routes Design
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
// packages/web/src/app/api/specs/[id]/route.ts
|
|
191
|
+
export async function GET(
|
|
192
|
+
request: Request,
|
|
193
|
+
{ params }: { params: Promise<{ id: string }> }
|
|
194
|
+
) {
|
|
195
|
+
const { id } = await params;
|
|
196
|
+
const spec = await getSpecById(id);
|
|
197
|
+
|
|
198
|
+
return NextResponse.json({ spec }, {
|
|
199
|
+
headers: {
|
|
200
|
+
'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=120'
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// packages/web/src/app/api/specs/[id]/subspecs/[file]/route.ts
|
|
206
|
+
export async function GET(
|
|
207
|
+
request: Request,
|
|
208
|
+
{ params }: { params: Promise<{ id: string; file: string }> }
|
|
209
|
+
) {
|
|
210
|
+
const { id, file } = await params;
|
|
211
|
+
const spec = await getSpecById(id);
|
|
212
|
+
const subSpec = spec?.subSpecs?.find(s => s.file === file);
|
|
213
|
+
|
|
214
|
+
return NextResponse.json({ subSpec }, {
|
|
215
|
+
headers: {
|
|
216
|
+
'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=120'
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Performance Targets
|
|
223
|
+
|
|
224
|
+
| Metric | Current | Tier 1 | Tier 2 | Tier 3 |
|
|
225
|
+
|--------|---------|--------|--------|--------|
|
|
226
|
+
| **Initial Page Load** | ~600ms | ~300ms | ~200ms | ~150ms |
|
|
227
|
+
| **Same Spec (Cached)** | ~600ms | ~100ms | ~50ms | ~10ms |
|
|
228
|
+
| **Different Spec** | ~800ms | ~400ms | ~100ms | ~50ms |
|
|
229
|
+
| **Sub-Spec Switch** | ~600ms | ~600ms | **~10ms** | **~5ms** |
|
|
230
|
+
| **Prefetched Spec** | ~800ms | ~400ms | **~50ms** | **~10ms** |
|
|
231
|
+
| **Cold Start Penalty** | Yes (500ms) | Yes | Yes | Yes |
|
|
232
|
+
|
|
233
|
+
**Success Criteria:**
|
|
234
|
+
- ✅ Sub-spec navigation feels instant (<50ms perceived)
|
|
235
|
+
- ✅ Spec navigation <100ms for cached/prefetched
|
|
236
|
+
- ✅ Initial load still fast (<300ms)
|
|
237
|
+
- ✅ No degradation in SEO or accessibility
|
|
238
|
+
- ✅ Memory usage remains reasonable (<50MB client cache)
|
|
239
|
+
|
|
240
|
+
## Plan
|
|
241
|
+
|
|
242
|
+
### Phase 1: Tier 1 - Quick Cache Config (Day 1 - 1-2 hours)
|
|
243
|
+
|
|
244
|
+
**Goal**: Test route segment caching to validate approach
|
|
245
|
+
|
|
246
|
+
- [ ] Add `revalidate: 60` to spec detail page
|
|
247
|
+
- [ ] Add `dynamicParams: true` for on-demand generation
|
|
248
|
+
- [ ] Deploy to Vercel staging
|
|
249
|
+
- [ ] Measure performance with Chrome DevTools
|
|
250
|
+
- [ ] Document improvement (expect 50-70% on repeat visits)
|
|
251
|
+
- [ ] If successful, proceed to Tier 2; if minimal gain, skip Tier 1
|
|
252
|
+
|
|
253
|
+
### Phase 2: Tier 2 - Hybrid Rendering (Days 2-3 - 2 days)
|
|
254
|
+
|
|
255
|
+
**Day 2: API Routes + Client Components**
|
|
256
|
+
- [ ] Create API route: `GET /api/specs/[id]`
|
|
257
|
+
- [ ] Create API route: `GET /api/specs/[id]/subspecs/[file]`
|
|
258
|
+
- [ ] Add cache headers (`s-maxage=60, stale-while-revalidate=120`)
|
|
259
|
+
- [ ] Split `SpecDetailPage` into server + client components
|
|
260
|
+
- [ ] Install SWR: `pnpm add swr`
|
|
261
|
+
- [ ] Implement `SpecDetailClient` with SWR caching
|
|
262
|
+
- [ ] Test API routes return correct data
|
|
263
|
+
|
|
264
|
+
**Day 3: Prefetching + Optimistic UI**
|
|
265
|
+
- [ ] Add hover prefetch to `SpecsNavSidebar`
|
|
266
|
+
- [ ] Implement instant sub-spec switching (no network)
|
|
267
|
+
- [ ] Add loading states (skeleton) for slow connections
|
|
268
|
+
- [ ] Add error boundaries for failed fetches
|
|
269
|
+
- [ ] Update routing to use shallow navigation
|
|
270
|
+
- [ ] Test navigation feels instant (<100ms)
|
|
271
|
+
|
|
272
|
+
### Phase 3: Performance Testing (Day 4 - 1 day)
|
|
273
|
+
|
|
274
|
+
**Benchmarking:**
|
|
275
|
+
- [ ] Initial page load time (target: <300ms)
|
|
276
|
+
- [ ] Sub-spec switch time (target: <50ms)
|
|
277
|
+
- [ ] Spec navigation (cached) (target: <100ms)
|
|
278
|
+
- [ ] Spec navigation (prefetched) (target: <100ms)
|
|
279
|
+
- [ ] Cold start penalty on Vercel (measure only)
|
|
280
|
+
- [ ] Memory usage after 50 navigations (<50MB)
|
|
281
|
+
|
|
282
|
+
**Real-World Testing:**
|
|
283
|
+
- [ ] Test on slow 3G connection
|
|
284
|
+
- [ ] Test with 100+ specs (sidebar performance)
|
|
285
|
+
- [ ] Test browser back/forward buttons work
|
|
286
|
+
- [ ] Test deep linking to sub-specs works
|
|
287
|
+
- [ ] Test SEO still works (view-source shows content)
|
|
288
|
+
|
|
289
|
+
### Phase 4: Deployment (Day 5 - 0.5 days)
|
|
290
|
+
|
|
291
|
+
- [ ] Deploy to Vercel staging
|
|
292
|
+
- [ ] Run Lighthouse audit (target: 90+ performance)
|
|
293
|
+
- [ ] Test on mobile devices
|
|
294
|
+
- [ ] Verify no regressions in functionality
|
|
295
|
+
- [ ] Deploy to production
|
|
296
|
+
- [ ] Monitor Vercel analytics for improvements
|
|
297
|
+
|
|
298
|
+
### Phase 5: Tier 3 - Advanced (Future - Optional)
|
|
299
|
+
|
|
300
|
+
- [ ] Replace SWR with React Query (if needed)
|
|
301
|
+
- [ ] Add virtual scrolling to sidebar (if >100 specs)
|
|
302
|
+
- [ ] Add service worker for offline caching
|
|
303
|
+
- [ ] Measure sub-10ms navigation times
|
|
304
|
+
|
|
305
|
+
## Test
|
|
306
|
+
|
|
307
|
+
### Performance Testing
|
|
308
|
+
|
|
309
|
+
**Automated Benchmarks:**
|
|
310
|
+
```bash
|
|
311
|
+
# Run Lighthouse CI
|
|
312
|
+
pnpm test:lighthouse
|
|
313
|
+
|
|
314
|
+
# Custom performance tests
|
|
315
|
+
pnpm test:perf
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Manual Testing Checklist:**
|
|
319
|
+
|
|
320
|
+
**Initial Load (Server-Rendered):**
|
|
321
|
+
- [ ] Spec detail page loads in <300ms (Fast 3G)
|
|
322
|
+
- [ ] Content visible before JavaScript loads
|
|
323
|
+
- [ ] SEO tags present in HTML source
|
|
324
|
+
- [ ] Lighthouse Performance score >90
|
|
325
|
+
|
|
326
|
+
**Client-Side Navigation:**
|
|
327
|
+
- [ ] Sub-spec switching feels instant (<50ms perceived)
|
|
328
|
+
- [ ] Spec navigation <100ms when cached
|
|
329
|
+
- [ ] Prefetching works (hover → faster click)
|
|
330
|
+
- [ ] Loading states appear for slow requests (>200ms)
|
|
331
|
+
- [ ] No flash of wrong content
|
|
332
|
+
|
|
333
|
+
**Browser Features:**
|
|
334
|
+
- [ ] Back button works correctly
|
|
335
|
+
- [ ] Forward button works correctly
|
|
336
|
+
- [ ] Deep links to sub-specs work (`/specs/82?subspec=DESIGN.md`)
|
|
337
|
+
- [ ] URL updates on navigation
|
|
338
|
+
- [ ] Page refresh loads correct content
|
|
339
|
+
|
|
340
|
+
**Edge Cases:**
|
|
341
|
+
- [ ] Offline → online transition works
|
|
342
|
+
- [ ] Cache invalidation works (API endpoint)
|
|
343
|
+
- [ ] Network error shows graceful fallback
|
|
344
|
+
- [ ] 404 for non-existent specs
|
|
345
|
+
- [ ] Memory doesn't leak over 100 navigations
|
|
346
|
+
|
|
347
|
+
### Regression Testing
|
|
348
|
+
|
|
349
|
+
**Functionality:**
|
|
350
|
+
- [ ] All existing features work (sidebar, search, filters)
|
|
351
|
+
- [ ] Markdown rendering correct
|
|
352
|
+
- [ ] Code highlighting works
|
|
353
|
+
- [ ] Table of contents works
|
|
354
|
+
- [ ] Back to top button works
|
|
355
|
+
|
|
356
|
+
**Accessibility:**
|
|
357
|
+
- [ ] Keyboard navigation works
|
|
358
|
+
- [ ] Screen reader announces page changes
|
|
359
|
+
- [ ] Focus management correct
|
|
360
|
+
- [ ] ARIA labels correct
|
|
361
|
+
|
|
362
|
+
**SEO:**
|
|
363
|
+
- [ ] Meta tags correct
|
|
364
|
+
- [ ] Open Graph tags work
|
|
365
|
+
- [ ] Twitter cards work
|
|
366
|
+
- [ ] Structured data present
|
|
367
|
+
|
|
368
|
+
## Notes
|
|
369
|
+
|
|
370
|
+
### Performance Measurement Tools
|
|
371
|
+
|
|
372
|
+
**Chrome DevTools:**
|
|
373
|
+
```javascript
|
|
374
|
+
// Measure navigation time
|
|
375
|
+
performance.mark('nav-start');
|
|
376
|
+
// ... navigation happens
|
|
377
|
+
performance.mark('nav-end');
|
|
378
|
+
performance.measure('navigation', 'nav-start', 'nav-end');
|
|
379
|
+
console.log(performance.getEntriesByName('navigation')[0].duration);
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
**Real User Monitoring:**
|
|
383
|
+
```typescript
|
|
384
|
+
// Add to SpecDetailClient
|
|
385
|
+
useEffect(() => {
|
|
386
|
+
const navigationTime = performance.now();
|
|
387
|
+
analytics.track('spec_navigation', {
|
|
388
|
+
specId: spec.id,
|
|
389
|
+
loadTime: navigationTime,
|
|
390
|
+
cached: !isLoading
|
|
391
|
+
});
|
|
392
|
+
}, [spec.id]);
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
**Vercel Analytics:**
|
|
396
|
+
- Built-in Web Vitals tracking
|
|
397
|
+
- Real-world performance data
|
|
398
|
+
- Geographic distribution
|
|
399
|
+
|
|
400
|
+
### Key Design Decisions
|
|
401
|
+
|
|
402
|
+
**Why Tier 2 (Hybrid) over Tier 1 (Cache) alone?**
|
|
403
|
+
- Tier 1 only helps repeat visits to *same* spec
|
|
404
|
+
- Users navigate between *different* specs frequently
|
|
405
|
+
- Tier 2 enables prefetching and client-side transitions
|
|
406
|
+
- Sub-spec switching needs client-side (no network round-trip)
|
|
407
|
+
|
|
408
|
+
**Why SWR over React Query?**
|
|
409
|
+
- Simpler API for our use case
|
|
410
|
+
- Smaller bundle size (~5KB vs ~13KB)
|
|
411
|
+
- Built-in stale-while-revalidate pattern
|
|
412
|
+
- Can upgrade to React Query later if needed
|
|
413
|
+
|
|
414
|
+
**Why keep server rendering?**
|
|
415
|
+
- SEO requires server-rendered HTML
|
|
416
|
+
- Fast initial load (no client JS required)
|
|
417
|
+
- Progressive enhancement (works without JS)
|
|
418
|
+
- Best of both worlds: server first load, client subsequent
|
|
419
|
+
|
|
420
|
+
**Why not ISR immediately?**
|
|
421
|
+
**Why not ISR?**
|
|
422
|
+
- Filesystem mode already has 60s caching (same benefit)
|
|
423
|
+
- Adds build complexity without clear win
|
|
424
|
+
- Cold starts acceptable with Tier 1+2 optimizations
|
|
425
|
+
- Can revisit if cold starts become issue
|
|
426
|
+
### Alternative Approaches Considered
|
|
427
|
+
|
|
428
|
+
**1. Full Static Generation (SSG)**
|
|
429
|
+
- **Pros**: Fastest possible (CDN cached HTML)
|
|
430
|
+
- **Cons**: Requires rebuild on every spec change, breaks realtime updates
|
|
431
|
+
- **Verdict**: ❌ Conflicts with v0.3 realtime goals
|
|
432
|
+
|
|
433
|
+
**2. Full Client-Side Rendering (CSR)**
|
|
434
|
+
- **Pros**: Instant navigation, simple architecture
|
|
435
|
+
- **Cons**: Bad SEO, slow initial load, no progressive enhancement
|
|
436
|
+
- **Verdict**: ❌ SEO is critical for public showcase
|
|
437
|
+
|
|
438
|
+
**3. Server Components Only (Current Approach)**
|
|
439
|
+
- **Pros**: Simple, SEO-friendly, no client JS
|
|
440
|
+
- **Cons**: Slow navigation, no caching, no prefetching
|
|
441
|
+
- **Verdict**: ❌ Too slow for good UX
|
|
442
|
+
|
|
443
|
+
**4. Hybrid Rendering (Chosen Approach)**
|
|
444
|
+
- **Pros**: SEO + fast navigation, best of both worlds
|
|
445
|
+
- **Cons**: More complex, requires API routes
|
|
446
|
+
- **Verdict**: ✅ Optimal balance
|
|
447
|
+
|
|
448
|
+
### Dependencies & Relationships
|
|
449
|
+
|
|
450
|
+
**This spec depends on:**
|
|
451
|
+
- Spec 082 (web-realtime-sync-architecture) - Provides filesystem source and service layer
|
|
452
|
+
- Existing spec detail page (`/specs/[id]/page.tsx`)
|
|
453
|
+
- Next.js 14+ App Router features
|
|
454
|
+
|
|
455
|
+
**This spec enables:**
|
|
456
|
+
- v0.3 launch with acceptable performance
|
|
457
|
+
- Better user experience for spec navigation
|
|
458
|
+
- Foundation for future features (edit, comments)
|
|
459
|
+
|
|
460
|
+
**Related specs:**
|
|
461
|
+
- Spec 081 (web-app-ux-redesign) - UX/UI improvements
|
|
462
|
+
- Spec 068 (live-specs-ux-enhancements) - Phase 2 UX work
|
|
463
|
+
- Spec 035 (live-specs-showcase) - Public showcase goals
|
|
464
|
+
|
|
465
|
+
### Open Questions
|
|
466
|
+
|
|
467
|
+
- [ ] What's acceptable cache size? (Start with 20 specs × 200KB = 4MB)
|
|
468
|
+
- [ ] Prefetch all specs on initial load? (No - only prefetch on hover)
|
|
469
|
+
- [ ] Virtual scroll sidebar? (Only if >100 specs becomes issue)
|
|
470
|
+
- [ ] React Query vs SWR? (Start with SWR, migrate if needed)
|
|
471
|
+
|
|
472
|
+
### Success Metrics
|
|
473
|
+
|
|
474
|
+
**Quantitative:**
|
|
475
|
+
- Navigation time: 600ms → <100ms (83% reduction)
|
|
476
|
+
- Sub-spec switch: 600ms → <50ms (92% reduction)
|
|
477
|
+
- Lighthouse Performance: Unknown → >90
|
|
478
|
+
- Time to Interactive: Unknown → <2s
|
|
479
|
+
|
|
480
|
+
**Qualitative:**
|
|
481
|
+
- Navigation feels instant (user perception)
|
|
482
|
+
- No more frustration during spec review sessions
|
|
483
|
+
- Competitive with modern web apps (Linear, Notion)
|
|
484
|
+
- Confidence to launch v0.3 publicly
|
|
485
|
+
|
|
486
|
+
**Business Impact:**
|
|
487
|
+
- Higher engagement (more specs viewed per session)
|
|
488
|
+
- Lower bounce rate (users don't leave due to slow navigation)
|
|
489
|
+
- Better first impression for new users
|
|
490
|
+
- Validates LeanSpec as production-ready tool
|