@leanspec/ui 0.2.9 → 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/{@img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64 → @img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64}/README.md +2 -2
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64 → @img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64}/lib/glib-2.0/include/glibconfig.h +9 -8
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib → @img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3} +0 -0
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64 → @img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64}/package.json +11 -5
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +46 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +221 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +1 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +42 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +30 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-linux-x64@0.34.5/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-darwin-arm64@0.34.5/node_modules/@img/sharp-darwin-arm64 → @img+sharp-linux-x64@0.34.5/node_modules/@img/sharp-linux-x64}/package.json +13 -7
- package/.next/standalone/node_modules/.pnpm/@img+sharp-linuxmusl-x64@0.34.5/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-linuxmusl-x64@0.34.5/node_modules/@img/sharp-linuxmusl-x64/package.json +46 -0
- 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 +11 -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 +88 -0
- package/.next/standalone/packages/ui/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error/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.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/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/context/route/build-manifest.json +11 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/context/route/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/context/route.js +8 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/context/route.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/context/route.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/context/route_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/dependencies/route/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/dependencies/route/build-manifest.json +11 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/dependencies/route/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/dependencies/route.js +8 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/dependencies/route.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/dependencies/route.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/dependencies/route_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/route.js +1 -3
- 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 -2
- 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 -2
- 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/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/validate/route/build-manifest.json +11 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/validate/route/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/validate/route.js +6 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/validate/route.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/validate/route.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/validate/route_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/api/projects/route.js +1 -3
- 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 +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 +2 -1
- 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 +2 -1
- 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 -1
- 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/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/context/page/build-manifest.json +18 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/context/page/next-font-manifest.json +6 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/context/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/context/page/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/context/page.js +21 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/context/page.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/context/page.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/context/page_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page/build-manifest.json +18 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page/next-font-manifest.json +6 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page.js +21 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/dependencies/page_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page.js +5 -5
- 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 +6 -5
- 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 +5 -4
- 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/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/stats/page/build-manifest.json +18 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/stats/page/next-font-manifest.json +6 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/stats/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/stats/page/server-reference-manifest.json +4 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/stats/page.js +21 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/stats/page.js.map +5 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/stats/page.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/stats/page_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/projects/page.js +5 -4
- 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.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 +2 -1
- package/.next/standalone/packages/ui/.next/server/app/specs/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/specs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/stats/page.js +2 -1
- package/.next/standalone/packages/ui/.next/server/app/stats/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/stats/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app-paths-manifest.json +11 -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/6681a__next-internal_server_app_api_projects_[id]_dependencies_route_actions_7ac49581.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/730ea_ui__next-internal_server_app_api_projects_[id]_context_route_actions_96adca70.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_projects_[id]_validate_route_actions_b60372c9.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/[externals]_better-sqlite3_a1cc22cb._.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 +3 -0
- 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]__5f1e0195._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__71d98924._.js +3 -0
- 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 +3 -0
- 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/packages_ui_src_lib_specs_sources_database-source_ts_b8c1af87._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/packages_ui_src_lib_specs_sources_database-source_ts_baa0160d._.js +72 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/730ea_ui__next-internal_server_app_projects_[projectId]_context_page_actions_e4940a48.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/730ea_ui__next-internal_server_app_projects_[projectId]_stats_page_actions_82a85203.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__0f0dade1._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__174e1ca1._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__212c8580._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__2b66bcca._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__a965a67b._.js → [root-of-the-server]__2d9202e8._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__312221a2._.js +3 -0
- 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 +3 -0
- 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]__46b71f61._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__665ae766._.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]__a34731d8._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__12b4eb41._.js → [root-of-the-server]__b0d6e2ad._.js} +2 -2
- 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]__dcee62dd._.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]__ead1539c._.js +1 -1
- 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/{_39562b2a._.js → _170362f4._.js} +3 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_1a642e67._.js +4 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{_adb9d7cb._.js → _22274047._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{_85effc18._.js → _2bc76f88._.js} +3 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{_fdd7780b._.js → _3f059230._.js} +3 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_58b98a8f._.js +4 -0
- 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 +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_b303aeea._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{_bae6d2b8._.js → _b421ba4a._.js} +3 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_be836d6a._.js +5 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_d840ffc6._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_ec637d7c._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_f05260d6._.js +4 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/f825c_server_app_projects_[projectId]_dependencies_page_actions_ba2321b8.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_0056f1f2._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_30b0b05a._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_478d57e5._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{node_modules__pnpm_151891de._.js → node_modules__pnpm_4e3e790c._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{node_modules__pnpm_f5b29533._.js → node_modules__pnpm_8680dc29._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{node_modules__pnpm_e175b92a._.js → node_modules__pnpm_94a0b1f5._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{node_modules__pnpm_1120b57c._.js → node_modules__pnpm_b4ff5c78._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{node_modules__pnpm_7791e3b8._.js → node_modules__pnpm_d3262b3d._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_context_context-client_tsx_4ba99a62._.js +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_dependencies_dependencies-client_tsx_0e82443a._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_projects_layout_tsx_86c2ce0f._.js +3 -0
- 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/chunks/ssr/packages_ui_src_components_specs-nav-sidebar_tsx_8237ed13._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/pages/404.html +2 -2
- package/.next/standalone/packages/ui/.next/server/pages/500.html +2 -2
- package/.next/standalone/packages/ui/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/packages/ui/.next/static/chunks/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/1e0689744f87e958.js +2 -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/{static/chunks/6d938a49daa10208.js → standalone/packages/ui/.next/static/chunks/4610aea3ca2e69eb.js} +1 -1
- package/.next/standalone/packages/ui/.next/static/chunks/6d7922838a3513a4.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/781328ee279ffc41.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/{942cf63b4032c808.js → 7df6308e6cfcf902.js} +1 -1
- package/.next/standalone/packages/ui/.next/static/chunks/840c6743a491a398.js +1 -0
- 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/{static/chunks/a3d7e1be47de010b.js → standalone/packages/ui/.next/static/chunks/bbd498aa5689c057.js} +1 -1
- package/.next/standalone/packages/ui/.next/static/chunks/bc0f8f7f8dc0a352.js +1 -0
- package/.next/{static/chunks/979625373d5474b6.js → standalone/packages/ui/.next/static/chunks/c26909a25ca9fc9b.js} +1 -1
- package/.next/{static/chunks/e3bc96a996e2a314.js → standalone/packages/ui/.next/static/chunks/d26f4109b44eb240.js} +1 -1
- package/.next/standalone/packages/ui/.next/static/chunks/{3276ca6fd9005903.js → d52a048b511c32bd.js} +1 -1
- package/.next/standalone/packages/ui/.next/static/chunks/dbce73f7087f2470.js +10 -0
- package/.next/standalone/packages/ui/.next/static/chunks/e399b4afc7936907.js +1 -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/standalone/packages/web/package.json +1 -9
- package/.next/standalone/packages/ui/dist/standalone/packages/web/server.js +1 -1
- package/.next/standalone/packages/ui/dist/standalone/specs/035-live-specs-showcase/README.md +3 -7
- package/.next/standalone/packages/ui/dist/standalone/specs/072-ai-agent-first-use-workflow/README.md +3 -5
- package/.next/standalone/packages/ui/dist/standalone/specs/081-web-app-ux-redesign/README.md +1 -2
- package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/README.md +3 -8
- package/.next/standalone/packages/ui/dist/standalone/specs/087-cli-ui-command/README.md +259 -73
- package/.next/standalone/packages/ui/dist/standalone/specs/088-core-concepts-terminology-only/README.md +3 -5
- package/.next/standalone/packages/ui/dist/standalone/specs/089-sdd-practical-tutorials/README.md +3 -5
- package/.next/standalone/packages/ui/dist/standalone/specs/090-leanspec-sdd-case-studies/README.md +3 -5
- package/.next/standalone/packages/ui/dist/standalone/specs/091-chinese-localization-strategy/README.md +23 -33
- package/.next/standalone/packages/ui/dist/standalone/specs/092-docs-site-submodule-migration/README.md +3 -7
- package/.next/standalone/packages/ui/dist/standalone/specs/093-spec-detail-ui-improvements/README.md +14 -25
- 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]/context/route.ts +39 -0
- package/.next/standalone/packages/ui/src/app/api/projects/[id]/dependencies/route.ts +20 -0
- package/.next/standalone/packages/ui/src/app/api/projects/[id]/route.ts +25 -9
- 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]/route.ts +14 -14
- 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]/specs/route.ts +9 -8
- package/.next/standalone/packages/ui/src/app/api/projects/[id]/tags/route.ts +25 -0
- package/.next/standalone/packages/ui/src/app/api/projects/[id]/validate/route.ts +49 -0
- package/.next/standalone/packages/ui/src/app/api/projects/route.ts +18 -5
- package/.next/standalone/packages/ui/src/app/api/specs/[id]/dependency-graph/route.test.ts +0 -2
- package/.next/standalone/packages/ui/src/app/api/specs/[id]/dependency-graph/route.ts +0 -15
- 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 +43 -62
- package/.next/standalone/packages/ui/src/app/dependencies/constants.ts +9 -8
- package/.next/standalone/packages/ui/src/app/dependencies/dependencies-client.tsx +95 -20
- package/.next/standalone/packages/ui/src/app/dependencies/page.tsx +25 -13
- package/.next/standalone/packages/ui/src/app/dependencies/spec-node.tsx +8 -8
- package/.next/standalone/packages/ui/src/app/dependencies/spec-sidebar.tsx +40 -67
- package/.next/standalone/packages/ui/src/app/page.tsx +24 -0
- package/.next/standalone/packages/ui/src/app/projects/[projectId]/context/page.tsx +41 -0
- package/.next/standalone/packages/ui/src/app/projects/[projectId]/dependencies/page.tsx +30 -0
- package/.next/standalone/packages/ui/src/app/projects/[projectId]/page.tsx +18 -2
- package/.next/standalone/packages/ui/src/app/projects/[projectId]/stats/page.tsx +24 -0
- package/.next/standalone/packages/ui/src/app/projects/layout.tsx +7 -0
- package/.next/standalone/packages/ui/src/app/projects/page.tsx +375 -107
- 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 +28 -18
- package/.next/standalone/packages/ui/src/app/stats/page.tsx +22 -0
- package/.next/standalone/packages/ui/src/components/color-picker.tsx +73 -0
- package/.next/standalone/packages/ui/src/components/create-project-dialog.tsx +3 -5
- package/.next/standalone/packages/ui/src/components/directory-picker.tsx +1 -0
- package/.next/standalone/packages/ui/{dist/standalone/packages/web/src/components/spec-metadata.tsx → src/components/editable-spec-metadata.tsx} +46 -30
- package/.next/standalone/packages/ui/src/components/main-sidebar.tsx +28 -6
- package/.next/standalone/packages/ui/src/components/markdown-link.tsx +15 -8
- package/.next/standalone/packages/ui/src/components/priority-editor.tsx +153 -0
- package/.next/standalone/packages/ui/src/components/project-switcher.tsx +74 -10
- package/.next/standalone/packages/ui/src/components/quick-search.tsx +3 -1
- package/.next/standalone/packages/ui/src/components/spec-dependency-graph.tsx +13 -52
- package/.next/standalone/packages/ui/src/components/spec-detail-client.tsx +58 -30
- package/.next/standalone/packages/ui/src/components/spec-detail-wrapper.tsx +3 -4
- package/.next/standalone/packages/ui/src/components/specs-nav-sidebar.tsx +8 -6
- 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/contexts/project-context.tsx +24 -0
- package/.next/standalone/packages/ui/src/lib/db/service-queries.ts +230 -40
- package/.next/standalone/packages/ui/src/lib/dependency-graph.ts +0 -13
- 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/src/types/specs.ts +6 -4
- 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/1e0689744f87e958.js +2 -0
- package/.next/static/chunks/241b6b1c83610ebf.js +1 -0
- package/.next/static/chunks/39931c5cecf4c4b7.js +1 -0
- package/.next/{standalone/packages/ui/.next/static/chunks/6d938a49daa10208.js → static/chunks/4610aea3ca2e69eb.js} +1 -1
- package/.next/static/chunks/6d7922838a3513a4.js +1 -0
- package/.next/static/chunks/781328ee279ffc41.js +1 -0
- package/.next/static/chunks/{942cf63b4032c808.js → 7df6308e6cfcf902.js} +1 -1
- package/.next/static/chunks/840c6743a491a398.js +1 -0
- package/.next/static/chunks/937cb3894a606899.js +5 -0
- package/.next/static/chunks/9cf644b700f37825.css +1 -0
- package/.next/{standalone/packages/ui/.next/static/chunks/a3d7e1be47de010b.js → static/chunks/bbd498aa5689c057.js} +1 -1
- package/.next/static/chunks/bc0f8f7f8dc0a352.js +1 -0
- package/.next/{standalone/packages/ui/.next/static/chunks/979625373d5474b6.js → static/chunks/c26909a25ca9fc9b.js} +1 -1
- package/.next/{standalone/packages/ui/.next/static/chunks/e3bc96a996e2a314.js → static/chunks/d26f4109b44eb240.js} +1 -1
- package/.next/static/chunks/{3276ca6fd9005903.js → d52a048b511c32bd.js} +1 -1
- package/.next/static/chunks/dbce73f7087f2470.js +10 -0
- package/.next/static/chunks/e399b4afc7936907.js +1 -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/@img+sharp-darwin-arm64@0.34.5/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__126dea7b._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__65667b70._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__675a763e._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__803d07f0._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__8233e09b._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__84cdc14a._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__8a9ab1a3._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__aa677b0d._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__ae726e9c._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__b0969111._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__bdc3963a._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__f06435b0._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__f5c6d6b8._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__fb91986f._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/packages_ui_src_lib_db_index_ts_556307fa._.js +0 -74
- package/.next/standalone/packages/ui/.next/server/chunks/packages_ui_src_lib_specs_sources_database-source_ts_0bd881ee._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__3c77d95b._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__50122e7e._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__8608a6fa._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__88a691ee._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__bdbbba01._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__cc589a54._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__daedd80e._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__dc176c61._.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/_3b617676._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_8cec504f._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_ea899b87._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_fe120f8a._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_1c916fe3._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_3ba1438c._.js +0 -3
- package/.next/standalone/packages/ui/.next/static/chunks/094cf9f4e3553261.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/1c015eb9eaaf9f9c.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/1d36660b2877d213.js +0 -3
- package/.next/standalone/packages/ui/.next/static/chunks/20f4141ccb5d4eb4.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/2c85b8059e42248a.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/3b6b058ebd14dbed.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/4d29ca0fa6843070.js +0 -2
- package/.next/standalone/packages/ui/.next/static/chunks/59854b15bf046467.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/5fd8101e32b076b1.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/a33f10af6abef4df.js +0 -10
- package/.next/standalone/packages/ui/.next/static/chunks/b7f19087afe1d2c9.css +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/ddd87cd0d26bc2f5.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/eeec245955b3b600.js +0 -5
- package/.next/standalone/packages/ui/dist/standalone/packages/web/components.json +0 -20
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/0000_reflective_thena.sql +0 -59
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/0001_fresh_carmella_unuscione.sql +0 -1
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/0000_snapshot.json +0 -427
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/0001_snapshot.json +0 -436
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/_journal.json +0 -20
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle.config.ts +0 -10
- package/.next/standalone/packages/ui/dist/standalone/packages/web/eslint.config.mjs +0 -18
- package/.next/standalone/packages/ui/dist/standalone/packages/web/next.config.ts +0 -7
- package/.next/standalone/packages/ui/dist/standalone/packages/web/postcss.config.mjs +0 -8
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/projects/[id]/specs/route.ts +0 -23
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/projects/route.ts +0 -19
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/revalidate/route.ts +0 -63
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/dependency-graph/route.test.ts +0 -51
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/dependency-graph/route.ts +0 -171
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/route.ts +0 -36
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/subspecs/[file]/route.ts +0 -46
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/stats/route.ts +0 -19
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/board-client.tsx +0 -162
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/loading.tsx +0 -43
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/page.tsx +0 -18
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/dashboard-client.tsx +0 -364
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/error.tsx +0 -43
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/globals.css +0 -531
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/home-client.tsx +0 -277
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/layout.tsx +0 -70
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/loading.tsx +0 -87
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/not-found.tsx +0 -27
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/page.tsx +0 -18
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/[id]/loading.tsx +0 -5
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/[id]/page.tsx +0 -43
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/page.tsx +0 -18
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/specs-client.tsx +0 -425
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/stats/page.tsx +0 -18
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/stats/stats-client.tsx +0 -283
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/back-to-top.tsx +0 -46
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/empty-state.tsx +0 -52
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/main-sidebar.tsx +0 -175
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/markdown-link.test.ts +0 -96
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/markdown-link.tsx +0 -95
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/navigation.tsx +0 -210
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/priority-badge.tsx +0 -53
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/quick-search.tsx +0 -180
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/skeletons.tsx +0 -119
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-dependency-graph.tsx +0 -369
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-client.tsx +0 -372
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-loading-shell.tsx +0 -42
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-wrapper.tsx +0 -70
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-sidebar.tsx +0 -127
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-timeline.tsx +0 -186
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/specs-nav-sidebar.tsx +0 -561
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/status-badge.tsx +0 -53
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/sub-spec-tabs.tsx +0 -143
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/table-of-contents.tsx +0 -130
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/theme-provider.tsx +0 -11
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/theme-toggle.tsx +0 -37
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/avatar.tsx +0 -50
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/badge.tsx +0 -36
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/breadcrumb.tsx +0 -110
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/button.tsx +0 -57
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/card.tsx +0 -76
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/command.tsx +0 -153
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/dialog.tsx +0 -122
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/input.tsx +0 -24
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/select.tsx +0 -159
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/separator.tsx +0 -31
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/skeleton.tsx +0 -15
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/tabs.tsx +0 -55
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/toast.tsx +0 -30
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/tooltip.tsx +0 -32
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/date-utils.ts +0 -76
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/index.ts +0 -42
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/migrate.ts +0 -18
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/queries.ts +0 -114
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/schema.ts +0 -123
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/seed.ts +0 -156
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/service-queries.ts +0 -216
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/dependency-graph.ts +0 -105
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/service.ts +0 -120
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/sources/database-source.ts +0 -94
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/sources/filesystem-source.ts +0 -249
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/types.ts +0 -55
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/stores/specs-sidebar-store.ts +0 -152
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/sub-specs.ts +0 -171
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/utils.ts +0 -17
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/types/specs.ts +0 -18
- package/.next/standalone/packages/ui/dist/standalone/packages/web/tailwind.config.ts +0 -58
- package/.next/standalone/packages/ui/dist/standalone/packages/web/tsconfig.json +0 -34
- package/.next/standalone/packages/ui/dist/standalone/packages/web/tsconfig.tsbuildinfo +0 -1
- package/.next/standalone/packages/ui/dist/standalone/packages/web/vitest.config.ts +0 -14
- package/.next/standalone/packages/ui/dist/standalone/specs/094-ai-chatbot-web-integration/README.md +0 -332
- package/.next/standalone/packages/ui/dist/standalone/specs/095-pr-migration-verification/README.md +0 -339
- package/.next/standalone/packages/ui/dist/standalone/specs/096-docs-beginner-first-reorg/README.md +0 -399
- package/.next/standalone/packages/ui/dist/standalone/specs/097-dag-visualization-library/README.md +0 -525
- package/.next/standalone/packages/ui/dist/standalone/specs/098-github-multi-project-integration/README.md +0 -387
- package/.next/standalone/packages/ui/dist/standalone/specs/099-enhanced-dependency-commands-cli-mcp/README.md +0 -613
- package/.next/standalone/packages/ui/dist/standalone/specs/100-release-process-typecheck-failure/README.md +0 -266
- package/.next/standalone/packages/ui/dist/standalone/specs/101-sidebar-scroll-position-drift/README.md +0 -100
- package/.next/standalone/packages/ui/dist/standalone/specs/102-mcp-wrapper-package/README.md +0 -172
- package/.next/static/chunks/094cf9f4e3553261.js +0 -1
- package/.next/static/chunks/1c015eb9eaaf9f9c.js +0 -1
- package/.next/static/chunks/1d36660b2877d213.js +0 -3
- package/.next/static/chunks/20f4141ccb5d4eb4.js +0 -1
- package/.next/static/chunks/2c85b8059e42248a.js +0 -1
- package/.next/static/chunks/3b6b058ebd14dbed.js +0 -1
- package/.next/static/chunks/4d29ca0fa6843070.js +0 -2
- package/.next/static/chunks/59854b15bf046467.js +0 -1
- package/.next/static/chunks/5fd8101e32b076b1.js +0 -1
- package/.next/static/chunks/a33f10af6abef4df.js +0 -10
- package/.next/static/chunks/b7f19087afe1d2c9.css +0 -1
- package/.next/static/chunks/ddd87cd0d26bc2f5.js +0 -1
- package/.next/static/chunks/eeec245955b3b600.js +0 -5
- /package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64 → @img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64}/lib/index.js +0 -0
- /package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64 → @img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64}/versions.json +0 -0
- /package/.next/standalone/packages/ui/.next/static/{8PwFWS-09QjFSbDbfp15t → s9uUE9DnvJD2xIz-iBGMe}/_buildManifest.js +0 -0
- /package/.next/standalone/packages/ui/.next/static/{8PwFWS-09QjFSbDbfp15t → s9uUE9DnvJD2xIz-iBGMe}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/packages/ui/.next/static/{8PwFWS-09QjFSbDbfp15t → s9uUE9DnvJD2xIz-iBGMe}/_ssgManifest.js +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/f864aa7e7061c0600e35cf3d879b27cf.txt +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/favicon.ico +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/file.svg +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/github-mark-white.svg +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/github-mark.svg +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/globe.svg +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/icon.svg +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/logo-dark-bg.svg +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/logo-with-bg.svg +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/logo.svg +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/next.svg +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/vercel.svg +0 -0
- /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/window.svg +0 -0
- /package/.next/{static/8PwFWS-09QjFSbDbfp15t → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_buildManifest.js +0 -0
- /package/.next/{static/8PwFWS-09QjFSbDbfp15t → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_clientMiddlewareManifest.json +0 -0
- /package/.next/{static/8PwFWS-09QjFSbDbfp15t → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline priority editor component
|
|
3
|
+
* Allows changing spec priority via dropdown
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use client';
|
|
7
|
+
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
import { AlertCircle, ArrowUp, Minus, ArrowDown, Loader2 } from 'lucide-react';
|
|
10
|
+
import { toast } from '@/components/ui/toast';
|
|
11
|
+
import {
|
|
12
|
+
Select,
|
|
13
|
+
SelectContent,
|
|
14
|
+
SelectItem,
|
|
15
|
+
SelectTrigger,
|
|
16
|
+
SelectValue,
|
|
17
|
+
} from '@/components/ui/select';
|
|
18
|
+
import { cn } from '@/lib/utils';
|
|
19
|
+
|
|
20
|
+
const PRIORITIES = ['low', 'medium', 'high', 'critical'] as const;
|
|
21
|
+
type Priority = (typeof PRIORITIES)[number];
|
|
22
|
+
|
|
23
|
+
const priorityConfig: Record<Priority, { icon: React.ComponentType<{ className?: string }>; label: string; className: string }> = {
|
|
24
|
+
'critical': {
|
|
25
|
+
icon: AlertCircle,
|
|
26
|
+
label: 'Critical',
|
|
27
|
+
className: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400'
|
|
28
|
+
},
|
|
29
|
+
'high': {
|
|
30
|
+
icon: ArrowUp,
|
|
31
|
+
label: 'High',
|
|
32
|
+
className: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400'
|
|
33
|
+
},
|
|
34
|
+
'medium': {
|
|
35
|
+
icon: Minus,
|
|
36
|
+
label: 'Medium',
|
|
37
|
+
className: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400'
|
|
38
|
+
},
|
|
39
|
+
'low': {
|
|
40
|
+
icon: ArrowDown,
|
|
41
|
+
label: 'Low',
|
|
42
|
+
className: 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-400'
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
interface PriorityEditorProps {
|
|
47
|
+
specId: string;
|
|
48
|
+
currentPriority: string;
|
|
49
|
+
onUpdate?: (newPriority: string) => void;
|
|
50
|
+
disabled?: boolean;
|
|
51
|
+
projectId?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function PriorityEditor({
|
|
55
|
+
specId,
|
|
56
|
+
currentPriority,
|
|
57
|
+
onUpdate,
|
|
58
|
+
disabled = false,
|
|
59
|
+
projectId
|
|
60
|
+
}: PriorityEditorProps) {
|
|
61
|
+
const [priority, setPriority] = React.useState<Priority>(currentPriority as Priority || 'medium');
|
|
62
|
+
const [isUpdating, setIsUpdating] = React.useState(false);
|
|
63
|
+
const [error, setError] = React.useState<string | null>(null);
|
|
64
|
+
|
|
65
|
+
const handleChange = async (newPriority: Priority) => {
|
|
66
|
+
if (newPriority === priority) return;
|
|
67
|
+
|
|
68
|
+
const previousPriority = priority;
|
|
69
|
+
setPriority(newPriority); // Optimistic update
|
|
70
|
+
setIsUpdating(true);
|
|
71
|
+
setError(null);
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
const apiUrl = projectId
|
|
75
|
+
? `/api/projects/${projectId}/specs/${specId}/metadata`
|
|
76
|
+
: `/api/specs/${specId}/metadata`;
|
|
77
|
+
|
|
78
|
+
const response = await fetch(apiUrl, {
|
|
79
|
+
method: 'PATCH',
|
|
80
|
+
headers: { 'Content-Type': 'application/json' },
|
|
81
|
+
body: JSON.stringify({ priority: newPriority }),
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
if (!response.ok) {
|
|
85
|
+
const data = await response.json();
|
|
86
|
+
throw new Error(data.error || 'Failed to update priority');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
onUpdate?.(newPriority);
|
|
90
|
+
toast.success('Priority updated');
|
|
91
|
+
} catch (err) {
|
|
92
|
+
setPriority(previousPriority); // Rollback
|
|
93
|
+
const errorMessage = err instanceof Error ? err.message : 'Failed to update';
|
|
94
|
+
setError(errorMessage);
|
|
95
|
+
toast.error('Failed to update priority', { description: errorMessage });
|
|
96
|
+
console.error('Priority update failed:', err);
|
|
97
|
+
} finally {
|
|
98
|
+
setIsUpdating(false);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const config = priorityConfig[priority] || priorityConfig.medium;
|
|
103
|
+
const Icon = config.icon;
|
|
104
|
+
|
|
105
|
+
return (
|
|
106
|
+
<div className="relative">
|
|
107
|
+
<Select
|
|
108
|
+
value={priority}
|
|
109
|
+
onValueChange={(value) => handleChange(value as Priority)}
|
|
110
|
+
disabled={disabled || isUpdating}
|
|
111
|
+
>
|
|
112
|
+
<SelectTrigger
|
|
113
|
+
className={cn(
|
|
114
|
+
'h-7 w-fit min-w-[100px] border-0 px-2 text-xs font-medium',
|
|
115
|
+
config.className,
|
|
116
|
+
isUpdating && 'opacity-70'
|
|
117
|
+
)}
|
|
118
|
+
aria-label="Change spec priority"
|
|
119
|
+
>
|
|
120
|
+
<div className="flex items-center gap-1.5">
|
|
121
|
+
{isUpdating ? (
|
|
122
|
+
<Loader2 className="h-3.5 w-3.5 animate-spin" />
|
|
123
|
+
) : (
|
|
124
|
+
<Icon className="h-3.5 w-3.5" />
|
|
125
|
+
)}
|
|
126
|
+
<SelectValue>
|
|
127
|
+
{config.label}
|
|
128
|
+
</SelectValue>
|
|
129
|
+
</div>
|
|
130
|
+
</SelectTrigger>
|
|
131
|
+
<SelectContent>
|
|
132
|
+
{PRIORITIES.map((p) => {
|
|
133
|
+
const cfg = priorityConfig[p];
|
|
134
|
+
const ItemIcon = cfg.icon;
|
|
135
|
+
return (
|
|
136
|
+
<SelectItem key={p} value={p} className="pl-2">
|
|
137
|
+
<div className="flex items-center gap-2">
|
|
138
|
+
<ItemIcon className="h-4 w-4" />
|
|
139
|
+
<span>{cfg.label}</span>
|
|
140
|
+
</div>
|
|
141
|
+
</SelectItem>
|
|
142
|
+
);
|
|
143
|
+
})}
|
|
144
|
+
</SelectContent>
|
|
145
|
+
</Select>
|
|
146
|
+
{error && (
|
|
147
|
+
<div className="absolute top-full left-0 mt-1 text-xs text-destructive">
|
|
148
|
+
{error}
|
|
149
|
+
</div>
|
|
150
|
+
)}
|
|
151
|
+
</div>
|
|
152
|
+
);
|
|
153
|
+
}
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
|
|
6
6
|
'use client';
|
|
7
7
|
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
8
|
+
import { useState } from 'react';
|
|
9
|
+
import { useRouter, usePathname } from 'next/navigation';
|
|
10
|
+
import { Check, ChevronsUpDown, Plus, Star, Settings, Loader2 } from 'lucide-react';
|
|
10
11
|
import { cn } from '@/lib/utils';
|
|
11
12
|
import { Button } from '@/components/ui/button';
|
|
12
13
|
import {
|
|
@@ -23,6 +24,7 @@ import {
|
|
|
23
24
|
PopoverContent,
|
|
24
25
|
PopoverTrigger,
|
|
25
26
|
} from '@/components/ui/popover';
|
|
27
|
+
import { Skeleton } from '@/components/ui/skeleton';
|
|
26
28
|
import { useProject } from '@/contexts/project-context';
|
|
27
29
|
import { CreateProjectDialog } from '@/components/create-project-dialog';
|
|
28
30
|
|
|
@@ -32,23 +34,55 @@ interface ProjectSwitcherProps {
|
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
export function ProjectSwitcher({ collapsed }: ProjectSwitcherProps) {
|
|
37
|
+
const router = useRouter();
|
|
38
|
+
const pathname = usePathname();
|
|
35
39
|
const {
|
|
36
40
|
mode,
|
|
37
41
|
currentProject,
|
|
38
42
|
projects,
|
|
39
|
-
|
|
43
|
+
isLoading,
|
|
40
44
|
} = useProject();
|
|
41
45
|
|
|
42
46
|
const [open, setOpen] = useState(false);
|
|
43
47
|
const [showNewProjectDialog, setShowNewProjectDialog] = useState(false);
|
|
48
|
+
const [isSwitching, setIsSwitching] = useState(false);
|
|
49
|
+
|
|
50
|
+
// Show skeleton during initial load
|
|
51
|
+
if (isLoading) {
|
|
52
|
+
return (
|
|
53
|
+
<Skeleton className={cn(
|
|
54
|
+
"w-full",
|
|
55
|
+
collapsed ? "h-9 w-9" : "h-10"
|
|
56
|
+
)} />
|
|
57
|
+
);
|
|
58
|
+
}
|
|
44
59
|
|
|
45
60
|
if (mode !== 'multi-project') {
|
|
46
61
|
return null;
|
|
47
62
|
}
|
|
48
63
|
|
|
49
|
-
const handleProjectSelect =
|
|
50
|
-
|
|
64
|
+
const handleProjectSelect = (projectId: string) => {
|
|
65
|
+
if (projectId === currentProject?.id) {
|
|
66
|
+
setOpen(false);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
setIsSwitching(true);
|
|
51
71
|
setOpen(false);
|
|
72
|
+
|
|
73
|
+
// Extract the path after /projects/{currentProjectId}
|
|
74
|
+
// Pattern: /projects/{projectId} or /projects/{projectId}/...
|
|
75
|
+
const projectPathMatch = pathname.match(/^\/projects\/[^/]+(\/.*)?$/);
|
|
76
|
+
let subPath = projectPathMatch?.[1] || ''; // Empty string = project home page
|
|
77
|
+
|
|
78
|
+
// If on a spec detail page (/specs/{specId}), redirect to specs list instead
|
|
79
|
+
// because the same spec ID might not exist in the other project
|
|
80
|
+
if (subPath.match(/^\/specs\/[^/]+$/)) {
|
|
81
|
+
subPath = '/specs';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Full page navigation - ensures clean state for new project
|
|
85
|
+
window.location.assign(`/projects/${projectId}${subPath}`);
|
|
52
86
|
};
|
|
53
87
|
|
|
54
88
|
const sortedProjects = [...projects].sort((a, b) => {
|
|
@@ -68,19 +102,35 @@ export function ProjectSwitcher({ collapsed }: ProjectSwitcherProps) {
|
|
|
68
102
|
variant="outline"
|
|
69
103
|
role="combobox"
|
|
70
104
|
aria-expanded={open}
|
|
105
|
+
disabled={isSwitching}
|
|
71
106
|
className={cn(
|
|
72
|
-
"w-full justify-between",
|
|
73
|
-
collapsed ? "h-9 w-9 p-0 justify-center" : "px-3"
|
|
107
|
+
"w-full justify-between transition-opacity",
|
|
108
|
+
collapsed ? "h-9 w-9 p-0 justify-center" : "px-3",
|
|
109
|
+
isSwitching && "opacity-70"
|
|
74
110
|
)}
|
|
75
111
|
>
|
|
76
112
|
{collapsed ? (
|
|
77
|
-
|
|
113
|
+
isSwitching ? (
|
|
114
|
+
<Loader2 className="h-4 w-4 animate-spin" />
|
|
115
|
+
) : (
|
|
116
|
+
<div
|
|
117
|
+
className="h-4 w-4 rounded-full border"
|
|
118
|
+
style={{ backgroundColor: currentProject?.color || 'hsl(var(--primary))' }}
|
|
119
|
+
/>
|
|
120
|
+
)
|
|
78
121
|
) : (
|
|
79
122
|
<>
|
|
80
123
|
<div className="flex items-center gap-2 truncate">
|
|
81
|
-
|
|
124
|
+
{isSwitching ? (
|
|
125
|
+
<Loader2 className="h-4 w-4 shrink-0 animate-spin" />
|
|
126
|
+
) : (
|
|
127
|
+
<div
|
|
128
|
+
className="h-4 w-4 rounded-full border shrink-0"
|
|
129
|
+
style={{ backgroundColor: currentProject?.color || 'hsl(var(--primary))' }}
|
|
130
|
+
/>
|
|
131
|
+
)}
|
|
82
132
|
<span className="truncate">
|
|
83
|
-
{currentProject?.name || "Select project..."}
|
|
133
|
+
{isSwitching ? "Switching..." : (currentProject?.name || "Select project...")}
|
|
84
134
|
</span>
|
|
85
135
|
</div>
|
|
86
136
|
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
|
@@ -109,6 +159,10 @@ export function ProjectSwitcher({ collapsed }: ProjectSwitcherProps) {
|
|
|
109
159
|
: "opacity-0"
|
|
110
160
|
)}
|
|
111
161
|
/>
|
|
162
|
+
<div
|
|
163
|
+
className="h-3 w-3 rounded-full shrink-0"
|
|
164
|
+
style={{ backgroundColor: project.color || 'hsl(var(--primary))' }}
|
|
165
|
+
/>
|
|
112
166
|
<span className="truncate flex-1">{project.name}</span>
|
|
113
167
|
{project.favorite && (
|
|
114
168
|
<Star className="h-3 w-3 fill-yellow-500 text-yellow-500" />
|
|
@@ -129,6 +183,16 @@ export function ProjectSwitcher({ collapsed }: ProjectSwitcherProps) {
|
|
|
129
183
|
<Plus className="mr-2 h-4 w-4" />
|
|
130
184
|
Create Project
|
|
131
185
|
</CommandItem>
|
|
186
|
+
<CommandItem
|
|
187
|
+
className="cursor-pointer"
|
|
188
|
+
onSelect={() => {
|
|
189
|
+
setOpen(false);
|
|
190
|
+
router.push('/projects');
|
|
191
|
+
}}
|
|
192
|
+
>
|
|
193
|
+
<Settings className="mr-2 h-4 w-4" />
|
|
194
|
+
Manage Projects
|
|
195
|
+
</CommandItem>
|
|
132
196
|
</CommandGroup>
|
|
133
197
|
</CommandList>
|
|
134
198
|
</Command>
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
} from "@/components/ui/command"
|
|
16
16
|
import { StatusBadge } from "@/components/status-badge"
|
|
17
17
|
import { PriorityBadge } from "@/components/priority-badge"
|
|
18
|
+
import { useProjectUrl } from "@/contexts/project-context"
|
|
18
19
|
|
|
19
20
|
interface Spec {
|
|
20
21
|
id: string
|
|
@@ -32,6 +33,7 @@ interface QuickSearchProps {
|
|
|
32
33
|
|
|
33
34
|
export function QuickSearch({ specs }: QuickSearchProps) {
|
|
34
35
|
const router = useRouter()
|
|
36
|
+
const { getSpecUrl } = useProjectUrl()
|
|
35
37
|
const [open, setOpen] = React.useState(false)
|
|
36
38
|
const [search, setSearch] = React.useState("")
|
|
37
39
|
const [recentSearches, setRecentSearches] = React.useState<string[]>([])
|
|
@@ -85,7 +87,7 @@ export function QuickSearch({ specs }: QuickSearchProps) {
|
|
|
85
87
|
localStorage.setItem("leanspec-recent-searches", JSON.stringify(updated))
|
|
86
88
|
|
|
87
89
|
// Navigate
|
|
88
|
-
router.push(
|
|
90
|
+
router.push(getSpecUrl(specId))
|
|
89
91
|
setOpen(false)
|
|
90
92
|
setSearch("")
|
|
91
93
|
}
|
|
@@ -21,10 +21,9 @@ import { cn } from '@/lib/utils';
|
|
|
21
21
|
const NODE_WIDTH = 280;
|
|
22
22
|
const NODE_HEIGHT = 110;
|
|
23
23
|
const precedenceColor = '#f59e0b';
|
|
24
|
-
const relatedColor = '#38bdf8';
|
|
25
24
|
const requiredByColor = '#ef4444'; // Red color for downstream dependents
|
|
26
25
|
|
|
27
|
-
type GraphTone = 'precedence' | '
|
|
26
|
+
type GraphTone = 'precedence' | 'current' | 'required-by';
|
|
28
27
|
|
|
29
28
|
interface SpecNodeData {
|
|
30
29
|
label: string;
|
|
@@ -38,7 +37,6 @@ interface SpecNodeData {
|
|
|
38
37
|
const toneClasses: Record<GraphTone, string> = {
|
|
39
38
|
current: 'border-primary/70 bg-primary/5 text-foreground',
|
|
40
39
|
precedence: 'border-amber-400/70 bg-amber-400/10 text-amber-900 dark:text-amber-200',
|
|
41
|
-
related: 'border-sky-400/70 bg-sky-400/10 text-sky-900 dark:text-sky-200',
|
|
42
40
|
'required-by': 'border-red-400/70 bg-red-400/10 text-red-900 dark:text-red-200',
|
|
43
41
|
};
|
|
44
42
|
|
|
@@ -82,6 +80,7 @@ interface SpecDependencyGraphProps {
|
|
|
82
80
|
relationships: SpecRelationships;
|
|
83
81
|
specNumber?: number | null;
|
|
84
82
|
specTitle: string;
|
|
83
|
+
projectId?: string;
|
|
85
84
|
}
|
|
86
85
|
|
|
87
86
|
interface GraphPayload {
|
|
@@ -99,13 +98,15 @@ function formatRelationshipLabel(value: string) {
|
|
|
99
98
|
return remainder ? `#${number} ${remainder}` : `#${number}`;
|
|
100
99
|
}
|
|
101
100
|
|
|
102
|
-
function buildRelationshipHref(value: string) {
|
|
101
|
+
function buildRelationshipHref(value: string, projectId?: string) {
|
|
103
102
|
const trimmed = value.trim();
|
|
104
103
|
const match = trimmed.match(/^(\d+)/);
|
|
105
|
-
|
|
106
|
-
|
|
104
|
+
const specNumber = match ? parseInt(match[1], 10) : trimmed;
|
|
105
|
+
|
|
106
|
+
if (projectId) {
|
|
107
|
+
return `/projects/${projectId}/specs/${specNumber}`;
|
|
107
108
|
}
|
|
108
|
-
return `/specs/${
|
|
109
|
+
return `/specs/${specNumber}`;
|
|
109
110
|
}
|
|
110
111
|
|
|
111
112
|
function nodeId(prefix: string, value: string, index: number) {
|
|
@@ -137,7 +138,7 @@ function layoutGraph(nodes: Node<SpecNodeData>[], edges: Edge[]): GraphPayload {
|
|
|
137
138
|
return { nodes: layoutedNodes, edges };
|
|
138
139
|
}
|
|
139
140
|
|
|
140
|
-
function buildGraph(relationships: SpecRelationships, specNumber: number | null | undefined, specTitle: string) {
|
|
141
|
+
function buildGraph(relationships: SpecRelationships, specNumber: number | null | undefined, specTitle: string, projectId?: string) {
|
|
141
142
|
const nodes: Node<SpecNodeData>[] = [];
|
|
142
143
|
const edges: Edge[] = [];
|
|
143
144
|
const centerLabel = specNumber ? `#${specNumber.toString().padStart(3, '0')} ${specTitle}` : specTitle;
|
|
@@ -172,7 +173,7 @@ function buildGraph(relationships: SpecRelationships, specNumber: number | null
|
|
|
172
173
|
badge: 'Depends On',
|
|
173
174
|
subtitle: 'Must complete first',
|
|
174
175
|
tone: 'precedence',
|
|
175
|
-
href: buildRelationshipHref(value),
|
|
176
|
+
href: buildRelationshipHref(value, projectId),
|
|
176
177
|
interactive: true,
|
|
177
178
|
},
|
|
178
179
|
position: { x: 0, y: 0 },
|
|
@@ -211,7 +212,7 @@ function buildGraph(relationships: SpecRelationships, specNumber: number | null
|
|
|
211
212
|
badge: 'Required By',
|
|
212
213
|
subtitle: 'Blocked by this spec',
|
|
213
214
|
tone: 'required-by',
|
|
214
|
-
href: buildRelationshipHref(value),
|
|
215
|
+
href: buildRelationshipHref(value, projectId),
|
|
215
216
|
interactive: true,
|
|
216
217
|
},
|
|
217
218
|
position: { x: 0, y: 0 },
|
|
@@ -239,54 +240,14 @@ function buildGraph(relationships: SpecRelationships, specNumber: number | null
|
|
|
239
240
|
});
|
|
240
241
|
});
|
|
241
242
|
|
|
242
|
-
// Related: Bidirectional informational connections
|
|
243
|
-
relationships.related?.forEach((value, index) => {
|
|
244
|
-
const id = nodeId('related', value, index);
|
|
245
|
-
nodes.push({
|
|
246
|
-
id,
|
|
247
|
-
type: 'specNode',
|
|
248
|
-
data: {
|
|
249
|
-
label: formatRelationshipLabel(value),
|
|
250
|
-
badge: 'Related',
|
|
251
|
-
subtitle: 'Connected work',
|
|
252
|
-
tone: 'related',
|
|
253
|
-
href: buildRelationshipHref(value),
|
|
254
|
-
interactive: true,
|
|
255
|
-
},
|
|
256
|
-
position: { x: 0, y: 0 },
|
|
257
|
-
draggable: false,
|
|
258
|
-
selectable: true,
|
|
259
|
-
sourcePosition: Position.Right,
|
|
260
|
-
targetPosition: Position.Left,
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
edges.push({
|
|
264
|
-
id: `edge-current-${id}`,
|
|
265
|
-
source: currentNode.id,
|
|
266
|
-
target: id,
|
|
267
|
-
type: 'smoothstep',
|
|
268
|
-
markerEnd: {
|
|
269
|
-
type: MarkerType.ArrowClosed,
|
|
270
|
-
color: relatedColor,
|
|
271
|
-
width: 24,
|
|
272
|
-
height: 24,
|
|
273
|
-
},
|
|
274
|
-
style: {
|
|
275
|
-
stroke: relatedColor,
|
|
276
|
-
strokeWidth: 3,
|
|
277
|
-
strokeDasharray: '10 8',
|
|
278
|
-
},
|
|
279
|
-
});
|
|
280
|
-
});
|
|
281
|
-
|
|
282
243
|
return layoutGraph(nodes, edges);
|
|
283
244
|
}
|
|
284
245
|
|
|
285
|
-
export function SpecDependencyGraph({ relationships, specNumber, specTitle }: SpecDependencyGraphProps) {
|
|
246
|
+
export function SpecDependencyGraph({ relationships, specNumber, specTitle, projectId }: SpecDependencyGraphProps) {
|
|
286
247
|
const router = useRouter();
|
|
287
248
|
const [instance, setInstance] = React.useState<ReactFlowInstance | null>(null);
|
|
288
249
|
|
|
289
|
-
const graph = React.useMemo(() => buildGraph(relationships, specNumber, specTitle), [relationships, specNumber, specTitle]);
|
|
250
|
+
const graph = React.useMemo(() => buildGraph(relationships, specNumber, specTitle, projectId), [relationships, specNumber, specTitle, projectId]);
|
|
290
251
|
|
|
291
252
|
const handleInit = React.useCallback((flowInstance: ReactFlowInstance) => {
|
|
292
253
|
setInstance(flowInstance);
|
|
@@ -17,6 +17,9 @@ import { Button } from '@/components/ui/button';
|
|
|
17
17
|
import { SpecTimeline } from '@/components/spec-timeline';
|
|
18
18
|
import { StatusBadge } from '@/components/status-badge';
|
|
19
19
|
import { PriorityBadge } from '@/components/priority-badge';
|
|
20
|
+
import { StatusEditor } from '@/components/status-editor';
|
|
21
|
+
import { PriorityEditor } from '@/components/priority-editor';
|
|
22
|
+
import { TagsEditor } from '@/components/tags-editor';
|
|
20
23
|
import { MarkdownLink } from '@/components/markdown-link';
|
|
21
24
|
import { TableOfContents, TableOfContentsSidebar } from '@/components/table-of-contents';
|
|
22
25
|
import { BackToTop } from '@/components/back-to-top';
|
|
@@ -31,6 +34,7 @@ import {
|
|
|
31
34
|
} from '@/components/ui/dialog';
|
|
32
35
|
import { extractH1Title, cn } from '@/lib/utils';
|
|
33
36
|
import { formatRelativeTime } from '@/lib/date-utils';
|
|
37
|
+
import { useProjectUrl } from '@/contexts/project-context';
|
|
34
38
|
import type { SpecWithMetadata } from '@/types/specs';
|
|
35
39
|
import {
|
|
36
40
|
FileText,
|
|
@@ -46,8 +50,10 @@ import {
|
|
|
46
50
|
Clock,
|
|
47
51
|
Maximize2,
|
|
48
52
|
Minimize2,
|
|
49
|
-
List as ListIcon
|
|
53
|
+
List as ListIcon,
|
|
54
|
+
ExternalLink
|
|
50
55
|
} from 'lucide-react';
|
|
56
|
+
import Link from 'next/link';
|
|
51
57
|
import type { Plugin } from 'unified';
|
|
52
58
|
import { visit } from 'unist-util-visit';
|
|
53
59
|
import type { Html, Root } from 'mdast';
|
|
@@ -96,9 +102,21 @@ export function SpecDetailClient({ initialSpec, initialSubSpec, isFocusMode = fa
|
|
|
96
102
|
const [timelineDialogOpen, setTimelineDialogOpen] = React.useState(false);
|
|
97
103
|
const [dependenciesDialogOpen, setDependenciesDialogOpen] = React.useState(false);
|
|
98
104
|
|
|
105
|
+
// Get project context for API URLs
|
|
106
|
+
const { getSpecUrl, projectId } = useProjectUrl();
|
|
107
|
+
|
|
108
|
+
// Build API URLs based on project context
|
|
109
|
+
const specApiUrl = projectId
|
|
110
|
+
? `/api/projects/${projectId}/specs/${initialSpec.specNumber || initialSpec.id}`
|
|
111
|
+
: `/api/specs/${initialSpec.specNumber || initialSpec.id}`;
|
|
112
|
+
|
|
113
|
+
const depGraphApiUrl = projectId
|
|
114
|
+
? `/api/projects/${projectId}/specs/${initialSpec.specNumber || initialSpec.id}/dependency-graph`
|
|
115
|
+
: `/api/specs/${initialSpec.specNumber || initialSpec.id}/dependency-graph`;
|
|
116
|
+
|
|
99
117
|
// Use SWR for client-side caching with the initial spec as fallback
|
|
100
118
|
const { data: specData, error, isLoading } = useSWR<{ spec: SpecWithMetadata }>(
|
|
101
|
-
|
|
119
|
+
specApiUrl,
|
|
102
120
|
fetcher,
|
|
103
121
|
{
|
|
104
122
|
fallbackData: { spec: initialSpec },
|
|
@@ -112,9 +130,8 @@ export function SpecDetailClient({ initialSpec, initialSubSpec, isFocusMode = fa
|
|
|
112
130
|
current: { specName: string; specNumber?: number };
|
|
113
131
|
dependsOn: { specName: string; specNumber?: number }[];
|
|
114
132
|
requiredBy: { specName: string; specNumber?: number }[];
|
|
115
|
-
related: { specName: string; specNumber?: number }[];
|
|
116
133
|
}>(
|
|
117
|
-
dependenciesDialogOpen ?
|
|
134
|
+
dependenciesDialogOpen ? depGraphApiUrl : null,
|
|
118
135
|
fetcher,
|
|
119
136
|
{
|
|
120
137
|
revalidateOnFocus: false,
|
|
@@ -132,12 +149,14 @@ export function SpecDetailClient({ initialSpec, initialSubSpec, isFocusMode = fa
|
|
|
132
149
|
? {
|
|
133
150
|
dependsOn: dependencyGraphData.dependsOn.map(s => s.specName),
|
|
134
151
|
requiredBy: dependencyGraphData.requiredBy.map(s => s.specName),
|
|
135
|
-
related: dependencyGraphData.related.map(s => s.specName),
|
|
136
152
|
}
|
|
137
153
|
: relationships;
|
|
138
154
|
|
|
139
155
|
const hasRelationships = Boolean(
|
|
140
|
-
relationships && (
|
|
156
|
+
relationships && (
|
|
157
|
+
(relationships.dependsOn?.length ?? 0) > 0 ||
|
|
158
|
+
(relationships.requiredBy?.length ?? 0) > 0
|
|
159
|
+
)
|
|
141
160
|
);
|
|
142
161
|
|
|
143
162
|
React.useEffect(() => {
|
|
@@ -173,8 +192,8 @@ export function SpecDetailClient({ initialSpec, initialSubSpec, isFocusMode = fa
|
|
|
173
192
|
// Handle sub-spec switching with optimistic UI (instant, no network)
|
|
174
193
|
const handleSubSpecSwitch = (file: string | null) => {
|
|
175
194
|
const newUrl = file
|
|
176
|
-
?
|
|
177
|
-
:
|
|
195
|
+
? getSpecUrl(spec.specNumber || spec.id, file)
|
|
196
|
+
: getSpecUrl(spec.specNumber || spec.id);
|
|
178
197
|
|
|
179
198
|
// Use shallow routing to avoid full page reload
|
|
180
199
|
router.push(newUrl, { scroll: false });
|
|
@@ -274,26 +293,23 @@ export function SpecDetailClient({ initialSpec, initialSubSpec, isFocusMode = fa
|
|
|
274
293
|
|
|
275
294
|
{/* Line 2: Status, Priority, Tags, Actions */}
|
|
276
295
|
<div className="flex flex-wrap items-center gap-2">
|
|
277
|
-
<
|
|
278
|
-
|
|
296
|
+
<StatusEditor
|
|
297
|
+
specId={spec.specNumber?.toString() || spec.id}
|
|
298
|
+
currentStatus={spec.status || 'planned'}
|
|
299
|
+
projectId={projectId}
|
|
300
|
+
/>
|
|
301
|
+
<PriorityEditor
|
|
302
|
+
specId={spec.specNumber?.toString() || spec.id}
|
|
303
|
+
currentPriority={spec.priority || 'medium'}
|
|
304
|
+
projectId={projectId}
|
|
305
|
+
/>
|
|
279
306
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
{tag}
|
|
287
|
-
</Badge>
|
|
288
|
-
))}
|
|
289
|
-
{tags.length > 5 && (
|
|
290
|
-
<Badge variant="secondary" className="text-xs">
|
|
291
|
-
+{tags.length - 5} more
|
|
292
|
-
</Badge>
|
|
293
|
-
)}
|
|
294
|
-
</div>
|
|
295
|
-
</>
|
|
296
|
-
)}
|
|
307
|
+
<div className="h-4 w-px bg-border mx-1 hidden sm:block" />
|
|
308
|
+
<TagsEditor
|
|
309
|
+
specId={spec.specNumber?.toString() || spec.id}
|
|
310
|
+
currentTags={tags}
|
|
311
|
+
projectId={projectId}
|
|
312
|
+
/>
|
|
297
313
|
</div>
|
|
298
314
|
|
|
299
315
|
{/* Line 3: Small metadata row */}
|
|
@@ -368,8 +384,19 @@ export function SpecDetailClient({ initialSpec, initialSubSpec, isFocusMode = fa
|
|
|
368
384
|
<DialogContent className="flex h-[85vh] w-[min(1200px,95vw)] max-w-6xl flex-col gap-4 overflow-hidden">
|
|
369
385
|
<DialogHeader>
|
|
370
386
|
<DialogTitle>Dependency Graph</DialogTitle>
|
|
371
|
-
<DialogDescription>
|
|
372
|
-
Precedence requirements and connected specs rendered with automatic layout
|
|
387
|
+
<DialogDescription className="flex flex-col gap-2">
|
|
388
|
+
<span>Precedence requirements and connected specs rendered with automatic layout.</span>
|
|
389
|
+
<Link
|
|
390
|
+
href={projectId
|
|
391
|
+
? `/projects/${projectId}/dependencies?spec=${spec.specNumber || spec.id}`
|
|
392
|
+
: `/dependencies?spec=${spec.specNumber || spec.id}`
|
|
393
|
+
}
|
|
394
|
+
className="inline-flex items-center gap-1.5 text-xs text-primary hover:underline w-fit"
|
|
395
|
+
onClick={() => setDependenciesDialogOpen(false)}
|
|
396
|
+
>
|
|
397
|
+
<ExternalLink className="h-3 w-3" />
|
|
398
|
+
View in full dependencies page
|
|
399
|
+
</Link>
|
|
373
400
|
</DialogDescription>
|
|
374
401
|
</DialogHeader>
|
|
375
402
|
<div className="min-h-0 flex-1">
|
|
@@ -378,6 +405,7 @@ export function SpecDetailClient({ initialSpec, initialSubSpec, isFocusMode = fa
|
|
|
378
405
|
relationships={completeRelationships}
|
|
379
406
|
specNumber={spec.specNumber}
|
|
380
407
|
specTitle={displayTitle}
|
|
408
|
+
projectId={projectId}
|
|
381
409
|
/>
|
|
382
410
|
)}
|
|
383
411
|
</div>
|
|
@@ -458,7 +486,7 @@ export function SpecDetailClient({ initialSpec, initialSubSpec, isFocusMode = fa
|
|
|
458
486
|
remarkPlugins={[remarkGfm, remarkStripHtmlComments]}
|
|
459
487
|
rehypePlugins={[rehypeHighlight, rehypeSlug]}
|
|
460
488
|
components={{
|
|
461
|
-
a: (props) => <MarkdownLink {...props} currentSpecNumber={spec.specNumber || undefined} />,
|
|
489
|
+
a: (props) => <MarkdownLink {...props} currentSpecNumber={spec.specNumber || undefined} projectId={projectId} />,
|
|
462
490
|
pre: ({ children, ...props }) => {
|
|
463
491
|
// Safely get the first child element
|
|
464
492
|
const childArray = React.Children.toArray(children);
|
|
@@ -11,11 +11,11 @@ import { SpecDetailClient } from '@/components/spec-detail-client';
|
|
|
11
11
|
import { primeSpecsSidebar, setActiveSidebarSpec } from '@/lib/stores/specs-sidebar-store';
|
|
12
12
|
import { cn } from '@/lib/utils';
|
|
13
13
|
import type { SpecWithMetadata, SidebarSpec } from '@/types/specs';
|
|
14
|
-
import type {
|
|
14
|
+
import type { LightweightSpec } from '@/lib/db/service-queries';
|
|
15
15
|
|
|
16
16
|
interface SpecDetailWrapperProps {
|
|
17
17
|
spec: SpecWithMetadata;
|
|
18
|
-
allSpecs:
|
|
18
|
+
allSpecs: LightweightSpec[];
|
|
19
19
|
currentSubSpec?: string;
|
|
20
20
|
}
|
|
21
21
|
|
|
@@ -45,9 +45,8 @@ export function SpecDetailWrapper({ spec, allSpecs, currentSubSpec }: SpecDetail
|
|
|
45
45
|
status: item.status,
|
|
46
46
|
priority: item.priority,
|
|
47
47
|
tags: item.tags,
|
|
48
|
-
contentMd: item.contentMd,
|
|
49
48
|
updatedAt: item.updatedAt,
|
|
50
|
-
subSpecsCount: ('subSpecsCount' in item) ? (item as
|
|
49
|
+
subSpecsCount: ('subSpecsCount' in item) ? (item as unknown as { subSpecsCount: number }).subSpecsCount : undefined,
|
|
51
50
|
}))
|
|
52
51
|
), [allSpecs]);
|
|
53
52
|
|