@leanspec/ui 0.2.6-dev.20251125010539 → 0.2.6
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/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/BUILD_ID +1 -0
- package/.next/standalone/packages/ui/dist/public/f864aa7e7061c0600e35cf3d879b27cf.txt +1 -0
- package/.next/standalone/packages/ui/dist/public/favicon.ico +0 -0
- package/.next/standalone/packages/ui/dist/public/file.svg +1 -0
- package/.next/standalone/packages/ui/dist/public/github-mark-white.svg +1 -0
- package/.next/standalone/packages/ui/dist/public/github-mark.svg +1 -0
- package/.next/standalone/packages/ui/dist/public/globe.svg +1 -0
- package/.next/standalone/packages/ui/dist/public/icon.svg +7 -0
- package/.next/standalone/packages/ui/dist/public/logo-dark-bg.svg +17 -0
- package/.next/standalone/packages/ui/dist/public/logo-with-bg.svg +17 -0
- package/.next/standalone/packages/ui/dist/public/logo.svg +17 -0
- package/.next/standalone/packages/ui/dist/public/next.svg +1 -0
- package/.next/standalone/packages/ui/dist/public/vercel.svg +1 -0
- package/.next/standalone/packages/ui/dist/public/window.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/README.md +196 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/leanspec.db +0 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/package.json +75 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/server.js +44 -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 +302 -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 +285 -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 +824 -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 +496 -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 +607 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/088-core-concepts-terminology-only/README.md +104 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/089-sdd-practical-tutorials/README.md +124 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/090-leanspec-sdd-case-studies/README.md +129 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/091-chinese-localization-strategy/README.md +244 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/092-docs-site-submodule-migration/README.md +148 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/093-spec-detail-ui-improvements/README.md +54 -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/dist/static/chunks/0c19c69aa7625475.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/116800b03245a1e5.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/15843a3d7584e314.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/19e80edf527aef5c.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/465954d5af3284a9.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/5abeeb89f1412a80.js +3 -0
- package/.next/standalone/packages/ui/dist/static/chunks/5c2072ad938de8ed.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/6a05a93ec8fa7b83.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/778e42188e450b39.css +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/a02c1f50ff00204f.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/a45464b9776dd88e.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/a6dad97d9634a72d.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/b0ea0ac61604f843.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/c06e85b449720194.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/c557ac675be79771.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/cad005a57ffbb2d3.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/cdf6fe33bc65efbc.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/d12ed5dbe44caed7.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/d1ebe5c1a344f4ca.js +5 -0
- package/.next/standalone/packages/ui/dist/static/chunks/d42cf1682bc46652.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/dde5d8bddd7fbfcf.js +1 -0
- package/.next/standalone/packages/ui/dist/static/chunks/ebd89051637b9a47.js +4 -0
- package/.next/standalone/packages/ui/dist/static/chunks/ec82875d18b29f47.js +2 -0
- package/.next/standalone/packages/ui/dist/static/chunks/f0b701df9769bcc5.js +19 -0
- package/.next/standalone/packages/ui/dist/static/chunks/turbopack-1c09a99f4c9e28d3.js +3 -0
- package/.next/standalone/packages/ui/leanspec.db +0 -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/.next/static/T_KGFP0pHt_xSaaYUJa3L/_buildManifest.js +11 -0
- package/.next/static/T_KGFP0pHt_xSaaYUJa3L/_clientMiddlewareManifest.json +1 -0
- package/.next/static/T_KGFP0pHt_xSaaYUJa3L/_ssgManifest.js +1 -0
- package/package.json +2 -2
- /package/.next/standalone/packages/ui/.next/static/{WJi9opx4ShY8zt8yBFo4r → T_KGFP0pHt_xSaaYUJa3L}/_buildManifest.js +0 -0
- /package/.next/standalone/packages/ui/.next/static/{WJi9opx4ShY8zt8yBFo4r → T_KGFP0pHt_xSaaYUJa3L}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/packages/ui/.next/static/{WJi9opx4ShY8zt8yBFo4r → T_KGFP0pHt_xSaaYUJa3L}/_ssgManifest.js +0 -0
- /package/.next/{static/WJi9opx4ShY8zt8yBFo4r → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_buildManifest.js +0 -0
- /package/.next/{static/WJi9opx4ShY8zt8yBFo4r → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_clientMiddlewareManifest.json +0 -0
- /package/.next/{static/WJi9opx4ShY8zt8yBFo4r → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
### Mode 2: Database-Backed (External GitHub Repos)
|
|
2
|
+
|
|
3
|
+
**Use Case:** Multi-project showcase (spec 035), external public repos
|
|
4
|
+
|
|
5
|
+
**Data Flow:**
|
|
6
|
+
```
|
|
7
|
+
GitHub API → Sync Service → PostgreSQL → Web App
|
|
8
|
+
↓ ↓ ↓
|
|
9
|
+
Rate limits Orchestration Cache layer
|
|
10
|
+
(5000/hr) (scheduled) (fast queries)
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**Architecture:**
|
|
14
|
+
```typescript
|
|
15
|
+
// packages/web/src/lib/specs/sources/database-source.ts
|
|
16
|
+
export class DatabaseSource implements SpecSource {
|
|
17
|
+
async getAllSpecs(projectId?: string): Promise<Spec[]> {
|
|
18
|
+
const query = projectId
|
|
19
|
+
? db.select().from(specs).where(eq(specs.projectId, projectId))
|
|
20
|
+
: db.select().from(specs);
|
|
21
|
+
|
|
22
|
+
return await query.orderBy(specs.specNumber);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async getSpec(specPath: string, projectId: string): Promise<Spec | null> {
|
|
26
|
+
// Parse spec number from path (e.g., "035" or "035-my-spec")
|
|
27
|
+
const specNum = parseInt(specPath.split('-')[0], 10);
|
|
28
|
+
|
|
29
|
+
const results = await db.select()
|
|
30
|
+
.from(specs)
|
|
31
|
+
.where(and(
|
|
32
|
+
eq(specs.projectId, projectId),
|
|
33
|
+
eq(specs.specNumber, specNum)
|
|
34
|
+
))
|
|
35
|
+
.limit(1);
|
|
36
|
+
|
|
37
|
+
return results[0] || null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// packages/web/src/lib/github/sync-service.ts
|
|
42
|
+
export class GitHubSyncService {
|
|
43
|
+
private octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
|
|
44
|
+
|
|
45
|
+
async syncProject(owner: string, repo: string, projectId: string) {
|
|
46
|
+
// 1. Fetch specs from GitHub
|
|
47
|
+
const repoSpecs = await this.discoverSpecs(owner, repo);
|
|
48
|
+
|
|
49
|
+
// 2. Compare with database
|
|
50
|
+
const dbSpecs = await db.select()
|
|
51
|
+
.from(specs)
|
|
52
|
+
.where(eq(specs.projectId, projectId));
|
|
53
|
+
|
|
54
|
+
// 3. Compute diff (added, updated, deleted)
|
|
55
|
+
const diff = this.computeDiff(repoSpecs, dbSpecs);
|
|
56
|
+
|
|
57
|
+
// 4. Apply changes
|
|
58
|
+
await this.applyDiff(projectId, diff);
|
|
59
|
+
|
|
60
|
+
// 5. Log sync result
|
|
61
|
+
await db.insert(syncLogs).values({
|
|
62
|
+
projectId,
|
|
63
|
+
status: 'success',
|
|
64
|
+
specsAdded: diff.added.length,
|
|
65
|
+
specsUpdated: diff.updated.length,
|
|
66
|
+
specsDeleted: diff.deleted.length,
|
|
67
|
+
completedAt: new Date(),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private async discoverSpecs(owner: string, repo: string) {
|
|
72
|
+
// Fetch specs directory listing
|
|
73
|
+
const { data } = await this.octokit.repos.getContent({
|
|
74
|
+
owner,
|
|
75
|
+
repo,
|
|
76
|
+
path: 'specs',
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// Filter directories (ignore archived)
|
|
80
|
+
const specDirs = Array.isArray(data)
|
|
81
|
+
? data.filter(item => item.type === 'dir' && item.name !== 'archived')
|
|
82
|
+
: [];
|
|
83
|
+
|
|
84
|
+
// Fetch each spec's README.md
|
|
85
|
+
const specs = await Promise.all(
|
|
86
|
+
specDirs.map(dir => this.fetchSpec(owner, repo, dir.name))
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
return specs.filter(Boolean);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Pros:**
|
|
95
|
+
- ✅ **Handles rate limits**: Database caches GitHub data
|
|
96
|
+
- ✅ **Fast queries**: Database optimized for filtering/sorting/search
|
|
97
|
+
- ✅ **Multi-project support**: Can showcase many repos
|
|
98
|
+
- ✅ **Scheduled sync**: Background jobs handle updates
|
|
99
|
+
- ✅ **Relationships**: Can query cross-spec dependencies
|
|
100
|
+
- ✅ **Audit trail**: Sync logs track changes
|
|
101
|
+
|
|
102
|
+
**Cons:**
|
|
103
|
+
- ⚠️ **Not realtime**: Sync delay (5-60 min typical)
|
|
104
|
+
- ⚠️ **Database dependency**: PostgreSQL required (Vercel Postgres)
|
|
105
|
+
- ⚠️ **Sync orchestration**: Need cron jobs or webhooks
|
|
106
|
+
- ⚠️ **Complexity**: More moving parts
|
|
107
|
+
|
|
108
|
+
**Mitigation:**
|
|
109
|
+
- Webhooks for near-realtime (optional, Phase 2+)
|
|
110
|
+
- Database is cache layer, not source of truth
|
|
111
|
+
- Fallback to GitHub API if sync fails
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
### Production Deployment Configuration
|
|
2
|
+
|
|
3
|
+
#### v0.3.0 (Filesystem Mode)
|
|
4
|
+
|
|
5
|
+
**Vercel Configuration:**
|
|
6
|
+
```json
|
|
7
|
+
// vercel.json (web app deployment)
|
|
8
|
+
{
|
|
9
|
+
"buildCommand": "pnpm -F @leanspec/web build",
|
|
10
|
+
"outputDirectory": "packages/web/.next",
|
|
11
|
+
"framework": "nextjs",
|
|
12
|
+
"installCommand": "pnpm install"
|
|
13
|
+
}
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**Environment Variables (Vercel Dashboard):**
|
|
17
|
+
```bash
|
|
18
|
+
SPECS_MODE=filesystem
|
|
19
|
+
SPECS_DIR=../../specs
|
|
20
|
+
CACHE_TTL=60000
|
|
21
|
+
REVALIDATION_SECRET=<random-secret>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Key Points:**
|
|
25
|
+
- Specs directory (`specs/`) must be in git repo
|
|
26
|
+
- No database required for v0.3.0
|
|
27
|
+
- Specs read at runtime from filesystem
|
|
28
|
+
- In-memory cache keeps performance <100ms
|
|
29
|
+
- Vercel serverless functions have filesystem access
|
|
30
|
+
|
|
31
|
+
#### v0.3.1+ (Dual Mode)
|
|
32
|
+
|
|
33
|
+
**Vercel Configuration:**
|
|
34
|
+
```json
|
|
35
|
+
// vercel.json (unchanged)
|
|
36
|
+
{
|
|
37
|
+
"buildCommand": "pnpm -F @leanspec/web build",
|
|
38
|
+
"outputDirectory": "packages/web/.next",
|
|
39
|
+
"framework": "nextjs",
|
|
40
|
+
"installCommand": "pnpm install",
|
|
41
|
+
"crons": [{
|
|
42
|
+
"path": "/api/cron/sync",
|
|
43
|
+
"schedule": "0 * * * *"
|
|
44
|
+
}]
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Environment Variables (Vercel Dashboard):**
|
|
49
|
+
```bash
|
|
50
|
+
SPECS_MODE=both
|
|
51
|
+
SPECS_DIR=../../specs
|
|
52
|
+
CACHE_TTL=60000
|
|
53
|
+
DATABASE_URL=postgres://...
|
|
54
|
+
GITHUB_TOKEN=ghp_...
|
|
55
|
+
CRON_SECRET=<random-secret>
|
|
56
|
+
REVALIDATION_SECRET=<random-secret>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Database Setup (Vercel Postgres):**
|
|
60
|
+
1. Create Vercel Postgres database
|
|
61
|
+
2. Run migrations: `pnpm -F @leanspec/web db:migrate`
|
|
62
|
+
3. Seed LeanSpec project: `pnpm -F @leanspec/web db:seed`
|
|
63
|
+
4. Cron job handles external repos
|
|
64
|
+
|
|
65
|
+
**Key Points:**
|
|
66
|
+
- Both filesystem and database sources active
|
|
67
|
+
- LeanSpec's specs use filesystem (fast, realtime)
|
|
68
|
+
- External repos use database (cached, scheduled sync)
|
|
69
|
+
- Cron job syncs external repos every hour
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
### Mode 1: Filesystem-Based (Local Specs)
|
|
2
|
+
|
|
3
|
+
**Use Case:** LeanSpec's own specs in monorepo
|
|
4
|
+
|
|
5
|
+
**Data Flow:**
|
|
6
|
+
```
|
|
7
|
+
specs/ directory → @leanspec/core → In-Memory Cache → Web App
|
|
8
|
+
↓
|
|
9
|
+
Single source of truth
|
|
10
|
+
Git is the version control
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**Architecture:**
|
|
14
|
+
```typescript
|
|
15
|
+
// packages/web/src/lib/specs/sources/filesystem-source.ts
|
|
16
|
+
export class FilesystemSource implements SpecSource {
|
|
17
|
+
private cache = new Map<string, CachedSpec>();
|
|
18
|
+
private reader = new SpecReader({ specsDir: '../../specs' });
|
|
19
|
+
|
|
20
|
+
async getAllSpecs(): Promise<Spec[]> {
|
|
21
|
+
const cacheKey = '__all_specs__';
|
|
22
|
+
const cached = this.cache.get(cacheKey);
|
|
23
|
+
|
|
24
|
+
if (cached && Date.now() < cached.expiresAt) {
|
|
25
|
+
return cached.data;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const specs = await this.reader.getAllSpecs();
|
|
29
|
+
this.cache.set(cacheKey, {
|
|
30
|
+
data: specs,
|
|
31
|
+
expiresAt: Date.now() + CACHE_TTL,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
return specs;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async getSpec(specPath: string): Promise<Spec | null> {
|
|
38
|
+
const cached = this.cache.get(specPath);
|
|
39
|
+
if (cached && Date.now() < cached.expiresAt) {
|
|
40
|
+
return cached.data;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const spec = await this.reader.readSpec(specPath);
|
|
44
|
+
this.cache.set(specPath, {
|
|
45
|
+
data: spec,
|
|
46
|
+
expiresAt: Date.now() + CACHE_TTL,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return spec;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
invalidateCache(specPath?: string) {
|
|
53
|
+
if (specPath) {
|
|
54
|
+
this.cache.delete(specPath);
|
|
55
|
+
} else {
|
|
56
|
+
this.cache.clear();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Pros:**
|
|
63
|
+
- ✅ **Realtime sync**: Changes appear within cache TTL (60s)
|
|
64
|
+
- ✅ **No database dependency**: Simpler deployment
|
|
65
|
+
- ✅ **Fast**: In-memory cache keeps performance <100ms
|
|
66
|
+
- ✅ **Source of truth**: Filesystem is authoritative
|
|
67
|
+
- ✅ **Works everywhere**: Dev, staging, production (Vercel)
|
|
68
|
+
|
|
69
|
+
**Cons:**
|
|
70
|
+
- ⚠️ Cache invalidation: TTL-based (not event-driven)
|
|
71
|
+
- ⚠️ Cold starts: Cache empty after deployment
|
|
72
|
+
- ⚠️ No cross-instance cache: Each Vercel function has own cache
|
|
73
|
+
|
|
74
|
+
**Mitigation:**
|
|
75
|
+
- Use Next.js `revalidate` for additional CDN caching
|
|
76
|
+
- File watcher in dev mode for instant invalidation (optional)
|
|
77
|
+
- Acceptable trade-off for simplicity
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
### v0.3 Implementation Plan
|
|
2
|
+
|
|
3
|
+
#### Phase 1: Filesystem Mode (v0.3.0 - Days 1-4)
|
|
4
|
+
|
|
5
|
+
**Goal**: Ship filesystem-based architecture for LeanSpec's own specs
|
|
6
|
+
|
|
7
|
+
**Changes Required:**
|
|
8
|
+
|
|
9
|
+
1. **Create Unified Service Layer**
|
|
10
|
+
```typescript
|
|
11
|
+
// packages/web/src/lib/specs/service.ts
|
|
12
|
+
export interface SpecSource { ... }
|
|
13
|
+
export class SpecsService { ... }
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
2. **Implement Filesystem Source**
|
|
17
|
+
```typescript
|
|
18
|
+
// packages/web/src/lib/specs/sources/filesystem-source.ts
|
|
19
|
+
export class FilesystemSource implements SpecSource {
|
|
20
|
+
private cache: Map<string, CachedSpec>;
|
|
21
|
+
private reader: SpecReader;
|
|
22
|
+
// ... implementation
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
3. **Update All Data Fetching**
|
|
27
|
+
- Replace `db.select()` calls with `specsService.getAllSpecs()`
|
|
28
|
+
- Update API routes to use service layer
|
|
29
|
+
- Update page components to use service layer
|
|
30
|
+
|
|
31
|
+
4. **Add Cache Invalidation API** (optional, nice-to-have)
|
|
32
|
+
```typescript
|
|
33
|
+
// packages/web/src/app/api/revalidate/route.ts
|
|
34
|
+
export async function POST(request: Request) {
|
|
35
|
+
const { secret, specPath } = await request.json();
|
|
36
|
+
if (secret !== process.env.REVALIDATION_SECRET) {
|
|
37
|
+
return Response.json({ error: 'Unauthorized' }, { status: 401 });
|
|
38
|
+
}
|
|
39
|
+
specsService.invalidateCache(specPath);
|
|
40
|
+
revalidatePath('/specs');
|
|
41
|
+
return Response.json({ revalidated: true });
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
5. **Environment Configuration**
|
|
46
|
+
```bash
|
|
47
|
+
# .env.local (development)
|
|
48
|
+
SPECS_MODE=filesystem
|
|
49
|
+
SPECS_DIR=../../specs
|
|
50
|
+
CACHE_TTL=60000
|
|
51
|
+
|
|
52
|
+
# Vercel (production)
|
|
53
|
+
SPECS_MODE=filesystem
|
|
54
|
+
SPECS_DIR=../../specs
|
|
55
|
+
CACHE_TTL=60000
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
6. **Keep Database Schema (for Phase 2)**
|
|
59
|
+
- Don't delete database code yet
|
|
60
|
+
- Add feature flag to switch between modes
|
|
61
|
+
- Document migration path for Phase 2
|
|
62
|
+
|
|
63
|
+
**Testing:**
|
|
64
|
+
- [ ] All specs load from filesystem
|
|
65
|
+
- [ ] Cache works (verify hit rate)
|
|
66
|
+
- [ ] Performance <100ms
|
|
67
|
+
- [ ] Deployment to Vercel succeeds
|
|
68
|
+
- [ ] Specs update within 60s of file change
|
|
69
|
+
|
|
70
|
+
#### Phase 2: Database Mode (v0.3.1 - Days 5-8)
|
|
71
|
+
|
|
72
|
+
**Goal**: Add multi-project support with GitHub integration
|
|
73
|
+
|
|
74
|
+
**Changes Required:**
|
|
75
|
+
|
|
76
|
+
1. **Implement Database Source**
|
|
77
|
+
```typescript
|
|
78
|
+
// packages/web/src/lib/specs/sources/database-source.ts
|
|
79
|
+
export class DatabaseSource implements SpecSource {
|
|
80
|
+
async getAllSpecs(projectId?: string): Promise<Spec[]> { ... }
|
|
81
|
+
async getSpec(specPath: string, projectId: string): Promise<Spec | null> { ... }
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
2. **Implement GitHub Sync Service**
|
|
86
|
+
```typescript
|
|
87
|
+
// packages/web/src/lib/github/sync-service.ts
|
|
88
|
+
export class GitHubSyncService {
|
|
89
|
+
async syncProject(owner: string, repo: string, projectId: string) { ... }
|
|
90
|
+
private async discoverSpecs(owner: string, repo: string) { ... }
|
|
91
|
+
private computeDiff(repoSpecs: Spec[], dbSpecs: Spec[]) { ... }
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
3. **Add Project Management UI**
|
|
96
|
+
- Add project page (admin only)
|
|
97
|
+
- Add project form (owner, repo, sync frequency)
|
|
98
|
+
- Add sync status dashboard
|
|
99
|
+
|
|
100
|
+
4. **Add Scheduled Sync (Vercel Cron)**
|
|
101
|
+
```typescript
|
|
102
|
+
// packages/web/src/app/api/cron/sync/route.ts
|
|
103
|
+
export async function GET(request: Request) {
|
|
104
|
+
// Verify cron secret
|
|
105
|
+
if (request.headers.get('Authorization') !== `Bearer ${process.env.CRON_SECRET}`) {
|
|
106
|
+
return Response.json({ error: 'Unauthorized' }, { status: 401 });
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Sync all projects
|
|
110
|
+
const projects = await db.select().from(schema.projects);
|
|
111
|
+
for (const project of projects) {
|
|
112
|
+
await syncService.syncProject(project.githubOwner, project.githubRepo, project.id);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return Response.json({ synced: projects.length });
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
5. **Update Configuration**
|
|
120
|
+
```bash
|
|
121
|
+
# Vercel (production)
|
|
122
|
+
SPECS_MODE=both # Enable both modes
|
|
123
|
+
DATABASE_URL=postgres://...
|
|
124
|
+
GITHUB_TOKEN=ghp_...
|
|
125
|
+
CRON_SECRET=...
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
6. **Update Service Layer Routing**
|
|
129
|
+
- If `projectId` provided → use database source
|
|
130
|
+
- Otherwise → use filesystem source
|
|
131
|
+
- Graceful fallback if one fails
|
|
132
|
+
|
|
133
|
+
**Testing:**
|
|
134
|
+
- [ ] Can add external GitHub repo
|
|
135
|
+
- [ ] Sync discovers all specs
|
|
136
|
+
- [ ] Database stores specs correctly
|
|
137
|
+
- [ ] UI shows both local and external specs
|
|
138
|
+
- [ ] Cron job runs successfully
|
|
139
|
+
|
|
140
|
+
#### Phase 3: Webhooks & Optimization (v0.4 - Future)
|
|
141
|
+
|
|
142
|
+
**Goal**: Near-realtime sync with webhooks
|
|
143
|
+
|
|
144
|
+
**Changes Required:**
|
|
145
|
+
|
|
146
|
+
1. **GitHub Webhook Endpoint**
|
|
147
|
+
```typescript
|
|
148
|
+
// packages/web/src/app/api/webhooks/github/route.ts
|
|
149
|
+
export async function POST(request: Request) {
|
|
150
|
+
const payload = await request.json();
|
|
151
|
+
const event = request.headers.get('X-GitHub-Event');
|
|
152
|
+
|
|
153
|
+
if (event === 'push') {
|
|
154
|
+
const { repository, commits } = payload;
|
|
155
|
+
const changedFiles = commits.flatMap(c => c.modified);
|
|
156
|
+
|
|
157
|
+
if (changedFiles.some(f => f.startsWith('specs/'))) {
|
|
158
|
+
// Trigger sync for this project
|
|
159
|
+
await syncService.syncProject(
|
|
160
|
+
repository.owner.login,
|
|
161
|
+
repository.name,
|
|
162
|
+
projectId
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return Response.json({ ok: true });
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
2. **Webhook Management UI**
|
|
172
|
+
- Auto-configure webhook on project add
|
|
173
|
+
- Show webhook status and delivery logs
|
|
174
|
+
- Retry failed deliveries
|
|
175
|
+
|
|
176
|
+
3. **Incremental Sync**
|
|
177
|
+
- Only sync changed specs (not full resync)
|
|
178
|
+
- Use webhook payload to identify changed files
|
|
179
|
+
- Much faster than full sync
|
|
180
|
+
|
|
181
|
+
**Testing:**
|
|
182
|
+
- [ ] Webhook receives push events
|
|
183
|
+
- [ ] Only changed specs are synced
|
|
184
|
+
- [ ] Latency <10 seconds from push to UI update
|