@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.
Files changed (278) hide show
  1. package/.next/standalone/node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/build/Release/better_sqlite3.node +0 -0
  2. package/.next/standalone/packages/ui/.next/BUILD_ID +1 -1
  3. package/.next/standalone/packages/ui/.next/build-manifest.json +2 -2
  4. package/.next/standalone/packages/ui/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/packages/ui/.next/required-server-files.json +4 -4
  6. package/.next/standalone/packages/ui/.next/server/app/_global-error/page.js.nft.json +1 -1
  7. package/.next/standalone/packages/ui/.next/server/app/_global-error.html +2 -2
  8. package/.next/standalone/packages/ui/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/standalone/packages/ui/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/.next/standalone/packages/ui/.next/server/app/_not-found.html +2 -2
  15. package/.next/standalone/packages/ui/.next/server/app/_not-found.rsc +1 -1
  16. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  17. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  18. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/[id]/route.js.nft.json +1 -1
  22. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/discover/route.js.nft.json +1 -1
  23. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/list-directory/route.js.nft.json +1 -1
  24. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/route.js.nft.json +1 -1
  25. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
  26. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/route.js.nft.json +1 -1
  27. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/status/route.js.nft.json +1 -1
  28. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/route.js.nft.json +1 -1
  29. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/stats/route.js.nft.json +1 -1
  30. package/.next/standalone/packages/ui/.next/server/app/api/projects/route.js.nft.json +1 -1
  31. package/.next/standalone/packages/ui/.next/server/app/api/revalidate/route.js.nft.json +1 -1
  32. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/dependency-graph/route.js.nft.json +1 -1
  33. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/route.js.nft.json +1 -1
  34. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route.js.nft.json +1 -1
  35. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/subspecs/[file]/route.js.nft.json +1 -1
  36. package/.next/standalone/packages/ui/.next/server/app/api/stats/route.js.nft.json +1 -1
  37. package/.next/standalone/packages/ui/.next/server/app/page.js.nft.json +1 -1
  38. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page.js.nft.json +1 -1
  39. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/[specId]/page.js.nft.json +1 -1
  40. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/page.js.nft.json +1 -1
  41. package/.next/standalone/packages/ui/.next/server/app/projects/page.js.nft.json +1 -1
  42. package/.next/standalone/packages/ui/.next/server/app/projects.html +2 -2
  43. package/.next/standalone/packages/ui/.next/server/app/projects.rsc +1 -1
  44. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_full.segment.rsc +1 -1
  45. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_index.segment.rsc +1 -1
  46. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
  47. package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +1 -1
  48. package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects.segment.rsc +1 -1
  49. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page.js.nft.json +1 -1
  50. package/.next/standalone/packages/ui/.next/server/app/specs/page.js.nft.json +1 -1
  51. package/.next/standalone/packages/ui/.next/server/app/stats/page.js.nft.json +1 -1
  52. package/.next/standalone/packages/ui/.next/server/pages/404.html +2 -2
  53. package/.next/standalone/packages/ui/.next/server/pages/500.html +2 -2
  54. package/.next/standalone/packages/ui/.next/server/server-reference-manifest.js +1 -1
  55. package/.next/standalone/packages/ui/.next/server/server-reference-manifest.json +1 -1
  56. package/.next/standalone/packages/ui/dist/BUILD_ID +1 -0
  57. package/.next/standalone/packages/ui/dist/public/f864aa7e7061c0600e35cf3d879b27cf.txt +1 -0
  58. package/.next/standalone/packages/ui/dist/public/favicon.ico +0 -0
  59. package/.next/standalone/packages/ui/dist/public/file.svg +1 -0
  60. package/.next/standalone/packages/ui/dist/public/github-mark-white.svg +1 -0
  61. package/.next/standalone/packages/ui/dist/public/github-mark.svg +1 -0
  62. package/.next/standalone/packages/ui/dist/public/globe.svg +1 -0
  63. package/.next/standalone/packages/ui/dist/public/icon.svg +7 -0
  64. package/.next/standalone/packages/ui/dist/public/logo-dark-bg.svg +17 -0
  65. package/.next/standalone/packages/ui/dist/public/logo-with-bg.svg +17 -0
  66. package/.next/standalone/packages/ui/dist/public/logo.svg +17 -0
  67. package/.next/standalone/packages/ui/dist/public/next.svg +1 -0
  68. package/.next/standalone/packages/ui/dist/public/vercel.svg +1 -0
  69. package/.next/standalone/packages/ui/dist/public/window.svg +1 -0
  70. package/.next/standalone/packages/ui/dist/standalone/packages/web/README.md +196 -0
  71. package/.next/standalone/packages/ui/dist/standalone/packages/web/leanspec.db +0 -0
  72. package/.next/standalone/packages/ui/dist/standalone/packages/web/package.json +75 -0
  73. package/.next/standalone/packages/ui/dist/standalone/packages/web/server.js +44 -0
  74. package/.next/standalone/packages/ui/dist/standalone/specs/014-complete-custom-frontmatter/README.md +175 -0
  75. package/.next/standalone/packages/ui/dist/standalone/specs/016-github-action/README.md +317 -0
  76. package/.next/standalone/packages/ui/dist/standalone/specs/017-vscode-extension/README.md +261 -0
  77. package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/CLI-DESIGN.md +380 -0
  78. package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/CONFIGURATION-EXAMPLES.md +230 -0
  79. package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/CONFIGURATION.md +285 -0
  80. package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/IMPLEMENTATION.md +358 -0
  81. package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/README.md +303 -0
  82. package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/TESTING.md +368 -0
  83. package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/VALIDATION-RULES.md +327 -0
  84. package/.next/standalone/packages/ui/dist/standalone/specs/024-pattern-aware-list-grouping/README.md +117 -0
  85. package/.next/standalone/packages/ui/dist/standalone/specs/025-template-config-updates/README.md +73 -0
  86. package/.next/standalone/packages/ui/dist/standalone/specs/026-init-pattern-selection/README.md +109 -0
  87. package/.next/standalone/packages/ui/dist/standalone/specs/034-copilot-slash-commands/README.md +107 -0
  88. package/.next/standalone/packages/ui/dist/standalone/specs/035-live-specs-showcase/ARCHITECTURE.md +244 -0
  89. package/.next/standalone/packages/ui/dist/standalone/specs/035-live-specs-showcase/IMPLEMENTATION.md +429 -0
  90. package/.next/standalone/packages/ui/dist/standalone/specs/035-live-specs-showcase/README.md +302 -0
  91. package/.next/standalone/packages/ui/dist/standalone/specs/036-pm-integrations/README.md +158 -0
  92. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-AI-ASSISTED.md +359 -0
  93. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-FULL-LIFECYCLE.md +86 -0
  94. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-REAL-FEATURE.md +437 -0
  95. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-SCRIPT.md +365 -0
  96. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DOGFOODING-FINAL.md +203 -0
  97. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DOGFOODING-SESSION-2025-11-06.md +174 -0
  98. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DOGFOODING-SUMMARY.md +156 -0
  99. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/IMPLEMENTATION.md +183 -0
  100. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/MARKETING.md +229 -0
  101. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/NEXT-STEPS-DEMO.md +243 -0
  102. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/README.md +217 -0
  103. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/SESSION-2025-11-06.md +166 -0
  104. package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/TESTING.md +126 -0
  105. package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/ACTUAL-IMPLEMENTATION.md +108 -0
  106. package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/DESIGN.md +382 -0
  107. package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/IMPLEMENTATION.md +144 -0
  108. package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/RATIONALE.md +146 -0
  109. package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/README.md +208 -0
  110. package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/TESTING.md +182 -0
  111. package/.next/standalone/packages/ui/dist/standalone/specs/047-git-backfill-timestamps/README.md +314 -0
  112. package/.next/standalone/packages/ui/dist/standalone/specs/048-spec-complexity-analysis/FINDINGS.md +113 -0
  113. package/.next/standalone/packages/ui/dist/standalone/specs/048-spec-complexity-analysis/GUIDELINES.md +237 -0
  114. package/.next/standalone/packages/ui/dist/standalone/specs/048-spec-complexity-analysis/README.md +149 -0
  115. package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/ANALYSIS-COMPARISONS.md +175 -0
  116. package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/ANALYSIS-CONSTRAINTS.md +254 -0
  117. package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/FIRST-PRINCIPLES.md +376 -0
  118. package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/OPERATIONALIZATION-ROADMAP.md +240 -0
  119. package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/OPERATIONALIZATION-TOOLS.md +175 -0
  120. package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/README.md +374 -0
  121. package/.next/standalone/packages/ui/dist/standalone/specs/051-docs-system-prompt-principles/README.md +339 -0
  122. package/.next/standalone/packages/ui/dist/standalone/specs/052-branding-assets/README.md +128 -0
  123. package/.next/standalone/packages/ui/dist/standalone/specs/053-spec-assets-philosophy/README.md +97 -0
  124. package/.next/standalone/packages/ui/dist/standalone/specs/054-validate-output-lint-style/DESIGN-DECISIONS.md +93 -0
  125. package/.next/standalone/packages/ui/dist/standalone/specs/054-validate-output-lint-style/OUTPUT-FORMAT-SPEC.md +146 -0
  126. package/.next/standalone/packages/ui/dist/standalone/specs/054-validate-output-lint-style/README.md +175 -0
  127. package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/ANALYSIS-PART1.md +397 -0
  128. package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/ANALYSIS-PART2.md +342 -0
  129. package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/ANALYSIS.md +44 -0
  130. package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/CHANGES.md +150 -0
  131. package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/CONCERNS-ANALYSIS.md +351 -0
  132. package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/DOCS-ALIGNMENT-ANALYSIS.md +238 -0
  133. package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/README.md +280 -0
  134. package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/REDESIGN-DRAFT.md +372 -0
  135. package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/REDESIGN-REFINED.md +466 -0
  136. package/.next/standalone/packages/ui/dist/standalone/specs/056-docs-site-accuracy-audit/AUDIT-RESULTS.md +178 -0
  137. package/.next/standalone/packages/ui/dist/standalone/specs/056-docs-site-accuracy-audit/README.md +174 -0
  138. package/.next/standalone/packages/ui/dist/standalone/specs/057-docs-validation-comprehensive/README.md +295 -0
  139. package/.next/standalone/packages/ui/dist/standalone/specs/057-docs-validation-comprehensive/VALIDATION-RESULTS.md +487 -0
  140. package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/ANALYSIS.md +241 -0
  141. package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/DESIGN.md +279 -0
  142. package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/IMPLEMENTATION.md +642 -0
  143. package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/NOTES.md +125 -0
  144. package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/README.md +286 -0
  145. package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/ARCHITECTURE.md +392 -0
  146. package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/COMMANDS.md +1002 -0
  147. package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/CONTEXT-ENGINEERING.md +411 -0
  148. package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/IMPLEMENTATION.md +812 -0
  149. package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/README.md +504 -0
  150. package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/TESTING.md +724 -0
  151. package/.next/standalone/packages/ui/dist/standalone/specs/060-core-concepts-coherence/README.md +125 -0
  152. package/.next/standalone/packages/ui/dist/standalone/specs/061-ai-assisted-spec-writing/README.md +299 -0
  153. package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/IMPLEMENTATION-PLAN.md +174 -0
  154. package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/PAGE-SPECIFICATIONS.md +265 -0
  155. package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/PROBLEM-ANALYSIS.md +36 -0
  156. package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/README.md +243 -0
  157. package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/SOLUTION-DESIGN.md +82 -0
  158. package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/DESIGN.md +338 -0
  159. package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/EXAMPLES.md +354 -0
  160. package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/IMPLEMENTATION.md +189 -0
  161. package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/README.md +119 -0
  162. package/.next/standalone/packages/ui/dist/standalone/specs/064-docs-site-zh-translation/README.md +170 -0
  163. package/.next/standalone/packages/ui/dist/standalone/specs/065-v03-planning/README.md +158 -0
  164. package/.next/standalone/packages/ui/dist/standalone/specs/066-context-economy-thresholds-refinement/README.md +842 -0
  165. package/.next/standalone/packages/ui/dist/standalone/specs/067-monorepo-core-extraction/README.md +358 -0
  166. package/.next/standalone/packages/ui/dist/standalone/specs/068-live-specs-ux-enhancements/DESIGN.md +444 -0
  167. package/.next/standalone/packages/ui/dist/standalone/specs/068-live-specs-ux-enhancements/README.md +357 -0
  168. package/.next/standalone/packages/ui/dist/standalone/specs/069-token-counting-utils/README.md +551 -0
  169. package/.next/standalone/packages/ui/dist/standalone/specs/070-mcp-token-counting-tool/README.md +372 -0
  170. package/.next/standalone/packages/ui/dist/standalone/specs/071-simplified-token-validation/README.md +489 -0
  171. package/.next/standalone/packages/ui/dist/standalone/specs/072-ai-agent-first-use-workflow/README.md +285 -0
  172. package/.next/standalone/packages/ui/dist/standalone/specs/073-template-engine-agents-md/README.md +323 -0
  173. package/.next/standalone/packages/ui/dist/standalone/specs/074-content-at-creation/README.md +136 -0
  174. package/.next/standalone/packages/ui/dist/standalone/specs/075-intelligent-search-engine/README.md +399 -0
  175. package/.next/standalone/packages/ui/dist/standalone/specs/076-programmatic-spec-relationships/README.md +301 -0
  176. package/.next/standalone/packages/ui/dist/standalone/specs/077-archiving-strategy/README.md +235 -0
  177. package/.next/standalone/packages/ui/dist/standalone/specs/078-sub-spec-template-system/README.md +303 -0
  178. package/.next/standalone/packages/ui/dist/standalone/specs/079-cli-alphabetical-organization/README.md +196 -0
  179. package/.next/standalone/packages/ui/dist/standalone/specs/080-mcp-server-modular-architecture/README.md +388 -0
  180. package/.next/standalone/packages/ui/dist/standalone/specs/081-web-app-ux-redesign/README.md +824 -0
  181. package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/DATABASE.md +111 -0
  182. package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/DEPLOYMENT.md +69 -0
  183. package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/FILESYSTEM.md +77 -0
  184. package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/IMPLEMENTATION.md +184 -0
  185. package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/README.md +496 -0
  186. package/.next/standalone/packages/ui/dist/standalone/specs/083-web-navigation-performance/README.md +490 -0
  187. package/.next/standalone/packages/ui/dist/standalone/specs/084-sub-spec-visibility-in-tools/README.md +389 -0
  188. package/.next/standalone/packages/ui/dist/standalone/specs/085-cli-relationship-commands/README.md +920 -0
  189. package/.next/standalone/packages/ui/dist/standalone/specs/086-template-component-deduplication/README.md +146 -0
  190. package/.next/standalone/packages/ui/dist/standalone/specs/087-cli-ui-command/README.md +607 -0
  191. package/.next/standalone/packages/ui/dist/standalone/specs/088-core-concepts-terminology-only/README.md +104 -0
  192. package/.next/standalone/packages/ui/dist/standalone/specs/089-sdd-practical-tutorials/README.md +124 -0
  193. package/.next/standalone/packages/ui/dist/standalone/specs/090-leanspec-sdd-case-studies/README.md +129 -0
  194. package/.next/standalone/packages/ui/dist/standalone/specs/091-chinese-localization-strategy/README.md +244 -0
  195. package/.next/standalone/packages/ui/dist/standalone/specs/092-docs-site-submodule-migration/README.md +148 -0
  196. package/.next/standalone/packages/ui/dist/standalone/specs/093-spec-detail-ui-improvements/README.md +54 -0
  197. package/.next/standalone/packages/ui/dist/standalone/specs/archived/001-typescript-cli-migration/README.md +37 -0
  198. package/.next/standalone/packages/ui/dist/standalone/specs/archived/002-template-system-redesign/README.md +60 -0
  199. package/.next/standalone/packages/ui/dist/standalone/specs/archived/003-init-system-redesign/README.md +113 -0
  200. package/.next/standalone/packages/ui/dist/standalone/specs/archived/004-existing-project-integration/README.md +69 -0
  201. package/.next/standalone/packages/ui/dist/standalone/specs/archived/004-existing-project-integration/SUMMARY.md +112 -0
  202. package/.next/standalone/packages/ui/dist/standalone/specs/archived/005-structured-frontmatter/README.md +229 -0
  203. package/.next/standalone/packages/ui/dist/standalone/specs/archived/006-pm-visualization-tools/README.md +406 -0
  204. package/.next/standalone/packages/ui/dist/standalone/specs/archived/007-system-prompt-updates/README.md +168 -0
  205. package/.next/standalone/packages/ui/dist/standalone/specs/archived/008-commander-migration/README.md +174 -0
  206. package/.next/standalone/packages/ui/dist/standalone/specs/archived/009-cli-ux-enhancement/README.md +212 -0
  207. package/.next/standalone/packages/ui/dist/standalone/specs/archived/010-commands-refactor/README.md +249 -0
  208. package/.next/standalone/packages/ui/dist/standalone/specs/archived/011-test-results/README.md +60 -0
  209. package/.next/standalone/packages/ui/dist/standalone/specs/archived/011-test-results/TEST_SUMMARY.md +139 -0
  210. package/.next/standalone/packages/ui/dist/standalone/specs/archived/012-sub-spec-files/README.md +722 -0
  211. package/.next/standalone/packages/ui/dist/standalone/specs/archived/013-custom-spec-templates/README.md +413 -0
  212. package/.next/standalone/packages/ui/dist/standalone/specs/archived/015-npm-publishing/README.md +255 -0
  213. package/.next/standalone/packages/ui/dist/standalone/specs/archived/019-readme-improvement/README.md +252 -0
  214. package/.next/standalone/packages/ui/dist/standalone/specs/archived/020-documentation-website/README.md +253 -0
  215. package/.next/standalone/packages/ui/dist/standalone/specs/archived/021-docusaurus-vercel-migration/README.md +612 -0
  216. package/.next/standalone/packages/ui/dist/standalone/specs/archived/022-flexible-folder-structure/README.md +794 -0
  217. package/.next/standalone/packages/ui/dist/standalone/specs/archived/023-folder-structure-improvements/DESIGN.md +834 -0
  218. package/.next/standalone/packages/ui/dist/standalone/specs/archived/023-folder-structure-improvements/README.md +255 -0
  219. package/.next/standalone/packages/ui/dist/standalone/specs/archived/027-cli-ui-ux-optimization/README.md +454 -0
  220. package/.next/standalone/packages/ui/dist/standalone/specs/archived/028-cli-ui-modernization/README.md +172 -0
  221. package/.next/standalone/packages/ui/dist/standalone/specs/archived/029-visualization-improvements/IMPLEMENTATION.md +152 -0
  222. package/.next/standalone/packages/ui/dist/standalone/specs/archived/029-visualization-improvements/README.md +95 -0
  223. package/.next/standalone/packages/ui/dist/standalone/specs/archived/030-created-date-format-bug/README.md +87 -0
  224. package/.next/standalone/packages/ui/dist/standalone/specs/archived/031-gantt-ux-improvements/README.md +230 -0
  225. package/.next/standalone/packages/ui/dist/standalone/specs/archived/032-console-log-chalk-security/README.md +89 -0
  226. package/.next/standalone/packages/ui/dist/standalone/specs/archived/033-mcp-server/README.md +89 -0
  227. package/.next/standalone/packages/ui/dist/standalone/specs/archived/037-docs-overhaul/README.md +166 -0
  228. package/.next/standalone/packages/ui/dist/standalone/specs/archived/038-flat-structure-migration/README.md +276 -0
  229. package/.next/standalone/packages/ui/dist/standalone/specs/archived/038-mcp-frontmatter-bug-fix/README.md +122 -0
  230. package/.next/standalone/packages/ui/dist/standalone/specs/archived/039-simplify-viewer-commands/README.md +198 -0
  231. package/.next/standalone/packages/ui/dist/standalone/specs/archived/039-template-variable-sync/README.md +192 -0
  232. package/.next/standalone/packages/ui/dist/standalone/specs/archived/040-spec-viewer-commands/README.md +171 -0
  233. package/.next/standalone/packages/ui/dist/standalone/specs/archived/042-mcp-error-handling/README.md +200 -0
  234. package/.next/standalone/packages/ui/dist/standalone/specs/archived/044-spec-relationships-clarity/README.md +317 -0
  235. package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/DESIGN.md +276 -0
  236. package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/IMPLEMENTATION.md +241 -0
  237. package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/README.md +139 -0
  238. package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/TESTING.md +328 -0
  239. package/.next/standalone/packages/ui/dist/standalone/specs/archived/050-tool-redesign-first-principles/README.md +400 -0
  240. package/.next/standalone/packages/ui/dist/static/chunks/0c19c69aa7625475.js +1 -0
  241. package/.next/standalone/packages/ui/dist/static/chunks/116800b03245a1e5.js +1 -0
  242. package/.next/standalone/packages/ui/dist/static/chunks/15843a3d7584e314.js +1 -0
  243. package/.next/standalone/packages/ui/dist/static/chunks/19e80edf527aef5c.js +1 -0
  244. package/.next/standalone/packages/ui/dist/static/chunks/465954d5af3284a9.js +1 -0
  245. package/.next/standalone/packages/ui/dist/static/chunks/5abeeb89f1412a80.js +3 -0
  246. package/.next/standalone/packages/ui/dist/static/chunks/5c2072ad938de8ed.js +1 -0
  247. package/.next/standalone/packages/ui/dist/static/chunks/6a05a93ec8fa7b83.js +1 -0
  248. package/.next/standalone/packages/ui/dist/static/chunks/778e42188e450b39.css +1 -0
  249. package/.next/standalone/packages/ui/dist/static/chunks/a02c1f50ff00204f.js +1 -0
  250. package/.next/standalone/packages/ui/dist/static/chunks/a45464b9776dd88e.js +1 -0
  251. package/.next/standalone/packages/ui/dist/static/chunks/a6dad97d9634a72d.js +1 -0
  252. package/.next/standalone/packages/ui/dist/static/chunks/b0ea0ac61604f843.js +1 -0
  253. package/.next/standalone/packages/ui/dist/static/chunks/c06e85b449720194.js +1 -0
  254. package/.next/standalone/packages/ui/dist/static/chunks/c557ac675be79771.js +1 -0
  255. package/.next/standalone/packages/ui/dist/static/chunks/cad005a57ffbb2d3.js +1 -0
  256. package/.next/standalone/packages/ui/dist/static/chunks/cdf6fe33bc65efbc.js +1 -0
  257. package/.next/standalone/packages/ui/dist/static/chunks/d12ed5dbe44caed7.js +1 -0
  258. package/.next/standalone/packages/ui/dist/static/chunks/d1ebe5c1a344f4ca.js +5 -0
  259. package/.next/standalone/packages/ui/dist/static/chunks/d42cf1682bc46652.js +1 -0
  260. package/.next/standalone/packages/ui/dist/static/chunks/dde5d8bddd7fbfcf.js +1 -0
  261. package/.next/standalone/packages/ui/dist/static/chunks/ebd89051637b9a47.js +4 -0
  262. package/.next/standalone/packages/ui/dist/static/chunks/ec82875d18b29f47.js +2 -0
  263. package/.next/standalone/packages/ui/dist/static/chunks/f0b701df9769bcc5.js +19 -0
  264. package/.next/standalone/packages/ui/dist/static/chunks/turbopack-1c09a99f4c9e28d3.js +3 -0
  265. package/.next/standalone/packages/ui/leanspec.db +0 -0
  266. package/.next/standalone/packages/ui/package.json +1 -1
  267. package/.next/standalone/packages/ui/server.js +1 -1
  268. package/.next/standalone/packages/ui/tsconfig.tsbuildinfo +1 -1
  269. package/.next/static/T_KGFP0pHt_xSaaYUJa3L/_buildManifest.js +11 -0
  270. package/.next/static/T_KGFP0pHt_xSaaYUJa3L/_clientMiddlewareManifest.json +1 -0
  271. package/.next/static/T_KGFP0pHt_xSaaYUJa3L/_ssgManifest.js +1 -0
  272. package/package.json +2 -2
  273. /package/.next/standalone/packages/ui/.next/static/{WJi9opx4ShY8zt8yBFo4r → T_KGFP0pHt_xSaaYUJa3L}/_buildManifest.js +0 -0
  274. /package/.next/standalone/packages/ui/.next/static/{WJi9opx4ShY8zt8yBFo4r → T_KGFP0pHt_xSaaYUJa3L}/_clientMiddlewareManifest.json +0 -0
  275. /package/.next/standalone/packages/ui/.next/static/{WJi9opx4ShY8zt8yBFo4r → T_KGFP0pHt_xSaaYUJa3L}/_ssgManifest.js +0 -0
  276. /package/.next/{static/WJi9opx4ShY8zt8yBFo4r → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_buildManifest.js +0 -0
  277. /package/.next/{static/WJi9opx4ShY8zt8yBFo4r → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_clientMiddlewareManifest.json +0 -0
  278. /package/.next/{static/WJi9opx4ShY8zt8yBFo4r → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_ssgManifest.js +0 -0
@@ -0,0 +1,920 @@
1
+ ---
2
+ status: complete
3
+ created: '2025-11-16'
4
+ tags:
5
+ - cli
6
+ - metadata
7
+ - relationships
8
+ - dx
9
+ priority: medium
10
+ created_at: '2025-11-16T13:33:40.858Z'
11
+ depends_on: []
12
+ updated_at: '2025-11-17T01:11:50.003Z'
13
+ related:
14
+ - 076-programmatic-spec-relationships
15
+ completed_at: '2025-11-16T14:08:51.283Z'
16
+ completed: '2025-11-16'
17
+ transitions:
18
+ - status: complete
19
+ at: '2025-11-16T14:08:51.283Z'
20
+ ---
21
+
22
+ # CLI Commands for Spec Relationship Management
23
+
24
+ > **Status**: ✅ Complete · **Priority**: Medium · **Created**: 2025-11-16 · **Tags**: cli, metadata, relationships, dx
25
+
26
+ **Project**: lean-spec
27
+ **Team**: Core Development
28
+
29
+ ## Overview
30
+
31
+ **The Problem**: Relationship fields (`depends_on`, `related`) currently require manual frontmatter editing, which:
32
+
33
+ 1. **Violates Core Rule #6**: "NEVER manually edit system-managed frontmatter"
34
+ 2. **Error-prone**: Easy to create invalid spec references (typos, non-existent specs)
35
+ 3. **No validation**: Can break `lean-spec deps` without knowing
36
+ 4. **Inconsistent with other metadata**: Status, priority, tags use CLI flags, but relationships don't
37
+ 5. **Poor DX**: Have to remember YAML syntax, indentation, array format
38
+ 6. **Blocks AI agents**: No programmatic interface for MCP tools (spec 076)
39
+ 7. **Missing from `create`**: Can't set relationships at creation time (unlike tags, priority, assignee)
40
+
41
+ **Current Workaround** (from AGENTS.md):
42
+ ```yaml
43
+ # Manual editing required - no CLI command exists yet
44
+ depends_on: [042, 035]
45
+ related: [081, 068]
46
+ ```
47
+
48
+ **What We Need**: CLI commands AND MCP tools to manage relationships safely:
49
+ ```bash
50
+ # At creation
51
+ lean-spec create new-feature --depends-on 042,035 --related 081
52
+
53
+ # After creation
54
+ lean-spec link 085 --depends-on 042,035
55
+ lean-spec link 085 --related 081,068
56
+ lean-spec unlink 085 --depends-on 042
57
+ lean-spec deps 085 # Verify relationships
58
+
59
+ # MCP usage (AI agents)
60
+ await mcp_lean_spec_create({ name: "new-feature", dependsOn: ["042", "035"] });
61
+ await mcp_lean_spec_link({ specPath: "085", dependsOn: ["042", "035"] });
62
+ await mcp_lean_spec_unlink({ specPath: "085", related: ["081"] });
63
+ ```
64
+
65
+ **Why It Matters**:
66
+ - Consistency with other metadata (tags, priority, assignee all settable at creation)
67
+ - Validation prevents broken relationships
68
+ - Enables automation (scripts, CI/CD, **AI agents**)
69
+ - Better error messages
70
+ - Completes the metadata management story (CLI + MCP)
71
+ - **Unblocks spec 076** (programmatic-spec-relationships)
72
+
73
+ ## Design
74
+
75
+ ### Command Design: `lean-spec link` and `lean-spec unlink`
76
+
77
+ **Rationale**: Use dedicated `link`/`unlink` commands instead of extending `lean-spec update` because:
78
+ 1. Relationships are **bidirectional** or **directional** (different from simple metadata)
79
+ 2. Need **add/remove** semantics (not just set/replace)
80
+ 3. Clear intent: "linking specs" vs "updating metadata"
81
+ 4. Future-proof for advanced relationship features (types, labels, etc.)
82
+
83
+ **Additionally**: Extend `lean-spec create` to support relationship flags for consistency with other metadata (tags, priority, assignee).
84
+
85
+ ### Command Interface
86
+
87
+ ```bash
88
+ # Create with relationships (new)
89
+ lean-spec create <name> --depends-on <spec1,spec2,...>
90
+ lean-spec create <name> --related <spec1,spec2,...>
91
+
92
+ # Add relationships
93
+ lean-spec link <spec> --depends-on <spec1,spec2,...>
94
+ lean-spec link <spec> --related <spec1,spec2,...>
95
+ lean-spec link <spec> --blocks <spec1,spec2,...> # Inverse of depends-on
96
+
97
+ # Remove relationships
98
+ lean-spec unlink <spec> --depends-on <spec1,spec2,...>
99
+ lean-spec unlink <spec> --related <spec1,spec2,...>
100
+ lean-spec unlink <spec> --blocks <spec1,spec2,...>
101
+
102
+ # Remove all relationships of a type
103
+ lean-spec unlink <spec> --depends-on --all
104
+ lean-spec unlink <spec> --related --all
105
+
106
+ # View relationships (existing command)
107
+ lean-spec deps <spec>
108
+ ```
109
+
110
+ ### Examples
111
+
112
+ **Creating with relationships:**
113
+ ```bash
114
+ # Create spec that depends on 042 and relates to 068
115
+ lean-spec create api-redesign --depends-on 042 --related 068,081
116
+
117
+ # Result in api-redesign/README.md frontmatter:
118
+ # depends_on: [042]
119
+ # related: [068, 081]
120
+ ```
121
+
122
+ **Adding dependencies:**
123
+ ```bash
124
+ # Spec 085 depends on specs 042 and 035
125
+ lean-spec link 085 --depends-on 042,035
126
+
127
+ # Result in 085-cli-relationship-commands/README.md:
128
+ # depends_on: [042, 035]
129
+ ```
130
+
131
+ **Adding related specs:**
132
+ ```bash
133
+ # Spec 082 is related to 035, 068, 081, 083
134
+ lean-spec link 082 --related 035,068,081,083
135
+
136
+ # Result: related: [035, 068, 081, 083]
137
+ ```
138
+
139
+ **Removing dependencies:**
140
+ ```bash
141
+ # Remove dependency on 042
142
+ lean-spec unlink 085 --depends-on 042
143
+
144
+ # Result: depends_on: [035] (042 removed)
145
+ ```
146
+
147
+ **Bidirectional relationships (related):**
148
+ ```bash
149
+ # Link 085 to 082 (automatically updates both specs)
150
+ lean-spec link 085 --related 082
151
+
152
+ # Result:
153
+ # - 085/README.md: related: [082]
154
+ # - 082/README.md: related: [035, 068, 081, 083, 085] (085 added)
155
+ ```
156
+
157
+ **Directional dependencies (depends_on → blocks):**
158
+ ```bash
159
+ # Spec 085 depends on 042
160
+ lean-spec link 085 --depends-on 042
161
+
162
+ # View from 085's perspective:
163
+ lean-spec deps 085
164
+ # Depends On:
165
+ # → 042-mcp-error-handling [complete]
166
+
167
+ # View from 042's perspective:
168
+ lean-spec deps 042
169
+ # Required By:
170
+ # ← 085-cli-relationship-commands [planned]
171
+ ```
172
+
173
+ ### Validation Rules
174
+
175
+ **Spec Existence:**
176
+ - ✅ Validate all referenced specs exist before linking
177
+ - ❌ Error if spec not found: "Spec 999 not found in specs/"
178
+
179
+ **Duplicate Prevention:**
180
+ - ✅ Skip if relationship already exists (idempotent)
181
+ - ✅ Show warning: "Relationship already exists"
182
+
183
+ **Cycle Detection:**
184
+ - ⚠️ Warn on dependency cycles (A → B → C → A)
185
+ - ✅ Allow cycles (don't block, just warn)
186
+
187
+ **Self-Reference:**
188
+ - ❌ Error if spec references itself
189
+ - ❌ "Cannot link spec to itself"
190
+
191
+ **Conflict Detection:**
192
+ - ⚠️ Warn if spec is both `depends_on` and `related` to same spec
193
+ - ❌ Error if A depends on B and B depends on A (mutual dependency)
194
+
195
+ ### Implementation Details
196
+
197
+ **File Structure:**
198
+ ```typescript
199
+ // packages/cli/src/commands/link.ts
200
+ export function linkCommand(): Command {
201
+ return new Command('link')
202
+ .description('Link specs with relationships')
203
+ .argument('<spec>', 'Spec to update')
204
+ .option('--depends-on <specs>', 'Add dependencies (comma-separated)')
205
+ .option('--related <specs>', 'Add related specs (comma-separated)')
206
+ .option('--blocks <specs>', 'Specs this blocks (inverse of depends-on)')
207
+ .action(async (spec, options) => { ... });
208
+ }
209
+
210
+ // packages/cli/src/commands/unlink.ts
211
+ export function unlinkCommand(): Command {
212
+ return new Command('unlink')
213
+ .description('Remove spec relationships')
214
+ .argument('<spec>', 'Spec to update')
215
+ .option('--depends-on <specs>', 'Remove dependencies')
216
+ .option('--related <specs>', 'Remove related specs')
217
+ .option('--all', 'Remove all relationships of specified type')
218
+ .action(async (spec, options) => { ... });
219
+ }
220
+
221
+ // packages/cli/src/commands/create.ts (extend existing)
222
+ export function createCommand(): Command {
223
+ return new Command('create')
224
+ .description('Create new spec in folder structure')
225
+ .argument('<name>', 'Name of the spec')
226
+ // ... existing options ...
227
+ .option('--depends-on <specs>', 'Set dependencies (comma-separated)')
228
+ .option('--related <specs>', 'Set related specs (comma-separated)')
229
+ .action(async (name, options) => {
230
+ await createSpec(name, options);
231
+
232
+ // Add relationships after creation if specified
233
+ if (options.dependsOn || options.related) {
234
+ await updateRelationships(name, {
235
+ dependsOn: options.dependsOn?.split(','),
236
+ related: options.related?.split(','),
237
+ operation: 'add',
238
+ });
239
+ }
240
+ });
241
+ }
242
+ ```
243
+
244
+ **Core Logic:**
245
+ ```typescript
246
+ // packages/cli/src/relationships.ts
247
+ import { getSpecFile, updateFrontmatter, parseFrontmatter } from './frontmatter.js';
248
+ import { resolveSpecPath } from './utils/path-helpers.js';
249
+
250
+ interface RelationshipUpdate {
251
+ dependsOn?: string[];
252
+ related?: string[];
253
+ operation: 'add' | 'remove';
254
+ }
255
+
256
+ export async function updateRelationships(
257
+ specPath: string,
258
+ update: RelationshipUpdate
259
+ ): Promise<void> {
260
+ // 1. Resolve spec path
261
+ const resolved = await resolveSpecPath(specPath, ...);
262
+
263
+ // 2. Read current frontmatter
264
+ const specFile = await getSpecFile(resolved, ...);
265
+ const { data: frontmatter } = parseFrontmatter(specFile);
266
+
267
+ // 3. Validate referenced specs exist
268
+ for (const ref of [...(update.dependsOn || []), ...(update.related || [])]) {
269
+ const exists = await resolveSpecPath(ref, ...);
270
+ if (!exists) throw new Error(`Spec ${ref} not found`);
271
+ }
272
+
273
+ // 4. Update arrays (add or remove)
274
+ const newDependsOn = updateArray(
275
+ frontmatter.depends_on || [],
276
+ update.dependsOn || [],
277
+ update.operation
278
+ );
279
+
280
+ const newRelated = updateArray(
281
+ frontmatter.related || [],
282
+ update.related || [],
283
+ update.operation
284
+ );
285
+
286
+ // 5. Handle bidirectional relationships (related)
287
+ if (update.related && update.operation === 'add') {
288
+ await updateBidirectionalRelated(specPath, update.related);
289
+ }
290
+
291
+ // 6. Write updated frontmatter
292
+ await updateFrontmatter(specFile, {
293
+ depends_on: newDependsOn.length > 0 ? newDependsOn : undefined,
294
+ related: newRelated.length > 0 ? newRelated : undefined,
295
+ });
296
+
297
+ // 7. Detect cycles and warn
298
+ if (newDependsOn.length > 0) {
299
+ await detectCycles(specPath, newDependsOn);
300
+ }
301
+ }
302
+
303
+ function updateArray(
304
+ current: string[],
305
+ items: string[],
306
+ operation: 'add' | 'remove'
307
+ ): string[] {
308
+ if (operation === 'add') {
309
+ // Add items, avoiding duplicates
310
+ const set = new Set([...current, ...items]);
311
+ return Array.from(set).sort();
312
+ } else {
313
+ // Remove items
314
+ return current.filter(x => !items.includes(x));
315
+ }
316
+ }
317
+
318
+ async function updateBidirectionalRelated(
319
+ sourceSpec: string,
320
+ targetSpecs: string[]
321
+ ): Promise<void> {
322
+ // For each target spec, add sourceSpec to its related array
323
+ for (const target of targetSpecs) {
324
+ const targetFile = await getSpecFile(...);
325
+ const { data } = parseFrontmatter(targetFile);
326
+
327
+ const related = data.related || [];
328
+ if (!related.includes(sourceSpec)) {
329
+ related.push(sourceSpec);
330
+ await updateFrontmatter(targetFile, {
331
+ related: related.sort()
332
+ });
333
+ }
334
+ }
335
+ }
336
+
337
+ async function detectCycles(
338
+ spec: string,
339
+ dependencies: string[],
340
+ visited: Set<string> = new Set()
341
+ ): Promise<void> {
342
+ if (visited.has(spec)) {
343
+ console.warn(`⚠️ Dependency cycle detected: ${Array.from(visited).join(' → ')} → ${spec}`);
344
+ return;
345
+ }
346
+
347
+ visited.add(spec);
348
+
349
+ for (const dep of dependencies) {
350
+ const depFile = await getSpecFile(...);
351
+ const { data } = parseFrontmatter(depFile);
352
+ if (data.depends_on) {
353
+ await detectCycles(dep, data.depends_on, new Set(visited));
354
+ }
355
+ }
356
+ }
357
+ ```
358
+
359
+ ### User Experience
360
+
361
+ **Success Messages:**
362
+ ```bash
363
+ $ lean-spec link 085 --depends-on 042,035
364
+ ✓ Added dependencies: 042, 035
365
+ Updated: specs/085-cli-relationship-commands/README.md
366
+
367
+ $ lean-spec link 085 --related 082
368
+ ✓ Added related: 082
369
+ Updated: specs/085-cli-relationship-commands/README.md
370
+ Updated: specs/082-web-realtime-sync-architecture/README.md (bidirectional)
371
+
372
+ $ lean-spec unlink 085 --depends-on 042
373
+ ✓ Removed dependency: 042
374
+ Updated: specs/085-cli-relationship-commands/README.md
375
+ ```
376
+
377
+ **Error Messages:**
378
+ ```bash
379
+ $ lean-spec link 085 --depends-on 999
380
+ ✗ Error: Spec 999 not found
381
+ Searched: 999, 999-*, specs/999
382
+
383
+ $ lean-spec link 085 --depends-on 085
384
+ ✗ Error: Cannot link spec to itself
385
+
386
+ $ lean-spec link 085 --depends-on 042
387
+ ⚠️ Dependency cycle detected: 085 → 042 → 035 → 085
388
+ ✓ Added dependency: 042 (cycle warning above)
389
+ ```
390
+
391
+ ### Integration with `lean-spec deps`
392
+
393
+ **Current behavior** (already exists):
394
+ ```bash
395
+ $ lean-spec deps 085
396
+ Depends On:
397
+ → 042-mcp-error-handling [complete]
398
+ → 035-live-specs-showcase [in-progress]
399
+
400
+ Related Specs:
401
+ ⟷ 082-web-realtime-sync-architecture [in-progress]
402
+
403
+ Required By:
404
+ ← 086-future-spec [planned]
405
+ ```
406
+
407
+ **No changes needed** - `deps` command already reads frontmatter correctly.
408
+
409
+ ### MCP Integration
410
+
411
+ **Goal**: Expose `link`/`unlink` functionality as MCP tools for AI agents (spec 076).
412
+
413
+ **MCP Tool Design** (leveraging modular architecture from spec 080):
414
+
415
+ ```typescript
416
+ // packages/cli/src/mcp/tools/create.ts (extend existing)
417
+ export function createTool(): ToolDefinition {
418
+ return [
419
+ 'create',
420
+ {
421
+ title: 'Create Spec',
422
+ description: '...',
423
+ inputSchema: {
424
+ name: z.string(),
425
+ // ... existing fields ...
426
+ dependsOn: z.array(z.string()).optional().describe('Specs this depends on'),
427
+ related: z.array(z.string()).optional().describe('Related specs (bidirectional)'),
428
+ },
429
+ // ... implementation includes relationship handling ...
430
+ }
431
+ ];
432
+ }
433
+
434
+ // packages/cli/src/mcp/tools/link.ts
435
+ export function linkTool(): ToolDefinition {
436
+ return [
437
+ 'link',
438
+ {
439
+ title: 'Link Specs',
440
+ description: 'Add relationships between specs (depends_on, related). Use this to establish dependencies or related connections between specifications.',
441
+ inputSchema: {
442
+ specPath: z.string().describe('The spec to update (e.g., "085", "cli-relationship-commands")'),
443
+ dependsOn: z.array(z.string()).optional().describe('Specs this depends on'),
444
+ related: z.array(z.string()).optional().describe('Related specs (bidirectional)'),
445
+ blocks: z.array(z.string()).optional().describe('Specs this blocks (inverse of depends-on)'),
446
+ },
447
+ outputSchema: {
448
+ success: z.boolean(),
449
+ updated: z.array(z.string()),
450
+ },
451
+ },
452
+ async (input) => {
453
+ try {
454
+ // Reuse CLI logic
455
+ await updateRelationships(input.specPath, {
456
+ dependsOn: input.dependsOn,
457
+ related: input.related,
458
+ operation: 'add',
459
+ });
460
+
461
+ return {
462
+ content: [{ type: 'text', text: 'Relationships updated successfully' }],
463
+ structuredContent: { success: true, updated: [input.specPath] },
464
+ };
465
+ } catch (error) {
466
+ return {
467
+ content: [{ type: 'text', text: formatErrorMessage('Error linking specs', error) }],
468
+ isError: true,
469
+ };
470
+ }
471
+ }
472
+ ];
473
+ }
474
+
475
+ // packages/cli/src/mcp/tools/unlink.ts
476
+ export function unlinkTool(): ToolDefinition {
477
+ return [
478
+ 'unlink',
479
+ {
480
+ title: 'Unlink Specs',
481
+ description: 'Remove relationships between specs. Use this to remove dependencies or related connections.',
482
+ inputSchema: {
483
+ specPath: z.string().describe('The spec to update'),
484
+ dependsOn: z.array(z.string()).optional().describe('Dependencies to remove'),
485
+ related: z.array(z.string()).optional().describe('Related specs to remove'),
486
+ all: z.boolean().optional().describe('Remove all relationships of specified type'),
487
+ },
488
+ outputSchema: {
489
+ success: z.boolean(),
490
+ updated: z.array(z.string()),
491
+ },
492
+ },
493
+ async (input) => {
494
+ try {
495
+ await updateRelationships(input.specPath, {
496
+ dependsOn: input.dependsOn,
497
+ related: input.related,
498
+ operation: 'remove',
499
+ });
500
+
501
+ return {
502
+ content: [{ type: 'text', text: 'Relationships removed successfully' }],
503
+ structuredContent: { success: true, updated: [input.specPath] },
504
+ };
505
+ } catch (error) {
506
+ return {
507
+ content: [{ type: 'text', text: formatErrorMessage('Error unlinking specs', error) }],
508
+ isError: true,
509
+ };
510
+ }
511
+ }
512
+ ];
513
+ }
514
+ ```
515
+
516
+ **Registration** (in `packages/cli/src/mcp/tools/registry.ts`):
517
+ ```typescript
518
+ import { linkTool } from './link.js';
519
+ import { unlinkTool } from './unlink.js';
520
+
521
+ export function registerTools(server: McpServer): void {
522
+ // ... existing tools ...
523
+ server.registerTool(...linkTool()); // Add alphabetically
524
+ // ... existing tools ...
525
+ server.registerTool(...unlinkTool()); // Add alphabetically
526
+ // ... existing tools ...
527
+ }
528
+ ```
529
+
530
+ **Benefits**:
531
+ - AI agents can manage relationships without manual YAML editing
532
+ - Consistent interface between CLI and MCP
533
+ - Reuses validation and business logic from CLI
534
+ - Follows established modular pattern from spec 080
535
+ - Enables spec 076 (programmatic-spec-relationships)
536
+
537
+ **Example AI Agent Workflow**:
538
+ ```typescript
539
+ // Before: Manual YAML editing (error-prone)
540
+ await mcp_lean_spec_view({ specPath: "085" });
541
+ // Parse YAML, edit frontmatter manually, risk corruption
542
+
543
+ // After: Programmatic interface (safe, validated)
544
+ // At creation
545
+ await mcp_lean_spec_create({
546
+ name: "new-feature",
547
+ dependsOn: ["042", "035"],
548
+ related: ["068"]
549
+ });
550
+
551
+ // After creation
552
+ await mcp_lean_spec_link({
553
+ specPath: "085",
554
+ dependsOn: ["042", "035"],
555
+ related: ["082"]
556
+ });
557
+ // Done! Validated, bidirectional updates handled automatically
558
+ ```
559
+
560
+ ## Plan
561
+
562
+ ### Phase 1: Core Commands (Days 1-2)
563
+
564
+ **Day 1: `link` Command**
565
+ - [ ] Create `packages/cli/src/commands/link.ts`
566
+ - [ ] Create `packages/cli/src/relationships.ts` (shared logic)
567
+ - [ ] Implement spec existence validation
568
+ - [ ] Implement `--depends-on` option (add dependencies)
569
+ - [ ] Implement `--related` option (add related specs)
570
+ - [ ] Implement bidirectional update for `related`
571
+ - [ ] Add tests for link command
572
+ - [ ] Update CLI index to register command
573
+
574
+ **Day 2: `unlink` Command + `create` Extension**
575
+ - [ ] Create `packages/cli/src/commands/unlink.ts`
576
+ - [ ] Implement `--depends-on` option (remove dependencies)
577
+ - [ ] Implement `--related` option (remove related specs)
578
+ - [ ] Implement `--all` flag (remove all of type)
579
+ - [ ] Handle bidirectional removal for `related`
580
+ - [ ] Add tests for unlink command
581
+ - [ ] **Extend `create` command** with `--depends-on` and `--related` flags
582
+ - [ ] Add tests for create with relationships
583
+
584
+ ### Phase 2: Validation & Safety (Day 3)
585
+
586
+ **Validation:**
587
+ - [ ] Duplicate prevention (idempotent operations)
588
+ - [ ] Self-reference detection
589
+ - [ ] Cycle detection (warn, don't block)
590
+ - [ ] Conflict detection (mutual dependencies)
591
+ - [ ] Format validation (spec number/name)
592
+
593
+ **Error Handling:**
594
+ - [ ] Graceful failure messages
595
+ - [ ] Rollback on partial failure
596
+ - [ ] Dry-run mode (`--dry-run`)
597
+ - [ ] Verbose mode (`--verbose`)
598
+
599
+ ### Phase 3: Advanced Features (Day 4 - Optional)
600
+
601
+ **Nice-to-have:**
602
+ - [ ] `--blocks` option (inverse of depends-on)
603
+ - [ ] Bulk operations (link multiple specs at once)
604
+ - [ ] Interactive mode (prompt for relationships)
605
+ - [ ] Graph visualization (`lean-spec graph`)
606
+
607
+ ### Phase 4: MCP Integration (Day 5)
608
+
609
+ **MCP Tools** (leveraging modular architecture from spec 080):
610
+ - [ ] **Extend `packages/cli/src/mcp/tools/create.ts`**
611
+ - [ ] Add `dependsOn` and `related` to input schema
612
+ - [ ] Wire to relationship handling logic
613
+ - [ ] Update tests
614
+ - [ ] Create `packages/cli/src/mcp/tools/link.ts`
615
+ - [ ] `linkTool()` definition
616
+ - [ ] Wire to CLI `updateRelationships()` logic
617
+ - [ ] Schema: `{ specPath, dependsOn?, related?, blocks? }`
618
+ - [ ] Create `packages/cli/src/mcp/tools/unlink.ts`
619
+ - [ ] `unlinkTool()` definition
620
+ - [ ] Wire to CLI `updateRelationships()` logic (remove operation)
621
+ - [ ] Schema: `{ specPath, dependsOn?, related?, all? }`
622
+ - [ ] Update `packages/cli/src/mcp/tools/registry.ts`
623
+ - [ ] Import `linkTool` and `unlinkTool`
624
+ - [ ] Register alphabetically: `server.registerTool(...linkTool())`
625
+ - [ ] Add MCP tool tests
626
+ - [ ] Update spec 076 status (enable MCP relationship management)
627
+
628
+ **Note**: Spec 080 (MCP modular architecture) is complete, making this integration straightforward. Follow the pattern from existing tools like `update.ts`.
629
+
630
+ ### Phase 5: Documentation & Migration (Day 6)
631
+
632
+ **Documentation:**
633
+ - [ ] Update AGENTS.md (remove manual editing exception)
634
+ - [ ] Update CLI help text
635
+ - [ ] Add examples to README
636
+ - [ ] Update contributing guide
637
+ - [ ] Document MCP tools in spec 076
638
+
639
+ **Migration:**
640
+ - [ ] Validate all existing relationships in specs/
641
+ - [ ] Fix any broken references
642
+ - [ ] Test commands on real specs
643
+ - [ ] Test MCP tools with AI agents (verify workflow improvement)
644
+
645
+ ## Test
646
+
647
+ ### Unit Tests
648
+
649
+ **Validation Tests:**
650
+ ```typescript
651
+ describe('updateRelationships', () => {
652
+ it('validates spec existence', async () => {
653
+ await expect(
654
+ updateRelationships('085', { dependsOn: ['999'], operation: 'add' })
655
+ ).rejects.toThrow('Spec 999 not found');
656
+ });
657
+
658
+ it('prevents self-reference', async () => {
659
+ await expect(
660
+ updateRelationships('085', { dependsOn: ['085'], operation: 'add' })
661
+ ).rejects.toThrow('Cannot link spec to itself');
662
+ });
663
+
664
+ it('detects cycles', async () => {
665
+ // Setup: 042 depends on 035, 035 depends on 085
666
+ await updateRelationships('085', { dependsOn: ['042'], operation: 'add' });
667
+ // Should warn about cycle: 085 → 042 → 035 → 085
668
+ });
669
+
670
+ it('is idempotent (adding existing relationship)', async () => {
671
+ await updateRelationships('085', { dependsOn: ['042'], operation: 'add' });
672
+ await updateRelationships('085', { dependsOn: ['042'], operation: 'add' });
673
+ // Should only appear once
674
+ });
675
+ });
676
+ ```
677
+
678
+ **Bidirectional Tests:**
679
+ ```typescript
680
+ describe('bidirectional related', () => {
681
+ it('updates both specs when adding related', async () => {
682
+ await updateRelationships('085', { related: ['082'], operation: 'add' });
683
+
684
+ // Check 085 has 082
685
+ const spec085 = await getSpecFile('085');
686
+ expect(spec085.related).toContain('082');
687
+
688
+ // Check 082 has 085
689
+ const spec082 = await getSpecFile('082');
690
+ expect(spec082.related).toContain('085');
691
+ });
692
+
693
+ it('removes from both specs when unlinking', async () => {
694
+ await updateRelationships('085', { related: ['082'], operation: 'remove' });
695
+
696
+ // Check both specs
697
+ const spec085 = await getSpecFile('085');
698
+ expect(spec085.related).not.toContain('082');
699
+
700
+ const spec082 = await getSpecFile('082');
701
+ expect(spec082.related).not.toContain('085');
702
+ });
703
+ });
704
+ ```
705
+
706
+ ### Integration Tests
707
+
708
+ **CLI Tests:**
709
+ ```bash
710
+ # Test link command
711
+ $ lean-spec link test-spec --depends-on 042
712
+ # Verify: test-spec/README.md has depends_on: [042]
713
+
714
+ $ lean-spec link test-spec --related 082
715
+ # Verify: both specs updated
716
+
717
+ # Test unlink command
718
+ $ lean-spec unlink test-spec --depends-on 042
719
+ # Verify: depends_on removed or array updated
720
+
721
+ # Test validation
722
+ $ lean-spec link test-spec --depends-on 999
723
+ # Verify: error message shown
724
+
725
+ # Test bidirectional
726
+ $ lean-spec deps test-spec
727
+ # Verify: relationships displayed correctly
728
+ ```
729
+
730
+ ### Manual Testing Checklist
731
+
732
+ **Basic Operations:**
733
+ - [ ] Add single dependency works
734
+ - [ ] Add multiple dependencies works (comma-separated)
735
+ - [ ] Add related spec updates both specs
736
+ - [ ] Remove dependency works
737
+ - [ ] Remove all dependencies works (`--all`)
738
+
739
+ **Validation:**
740
+ - [ ] Non-existent spec shows error
741
+ - [ ] Self-reference shows error
742
+ - [ ] Cycle detection shows warning
743
+ - [ ] Duplicate add is idempotent (no error)
744
+
745
+ **Edge Cases:**
746
+ - [ ] Empty relationships (no depends_on/related) handled
747
+ - [ ] Spec with no frontmatter handled
748
+ - [ ] Removing non-existent relationship is safe (no error)
749
+ - [ ] Unicode in spec names handled
750
+
751
+ **Integration:**
752
+ - [ ] `lean-spec deps` shows correct relationships
753
+ - [ ] Updated relationships persist across commands
754
+ - [ ] Works with spec numbers (042) and names (mcp-error-handling)
755
+
756
+ **MCP Tools:**
757
+ - [ ] `mcp_lean_spec_link` tool works from AI agent
758
+ - [ ] `mcp_lean_spec_unlink` tool works from AI agent
759
+ - [ ] MCP tools validate inputs correctly
760
+ - [ ] MCP tools show in tool registry alphabetically
761
+ - [ ] Error messages are helpful for AI agents
762
+
763
+ ## Notes
764
+
765
+ ### Design Decisions
766
+
767
+ **Why `link`/`unlink` instead of extending `lean-spec update`?**
768
+ - Relationships are conceptually different from simple metadata
769
+ - Need add/remove semantics (not set/replace)
770
+ - Bidirectional updates require special handling
771
+ - Future-proof for relationship types, labels, etc.
772
+ - Clearer command intent ("link specs" vs "update metadata")
773
+
774
+ **Why allow dependency cycles with warning?**
775
+ - Real-world projects have circular dependencies
776
+ - Blocking would be too restrictive
777
+ - Warning gives visibility without preventing work
778
+ - Can add `--strict` flag later if needed
779
+
780
+ **Why bidirectional for `related` but not `depends_on`?**
781
+ - `related` is symmetric: if A relates to B, B relates to A
782
+ - `depends_on` is directional: A depends on B ≠ B depends on A
783
+ - `lean-spec deps` shows both perspectives (`→` and `←`)
784
+
785
+ **Why not `--blocks` initially?**
786
+ - Syntactic sugar for inverse of `depends_on`
787
+ - Can compute from existing data
788
+ - Add later if users request it
789
+ - Keeps MVP simpler
790
+
791
+ **Why MCP tools in Phase 4 instead of separate spec?**
792
+ - CLI logic is the foundation - MCP tools are thin wrappers
793
+ - Reusing validation/business logic prevents divergence
794
+ - Spec 080 (modular MCP architecture) makes integration trivial
795
+ - Delivers complete solution (CLI + MCP) in one spec
796
+ - Enables spec 076 (programmatic-spec-relationships) immediately
797
+
798
+ **Why extend `create` instead of separate command?**
799
+ - Consistency: tags, priority, assignee all settable at creation
800
+ - Natural workflow: declare dependencies upfront when planning
801
+ - Reduces manual steps: create + link → create (one command)
802
+ - Better AI agent UX: single tool call vs. two
803
+ - Matches user expectations from other metadata
804
+
805
+ ### Alternative Approaches Considered
806
+
807
+ **1. Extend `lean-spec update`**
808
+ ```bash
809
+ lean-spec update 085 --add-dependency 042
810
+ lean-spec update 085 --remove-dependency 042
811
+ ```
812
+ - **Pros**: Fewer commands, consistent with update
813
+ - **Cons**: Awkward syntax, hard to extend, no bidirectional handling
814
+ - **Verdict**: ❌ Too limiting
815
+
816
+ **2. Separate commands per relationship type**
817
+ ```bash
818
+ lean-spec add-dependency 085 042
819
+ lean-spec remove-dependency 085 042
820
+ lean-spec add-related 085 082
821
+ ```
822
+ - **Pros**: Very explicit
823
+ - **Cons**: Too many commands, verbose
824
+ - **Verdict**: ❌ Command explosion
825
+
826
+ **3. Unified `link`/`unlink` with options (Chosen)**
827
+ ```bash
828
+ lean-spec link 085 --depends-on 042 --related 082
829
+ lean-spec unlink 085 --depends-on 042
830
+ ```
831
+ - **Pros**: Flexible, extensible, clear intent
832
+ - **Cons**: Slightly longer syntax
833
+ - **Verdict**: ✅ Best balance
834
+
835
+ **4. Interactive mode only**
836
+ ```bash
837
+ lean-spec link 085
838
+ > Add dependency: 042
839
+ > Add related: 082
840
+ ```
841
+ - **Pros**: User-friendly
842
+ - **Cons**: Not scriptable, slow for automation
843
+ - **Verdict**: ❌ Too limited (can add as optional mode)
844
+
845
+ ### Open Questions
846
+
847
+ - [ ] Should `--blocks` be included in MVP? (Defer to Phase 3)
848
+ - [ ] How to handle renamed/moved specs? (Out of scope - separate spec)
849
+ - [ ] Should we support relationship types (e.g., "implements", "extends")? (Future)
850
+ - [ ] Graph visualization format? (Mermaid, DOT, ASCII) (Future)
851
+ - [ ] Should unlink remove bidirectional automatically? (Yes for `related`)
852
+ - [ ] Should MCP tools use same command names or different? (Use same: `link`/`unlink` for consistency)
853
+
854
+ ### Success Criteria
855
+
856
+ **Functionality:**
857
+ - ✅ Can add/remove dependencies without manual editing
858
+ - ✅ Bidirectional `related` updates both specs
859
+ - ✅ Validation prevents broken relationships
860
+ - ✅ `lean-spec deps` shows correct relationships
861
+
862
+ **Developer Experience:**
863
+ - ✅ Commands feel natural and intuitive
864
+ - ✅ Error messages are helpful
865
+ - ✅ Works with spec numbers or names
866
+ - ✅ Faster than manual editing
867
+
868
+ **Code Quality:**
869
+ - ✅ Test coverage >90%
870
+ - ✅ No regressions in existing commands
871
+ - ✅ Passes `lean-spec validate`
872
+ - ✅ TypeScript compilation clean
873
+ - ✅ MCP tools follow modular pattern from spec 080
874
+
875
+ **AI Agent Experience:**
876
+ - ✅ Can manage relationships without manual YAML editing
877
+ - ✅ Workflow parity with spec 076 vision
878
+ - ✅ Error messages guide agents to correct usage
879
+
880
+ ### Context Economy Analysis
881
+
882
+ **Current state**: 6,296 tokens (🔴 should split threshold)
883
+ - 54% code examples (validation, CLI, MCP)
884
+ - 45% prose (design rationale, decisions)
885
+ - 808 lines total
886
+
887
+ **Why not split?**
888
+ - This is a **design spec** with extensive code examples needed for:
889
+ - CLI command interface (multiple examples)
890
+ - Validation logic (comprehensive error cases)
891
+ - MCP tool integration (complete examples)
892
+ - Bidirectional relationship handling
893
+ - Examples are cross-referenced and interdependent
894
+ - Splitting would harm coherence and discoverability
895
+ - Once implemented, can extract to sub-specs if needed
896
+
897
+ **Trade-off**: Accept elevated token count for design phase to maintain coherence. After implementation, can extract:
898
+ - `IMPLEMENTATION.md` - Core logic, validation
899
+ - `MCP-INTEGRATION.md` - MCP tool details
900
+ - `EXAMPLES.md` - Usage examples, edge cases
901
+
902
+ ### Related Specs
903
+
904
+ **This spec depends on:**
905
+ - Existing frontmatter parsing (`packages/cli/src/frontmatter.ts`)
906
+ - Existing `lean-spec deps` command (view-only)
907
+ - Spec path resolution utilities
908
+ - Spec 080 (mcp-server-modular-architecture) - Modular MCP structure for adding new tools
909
+
910
+ **This spec enables:**
911
+ - Automated relationship management in CI/CD
912
+ - Better spec graph analysis
913
+ - Foundation for future relationship features
914
+ - Removal of manual editing exception in AGENTS.md
915
+ - **Spec 076 (programmatic-spec-relationships)** - MCP tools for relationship management
916
+
917
+ **Related specs:**
918
+ - **Spec 076 (programmatic-spec-relationships)** - MCP server side (depends on this CLI foundation)
919
+ - Spec 059 (programmatic-spec-management) - API design patterns
920
+ - Spec 080 (mcp-server-modular-architecture) - Modular MCP architecture (complete)