@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
|
@@ -0,0 +1,812 @@
|
|
|
1
|
+
# Implementation Roadmap
|
|
2
|
+
|
|
3
|
+
**Phased delivery for mechanical transformation tools**
|
|
4
|
+
|
|
5
|
+
## Timeline Overview
|
|
6
|
+
|
|
7
|
+
**Total Duration**: 4 weeks for v0.3.0
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Week 1: Foundation (parsing, basic operations)
|
|
11
|
+
Week 2: Core commands (analyze, split, compact)
|
|
12
|
+
Week 3: Additional commands (compress, isolate)
|
|
13
|
+
Week 4: Polish, testing, dogfooding
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**Key Change**: Significantly simpler than originally planned. No complex algorithms, no semantic analysis - just mechanical file operations.
|
|
17
|
+
|
|
18
|
+
## Phase 1: Foundation (Week 1)
|
|
19
|
+
|
|
20
|
+
### Goals
|
|
21
|
+
- ✅ Basic markdown parsing (line ranges, sections, frontmatter)
|
|
22
|
+
- ✅ File operations (extract, create, delete, move)
|
|
23
|
+
- ✅ Token counting integration
|
|
24
|
+
|
|
25
|
+
### Tasks
|
|
26
|
+
|
|
27
|
+
#### Day 1-2: Parser Setup
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Leverage existing code
|
|
31
|
+
packages/core/src/analysis/
|
|
32
|
+
parser.ts # Basic markdown parsing
|
|
33
|
+
line-extractor.ts # Extract line ranges
|
|
34
|
+
section-finder.ts # Find section boundaries
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**What we need**:
|
|
38
|
+
- Parse frontmatter (already exists)
|
|
39
|
+
- Find section headings and line numbers
|
|
40
|
+
- Extract line ranges from content
|
|
41
|
+
- Count tokens (already exists via spec 069)
|
|
42
|
+
|
|
43
|
+
**What we DON'T need**:
|
|
44
|
+
- ❌ Full AST traversal
|
|
45
|
+
- ❌ Semantic analysis
|
|
46
|
+
- ❌ Concern detection
|
|
47
|
+
- ❌ Similarity algorithms
|
|
48
|
+
|
|
49
|
+
#### Day 3-4: Basic File Operations
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
// Simple utilities
|
|
53
|
+
function extractLines(content: string, start: number, end: number): string {
|
|
54
|
+
return content.split('\n').slice(start - 1, end).join('\n');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function removeLines(content: string, start: number, end: number): string {
|
|
58
|
+
const lines = content.split('\n');
|
|
59
|
+
lines.splice(start - 1, end - start + 1);
|
|
60
|
+
return lines.join('\n');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function replaceLines(content: string, start: number, end: number, replacement: string): string {
|
|
64
|
+
const lines = content.split('\n');
|
|
65
|
+
lines.splice(start - 1, end - start + 1, replacement);
|
|
66
|
+
return lines.join('\n');
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### Day 5: Token Integration
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# Already exists from spec 069
|
|
74
|
+
$ lean-spec tokens <spec>
|
|
75
|
+
|
|
76
|
+
# Just need to integrate into analyze command
|
|
77
|
+
$ lean-spec analyze <spec> --json
|
|
78
|
+
# Returns token count in JSON
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Phase 2: Core Commands (Week 2)
|
|
82
|
+
|
|
83
|
+
### Goals
|
|
84
|
+
- ✅ `analyze` command (return structure as JSON)
|
|
85
|
+
- ✅ `split` command (mechanical line extraction)
|
|
86
|
+
- ✅ `compact` command (remove line ranges)
|
|
87
|
+
|
|
88
|
+
### Day 1-2: Analyze Command
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// packages/cli/src/commands/analyze.ts
|
|
92
|
+
interface AnalyzeResult {
|
|
93
|
+
spec: string;
|
|
94
|
+
metrics: {
|
|
95
|
+
tokens: number;
|
|
96
|
+
lines: number;
|
|
97
|
+
sections: SectionInfo[];
|
|
98
|
+
};
|
|
99
|
+
threshold: {
|
|
100
|
+
status: 'excellent' | 'good' | 'warning' | 'error';
|
|
101
|
+
};
|
|
102
|
+
structure: Array<{
|
|
103
|
+
section: string;
|
|
104
|
+
level: number;
|
|
105
|
+
lineRange: [number, number];
|
|
106
|
+
tokens: number;
|
|
107
|
+
}>;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export async function analyze(spec: string): Promise<AnalyzeResult> {
|
|
111
|
+
// 1. Read spec
|
|
112
|
+
const content = await readFile(spec);
|
|
113
|
+
|
|
114
|
+
// 2. Count tokens (existing utility)
|
|
115
|
+
const tokens = await countTokens(content);
|
|
116
|
+
|
|
117
|
+
// 3. Find sections
|
|
118
|
+
const sections = findSections(content);
|
|
119
|
+
|
|
120
|
+
// 4. Return structured data
|
|
121
|
+
return {
|
|
122
|
+
spec,
|
|
123
|
+
metrics: { tokens, lines: content.split('\n').length, sections },
|
|
124
|
+
threshold: getThresholdStatus(tokens),
|
|
125
|
+
structure: sections
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Day 3-4: Split Command
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
// packages/cli/src/commands/split.ts
|
|
134
|
+
interface SplitOptions {
|
|
135
|
+
outputs: Array<{
|
|
136
|
+
file: string;
|
|
137
|
+
lines: [number, number];
|
|
138
|
+
}>;
|
|
139
|
+
updateRefs: boolean;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export async function split(spec: string, options: SplitOptions) {
|
|
143
|
+
const content = await readFile(`${spec}/README.md`);
|
|
144
|
+
|
|
145
|
+
// Extract each output
|
|
146
|
+
for (const { file, lines } of options.outputs) {
|
|
147
|
+
const extracted = extractLines(content, lines[0], lines[1]);
|
|
148
|
+
await writeFile(`${spec}/${file}`, extracted);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Update frontmatter in README.md
|
|
152
|
+
if (options.updateRefs) {
|
|
153
|
+
await updateSubSpecLinks(spec, options.outputs.map(o => o.file));
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Validate
|
|
157
|
+
await validateSpec(spec);
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Day 5: Compact Command
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
// packages/cli/src/commands/compact.ts
|
|
165
|
+
interface CompactOptions {
|
|
166
|
+
removes: Array<[number, number]>;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export async function compact(spec: string, options: CompactOptions) {
|
|
170
|
+
let content = await readFile(`${spec}/README.md`);
|
|
171
|
+
|
|
172
|
+
// Remove ranges (reverse order to maintain line numbers)
|
|
173
|
+
const sorted = options.removes.sort((a, b) => b[0] - a[0]);
|
|
174
|
+
for (const [start, end] of sorted) {
|
|
175
|
+
content = removeLines(content, start, end);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
await writeFile(`${spec}/README.md`, content);
|
|
179
|
+
await validateSpec(spec);
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Phase 3: Additional Commands (Week 3)
|
|
184
|
+
|
|
185
|
+
### Goals
|
|
186
|
+
- ✅ `compress` command (replace with summary)
|
|
187
|
+
- ✅ `isolate` command (move to new spec)
|
|
188
|
+
- ✅ CLI polish
|
|
189
|
+
|
|
190
|
+
### Day 1-2: Compress Command
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
// packages/cli/src/commands/compress.ts
|
|
194
|
+
interface CompressOptions {
|
|
195
|
+
range: [number, number];
|
|
196
|
+
replacement: string;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export async function compress(spec: string, options: CompressOptions) {
|
|
200
|
+
const content = await readFile(`${spec}/README.md`);
|
|
201
|
+
const newContent = replaceLines(
|
|
202
|
+
content,
|
|
203
|
+
options.range[0],
|
|
204
|
+
options.range[1],
|
|
205
|
+
options.replacement
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
await writeFile(`${spec}/README.md`, newContent);
|
|
209
|
+
await validateSpec(spec);
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Day 3-4: Isolate Command
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
// packages/cli/src/commands/isolate.ts
|
|
217
|
+
interface IsolateOptions {
|
|
218
|
+
lines: [number, number];
|
|
219
|
+
newSpec: string;
|
|
220
|
+
addReference: boolean;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export async function isolate(sourceSpec: string, options: IsolateOptions) {
|
|
224
|
+
// 1. Extract content
|
|
225
|
+
const content = await readFile(`${sourceSpec}/README.md`);
|
|
226
|
+
const extracted = extractLines(content, options.lines[0], options.lines[1]);
|
|
227
|
+
|
|
228
|
+
// 2. Create new spec
|
|
229
|
+
await createSpec(options.newSpec, extracted);
|
|
230
|
+
|
|
231
|
+
// 3. Remove from source
|
|
232
|
+
await compact(sourceSpec, { removes: [options.lines] });
|
|
233
|
+
|
|
234
|
+
// 4. Add reference if requested
|
|
235
|
+
if (options.addReference) {
|
|
236
|
+
await addCrossReference(sourceSpec, options.newSpec);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Day 5: CLI Integration
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
# Add commands to CLI
|
|
245
|
+
packages/cli/src/index.ts
|
|
246
|
+
|
|
247
|
+
program
|
|
248
|
+
.command('analyze <spec>')
|
|
249
|
+
.option('--json', 'Output as JSON')
|
|
250
|
+
.action(analyzeCommand);
|
|
251
|
+
|
|
252
|
+
program
|
|
253
|
+
.command('split <spec>')
|
|
254
|
+
.option('--output <file:lines>', 'Output file with line range', collect)
|
|
255
|
+
.option('--update-refs', 'Update cross-references')
|
|
256
|
+
.action(splitCommand);
|
|
257
|
+
|
|
258
|
+
# etc.
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Phase 4: Polish & Dogfooding (Week 4)
|
|
262
|
+
|
|
263
|
+
### Goals
|
|
264
|
+
- ✅ Test on real specs
|
|
265
|
+
- ✅ Fix bugs
|
|
266
|
+
- ✅ Documentation
|
|
267
|
+
- ✅ Release v0.3.0
|
|
268
|
+
|
|
269
|
+
### Day 1-2: Dogfooding
|
|
270
|
+
|
|
271
|
+
**Target specs** (oversized or complex):
|
|
272
|
+
1. This spec (059) - Use to split itself
|
|
273
|
+
2. Spec 045 - Large unified dashboard spec
|
|
274
|
+
3. Spec 048 - Complexity analysis spec
|
|
275
|
+
|
|
276
|
+
### Day 3-4: Testing & Fixes
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# Test suite
|
|
280
|
+
packages/core/src/analysis/__tests__/
|
|
281
|
+
parser.test.ts
|
|
282
|
+
line-extractor.test.ts
|
|
283
|
+
section-finder.test.ts
|
|
284
|
+
|
|
285
|
+
packages/cli/src/commands/__tests__/
|
|
286
|
+
analyze.test.ts
|
|
287
|
+
split.test.ts
|
|
288
|
+
compact.test.ts
|
|
289
|
+
compress.test.ts
|
|
290
|
+
isolate.test.ts
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Day 5: Release
|
|
294
|
+
|
|
295
|
+
- [ ] Update CHANGELOG.md
|
|
296
|
+
- [ ] Version bump to v0.3.0
|
|
297
|
+
- [ ] Publish to npm
|
|
298
|
+
- [ ] Update documentation site
|
|
299
|
+
|
|
300
|
+
## Success Criteria
|
|
301
|
+
|
|
302
|
+
**Must Have**:
|
|
303
|
+
- ✅ AI agent can analyze spec via JSON output
|
|
304
|
+
- ✅ AI agent can split spec with explicit parameters
|
|
305
|
+
- ✅ All transformations are deterministic
|
|
306
|
+
- ✅ No LLM calls in tools
|
|
307
|
+
- ✅ Fast (<200ms for typical operations)
|
|
308
|
+
|
|
309
|
+
**Nice to Have**:
|
|
310
|
+
- `--dry-run` mode
|
|
311
|
+
- `preview` command
|
|
312
|
+
- `rollback` command
|
|
313
|
+
|
|
314
|
+
**Deferred to v0.4.0**:
|
|
315
|
+
- Batch operations
|
|
316
|
+
- Watch mode
|
|
317
|
+
- CI/CD integration
|
|
318
|
+
|
|
319
|
+
## Testing Strategy
|
|
320
|
+
|
|
321
|
+
See [TESTING.md](./TESTING.md) for detailed test plan.
|
|
322
|
+
|
|
323
|
+
**Key insight**: Simple tools = simple tests. No complex algorithms to test.
|
|
324
|
+
|
|
325
|
+
## Risks & Mitigations
|
|
326
|
+
|
|
327
|
+
| Risk | Mitigation |
|
|
328
|
+
|------|-----------|
|
|
329
|
+
| Line numbers shift after edits | Tools update references automatically |
|
|
330
|
+
| Invalid markdown after split | Validation catches errors |
|
|
331
|
+
| AI agent provides bad parameters | Dry-run mode for safety |
|
|
332
|
+
| Breaking cross-references | Reference validator checks links |
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
**Key Principle**: Keep it simple. 4 weeks to build mechanical tools vs. 7+ weeks for complex semantic analysis. AI agents do the hard work, tools just execute.
|
|
337
|
+
|
|
338
|
+
**Day 5: Round-trip validation**
|
|
339
|
+
- [ ] Test parse → stringify → parse identity
|
|
340
|
+
- [ ] Validate on all existing specs
|
|
341
|
+
- [ ] Fix any formatting issues
|
|
342
|
+
|
|
343
|
+
#### Week 2: AST Utilities
|
|
344
|
+
|
|
345
|
+
**Day 1-2: Traversal**
|
|
346
|
+
- [ ] Implement `visit(ast, nodeType, callback)`
|
|
347
|
+
- [ ] Implement `findSections(ast, predicate)`
|
|
348
|
+
- [ ] Implement `extractText(node)`
|
|
349
|
+
|
|
350
|
+
**Day 3-4: Queries**
|
|
351
|
+
- [ ] Find references: `findReferences(ast)`
|
|
352
|
+
- [ ] Find code blocks: `findCodeBlocks(ast)`
|
|
353
|
+
- [ ] Find headings: `findHeadings(ast, depth)`
|
|
354
|
+
- [ ] Count lines: `countLines(node)`
|
|
355
|
+
|
|
356
|
+
**Day 5: Testing**
|
|
357
|
+
- [ ] Unit tests for all utilities
|
|
358
|
+
- [ ] Integration test with real specs
|
|
359
|
+
- [ ] Document API with examples
|
|
360
|
+
|
|
361
|
+
### Deliverables
|
|
362
|
+
- ✅ Working parser (unified.js integration)
|
|
363
|
+
- ✅ AST utilities library
|
|
364
|
+
- ✅ Test suite (>80% coverage)
|
|
365
|
+
- ✅ Documentation
|
|
366
|
+
|
|
367
|
+
## Phase 2: Analysis Tools (Week 3)
|
|
368
|
+
|
|
369
|
+
### Goals
|
|
370
|
+
- ✅ Detect complexity issues
|
|
371
|
+
- ✅ Find redundancy
|
|
372
|
+
- ✅ Identify concerns
|
|
373
|
+
- ✅ CLI commands for analysis
|
|
374
|
+
|
|
375
|
+
### Tasks
|
|
376
|
+
|
|
377
|
+
#### Day 1-2: Complexity Analysis
|
|
378
|
+
```typescript
|
|
379
|
+
// src/analysis/analyzer/complexity.ts
|
|
380
|
+
export interface ComplexityAnalyzer {
|
|
381
|
+
analyze(ast: SpecAST): ComplexityMetrics;
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
- [ ] Implement token count analysis (using tiktoken)
|
|
386
|
+
- [ ] Calculate nesting depth
|
|
387
|
+
- [ ] Count sections, code blocks, references
|
|
388
|
+
- [ ] Validate against token thresholds (2K/3.5K/5K)
|
|
389
|
+
- [ ] Check structure quality (sub-specs, sectioning)
|
|
390
|
+
- [ ] Test on existing specs
|
|
391
|
+
|
|
392
|
+
#### Day 3-4: Concern Detection
|
|
393
|
+
```typescript
|
|
394
|
+
// src/analysis/analyzer/concerns.ts
|
|
395
|
+
export interface ConcernAnalyzer {
|
|
396
|
+
extractConcerns(ast: SpecAST): Concern[];
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
- [ ] Implement boundary detection algorithm
|
|
401
|
+
- [ ] Implement concern clustering
|
|
402
|
+
- [ ] Generate concern names
|
|
403
|
+
- [ ] Test on specs with known structure
|
|
404
|
+
|
|
405
|
+
#### Day 5: CLI Integration
|
|
406
|
+
```bash
|
|
407
|
+
$ lean-spec analyze <spec> --complexity
|
|
408
|
+
$ lean-spec analyze <spec> --concerns
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
- [ ] Add `analyze` command to CLI
|
|
412
|
+
- [ ] Format output (human-readable)
|
|
413
|
+
- [ ] Add JSON output mode
|
|
414
|
+
- [ ] Add to help documentation
|
|
415
|
+
|
|
416
|
+
### Deliverables
|
|
417
|
+
- ✅ Complexity analyzer
|
|
418
|
+
- ✅ Concern detector
|
|
419
|
+
- ✅ `lean-spec analyze` command
|
|
420
|
+
- ✅ Comprehensive tests
|
|
421
|
+
|
|
422
|
+
## Phase 3: Transformation Engine (Weeks 4-5)
|
|
423
|
+
|
|
424
|
+
### Goals
|
|
425
|
+
- ✅ Partition specs into sub-specs
|
|
426
|
+
- ✅ Compact redundant content
|
|
427
|
+
- ✅ Update cross-references automatically
|
|
428
|
+
- ✅ Validate transformations
|
|
429
|
+
|
|
430
|
+
### Week 4: Partition Transformer
|
|
431
|
+
|
|
432
|
+
#### Day 1-2: Core splitting logic
|
|
433
|
+
```typescript
|
|
434
|
+
// src/analysis/transformer/partition.ts
|
|
435
|
+
export class PartitionTransformer implements Transformer {
|
|
436
|
+
preview(ast: SpecAST, options: PartitionOptions): TransformPreview;
|
|
437
|
+
apply(ast: SpecAST, options: PartitionOptions): SubSpecFile[];
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
- [ ] Implement concern extraction
|
|
442
|
+
- [ ] Generate sub-spec ASTs
|
|
443
|
+
- [ ] Create README.md (overview + links)
|
|
444
|
+
- [ ] Test with spec 045 (known-good split)
|
|
445
|
+
|
|
446
|
+
#### Day 3-4: Reference updating
|
|
447
|
+
- [ ] Build reference graph
|
|
448
|
+
- [ ] Generate mapping (old → new paths)
|
|
449
|
+
- [ ] Update internal links
|
|
450
|
+
- [ ] Update cross-references
|
|
451
|
+
- [ ] Validate all links resolve
|
|
452
|
+
|
|
453
|
+
#### Day 5: File operations
|
|
454
|
+
- [ ] Write sub-spec files
|
|
455
|
+
- [ ] Update parent README.md
|
|
456
|
+
- [ ] Create git commit
|
|
457
|
+
- [ ] Test on actual filesystem
|
|
458
|
+
|
|
459
|
+
### Week 5: Compaction & Compression
|
|
460
|
+
|
|
461
|
+
#### Day 1-2: Redundancy detection
|
|
462
|
+
```typescript
|
|
463
|
+
// src/analysis/analyzer/redundancy.ts
|
|
464
|
+
export interface RedundancyAnalyzer {
|
|
465
|
+
findDuplicates(ast: SpecAST): Duplicate[];
|
|
466
|
+
findSimilarContent(ast: SpecAST): SimilarityGroup[];
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
- [ ] Exact duplicate detection
|
|
471
|
+
- [ ] Fuzzy matching (85% similarity)
|
|
472
|
+
- [ ] Pattern detection (repeated examples)
|
|
473
|
+
- [ ] Test on verbose specs
|
|
474
|
+
|
|
475
|
+
#### Day 3-4: Compaction transformer
|
|
476
|
+
```typescript
|
|
477
|
+
// src/analysis/transformer/compact.ts
|
|
478
|
+
export class CompactionTransformer implements Transformer {
|
|
479
|
+
preview(ast: SpecAST): CompactionPreview;
|
|
480
|
+
apply(ast: SpecAST): SpecAST;
|
|
481
|
+
}
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
- [ ] Remove exact duplicates
|
|
485
|
+
- [ ] Consolidate references
|
|
486
|
+
- [ ] Merge similar sections
|
|
487
|
+
- [ ] Preserve decision rationale
|
|
488
|
+
- [ ] Test preservation (no info loss)
|
|
489
|
+
|
|
490
|
+
#### Day 5: Compression transformer
|
|
491
|
+
```typescript
|
|
492
|
+
// src/analysis/transformer/compress.ts
|
|
493
|
+
export class CompressionTransformer implements Transformer {
|
|
494
|
+
// Uses AI for summarization
|
|
495
|
+
preview(ast: SpecAST, options: CompressionOptions): CompressionPreview;
|
|
496
|
+
apply(ast: SpecAST, options: CompressionOptions): SpecAST;
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
- [ ] Identify compressible sections
|
|
501
|
+
- [ ] Generate summaries (AI-assisted)
|
|
502
|
+
- [ ] Preserve key decisions
|
|
503
|
+
- [ ] Test on completed phases
|
|
504
|
+
|
|
505
|
+
### Deliverables
|
|
506
|
+
- ✅ Partition transformer (sub-spec splitting)
|
|
507
|
+
- ✅ Compaction transformer (redundancy removal)
|
|
508
|
+
- ✅ Compression transformer (summarization)
|
|
509
|
+
- ✅ Reference manager (link updates)
|
|
510
|
+
- ✅ Comprehensive tests
|
|
511
|
+
|
|
512
|
+
## Phase 4: CLI Commands (Week 6)
|
|
513
|
+
|
|
514
|
+
### Goals
|
|
515
|
+
- ✅ User-friendly CLI interface
|
|
516
|
+
- ✅ Interactive previews
|
|
517
|
+
- ✅ Safe transformations (with rollback)
|
|
518
|
+
- ✅ All commands documented
|
|
519
|
+
|
|
520
|
+
### Tasks
|
|
521
|
+
|
|
522
|
+
#### Day 1-2: `lean-spec split` command
|
|
523
|
+
```bash
|
|
524
|
+
$ lean-spec split <spec> [options]
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
- [ ] Implement command handler
|
|
528
|
+
- [ ] Add strategy selection (auto, concerns, phases)
|
|
529
|
+
- [ ] Generate and display preview
|
|
530
|
+
- [ ] Prompt for confirmation
|
|
531
|
+
- [ ] Apply transformation
|
|
532
|
+
- [ ] Validate result
|
|
533
|
+
- [ ] Test on multiple specs
|
|
534
|
+
|
|
535
|
+
#### Day 3: `lean-spec compact` command
|
|
536
|
+
```bash
|
|
537
|
+
$ lean-spec compact <spec> [options]
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
- [ ] Implement command handler
|
|
541
|
+
- [ ] Display redundancy analysis
|
|
542
|
+
- [ ] Show compaction preview
|
|
543
|
+
- [ ] Apply compaction
|
|
544
|
+
- [ ] Validate result
|
|
545
|
+
- [ ] Test on verbose specs
|
|
546
|
+
|
|
547
|
+
#### Day 4: `lean-spec compress` command
|
|
548
|
+
```bash
|
|
549
|
+
$ lean-spec compress <spec> [options]
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
- [ ] Implement command handler
|
|
553
|
+
- [ ] Identify compressible sections
|
|
554
|
+
- [ ] Generate AI summaries (optional)
|
|
555
|
+
- [ ] Show preview
|
|
556
|
+
- [ ] Apply compression
|
|
557
|
+
- [ ] Test on specs with completed phases
|
|
558
|
+
|
|
559
|
+
#### Day 5: Utilities & Polish
|
|
560
|
+
```bash
|
|
561
|
+
$ lean-spec preview <spec> --transformation=<type>
|
|
562
|
+
$ lean-spec diff <spec> --before-after
|
|
563
|
+
$ lean-spec rollback <spec>
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
- [ ] Implement preview command
|
|
567
|
+
- [ ] Implement diff command
|
|
568
|
+
- [ ] Implement rollback (git-based)
|
|
569
|
+
- [ ] Update help documentation
|
|
570
|
+
- [ ] Create command examples
|
|
571
|
+
|
|
572
|
+
### Deliverables
|
|
573
|
+
- ✅ `lean-spec split` command
|
|
574
|
+
- ✅ `lean-spec compact` command
|
|
575
|
+
- ✅ `lean-spec compress` command
|
|
576
|
+
- ✅ Utility commands (preview, diff, rollback)
|
|
577
|
+
- ✅ Help documentation
|
|
578
|
+
- ✅ Example workflows
|
|
579
|
+
|
|
580
|
+
## Phase 5: Polish & Launch (Week 7)
|
|
581
|
+
|
|
582
|
+
### Goals
|
|
583
|
+
- ✅ Handle edge cases
|
|
584
|
+
- ✅ Optimize performance
|
|
585
|
+
- ✅ Dogfood on our own specs
|
|
586
|
+
- ✅ Documentation & examples
|
|
587
|
+
|
|
588
|
+
### Tasks
|
|
589
|
+
|
|
590
|
+
#### Day 1: Edge case handling
|
|
591
|
+
- [ ] Test on all existing specs
|
|
592
|
+
- [ ] Handle empty sections
|
|
593
|
+
- [ ] Handle specs with no clear concerns
|
|
594
|
+
- [ ] Handle specs already split
|
|
595
|
+
- [ ] Handle malformed markdown
|
|
596
|
+
- [ ] Add helpful error messages
|
|
597
|
+
|
|
598
|
+
#### Day 2: Performance optimization
|
|
599
|
+
- [ ] Profile analysis operations
|
|
600
|
+
- [ ] Add caching for repeated analysis
|
|
601
|
+
- [ ] Optimize AST traversal
|
|
602
|
+
- [ ] Parallelize project-wide analysis
|
|
603
|
+
- [ ] Target: <1s for any single spec
|
|
604
|
+
|
|
605
|
+
#### Day 3-4: Dogfooding
|
|
606
|
+
- [ ] Run on all specs >3,000 tokens
|
|
607
|
+
- [ ] Fix any issues discovered
|
|
608
|
+
- [ ] Document learnings
|
|
609
|
+
- [ ] Create case studies (before/after)
|
|
610
|
+
|
|
611
|
+
#### Day 5: Documentation & Launch
|
|
612
|
+
- [ ] Update README.md
|
|
613
|
+
- [ ] Create tutorial/guide
|
|
614
|
+
- [ ] Record demo video
|
|
615
|
+
- [ ] Announce on social media
|
|
616
|
+
- [ ] Blog post explaining approach
|
|
617
|
+
|
|
618
|
+
### Deliverables
|
|
619
|
+
- ✅ Robust edge case handling
|
|
620
|
+
- ✅ Optimized performance
|
|
621
|
+
- ✅ Dogfooded on all project specs
|
|
622
|
+
- ✅ Complete documentation
|
|
623
|
+
- ✅ v0.3.0 released
|
|
624
|
+
|
|
625
|
+
## Testing Strategy
|
|
626
|
+
|
|
627
|
+
### Unit Tests
|
|
628
|
+
|
|
629
|
+
**Parser**:
|
|
630
|
+
- ✅ Parse valid markdown
|
|
631
|
+
- ✅ Handle frontmatter
|
|
632
|
+
- ✅ Track line positions
|
|
633
|
+
- ✅ Round-trip identity
|
|
634
|
+
|
|
635
|
+
**Analyzers**:
|
|
636
|
+
- ✅ Complexity calculation
|
|
637
|
+
- ✅ Concern detection
|
|
638
|
+
- ✅ Redundancy finding
|
|
639
|
+
- ✅ Conflict detection
|
|
640
|
+
|
|
641
|
+
**Transformers**:
|
|
642
|
+
- ✅ Partition correctness
|
|
643
|
+
- ✅ Reference updating
|
|
644
|
+
- ✅ Compaction preservation
|
|
645
|
+
- ✅ Compression accuracy
|
|
646
|
+
|
|
647
|
+
**Commands**:
|
|
648
|
+
- ✅ CLI argument parsing
|
|
649
|
+
- ✅ Preview generation
|
|
650
|
+
- ✅ File operations
|
|
651
|
+
- ✅ Rollback functionality
|
|
652
|
+
|
|
653
|
+
### Integration Tests
|
|
654
|
+
|
|
655
|
+
**End-to-end workflows**:
|
|
656
|
+
```bash
|
|
657
|
+
# Test: Split oversized spec
|
|
658
|
+
$ lean-spec split 045
|
|
659
|
+
# Verify: 5 files created, all valid, references updated
|
|
660
|
+
|
|
661
|
+
# Test: Compact verbose spec
|
|
662
|
+
$ lean-spec compact 018
|
|
663
|
+
# Verify: Lines reduced, no info lost
|
|
664
|
+
|
|
665
|
+
# Test: Compress completed phases
|
|
666
|
+
$ lean-spec compress 043 --phases
|
|
667
|
+
# Verify: Phases summarized, outcomes preserved
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
### Golden Tests
|
|
671
|
+
|
|
672
|
+
Create snapshots of transformations:
|
|
673
|
+
```
|
|
674
|
+
tests/golden/
|
|
675
|
+
split-045/
|
|
676
|
+
input.md # Original spec
|
|
677
|
+
output/
|
|
678
|
+
README.md # Expected result
|
|
679
|
+
DESIGN.md
|
|
680
|
+
...
|
|
681
|
+
compact-018/
|
|
682
|
+
input.md
|
|
683
|
+
output.md
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
Run regression tests:
|
|
687
|
+
```bash
|
|
688
|
+
$ npm run test:golden
|
|
689
|
+
# Compares actual output vs expected output
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
### Performance Tests
|
|
693
|
+
|
|
694
|
+
```typescript
|
|
695
|
+
describe('Performance', () => {
|
|
696
|
+
it('should analyze spec in <100ms', async () => {
|
|
697
|
+
const start = Date.now();
|
|
698
|
+
await analyze(largeSpec);
|
|
699
|
+
const duration = Date.now() - start;
|
|
700
|
+
expect(duration).toBeLessThan(100);
|
|
701
|
+
});
|
|
702
|
+
|
|
703
|
+
it('should split spec in <500ms', async () => {
|
|
704
|
+
const start = Date.now();
|
|
705
|
+
await split(largeSpec);
|
|
706
|
+
const duration = Date.now() - start;
|
|
707
|
+
expect(duration).toBeLessThan(500);
|
|
708
|
+
});
|
|
709
|
+
});
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
## Success Criteria
|
|
713
|
+
|
|
714
|
+
### Phase 1 (Foundation)
|
|
715
|
+
- ✅ Parse all existing specs without errors
|
|
716
|
+
- ✅ Round-trip preserves content exactly
|
|
717
|
+
- ✅ Test coverage >80%
|
|
718
|
+
|
|
719
|
+
### Phase 2 (Analysis)
|
|
720
|
+
- ✅ Correctly identify concerns in 90%+ of specs
|
|
721
|
+
- ✅ Token thresholds match validation expectations
|
|
722
|
+
- ✅ Structure checks provide actionable feedback
|
|
723
|
+
- ✅ JSON output mode works for automation
|
|
724
|
+
|
|
725
|
+
### Phase 3 (Transformation)
|
|
726
|
+
- ✅ Split spec 045 matches manual split
|
|
727
|
+
- ✅ All cross-references remain valid
|
|
728
|
+
- ✅ Compaction preserves all decisions
|
|
729
|
+
- ✅ Zero information loss
|
|
730
|
+
|
|
731
|
+
### Phase 4 (CLI)
|
|
732
|
+
- ✅ Commands feel intuitive to users
|
|
733
|
+
- ✅ Previews are clear and accurate
|
|
734
|
+
- ✅ Rollback works reliably
|
|
735
|
+
- ✅ Help docs are comprehensive
|
|
736
|
+
|
|
737
|
+
### Phase 5 (Polish)
|
|
738
|
+
- ✅ No crashes on any existing spec
|
|
739
|
+
- ✅ Performance targets met
|
|
740
|
+
- ✅ Team can use confidently
|
|
741
|
+
- ✅ Documentation complete
|
|
742
|
+
|
|
743
|
+
## Risk Mitigation
|
|
744
|
+
|
|
745
|
+
### Risk 1: Complex Edge Cases
|
|
746
|
+
|
|
747
|
+
**Mitigation**:
|
|
748
|
+
- Start with simple specs (tests)
|
|
749
|
+
- Gradually increase complexity
|
|
750
|
+
- Build comprehensive test suite
|
|
751
|
+
- Fail gracefully with helpful errors
|
|
752
|
+
|
|
753
|
+
### Risk 2: Reference Integrity
|
|
754
|
+
|
|
755
|
+
**Mitigation**:
|
|
756
|
+
- Thorough reference graph testing
|
|
757
|
+
- Validation after every transform
|
|
758
|
+
- Git-based rollback always available
|
|
759
|
+
- Manual review before committing
|
|
760
|
+
|
|
761
|
+
### Risk 3: Information Loss
|
|
762
|
+
|
|
763
|
+
**Mitigation**:
|
|
764
|
+
- Preview mode for all transforms
|
|
765
|
+
- Diff view before applying
|
|
766
|
+
- Golden tests for regression
|
|
767
|
+
- Reversible operations (via git)
|
|
768
|
+
|
|
769
|
+
### Risk 4: Performance Issues
|
|
770
|
+
|
|
771
|
+
**Mitigation**:
|
|
772
|
+
- Profile early and often
|
|
773
|
+
- Cache analysis results
|
|
774
|
+
- Stream for large projects
|
|
775
|
+
- Set clear performance targets
|
|
776
|
+
|
|
777
|
+
### Risk 5: User Confusion
|
|
778
|
+
|
|
779
|
+
**Mitigation**:
|
|
780
|
+
- Clear command naming
|
|
781
|
+
- Interactive prompts with context
|
|
782
|
+
- Comprehensive help docs
|
|
783
|
+
- Example workflows
|
|
784
|
+
|
|
785
|
+
## Post-Launch Roadmap
|
|
786
|
+
|
|
787
|
+
### v0.3.1 (Bug fixes)
|
|
788
|
+
- Address issues from dogfooding
|
|
789
|
+
- Improve error messages
|
|
790
|
+
- Performance tweaks
|
|
791
|
+
|
|
792
|
+
### v0.4.0 (Continuous Management)
|
|
793
|
+
- Watch mode (auto-detect violations)
|
|
794
|
+
- Pre-commit hooks
|
|
795
|
+
- CI/CD integration
|
|
796
|
+
- Auto-compaction on save
|
|
797
|
+
|
|
798
|
+
### v0.5.0 (AI-Assisted Strategy)
|
|
799
|
+
- LLM suggests optimal strategy
|
|
800
|
+
- Semantic conflict detection
|
|
801
|
+
- Automated resolution suggestions
|
|
802
|
+
- Learning from past transformations
|
|
803
|
+
|
|
804
|
+
### v1.0.0 (Project-Wide Optimization)
|
|
805
|
+
- Cross-spec redundancy detection
|
|
806
|
+
- Spec dependency graph
|
|
807
|
+
- Consolidation recommendations
|
|
808
|
+
- Project health dashboard
|
|
809
|
+
|
|
810
|
+
---
|
|
811
|
+
|
|
812
|
+
**Key Principle**: Ship incrementally, dogfood continuously, iterate based on real usage. Quality over speed.
|