@leanspec/ui 0.2.9-dev.20251205030455 → 0.2.10
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 +5 -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 +40 -0
- package/.next/standalone/packages/ui/.next/server/app/_global-error/page.js +1 -1
- 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/page_client-reference-manifest.js +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 +2 -2
- 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 -20
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_full.segment.rsc +18 -20
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_index.segment.rsc +23 -26
- 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 +5 -5
- package/.next/standalone/packages/ui/.next/server/app/api/context/route.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/context/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/dependencies/route.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/dependencies/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/[id]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/discover/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/list-directory/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/context/route.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/context/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/dependencies/route.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/dependencies/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]/dependency-graph/route/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/dependency-graph/route/build-manifest.json +11 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/dependency-graph/route/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/dependency-graph/route.js +8 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/dependency-graph/route.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/dependency-graph/route.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/dependency-graph/route_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/metadata/route/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/metadata/route/build-manifest.json +11 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/metadata/route/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/metadata/route.js +8 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/metadata/route.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/metadata/route.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/metadata/route_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/route.js +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 +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 +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 +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/[id]/tags/route/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/tags/route/build-manifest.json +11 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/tags/route/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/tags/route.js +8 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/tags/route.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/tags/route.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/tags/route_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/validate/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 +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]/metadata/route/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/metadata/route/build-manifest.json +11 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/metadata/route/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/metadata/route.js +8 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/metadata/route.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/metadata/route.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/metadata/route_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/route.js +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 +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 +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/api/tags/route/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/api/tags/route/build-manifest.json +11 -0
- package/.next/standalone/packages/ui/.next/server/app/api/tags/route/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/api/tags/route.js +8 -0
- package/.next/standalone/packages/ui/.next/server/app/api/tags/route.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/api/tags/route.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/api/tags/route_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/context/page.js +4 -3
- package/.next/standalone/packages/ui/.next/server/app/context/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/context/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/dependencies/page.js +4 -3
- package/.next/standalone/packages/ui/.next/server/app/dependencies/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/dependencies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/page.js +2 -2
- 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]/context/page.js +2 -2
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/context/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/context/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page.js +2 -2
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page.js +2 -2
- 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 +2 -2
- 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 +2 -2
- 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/[projectId]/stats/page.js +2 -2
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/stats/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/stats/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/page.js +2 -2
- 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 +24 -25
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_full.segment.rsc +24 -25
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_index.segment.rsc +20 -24
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
- 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 +2 -2
- 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 +4 -3
- 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 +4 -3
- 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 +5 -0
- package/.next/standalone/packages/ui/.next/server/chunks/284a8_app_api_projects_[id]_specs_[spec]_dependency-graph_route_actions_f18476ed.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/730ea_ui__next-internal_server_app_api_projects_[id]_tags_route_actions_40899744.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/730ea_ui__next-internal_server_app_api_specs_[id]_metadata_route_actions_139bb09f.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__0afcada7._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__0e63a440._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__0ec6f9b0._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__0edb782a._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__0fbfea15._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__1706515f._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__1f037512._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__38780e00._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__3a535244._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__41f43652._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__5081ac6f._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__526764b2._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__548e27d4._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__71d98924._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__74af400b._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__8075fe29._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__9ce722b4._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__9cf3bf21._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__a2d7cbed._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__b1ad8b69._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__c7a4906b._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__de15d2aa._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__e16f7651._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__e2fcb5c6._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__e8d9903e._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__f6936b89._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/f825c_server_app_api_projects_[id]_specs_[spec]_metadata_route_actions_35af9a8c.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/packages_ui__next-internal_server_app_api_tags_route_actions_64625b2c.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__01bfc8ff._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__13f96ef4._.js → [root-of-the-server]__174e1ca1._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__38c56adc._.js → [root-of-the-server]__2d9202e8._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__338c65fe._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__366688dd._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__44b603f9._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__4ec37765._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__69a0d63a._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__7f55abaa._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__c158c9a9._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__c7735439._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__e2c760eb._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__84124d4b._.js → [root-of-the-server]__ead1539c._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__ec5b96a5._.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/{_adb9d7cb._.js → _22274047._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_59616aa6._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_5e1484f9._.js +7 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_8ab6f9ca._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_be836d6a._.js +5 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_ec637d7c._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_projects_page_tsx_6e166c8e._.js +1 -1
- 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_spec-detail-wrapper_tsx_fd35401c._.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/0c7bbb59865774a1.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/0fe978002ba489fb.js +3 -0
- package/.next/standalone/packages/ui/.next/static/chunks/1169d4ac8f9df687.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/241b6b1c83610ebf.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/39931c5cecf4c4b7.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/6d7922838a3513a4.js +1 -0
- package/.next/{static/chunks/7a00633903e066b4.js → standalone/packages/ui/.next/static/chunks/781328ee279ffc41.js} +1 -1
- package/.next/standalone/packages/ui/.next/static/chunks/937cb3894a606899.js +5 -0
- package/.next/standalone/packages/ui/.next/static/chunks/9cf644b700f37825.css +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/bc0f8f7f8dc0a352.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/dbce73f7087f2470.js +10 -0
- package/.next/standalone/packages/ui/.next/static/chunks/f0a083ac29b4b6c2.js +1 -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 +1 -1
- package/.next/standalone/packages/ui/server.js +1 -1
- package/.next/standalone/packages/ui/src/app/api/dependencies/route.ts +4 -67
- package/.next/standalone/packages/ui/src/app/api/projects/[id]/dependencies/route.ts +3 -52
- package/.next/standalone/packages/ui/src/app/api/projects/[id]/specs/[spec]/dependency-graph/route.ts +129 -0
- package/.next/standalone/packages/ui/src/app/api/projects/[id]/specs/[spec]/metadata/route.ts +170 -0
- package/.next/standalone/packages/ui/src/app/api/projects/[id]/specs/[spec]/status/route.ts +9 -2
- package/.next/standalone/packages/ui/src/app/api/projects/[id]/tags/route.ts +25 -0
- package/.next/standalone/packages/ui/src/app/api/specs/[id]/metadata/route.ts +184 -0
- package/.next/standalone/packages/ui/src/app/api/tags/route.ts +16 -0
- package/.next/standalone/packages/ui/src/app/context/page.tsx +22 -0
- package/.next/standalone/packages/ui/src/app/dashboard-client.tsx +14 -4
- package/.next/standalone/packages/ui/src/app/dependencies/dependencies-client.tsx +2 -2
- package/.next/standalone/packages/ui/src/app/dependencies/page.tsx +25 -13
- package/.next/standalone/packages/ui/src/app/projects/[projectId]/dependencies/page.tsx +1 -14
- package/.next/standalone/packages/ui/src/app/projects/page.tsx +234 -113
- package/.next/standalone/packages/ui/src/app/specs/[id]/page.tsx +24 -1
- package/.next/standalone/packages/ui/src/app/specs/page.tsx +22 -0
- package/.next/standalone/packages/ui/src/app/specs/specs-client.tsx +1 -1
- package/.next/standalone/packages/ui/src/app/stats/page.tsx +22 -0
- package/.next/standalone/packages/ui/src/components/editable-spec-metadata.tsx +152 -0
- package/.next/standalone/packages/ui/src/components/main-sidebar.tsx +6 -0
- package/.next/standalone/packages/ui/src/components/priority-editor.tsx +153 -0
- package/.next/standalone/packages/ui/src/components/project-switcher.tsx +53 -8
- package/.next/standalone/packages/ui/src/components/spec-detail-client.tsx +23 -20
- package/.next/standalone/packages/ui/src/components/status-editor.tsx +153 -0
- package/.next/standalone/packages/ui/src/components/tags-editor.tsx +238 -0
- package/.next/standalone/packages/ui/src/components/ui/command.tsx +1 -1
- package/.next/standalone/packages/ui/src/lib/db/service-queries.ts +151 -15
- package/.next/standalone/packages/ui/src/lib/projects/registry.ts +1 -1
- package/.next/standalone/packages/ui/src/lib/specs/sources/multi-project-source.ts +21 -5
- package/.next/standalone/packages/ui/tsconfig.tsbuildinfo +1 -1
- package/.next/static/chunks/0c7bbb59865774a1.js +1 -0
- package/.next/static/chunks/0fe978002ba489fb.js +3 -0
- package/.next/static/chunks/1169d4ac8f9df687.js +1 -0
- package/.next/static/chunks/241b6b1c83610ebf.js +1 -0
- package/.next/static/chunks/39931c5cecf4c4b7.js +1 -0
- package/.next/static/chunks/6d7922838a3513a4.js +1 -0
- package/.next/{standalone/packages/ui/.next/static/chunks/7a00633903e066b4.js → static/chunks/781328ee279ffc41.js} +1 -1
- package/.next/static/chunks/937cb3894a606899.js +5 -0
- package/.next/static/chunks/9cf644b700f37825.css +1 -0
- package/.next/static/chunks/bc0f8f7f8dc0a352.js +1 -0
- package/.next/static/chunks/dbce73f7087f2470.js +10 -0
- package/.next/static/chunks/f0a083ac29b4b6c2.js +1 -0
- package/.next/static/s9uUE9DnvJD2xIz-iBGMe/_buildManifest.js +11 -0
- package/.next/static/s9uUE9DnvJD2xIz-iBGMe/_clientMiddlewareManifest.json +1 -0
- package/.next/static/s9uUE9DnvJD2xIz-iBGMe/_ssgManifest.js +1 -0
- package/package.json +2 -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/[root-of-the-server]__18aca702._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__27348781._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__3a7f0840._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__3e17db24._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__6e06fd2a._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__97b99cc0._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__9d9758e1._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__b212b9bd._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__b9c03a57._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__e99e7672._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__f38a5f20._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__fa8cf2bc._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__53f4506c._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__921689ca._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__a9d7fd42._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__b27b2469._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__b3633d6e._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_03aa8d19._.js +0 -7
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_28fe1532._.js +0 -5
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_90eed09a._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_f9129aae._.js +0 -3
- package/.next/standalone/packages/ui/.next/static/chunks/04de9ed512b8098b.js +0 -10
- package/.next/standalone/packages/ui/.next/static/chunks/3d12a8c3152b526d.js +0 -3
- package/.next/standalone/packages/ui/.next/static/chunks/7931c6cb379305b1.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/7f9a218732be8099.js +0 -5
- package/.next/standalone/packages/ui/.next/static/chunks/8a6e8f3394240dbb.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/8d8c106c6848d15b.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/a640b005f2e15d98.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/a7075a240adea8e8.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/ddb2935cfe5310c7.css +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/f924ae32752e1583.js +0 -1
- package/.next/static/chunks/04de9ed512b8098b.js +0 -10
- package/.next/static/chunks/3d12a8c3152b526d.js +0 -3
- package/.next/static/chunks/7931c6cb379305b1.js +0 -1
- package/.next/static/chunks/7f9a218732be8099.js +0 -5
- package/.next/static/chunks/8a6e8f3394240dbb.js +0 -1
- package/.next/static/chunks/8d8c106c6848d15b.js +0 -1
- package/.next/static/chunks/a640b005f2e15d98.js +0 -1
- package/.next/static/chunks/a7075a240adea8e8.js +0 -1
- package/.next/static/chunks/ddb2935cfe5310c7.css +0 -1
- package/.next/static/chunks/f924ae32752e1583.js +0 -1
- /package/.next/standalone/packages/ui/.next/static/{T8X9UGfigRL0qWZiBHNjy → s9uUE9DnvJD2xIz-iBGMe}/_buildManifest.js +0 -0
- /package/.next/standalone/packages/ui/.next/static/{T8X9UGfigRL0qWZiBHNjy → s9uUE9DnvJD2xIz-iBGMe}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/packages/ui/.next/static/{T8X9UGfigRL0qWZiBHNjy → s9uUE9DnvJD2xIz-iBGMe}/_ssgManifest.js +0 -0
- /package/.next/{static/T8X9UGfigRL0qWZiBHNjy → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_buildManifest.js +0 -0
- /package/.next/{static/T8X9UGfigRL0qWZiBHNjy → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_clientMiddlewareManifest.json +0 -0
- /package/.next/{static/T8X9UGfigRL0qWZiBHNjy → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_ssgManifest.js +0 -0
package/.next/standalone/packages/ui/dist/standalone/specs/085-cli-relationship-commands/README.md
ADDED
|
@@ -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)
|