@leanspec/ui 0.2.7-dev.20251128020042 → 0.2.8
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/app-path-routes-manifest.json +2 -0
- 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/routes-manifest.json +12 -0
- 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/page_client-reference-manifest.js +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 +18 -18
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_full.segment.rsc +18 -18
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_tree.segment.rsc +6 -6
- package/.next/standalone/packages/ui/.next/server/app/api/context/route/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/api/context/route/build-manifest.json +11 -0
- package/.next/standalone/packages/ui/.next/server/app/api/context/route/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/api/context/route.js +8 -0
- package/.next/standalone/packages/ui/.next/server/app/api/context/route.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/api/context/route.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/api/context/route_client-reference-manifest.js +2 -0
- 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/context/page/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/context/page/build-manifest.json +18 -0
- package/.next/standalone/packages/ui/.next/server/app/context/page/next-font-manifest.json +6 -0
- package/.next/standalone/packages/ui/.next/server/app/context/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/context/page/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/context/page.js +19 -0
- package/.next/standalone/packages/ui/.next/server/app/context/page.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/context/page.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/context/page_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/page_client-reference-manifest.js +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]/page_client-reference-manifest.js +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/[specId]/page_client-reference-manifest.js +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/[projectId]/specs/page_client-reference-manifest.js +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/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.html +2 -2
- package/.next/standalone/packages/ui/.next/server/app/projects.rsc +12 -12
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_full.segment.rsc +12 -12
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_index.segment.rsc +9 -9
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_tree.segment.rsc +3 -3
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +2 -2
- 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/[id]/page_client-reference-manifest.js +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/specs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/stats/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/stats/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app-paths-manifest.json +2 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__3559376c._.js +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__65667b70._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__803d07f0._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__84cdc14a._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__8a9ab1a3._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__bdc3963a._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__f5c6d6b8._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/packages_ui__next-internal_server_app_api_context_route_actions_dead6daa.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__12b4eb41._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__69a0d63a._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__6e739186._.js +7 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__a4c56419._.js +7 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__b6632d78._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__daee3355._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__ead1539c._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_000dd317._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_0f9ffe32._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_28fe1532._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_315f3b3a._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_959ad3d8._.js +4 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_9dcf102b._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{_497c8b73._.js → _b397e94a._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_8272a49c._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui__next-internal_server_app_context_page_actions_1a062d48.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_context_context-client_tsx_4ba99a62._.js +12 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_specs_specs-client_tsx_0bb8f8f8._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_components_specs-nav-sidebar_tsx_8237ed13._.js +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/.next/static/chunks/1eb8283995f370c6.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/336e8e8fc6b0fba8.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/37a1236ed50645a6.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/9d84ba08a41145ec.js +5 -0
- package/.next/standalone/packages/ui/.next/static/chunks/c4b1faff3361a749.js +1 -0
- package/.next/{static/chunks/294dea6dbec43ca6.js → standalone/packages/ui/.next/static/chunks/d7420d2a867e57b5.js} +1 -1
- package/.next/{static/chunks/cca4441cde342ae3.js → standalone/packages/ui/.next/static/chunks/dae403679aae65f4.js} +1 -1
- package/.next/standalone/packages/ui/.next/static/chunks/efded9da04c960d8.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/f382932f1a5d6359.js +10 -0
- package/.next/standalone/packages/ui/.next/static/chunks/f43b6e43b4da1a32.css +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/f6dd06e6d22d2d12.js +3 -0
- 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/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/package.json +2 -1
- package/.next/standalone/packages/ui/server.js +1 -1
- package/.next/standalone/packages/ui/src/app/api/context/route.ts +22 -0
- package/.next/standalone/packages/ui/src/app/context/context-client.tsx +371 -0
- package/.next/standalone/packages/ui/src/app/context/page.tsx +17 -0
- package/.next/standalone/packages/ui/src/app/globals.css +16 -16
- package/.next/standalone/packages/ui/src/app/layout.tsx +1 -7
- package/.next/standalone/packages/ui/src/components/context-file-viewer.tsx +291 -0
- package/.next/standalone/packages/ui/src/components/main-sidebar.tsx +10 -1
- package/.next/standalone/packages/ui/src/components/spec-detail-client.tsx +181 -134
- package/.next/standalone/packages/ui/src/components/spec-detail-wrapper.tsx +20 -0
- package/.next/standalone/packages/ui/src/components/specs-nav-sidebar.tsx +3 -2
- package/.next/standalone/packages/ui/src/components/ui/accordion.tsx +58 -0
- package/.next/standalone/packages/ui/src/lib/db/service-queries.ts +172 -3
- package/.next/standalone/packages/ui/src/lib/specs/types.ts +44 -0
- package/.next/standalone/packages/ui/tsconfig.tsbuildinfo +1 -1
- package/.next/static/-Mn9iD4O5f_khGd1P3kmB/_buildManifest.js +11 -0
- package/.next/static/-Mn9iD4O5f_khGd1P3kmB/_clientMiddlewareManifest.json +1 -0
- package/.next/static/-Mn9iD4O5f_khGd1P3kmB/_ssgManifest.js +1 -0
- package/.next/static/chunks/1eb8283995f370c6.js +1 -0
- package/.next/static/chunks/336e8e8fc6b0fba8.js +1 -0
- package/.next/static/chunks/37a1236ed50645a6.js +1 -0
- package/.next/static/chunks/9d84ba08a41145ec.js +5 -0
- package/.next/static/chunks/c4b1faff3361a749.js +1 -0
- package/.next/{standalone/packages/ui/.next/static/chunks/294dea6dbec43ca6.js → static/chunks/d7420d2a867e57b5.js} +1 -1
- package/.next/{standalone/packages/ui/.next/static/chunks/cca4441cde342ae3.js → static/chunks/dae403679aae65f4.js} +1 -1
- package/.next/static/chunks/efded9da04c960d8.js +1 -0
- package/.next/static/chunks/f382932f1a5d6359.js +10 -0
- package/.next/static/chunks/f43b6e43b4da1a32.css +1 -0
- package/.next/static/chunks/f6dd06e6d22d2d12.js +3 -0
- package/package.json +3 -2
- package/.next/standalone/node_modules/.pnpm/source-map@0.8.0-beta.0/node_modules/source-map/package.json +0 -95
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__1d0c2012._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__73f60f12._.js +0 -7
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__a7ae8552._.js +0 -7
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_14118969._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_4129cc0f._.js +0 -3
- package/.next/standalone/packages/ui/.next/static/chunks/16ff9833ae1bb3ae.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/7590e65bcaa41e8b.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/a803d646487dfc2d.js +0 -3
- package/.next/standalone/packages/ui/.next/static/chunks/b6976cf6c48996e5.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/b845813463167db0.js +0 -5
- package/.next/standalone/packages/ui/.next/static/chunks/bd9893e28f8f6a9a.css +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/d784d84d5b880e48.js +0 -1
- package/.next/static/chunks/16ff9833ae1bb3ae.js +0 -1
- package/.next/static/chunks/7590e65bcaa41e8b.js +0 -1
- package/.next/static/chunks/a803d646487dfc2d.js +0 -3
- package/.next/static/chunks/b6976cf6c48996e5.js +0 -1
- package/.next/static/chunks/b845813463167db0.js +0 -5
- package/.next/static/chunks/bd9893e28f8f6a9a.css +0 -1
- package/.next/static/chunks/d784d84d5b880e48.js +0 -1
- /package/.next/standalone/packages/ui/.next/static/{RV93_WHoymRJ5886d_ry8 → -Mn9iD4O5f_khGd1P3kmB}/_buildManifest.js +0 -0
- /package/.next/standalone/packages/ui/.next/static/{RV93_WHoymRJ5886d_ry8 → -Mn9iD4O5f_khGd1P3kmB}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/packages/ui/.next/static/{RV93_WHoymRJ5886d_ry8 → -Mn9iD4O5f_khGd1P3kmB}/_ssgManifest.js +0 -0
- /package/.next/{static/RV93_WHoymRJ5886d_ry8 → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_buildManifest.js +0 -0
- /package/.next/{static/RV93_WHoymRJ5886d_ry8 → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_clientMiddlewareManifest.json +0 -0
- /package/.next/{static/RV93_WHoymRJ5886d_ry8 → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,834 @@
|
|
|
1
|
+
# Design Document: Folder Structure Improvements
|
|
2
|
+
|
|
3
|
+
> Detailed implementation notes for spec 002
|
|
4
|
+
|
|
5
|
+
## Implementation Details
|
|
6
|
+
|
|
7
|
+
### Auto-Check Integration
|
|
8
|
+
|
|
9
|
+
Auto-check runs automatically in these commands:
|
|
10
|
+
|
|
11
|
+
**Commands that interact with specs (11 total):**
|
|
12
|
+
1. `lean-spec create` - After creating spec
|
|
13
|
+
2. `lean-spec list` - Before showing list
|
|
14
|
+
3. `lean-spec board` - Before showing board
|
|
15
|
+
4. `lean-spec update` - Before updating spec
|
|
16
|
+
5. `lean-spec search` - Before searching
|
|
17
|
+
6. `lean-spec stats` - Before showing stats
|
|
18
|
+
7. `lean-spec timeline` - Before showing timeline
|
|
19
|
+
8. `lean-spec gantt` - Before showing gantt
|
|
20
|
+
9. `lean-spec deps` - Before showing dependencies
|
|
21
|
+
10. `lean-spec files` - Before listing files
|
|
22
|
+
11. `lean-spec archive` - Before archiving
|
|
23
|
+
|
|
24
|
+
**Commands that skip auto-check:**
|
|
25
|
+
- `lean-spec init` - No specs exist yet
|
|
26
|
+
- `lean-spec templates` - Template management only
|
|
27
|
+
- `lean-spec check` - Already checking conflicts
|
|
28
|
+
|
|
29
|
+
**Integration pattern:**
|
|
30
|
+
```typescript
|
|
31
|
+
// Standard pattern for all commands
|
|
32
|
+
import { autoCheckIfEnabled } from './check.js';
|
|
33
|
+
|
|
34
|
+
export async function someCommand(options: any): Promise<void> {
|
|
35
|
+
// Auto-check at start (or end for create)
|
|
36
|
+
await autoCheckIfEnabled();
|
|
37
|
+
|
|
38
|
+
// ... rest of command logic
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Specific implementations:**
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// src/commands/create.ts
|
|
46
|
+
export async function createSpec(...) {
|
|
47
|
+
// ... create spec logic ...
|
|
48
|
+
|
|
49
|
+
console.log(chalk.green(`✓ Created: ${specDir}/`));
|
|
50
|
+
|
|
51
|
+
// Auto-check AFTER creation
|
|
52
|
+
await autoCheckIfEnabled();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// src/commands/list.ts
|
|
56
|
+
export async function listSpecs(...) {
|
|
57
|
+
await autoCheckIfEnabled(); // Check at start
|
|
58
|
+
// ... list logic ...
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// src/commands/board.ts
|
|
62
|
+
export async function boardCommand(...) {
|
|
63
|
+
await autoCheckIfEnabled(); // Check at start
|
|
64
|
+
// ... board logic ...
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// src/commands/update.ts
|
|
68
|
+
export async function updateSpec(...) {
|
|
69
|
+
await autoCheckIfEnabled(); // Check at start
|
|
70
|
+
// ... update logic ...
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// src/commands/search.ts
|
|
74
|
+
export async function searchCommand(...) {
|
|
75
|
+
await autoCheckIfEnabled(); // Check at start
|
|
76
|
+
// ... search logic ...
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// src/commands/stats.ts
|
|
80
|
+
export async function statsCommand(...) {
|
|
81
|
+
await autoCheckIfEnabled(); // Check at start
|
|
82
|
+
// ... stats logic ...
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// src/commands/timeline.ts
|
|
86
|
+
export async function timelineCommand(...) {
|
|
87
|
+
await autoCheckIfEnabled(); // Check at start
|
|
88
|
+
// ... timeline logic ...
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// src/commands/gantt.ts
|
|
92
|
+
export async function ganttCommand(...) {
|
|
93
|
+
await autoCheckIfEnabled(); // Check at start
|
|
94
|
+
// ... gantt logic ...
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// src/commands/deps.ts
|
|
98
|
+
export async function depsCommand(...) {
|
|
99
|
+
await autoCheckIfEnabled(); // Check at start
|
|
100
|
+
// ... deps logic ...
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// src/commands/files.ts
|
|
104
|
+
export async function filesCommand(...) {
|
|
105
|
+
await autoCheckIfEnabled(); // Check at start
|
|
106
|
+
// ... files logic ...
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// src/commands/archive.ts
|
|
110
|
+
export async function archiveSpec(...) {
|
|
111
|
+
await autoCheckIfEnabled(); // Check at start
|
|
112
|
+
// ... archive logic ...
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Config Schema Update
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
// src/config.ts
|
|
120
|
+
export interface LeanSpecConfig {
|
|
121
|
+
template: string;
|
|
122
|
+
templates?: Record<string, string>;
|
|
123
|
+
specsDir: string;
|
|
124
|
+
autoCheck?: boolean; // NEW: Enable/disable auto-check (default: true)
|
|
125
|
+
structure: {
|
|
126
|
+
pattern: 'flat' | 'custom' | string;
|
|
127
|
+
dateFormat: string;
|
|
128
|
+
sequenceDigits: number;
|
|
129
|
+
defaultFile: string;
|
|
130
|
+
prefix?: string;
|
|
131
|
+
groupExtractor?: string;
|
|
132
|
+
groupFallback?: string;
|
|
133
|
+
};
|
|
134
|
+
features?: {
|
|
135
|
+
aiAgents?: boolean;
|
|
136
|
+
examples?: boolean;
|
|
137
|
+
collaboration?: boolean;
|
|
138
|
+
compliance?: boolean;
|
|
139
|
+
approvals?: boolean;
|
|
140
|
+
apiDocs?: boolean;
|
|
141
|
+
};
|
|
142
|
+
frontmatter?: {
|
|
143
|
+
required?: string[];
|
|
144
|
+
optional?: string[];
|
|
145
|
+
custom?: Record<string, 'string' | 'number' | 'boolean' | 'array'>;
|
|
146
|
+
};
|
|
147
|
+
variables?: Record<string, string>;
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### 1. Default Config Change
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
// src/config.ts
|
|
155
|
+
const DEFAULT_CONFIG: LeanSpecConfig = {
|
|
156
|
+
template: 'spec-template.md',
|
|
157
|
+
templates: {
|
|
158
|
+
default: 'spec-template.md',
|
|
159
|
+
},
|
|
160
|
+
specsDir: 'specs',
|
|
161
|
+
structure: {
|
|
162
|
+
pattern: 'flat',
|
|
163
|
+
prefix: '{YYYYMMDD}-', // NEW: Add date prefix by default
|
|
164
|
+
dateFormat: 'YYYYMMDD',
|
|
165
|
+
sequenceDigits: 3,
|
|
166
|
+
defaultFile: 'README.md',
|
|
167
|
+
},
|
|
168
|
+
features: {
|
|
169
|
+
aiAgents: true,
|
|
170
|
+
examples: true,
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### 2. Create Command: Add --no-prefix Flag
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
// src/commands/create.ts
|
|
179
|
+
import { autoCheckIfEnabled } from './check.js'; // NEW
|
|
180
|
+
|
|
181
|
+
export async function createSpec(name: string, options: {
|
|
182
|
+
title?: string;
|
|
183
|
+
description?: string;
|
|
184
|
+
tags?: string[];
|
|
185
|
+
priority?: SpecPriority;
|
|
186
|
+
assignee?: string;
|
|
187
|
+
template?: string;
|
|
188
|
+
customFields?: Record<string, unknown>;
|
|
189
|
+
noPrefix?: boolean; // NEW
|
|
190
|
+
} = {}): Promise<void> {
|
|
191
|
+
const config = await loadConfig();
|
|
192
|
+
const cwd = process.cwd();
|
|
193
|
+
const specsDir = path.join(cwd, config.specsDir);
|
|
194
|
+
|
|
195
|
+
await fs.mkdir(specsDir, { recursive: true });
|
|
196
|
+
|
|
197
|
+
const seq = await getGlobalNextSeq(specsDir, config.structure.sequenceDigits);
|
|
198
|
+
|
|
199
|
+
let specRelativePath: string;
|
|
200
|
+
|
|
201
|
+
if (config.structure.pattern === 'flat') {
|
|
202
|
+
// NEW: Check noPrefix flag
|
|
203
|
+
const prefix = options.noPrefix
|
|
204
|
+
? ''
|
|
205
|
+
: config.structure.prefix
|
|
206
|
+
? resolvePrefix(config.structure.prefix, config.structure.dateFormat)
|
|
207
|
+
: '';
|
|
208
|
+
specRelativePath = `${prefix}${seq}-${name}`;
|
|
209
|
+
} else if (config.structure.pattern === 'custom') {
|
|
210
|
+
// ... existing custom pattern logic
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// ... create spec logic ...
|
|
214
|
+
|
|
215
|
+
console.log(chalk.green(`✓ Created: ${specDir}/`));
|
|
216
|
+
console.log(chalk.gray(` Edit: ${specFile}`));
|
|
217
|
+
|
|
218
|
+
// NEW: Auto-check after creation
|
|
219
|
+
await autoCheckIfEnabled();
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 3. Check Command Implementation
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
// src/commands/check.ts
|
|
227
|
+
import * as path from 'node:path';
|
|
228
|
+
import chalk from 'chalk';
|
|
229
|
+
import { loadConfig } from '../config.js';
|
|
230
|
+
import { loadAllSpecs } from '../spec-loader.js';
|
|
231
|
+
|
|
232
|
+
export async function checkSpecs(options: {
|
|
233
|
+
quiet?: boolean;
|
|
234
|
+
silent?: boolean; // NEW: Completely suppress output
|
|
235
|
+
} = {}): Promise<boolean> {
|
|
236
|
+
const config = await loadConfig();
|
|
237
|
+
const cwd = process.cwd();
|
|
238
|
+
const specsDir = path.join(cwd, config.specsDir);
|
|
239
|
+
|
|
240
|
+
// Find all specs with sequence numbers
|
|
241
|
+
const specs = await loadAllSpecs();
|
|
242
|
+
const sequenceMap = new Map<number, string[]>();
|
|
243
|
+
|
|
244
|
+
for (const spec of specs) {
|
|
245
|
+
// Extract sequence number from spec name
|
|
246
|
+
const specName = path.basename(spec.path);
|
|
247
|
+
const match = specName.match(/^(\d+)-/);
|
|
248
|
+
|
|
249
|
+
if (match) {
|
|
250
|
+
const seq = parseInt(match[1], 10);
|
|
251
|
+
if (!sequenceMap.has(seq)) {
|
|
252
|
+
sequenceMap.set(seq, []);
|
|
253
|
+
}
|
|
254
|
+
sequenceMap.get(seq)!.push(spec.path);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Find conflicts (sequences with multiple specs)
|
|
259
|
+
const conflicts = Array.from(sequenceMap.entries())
|
|
260
|
+
.filter(([_, paths]) => paths.length > 1)
|
|
261
|
+
.sort(([a], [b]) => a - b);
|
|
262
|
+
|
|
263
|
+
if (conflicts.length === 0) {
|
|
264
|
+
if (!options.quiet && !options.silent) {
|
|
265
|
+
console.log(chalk.green('✓ No sequence conflicts detected'));
|
|
266
|
+
}
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Report conflicts
|
|
271
|
+
if (!options.silent) {
|
|
272
|
+
if (!options.quiet) {
|
|
273
|
+
// Full output
|
|
274
|
+
console.log('');
|
|
275
|
+
console.log(chalk.yellow('⚠️ Sequence conflicts detected:\n'));
|
|
276
|
+
|
|
277
|
+
for (const [seq, paths] of conflicts) {
|
|
278
|
+
console.log(chalk.red(` Sequence ${String(seq).padStart(config.structure.sequenceDigits, '0')}:`));
|
|
279
|
+
for (const p of paths) {
|
|
280
|
+
console.log(chalk.gray(` - ${p}`));
|
|
281
|
+
}
|
|
282
|
+
console.log('');
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
console.log(chalk.cyan('Tip: Use date prefix to prevent conflicts:'));
|
|
286
|
+
console.log(chalk.gray(' Edit .lean-spec/config.json → structure.prefix: "{YYYYMMDD}-"'));
|
|
287
|
+
console.log('');
|
|
288
|
+
console.log(chalk.cyan('Or rename folders manually to resolve.'));
|
|
289
|
+
console.log('');
|
|
290
|
+
} else {
|
|
291
|
+
// Brief warning (for auto-check)
|
|
292
|
+
console.log('');
|
|
293
|
+
console.log(chalk.yellow(`⚠️ Conflict warning: ${conflicts.length} sequence conflict(s) detected`));
|
|
294
|
+
console.log(chalk.gray('Run: lean-spec check'));
|
|
295
|
+
console.log('');
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// NEW: Helper for auto-check in other commands
|
|
303
|
+
export async function autoCheckIfEnabled(): Promise<void> {
|
|
304
|
+
const config = await loadConfig();
|
|
305
|
+
|
|
306
|
+
// Check if auto-check is disabled
|
|
307
|
+
if (config.autoCheck === false) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Run check in quiet mode (brief warning only)
|
|
312
|
+
try {
|
|
313
|
+
await checkSpecs({ quiet: true });
|
|
314
|
+
} catch {
|
|
315
|
+
// Ignore errors in auto-check
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### 4. Pattern-Aware List Grouping
|
|
321
|
+
|
|
322
|
+
```typescript
|
|
323
|
+
// src/commands/list.ts
|
|
324
|
+
import { autoCheckIfEnabled } from './check.js'; // NEW
|
|
325
|
+
|
|
326
|
+
function groupSpecs(specs: Spec[], config: LeanSpecConfig): Map<string, Spec[]> {
|
|
327
|
+
if (config.structure.pattern === 'flat') {
|
|
328
|
+
// Group by month from frontmatter.created
|
|
329
|
+
const byMonth = new Map<string, Spec[]>();
|
|
330
|
+
|
|
331
|
+
for (const spec of specs) {
|
|
332
|
+
const created = spec.frontmatter.created;
|
|
333
|
+
const date = new Date(created);
|
|
334
|
+
const monthKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;
|
|
335
|
+
|
|
336
|
+
if (!byMonth.has(monthKey)) {
|
|
337
|
+
byMonth.set(monthKey, []);
|
|
338
|
+
}
|
|
339
|
+
byMonth.get(monthKey)!.push(spec);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
return byMonth;
|
|
343
|
+
} else {
|
|
344
|
+
// Group by folder structure (first path component)
|
|
345
|
+
const byFolder = new Map<string, Spec[]>();
|
|
346
|
+
|
|
347
|
+
for (const spec of specs) {
|
|
348
|
+
const folder = spec.path.split('/')[0];
|
|
349
|
+
|
|
350
|
+
if (!byFolder.has(folder)) {
|
|
351
|
+
byFolder.set(folder, []);
|
|
352
|
+
}
|
|
353
|
+
byFolder.get(folder)!.push(spec);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
return byFolder;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
export async function listSpecs(options: {
|
|
361
|
+
showArchived?: boolean;
|
|
362
|
+
status?: SpecStatus | SpecStatus[];
|
|
363
|
+
tags?: string[];
|
|
364
|
+
priority?: SpecPriority | SpecPriority[];
|
|
365
|
+
assignee?: string;
|
|
366
|
+
customFields?: Record<string, unknown>;
|
|
367
|
+
flat?: boolean; // NEW: Disable grouping
|
|
368
|
+
} = {}): Promise<void> {
|
|
369
|
+
// NEW: Auto-check before listing
|
|
370
|
+
await autoCheckIfEnabled();
|
|
371
|
+
|
|
372
|
+
const config = await loadConfig();
|
|
373
|
+
const cwd = process.cwd();
|
|
374
|
+
const specsDir = path.join(cwd, config.specsDir);
|
|
375
|
+
|
|
376
|
+
try {
|
|
377
|
+
await fs.access(specsDir);
|
|
378
|
+
} catch {
|
|
379
|
+
console.log('');
|
|
380
|
+
console.log('No specs directory found. Initialize with: lean-spec init');
|
|
381
|
+
console.log('');
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Build filter options and load specs...
|
|
386
|
+
// ... rest of list implementation ...
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### 5. CLI Command Registration
|
|
391
|
+
|
|
392
|
+
```typescript
|
|
393
|
+
// src/cli.ts
|
|
394
|
+
|
|
395
|
+
// Import new command
|
|
396
|
+
import { checkSpecs } from './commands/check.js';
|
|
397
|
+
|
|
398
|
+
// Add command
|
|
399
|
+
program
|
|
400
|
+
.command('check')
|
|
401
|
+
.description('Check for sequence conflicts')
|
|
402
|
+
.option('-q, --quiet', 'Suppress output')
|
|
403
|
+
.action(async (options) => {
|
|
404
|
+
const hasConflicts = await checkSpecs(options);
|
|
405
|
+
process.exit(hasConflicts ? 0 : 1);
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
// Update create command
|
|
409
|
+
program
|
|
410
|
+
.command('create <name>')
|
|
411
|
+
.description('Create a new spec')
|
|
412
|
+
.option('-t, --title <title>', 'Spec title')
|
|
413
|
+
.option('-d, --description <description>', 'Spec description')
|
|
414
|
+
.option('--tags <tags>', 'Comma-separated tags')
|
|
415
|
+
.option('-p, --priority <priority>', 'Priority (low, medium, high, critical)')
|
|
416
|
+
.option('--assignee <assignee>', 'Assignee name')
|
|
417
|
+
.option('--template <template>', 'Template to use')
|
|
418
|
+
.option('--field <key=value>', 'Custom field (repeatable)', collectFields, {})
|
|
419
|
+
.option('--no-prefix', 'Skip date prefix even if configured') // NEW
|
|
420
|
+
.action(async (name, options) => {
|
|
421
|
+
// ... parse options
|
|
422
|
+
await createSpec(name, {
|
|
423
|
+
// ... other options
|
|
424
|
+
noPrefix: !options.prefix, // NEW
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
// Update list command
|
|
429
|
+
program
|
|
430
|
+
.command('list')
|
|
431
|
+
.description('List all specs')
|
|
432
|
+
.option('-a, --archived', 'Include archived specs')
|
|
433
|
+
.option('-s, --status <status>', 'Filter by status')
|
|
434
|
+
.option('-t, --tags <tags>', 'Filter by tags (comma-separated)')
|
|
435
|
+
.option('-p, --priority <priority>', 'Filter by priority')
|
|
436
|
+
.option('--assignee <assignee>', 'Filter by assignee')
|
|
437
|
+
.option('--field <key=value>', 'Filter by custom field', collectFields, {})
|
|
438
|
+
.option('--flat', 'Disable grouping') // NEW
|
|
439
|
+
.action(async (options) => {
|
|
440
|
+
// ... parse options
|
|
441
|
+
await listSpecs({
|
|
442
|
+
// ... other options
|
|
443
|
+
flat: options.flat, // NEW
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### 6. Template Config Updates
|
|
449
|
+
|
|
450
|
+
```json
|
|
451
|
+
// templates/minimal/config.json
|
|
452
|
+
{
|
|
453
|
+
"name": "Minimal",
|
|
454
|
+
"description": "Just the essentials - folder structure only",
|
|
455
|
+
"config": {
|
|
456
|
+
"template": "minimal",
|
|
457
|
+
"specsDir": "specs",
|
|
458
|
+
"structure": {
|
|
459
|
+
"pattern": "flat",
|
|
460
|
+
"prefix": "{YYYYMMDD}-",
|
|
461
|
+
"dateFormat": "YYYYMMDD",
|
|
462
|
+
"sequenceDigits": 3,
|
|
463
|
+
"defaultFile": "README.md"
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
```json
|
|
470
|
+
// templates/standard/config.json
|
|
471
|
+
{
|
|
472
|
+
"name": "Standard",
|
|
473
|
+
"description": "Recommended for most projects - solo devs and small teams",
|
|
474
|
+
"config": {
|
|
475
|
+
"template": "standard",
|
|
476
|
+
"specsDir": "specs",
|
|
477
|
+
"structure": {
|
|
478
|
+
"pattern": "flat",
|
|
479
|
+
"prefix": "{YYYYMMDD}-",
|
|
480
|
+
"dateFormat": "YYYYMMDD",
|
|
481
|
+
"sequenceDigits": 3,
|
|
482
|
+
"defaultFile": "README.md"
|
|
483
|
+
},
|
|
484
|
+
"features": {
|
|
485
|
+
"aiAgents": true
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
```json
|
|
492
|
+
// templates/enterprise/config.json
|
|
493
|
+
{
|
|
494
|
+
"name": "Enterprise",
|
|
495
|
+
"description": "Governance-ready with approvals, compliance, and security",
|
|
496
|
+
"config": {
|
|
497
|
+
"template": "enterprise",
|
|
498
|
+
"specsDir": "specs",
|
|
499
|
+
"structure": {
|
|
500
|
+
"pattern": "custom",
|
|
501
|
+
"groupExtractor": "{YYYYMMDD}",
|
|
502
|
+
"dateFormat": "YYYYMMDD",
|
|
503
|
+
"sequenceDigits": 3,
|
|
504
|
+
"defaultFile": "README.md"
|
|
505
|
+
},
|
|
506
|
+
"features": {
|
|
507
|
+
"aiAgents": true,
|
|
508
|
+
"compliance": true,
|
|
509
|
+
"approvals": true
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
### 7. Init Wizard Pattern Selection
|
|
516
|
+
|
|
517
|
+
```typescript
|
|
518
|
+
// src/commands/init.ts
|
|
519
|
+
|
|
520
|
+
// Add pattern selection
|
|
521
|
+
async function promptStructurePattern(): Promise<Partial<LeanSpecConfig['structure']>> {
|
|
522
|
+
const choice = await select({
|
|
523
|
+
message: 'How do you want to organize specs?',
|
|
524
|
+
options: [
|
|
525
|
+
{
|
|
526
|
+
name: 'Flat with dates (Recommended)',
|
|
527
|
+
value: 'flat-dated',
|
|
528
|
+
description: '20251103-001-feature/ - Prevents conflicts in teams',
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
name: 'Flat, clean numbers',
|
|
532
|
+
value: 'flat-clean',
|
|
533
|
+
description: '001-feature/ - Simple for solo developers',
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
name: 'Date folders',
|
|
537
|
+
value: 'custom-date',
|
|
538
|
+
description: '20251103/001-feature/ - Traditional nested structure',
|
|
539
|
+
},
|
|
540
|
+
],
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
switch (choice) {
|
|
544
|
+
case 'flat-dated':
|
|
545
|
+
return {
|
|
546
|
+
pattern: 'flat',
|
|
547
|
+
prefix: '{YYYYMMDD}-',
|
|
548
|
+
sequenceDigits: 3,
|
|
549
|
+
dateFormat: 'YYYYMMDD',
|
|
550
|
+
defaultFile: 'README.md',
|
|
551
|
+
};
|
|
552
|
+
case 'flat-clean':
|
|
553
|
+
return {
|
|
554
|
+
pattern: 'flat',
|
|
555
|
+
sequenceDigits: 3,
|
|
556
|
+
dateFormat: 'YYYYMMDD',
|
|
557
|
+
defaultFile: 'README.md',
|
|
558
|
+
};
|
|
559
|
+
case 'custom-date':
|
|
560
|
+
return {
|
|
561
|
+
pattern: 'custom',
|
|
562
|
+
groupExtractor: '{YYYYMMDD}',
|
|
563
|
+
sequenceDigits: 3,
|
|
564
|
+
dateFormat: 'YYYYMMDD',
|
|
565
|
+
defaultFile: 'README.md',
|
|
566
|
+
};
|
|
567
|
+
default:
|
|
568
|
+
return {
|
|
569
|
+
pattern: 'flat',
|
|
570
|
+
prefix: '{YYYYMMDD}-',
|
|
571
|
+
sequenceDigits: 3,
|
|
572
|
+
dateFormat: 'YYYYMMDD',
|
|
573
|
+
defaultFile: 'README.md',
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
// Update init function
|
|
579
|
+
export async function initProject(options: { template?: string } = {}): Promise<void> {
|
|
580
|
+
// ... existing template selection
|
|
581
|
+
|
|
582
|
+
// NEW: Add structure pattern selection
|
|
583
|
+
const structureConfig = await promptStructurePattern();
|
|
584
|
+
|
|
585
|
+
// Merge structure config into final config
|
|
586
|
+
config.structure = {
|
|
587
|
+
...config.structure,
|
|
588
|
+
...structureConfig,
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
// ... rest of init
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
## Testing Strategy
|
|
596
|
+
|
|
597
|
+
### Unit Tests
|
|
598
|
+
|
|
599
|
+
```typescript
|
|
600
|
+
// src/commands/check.test.ts
|
|
601
|
+
describe('checkSpecs', () => {
|
|
602
|
+
it('should detect duplicate sequences', async () => {
|
|
603
|
+
// Create two specs with same sequence
|
|
604
|
+
await createTestSpec('001-feature-a');
|
|
605
|
+
await createTestSpec('001-feature-b');
|
|
606
|
+
|
|
607
|
+
const hasConflicts = await checkSpecs({ quiet: true });
|
|
608
|
+
expect(hasConflicts).toBe(false); // Returns false when conflicts exist
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
it('should pass when no conflicts', async () => {
|
|
612
|
+
await createTestSpec('001-feature-a');
|
|
613
|
+
await createTestSpec('002-feature-b');
|
|
614
|
+
|
|
615
|
+
const hasConflicts = await checkSpecs({ quiet: true });
|
|
616
|
+
expect(hasConflicts).toBe(true); // Returns true when no conflicts
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
it('should respect silent mode', async () => {
|
|
620
|
+
await createTestSpec('001-feature-a');
|
|
621
|
+
await createTestSpec('001-feature-b');
|
|
622
|
+
|
|
623
|
+
// Should not output anything
|
|
624
|
+
const output = captureConsoleOutput(() => {
|
|
625
|
+
checkSpecs({ silent: true });
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
expect(output).toBe('');
|
|
629
|
+
});
|
|
630
|
+
});
|
|
631
|
+
|
|
632
|
+
describe('autoCheckIfEnabled', () => {
|
|
633
|
+
it('should run check when autoCheck is true', async () => {
|
|
634
|
+
await setConfig({ autoCheck: true });
|
|
635
|
+
await createTestSpec('001-feature-a');
|
|
636
|
+
await createTestSpec('001-feature-b');
|
|
637
|
+
|
|
638
|
+
const output = captureConsoleOutput(() => {
|
|
639
|
+
autoCheckIfEnabled();
|
|
640
|
+
});
|
|
641
|
+
|
|
642
|
+
expect(output).toContain('conflict');
|
|
643
|
+
});
|
|
644
|
+
|
|
645
|
+
it('should skip check when autoCheck is false', async () => {
|
|
646
|
+
await setConfig({ autoCheck: false });
|
|
647
|
+
await createTestSpec('001-feature-a');
|
|
648
|
+
await createTestSpec('001-feature-b');
|
|
649
|
+
|
|
650
|
+
const output = captureConsoleOutput(() => {
|
|
651
|
+
autoCheckIfEnabled();
|
|
652
|
+
});
|
|
653
|
+
|
|
654
|
+
expect(output).toBe('');
|
|
655
|
+
});
|
|
656
|
+
});
|
|
657
|
+
|
|
658
|
+
// Test auto-check integration in each command
|
|
659
|
+
describe('auto-check integration', () => {
|
|
660
|
+
beforeEach(async () => {
|
|
661
|
+
await setConfig({ autoCheck: true });
|
|
662
|
+
// Create conflicting specs
|
|
663
|
+
await createTestSpec('001-feature-a');
|
|
664
|
+
await createTestSpec('001-feature-b');
|
|
665
|
+
});
|
|
666
|
+
|
|
667
|
+
it('should auto-check in create command', async () => {
|
|
668
|
+
const output = captureConsoleOutput(() => {
|
|
669
|
+
createSpec('feature-c');
|
|
670
|
+
});
|
|
671
|
+
expect(output).toContain('conflict');
|
|
672
|
+
});
|
|
673
|
+
|
|
674
|
+
it('should auto-check in list command', async () => {
|
|
675
|
+
const output = captureConsoleOutput(() => {
|
|
676
|
+
listSpecs();
|
|
677
|
+
});
|
|
678
|
+
expect(output).toContain('conflict');
|
|
679
|
+
});
|
|
680
|
+
|
|
681
|
+
it('should auto-check in board command', async () => {
|
|
682
|
+
const output = captureConsoleOutput(() => {
|
|
683
|
+
boardCommand({});
|
|
684
|
+
});
|
|
685
|
+
expect(output).toContain('conflict');
|
|
686
|
+
});
|
|
687
|
+
|
|
688
|
+
it('should auto-check in update command', async () => {
|
|
689
|
+
const output = captureConsoleOutput(() => {
|
|
690
|
+
updateSpec('001-feature-a', { status: 'complete' });
|
|
691
|
+
});
|
|
692
|
+
expect(output).toContain('conflict');
|
|
693
|
+
});
|
|
694
|
+
|
|
695
|
+
it('should auto-check in search command', async () => {
|
|
696
|
+
const output = captureConsoleOutput(() => {
|
|
697
|
+
searchCommand('feature');
|
|
698
|
+
});
|
|
699
|
+
expect(output).toContain('conflict');
|
|
700
|
+
});
|
|
701
|
+
|
|
702
|
+
it('should auto-check in stats command', async () => {
|
|
703
|
+
const output = captureConsoleOutput(() => {
|
|
704
|
+
statsCommand({});
|
|
705
|
+
});
|
|
706
|
+
expect(output).toContain('conflict');
|
|
707
|
+
});
|
|
708
|
+
|
|
709
|
+
it('should auto-check in timeline command', async () => {
|
|
710
|
+
const output = captureConsoleOutput(() => {
|
|
711
|
+
timelineCommand({});
|
|
712
|
+
});
|
|
713
|
+
expect(output).toContain('conflict');
|
|
714
|
+
});
|
|
715
|
+
|
|
716
|
+
it('should auto-check in gantt command', async () => {
|
|
717
|
+
const output = captureConsoleOutput(() => {
|
|
718
|
+
ganttCommand({});
|
|
719
|
+
});
|
|
720
|
+
expect(output).toContain('conflict');
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
it('should auto-check in deps command', async () => {
|
|
724
|
+
const output = captureConsoleOutput(() => {
|
|
725
|
+
depsCommand('001-feature-a');
|
|
726
|
+
});
|
|
727
|
+
expect(output).toContain('conflict');
|
|
728
|
+
});
|
|
729
|
+
|
|
730
|
+
it('should auto-check in files command', async () => {
|
|
731
|
+
const output = captureConsoleOutput(() => {
|
|
732
|
+
filesCommand('001-feature-a');
|
|
733
|
+
});
|
|
734
|
+
expect(output).toContain('conflict');
|
|
735
|
+
});
|
|
736
|
+
|
|
737
|
+
it('should auto-check in archive command', async () => {
|
|
738
|
+
const output = captureConsoleOutput(() => {
|
|
739
|
+
archiveSpec('001-feature-a');
|
|
740
|
+
});
|
|
741
|
+
expect(output).toContain('conflict');
|
|
742
|
+
});
|
|
743
|
+
|
|
744
|
+
it('should NOT auto-check in init command', async () => {
|
|
745
|
+
const output = captureConsoleOutput(() => {
|
|
746
|
+
initProject();
|
|
747
|
+
});
|
|
748
|
+
expect(output).not.toContain('conflict');
|
|
749
|
+
});
|
|
750
|
+
|
|
751
|
+
it('should NOT auto-check in templates command', async () => {
|
|
752
|
+
const output = captureConsoleOutput(() => {
|
|
753
|
+
listTemplates();
|
|
754
|
+
});
|
|
755
|
+
expect(output).not.toContain('conflict');
|
|
756
|
+
});
|
|
757
|
+
|
|
758
|
+
it('should NOT auto-check in check command', async () => {
|
|
759
|
+
const output = captureConsoleOutput(() => {
|
|
760
|
+
checkSpecs();
|
|
761
|
+
});
|
|
762
|
+
// Should show full report, not auto-check warning
|
|
763
|
+
expect(output).toContain('Sequence conflicts detected');
|
|
764
|
+
});
|
|
765
|
+
});
|
|
766
|
+
|
|
767
|
+
// src/commands/create.test.ts
|
|
768
|
+
describe('createSpec with --no-prefix', () => {
|
|
769
|
+
it('should skip prefix when flag provided', async () => {
|
|
770
|
+
await createSpec('test-feature', { noPrefix: true });
|
|
771
|
+
|
|
772
|
+
const specDir = path.join(tmpDir, 'specs', '001-test-feature');
|
|
773
|
+
expect(await dirExists(specDir)).toBe(true);
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
it('should apply date prefix by default', async () => {
|
|
777
|
+
await createSpec('test-feature');
|
|
778
|
+
|
|
779
|
+
const today = getToday('YYYYMMDD');
|
|
780
|
+
const specDir = path.join(tmpDir, 'specs', `${today}-001-test-feature`);
|
|
781
|
+
expect(await dirExists(specDir)).toBe(true);
|
|
782
|
+
});
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
// src/commands/list.test.ts
|
|
786
|
+
describe('listSpecs with --flat', () => {
|
|
787
|
+
it('should display flat list without grouping', async () => {
|
|
788
|
+
// Test flat display
|
|
789
|
+
});
|
|
790
|
+
|
|
791
|
+
it('should group by month for flat pattern', async () => {
|
|
792
|
+
// Test month grouping
|
|
793
|
+
});
|
|
794
|
+
|
|
795
|
+
it('should group by folder for custom pattern', async () => {
|
|
796
|
+
// Test folder grouping
|
|
797
|
+
});
|
|
798
|
+
});
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
### Integration Tests
|
|
802
|
+
|
|
803
|
+
```typescript
|
|
804
|
+
// Multi-user conflict scenario
|
|
805
|
+
describe('Multi-user workflow', () => {
|
|
806
|
+
it('should prevent conflicts with date prefix', async () => {
|
|
807
|
+
// User A creates spec on Nov 3
|
|
808
|
+
const specA = await createSpec('feature-a');
|
|
809
|
+
expect(specA).toContain('20251103-001');
|
|
810
|
+
|
|
811
|
+
// User B creates spec on Nov 3 (different sequence)
|
|
812
|
+
const specB = await createSpec('feature-b');
|
|
813
|
+
expect(specB).toContain('20251103-002');
|
|
814
|
+
|
|
815
|
+
// No conflicts
|
|
816
|
+
const hasConflicts = await checkSpecs({ quiet: true });
|
|
817
|
+
expect(hasConflicts).toBe(true);
|
|
818
|
+
});
|
|
819
|
+
});
|
|
820
|
+
```
|
|
821
|
+
|
|
822
|
+
## Performance Impact
|
|
823
|
+
|
|
824
|
+
- **Date prefix**: No performance impact (string concatenation)
|
|
825
|
+
- **Check command**: O(n) where n = number of specs, fast even with 1000+ specs
|
|
826
|
+
- **List grouping**: Minimal overhead, same O(n) complexity
|
|
827
|
+
- **Template changes**: No runtime impact
|
|
828
|
+
|
|
829
|
+
## Migration Path
|
|
830
|
+
|
|
831
|
+
1. Existing projects without prefix: Continue working, no changes required
|
|
832
|
+
2. Existing projects with date folders: Already using custom pattern, no changes
|
|
833
|
+
3. New projects: Get date prefix by default
|
|
834
|
+
4. Users can opt out: Use `--no-prefix` flag or edit config
|