@leanspec/ui 0.2.7 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. 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
  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
  3. 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
  4. 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
  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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. package/.next/standalone/node_modules/.pnpm/@img+sharp-linuxmusl-x64@0.34.5/node_modules/@img/sharp-linuxmusl-x64/package.json +46 -0
  15. package/.next/standalone/node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/build/Release/better_sqlite3.node +0 -0
  16. package/.next/standalone/packages/ui/.next/BUILD_ID +1 -1
  17. package/.next/standalone/packages/ui/.next/app-path-routes-manifest.json +2 -0
  18. package/.next/standalone/packages/ui/.next/build-manifest.json +2 -2
  19. package/.next/standalone/packages/ui/.next/prerender-manifest.json +3 -3
  20. package/.next/standalone/packages/ui/.next/required-server-files.json +4 -4
  21. package/.next/standalone/packages/ui/.next/routes-manifest.json +12 -0
  22. package/.next/standalone/packages/ui/.next/server/app/_global-error.html +2 -2
  23. package/.next/standalone/packages/ui/.next/server/app/_global-error.rsc +1 -1
  24. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  25. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  26. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  27. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  28. package/.next/standalone/packages/ui/.next/server/app/_not-found/page.js +1 -1
  29. package/.next/standalone/packages/ui/.next/server/app/_not-found/page.js.nft.json +1 -1
  30. package/.next/standalone/packages/ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/packages/ui/.next/server/app/_not-found.html +2 -2
  32. package/.next/standalone/packages/ui/.next/server/app/_not-found.rsc +18 -18
  33. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_full.segment.rsc +18 -18
  34. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
  35. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
  36. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  37. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_tree.segment.rsc +6 -6
  38. package/.next/standalone/packages/ui/.next/server/app/api/context/route/app-paths-manifest.json +3 -0
  39. package/.next/standalone/packages/ui/.next/server/app/api/context/route/build-manifest.json +11 -0
  40. package/.next/standalone/packages/ui/.next/server/app/api/context/route/server-reference-manifest.json +4 -0
  41. package/.next/standalone/packages/ui/.next/server/app/api/context/route.js +8 -0
  42. package/.next/standalone/packages/ui/.next/server/app/api/context/route.js.map +5 -0
  43. package/.next/standalone/packages/ui/.next/server/app/api/context/route.js.nft.json +1 -0
  44. package/.next/standalone/packages/ui/.next/server/app/api/context/route_client-reference-manifest.js +2 -0
  45. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/[id]/route.js.nft.json +1 -1
  46. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/discover/route.js.nft.json +1 -1
  47. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/list-directory/route.js.nft.json +1 -1
  48. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/route.js.nft.json +1 -1
  49. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
  50. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/route.js.nft.json +1 -1
  51. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/status/route.js.nft.json +1 -1
  52. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/route.js.nft.json +1 -1
  53. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/stats/route.js.nft.json +1 -1
  54. package/.next/standalone/packages/ui/.next/server/app/api/projects/route.js.nft.json +1 -1
  55. package/.next/standalone/packages/ui/.next/server/app/api/revalidate/route.js.nft.json +1 -1
  56. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/dependency-graph/route.js.nft.json +1 -1
  57. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/route.js.nft.json +1 -1
  58. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route.js.nft.json +1 -1
  59. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/subspecs/[file]/route.js.nft.json +1 -1
  60. package/.next/standalone/packages/ui/.next/server/app/api/stats/route.js.nft.json +1 -1
  61. package/.next/standalone/packages/ui/.next/server/app/context/page/app-paths-manifest.json +3 -0
  62. package/.next/standalone/packages/ui/.next/server/app/context/page/build-manifest.json +18 -0
  63. package/.next/standalone/packages/ui/.next/server/app/context/page/next-font-manifest.json +6 -0
  64. package/.next/standalone/packages/ui/.next/server/app/context/page/react-loadable-manifest.json +1 -0
  65. package/.next/standalone/packages/ui/.next/server/app/context/page/server-reference-manifest.json +4 -0
  66. package/.next/standalone/packages/ui/.next/server/app/context/page.js +19 -0
  67. package/.next/standalone/packages/ui/.next/server/app/context/page.js.map +5 -0
  68. package/.next/standalone/packages/ui/.next/server/app/context/page.js.nft.json +1 -0
  69. package/.next/standalone/packages/ui/.next/server/app/context/page_client-reference-manifest.js +2 -0
  70. package/.next/standalone/packages/ui/.next/server/app/page.js +1 -1
  71. package/.next/standalone/packages/ui/.next/server/app/page.js.nft.json +1 -1
  72. package/.next/standalone/packages/ui/.next/server/app/page_client-reference-manifest.js +1 -1
  73. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page.js +1 -1
  74. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page.js.nft.json +1 -1
  75. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page_client-reference-manifest.js +1 -1
  76. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/[specId]/page.js +1 -1
  77. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/[specId]/page.js.nft.json +1 -1
  78. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/[specId]/page_client-reference-manifest.js +1 -1
  79. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/page.js +1 -1
  80. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/page.js.nft.json +1 -1
  81. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/page_client-reference-manifest.js +1 -1
  82. package/.next/standalone/packages/ui/.next/server/app/projects/page.js +1 -1
  83. package/.next/standalone/packages/ui/.next/server/app/projects/page.js.nft.json +1 -1
  84. package/.next/standalone/packages/ui/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  85. package/.next/standalone/packages/ui/.next/server/app/projects.html +2 -2
  86. package/.next/standalone/packages/ui/.next/server/app/projects.rsc +12 -12
  87. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_full.segment.rsc +12 -12
  88. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_index.segment.rsc +9 -9
  89. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_tree.segment.rsc +3 -3
  90. package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +2 -2
  91. package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects.segment.rsc +1 -1
  92. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page.js +1 -1
  93. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page.js.nft.json +1 -1
  94. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page_client-reference-manifest.js +1 -1
  95. package/.next/standalone/packages/ui/.next/server/app/specs/page.js +1 -1
  96. package/.next/standalone/packages/ui/.next/server/app/specs/page.js.nft.json +1 -1
  97. package/.next/standalone/packages/ui/.next/server/app/specs/page_client-reference-manifest.js +1 -1
  98. package/.next/standalone/packages/ui/.next/server/app/stats/page.js +1 -1
  99. package/.next/standalone/packages/ui/.next/server/app/stats/page.js.nft.json +1 -1
  100. package/.next/standalone/packages/ui/.next/server/app/stats/page_client-reference-manifest.js +1 -1
  101. package/.next/standalone/packages/ui/.next/server/app-paths-manifest.json +2 -0
  102. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__3559376c._.js +2 -2
  103. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__65667b70._.js +1 -1
  104. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__803d07f0._.js +1 -1
  105. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__84cdc14a._.js +1 -1
  106. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__8a9ab1a3._.js +3 -0
  107. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__bdc3963a._.js +1 -1
  108. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__f5c6d6b8._.js +1 -1
  109. package/.next/standalone/packages/ui/.next/server/chunks/packages_ui__next-internal_server_app_api_context_route_actions_dead6daa.js +3 -0
  110. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__12b4eb41._.js +3 -0
  111. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__69a0d63a._.js +3 -0
  112. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__6e739186._.js +7 -0
  113. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__a4c56419._.js +7 -0
  114. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__b6632d78._.js +3 -0
  115. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__daee3355._.js +1 -1
  116. package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__5382b397._.js → [root-of-the-server]__ead1539c._.js} +2 -2
  117. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_000dd317._.js +1 -1
  118. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_0f9ffe32._.js +1 -1
  119. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_28fe1532._.js +5 -0
  120. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_315f3b3a._.js +3 -0
  121. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_959ad3d8._.js +4 -0
  122. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_9dcf102b._.js +3 -0
  123. package/.next/standalone/packages/ui/.next/server/chunks/ssr/{_497c8b73._.js → _b397e94a._.js} +2 -2
  124. package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_8272a49c._.js +3 -0
  125. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui__next-internal_server_app_context_page_actions_1a062d48.js +3 -0
  126. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_context_context-client_tsx_4ba99a62._.js +12 -0
  127. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_specs_specs-client_tsx_0bb8f8f8._.js +1 -1
  128. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_components_specs-nav-sidebar_tsx_8237ed13._.js +1 -1
  129. package/.next/standalone/packages/ui/.next/server/pages/404.html +2 -2
  130. package/.next/standalone/packages/ui/.next/server/pages/500.html +2 -2
  131. package/.next/standalone/packages/ui/.next/server/server-reference-manifest.js +1 -1
  132. package/.next/standalone/packages/ui/.next/server/server-reference-manifest.json +1 -1
  133. package/.next/standalone/packages/ui/.next/static/chunks/1eb8283995f370c6.js +1 -0
  134. package/.next/standalone/packages/ui/.next/static/chunks/336e8e8fc6b0fba8.js +1 -0
  135. package/.next/standalone/packages/ui/.next/static/chunks/37a1236ed50645a6.js +1 -0
  136. package/.next/standalone/packages/ui/.next/static/chunks/9d84ba08a41145ec.js +5 -0
  137. package/.next/standalone/packages/ui/.next/static/chunks/c4b1faff3361a749.js +1 -0
  138. package/.next/standalone/packages/ui/.next/static/chunks/{294dea6dbec43ca6.js → d7420d2a867e57b5.js} +1 -1
  139. package/.next/{static/chunks/cca4441cde342ae3.js → standalone/packages/ui/.next/static/chunks/dae403679aae65f4.js} +1 -1
  140. package/.next/standalone/packages/ui/.next/static/chunks/efded9da04c960d8.js +1 -0
  141. package/.next/standalone/packages/ui/.next/static/chunks/f382932f1a5d6359.js +10 -0
  142. package/.next/standalone/packages/ui/.next/static/chunks/f43b6e43b4da1a32.css +1 -0
  143. package/.next/standalone/packages/ui/.next/static/chunks/f6dd06e6d22d2d12.js +3 -0
  144. package/.next/standalone/packages/ui/dist/BUILD_ID +1 -0
  145. package/.next/standalone/packages/ui/dist/standalone/packages/web/package.json +1 -9
  146. package/.next/standalone/packages/ui/dist/standalone/packages/web/server.js +1 -1
  147. package/.next/standalone/packages/ui/dist/standalone/specs/035-live-specs-showcase/README.md +3 -7
  148. package/.next/standalone/packages/ui/dist/standalone/specs/072-ai-agent-first-use-workflow/README.md +3 -5
  149. package/.next/standalone/packages/ui/dist/standalone/specs/081-web-app-ux-redesign/README.md +1 -2
  150. package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/README.md +3 -8
  151. package/.next/standalone/packages/ui/dist/standalone/specs/087-cli-ui-command/README.md +259 -73
  152. package/.next/standalone/packages/ui/dist/standalone/specs/088-core-concepts-terminology-only/README.md +3 -5
  153. package/.next/standalone/packages/ui/dist/standalone/specs/089-sdd-practical-tutorials/README.md +3 -5
  154. package/.next/standalone/packages/ui/dist/standalone/specs/090-leanspec-sdd-case-studies/README.md +3 -5
  155. package/.next/standalone/packages/ui/dist/standalone/specs/091-chinese-localization-strategy/README.md +23 -33
  156. package/.next/standalone/packages/ui/dist/standalone/specs/092-docs-site-submodule-migration/README.md +3 -7
  157. package/.next/standalone/packages/ui/dist/standalone/specs/093-spec-detail-ui-improvements/README.md +14 -25
  158. package/.next/standalone/packages/ui/dist/static/chunks/0c19c69aa7625475.js +1 -0
  159. package/.next/standalone/packages/ui/dist/static/chunks/116800b03245a1e5.js +1 -0
  160. package/.next/standalone/packages/ui/dist/static/chunks/15843a3d7584e314.js +1 -0
  161. package/.next/standalone/packages/ui/dist/static/chunks/19e80edf527aef5c.js +1 -0
  162. package/.next/standalone/packages/ui/dist/static/chunks/465954d5af3284a9.js +1 -0
  163. package/.next/standalone/packages/ui/dist/static/chunks/5abeeb89f1412a80.js +3 -0
  164. package/.next/standalone/packages/ui/dist/static/chunks/5c2072ad938de8ed.js +1 -0
  165. package/.next/standalone/packages/ui/dist/static/chunks/6a05a93ec8fa7b83.js +1 -0
  166. package/.next/standalone/packages/ui/dist/static/chunks/778e42188e450b39.css +1 -0
  167. package/.next/standalone/packages/ui/dist/static/chunks/a02c1f50ff00204f.js +1 -0
  168. package/.next/standalone/packages/ui/dist/static/chunks/a45464b9776dd88e.js +1 -0
  169. package/.next/standalone/packages/ui/dist/static/chunks/a6dad97d9634a72d.js +1 -0
  170. package/.next/standalone/packages/ui/dist/static/chunks/b0ea0ac61604f843.js +1 -0
  171. package/.next/standalone/packages/ui/dist/static/chunks/c06e85b449720194.js +1 -0
  172. package/.next/standalone/packages/ui/dist/static/chunks/c557ac675be79771.js +1 -0
  173. package/.next/standalone/packages/ui/dist/static/chunks/cad005a57ffbb2d3.js +1 -0
  174. package/.next/standalone/packages/ui/dist/static/chunks/cdf6fe33bc65efbc.js +1 -0
  175. package/.next/standalone/packages/ui/dist/static/chunks/d12ed5dbe44caed7.js +1 -0
  176. package/.next/standalone/packages/ui/dist/static/chunks/d1ebe5c1a344f4ca.js +5 -0
  177. package/.next/standalone/packages/ui/dist/static/chunks/d42cf1682bc46652.js +1 -0
  178. package/.next/standalone/packages/ui/dist/static/chunks/dde5d8bddd7fbfcf.js +1 -0
  179. package/.next/standalone/packages/ui/dist/static/chunks/ebd89051637b9a47.js +4 -0
  180. package/.next/standalone/packages/ui/dist/static/chunks/ec82875d18b29f47.js +2 -0
  181. package/.next/standalone/packages/ui/dist/static/chunks/f0b701df9769bcc5.js +19 -0
  182. package/.next/standalone/packages/ui/dist/static/chunks/turbopack-1c09a99f4c9e28d3.js +3 -0
  183. package/.next/standalone/packages/ui/package.json +3 -1
  184. package/.next/standalone/packages/ui/server.js +1 -1
  185. package/.next/standalone/packages/ui/src/app/api/context/route.ts +22 -0
  186. package/.next/standalone/packages/ui/src/app/context/context-client.tsx +371 -0
  187. package/.next/standalone/packages/ui/src/app/context/page.tsx +17 -0
  188. package/.next/standalone/packages/ui/src/app/globals.css +16 -16
  189. package/.next/standalone/packages/ui/src/app/layout.tsx +4 -7
  190. package/.next/standalone/packages/ui/src/components/context-file-viewer.tsx +291 -0
  191. package/.next/standalone/packages/ui/src/components/main-sidebar.tsx +10 -1
  192. package/.next/standalone/packages/ui/src/components/spec-detail-client.tsx +181 -134
  193. package/.next/standalone/packages/ui/src/components/spec-detail-wrapper.tsx +20 -0
  194. package/.next/standalone/packages/ui/src/components/specs-nav-sidebar.tsx +3 -2
  195. package/.next/standalone/packages/ui/src/components/ui/accordion.tsx +58 -0
  196. package/.next/standalone/packages/ui/src/lib/db/service-queries.ts +172 -3
  197. package/.next/standalone/packages/ui/src/lib/specs/types.ts +44 -0
  198. package/.next/standalone/packages/ui/tsconfig.tsbuildinfo +1 -1
  199. package/.next/static/-Mn9iD4O5f_khGd1P3kmB/_buildManifest.js +11 -0
  200. package/.next/static/-Mn9iD4O5f_khGd1P3kmB/_clientMiddlewareManifest.json +1 -0
  201. package/.next/static/-Mn9iD4O5f_khGd1P3kmB/_ssgManifest.js +1 -0
  202. package/.next/static/chunks/1eb8283995f370c6.js +1 -0
  203. package/.next/static/chunks/336e8e8fc6b0fba8.js +1 -0
  204. package/.next/static/chunks/37a1236ed50645a6.js +1 -0
  205. package/.next/static/chunks/9d84ba08a41145ec.js +5 -0
  206. package/.next/static/chunks/c4b1faff3361a749.js +1 -0
  207. package/.next/static/chunks/{294dea6dbec43ca6.js → d7420d2a867e57b5.js} +1 -1
  208. package/.next/{standalone/packages/ui/.next/static/chunks/cca4441cde342ae3.js → static/chunks/dae403679aae65f4.js} +1 -1
  209. package/.next/static/chunks/efded9da04c960d8.js +1 -0
  210. package/.next/static/chunks/f382932f1a5d6359.js +10 -0
  211. package/.next/static/chunks/f43b6e43b4da1a32.css +1 -0
  212. package/.next/static/chunks/f6dd06e6d22d2d12.js +3 -0
  213. package/package.json +4 -2
  214. 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
  215. package/.next/standalone/node_modules/.pnpm/source-map@0.8.0-beta.0/node_modules/source-map/package.json +0 -95
  216. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__1d0c2012._.js +0 -3
  217. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__73f60f12._.js +0 -7
  218. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__a7ae8552._.js +0 -7
  219. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_14118969._.js +0 -3
  220. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_4129cc0f._.js +0 -3
  221. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_c2f54661._.js +0 -5
  222. package/.next/standalone/packages/ui/.next/static/chunks/16ff9833ae1bb3ae.js +0 -1
  223. package/.next/standalone/packages/ui/.next/static/chunks/2204c0f16b23ec4c.js +0 -3
  224. package/.next/standalone/packages/ui/.next/static/chunks/7590e65bcaa41e8b.js +0 -1
  225. package/.next/standalone/packages/ui/.next/static/chunks/b6976cf6c48996e5.js +0 -1
  226. package/.next/standalone/packages/ui/.next/static/chunks/b845813463167db0.js +0 -5
  227. package/.next/standalone/packages/ui/.next/static/chunks/bd9893e28f8f6a9a.css +0 -1
  228. package/.next/standalone/packages/ui/.next/static/chunks/d784d84d5b880e48.js +0 -1
  229. package/.next/standalone/packages/ui/dist/standalone/packages/web/components.json +0 -20
  230. package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/0000_reflective_thena.sql +0 -59
  231. package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/0001_fresh_carmella_unuscione.sql +0 -1
  232. package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/0000_snapshot.json +0 -427
  233. package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/0001_snapshot.json +0 -436
  234. package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/_journal.json +0 -20
  235. package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle.config.ts +0 -10
  236. package/.next/standalone/packages/ui/dist/standalone/packages/web/eslint.config.mjs +0 -18
  237. package/.next/standalone/packages/ui/dist/standalone/packages/web/next.config.ts +0 -7
  238. package/.next/standalone/packages/ui/dist/standalone/packages/web/postcss.config.mjs +0 -8
  239. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/projects/[id]/specs/route.ts +0 -23
  240. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/projects/route.ts +0 -19
  241. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/revalidate/route.ts +0 -63
  242. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/dependency-graph/route.test.ts +0 -51
  243. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/dependency-graph/route.ts +0 -171
  244. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/route.ts +0 -36
  245. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/subspecs/[file]/route.ts +0 -46
  246. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/stats/route.ts +0 -19
  247. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/board-client.tsx +0 -162
  248. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/loading.tsx +0 -43
  249. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/page.tsx +0 -18
  250. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/dashboard-client.tsx +0 -364
  251. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/error.tsx +0 -43
  252. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/globals.css +0 -531
  253. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/home-client.tsx +0 -277
  254. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/layout.tsx +0 -70
  255. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/loading.tsx +0 -87
  256. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/not-found.tsx +0 -27
  257. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/page.tsx +0 -18
  258. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/[id]/loading.tsx +0 -5
  259. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/[id]/page.tsx +0 -43
  260. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/page.tsx +0 -18
  261. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/specs-client.tsx +0 -425
  262. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/stats/page.tsx +0 -18
  263. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/stats/stats-client.tsx +0 -283
  264. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/back-to-top.tsx +0 -46
  265. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/empty-state.tsx +0 -52
  266. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/main-sidebar.tsx +0 -175
  267. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/markdown-link.test.ts +0 -96
  268. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/markdown-link.tsx +0 -95
  269. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/navigation.tsx +0 -210
  270. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/priority-badge.tsx +0 -53
  271. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/quick-search.tsx +0 -180
  272. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/skeletons.tsx +0 -119
  273. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-dependency-graph.tsx +0 -369
  274. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-client.tsx +0 -372
  275. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-loading-shell.tsx +0 -42
  276. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-wrapper.tsx +0 -70
  277. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-metadata.tsx +0 -136
  278. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-sidebar.tsx +0 -127
  279. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-timeline.tsx +0 -186
  280. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/specs-nav-sidebar.tsx +0 -561
  281. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/status-badge.tsx +0 -53
  282. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/sub-spec-tabs.tsx +0 -143
  283. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/table-of-contents.tsx +0 -130
  284. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/theme-provider.tsx +0 -11
  285. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/theme-toggle.tsx +0 -37
  286. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/avatar.tsx +0 -50
  287. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/badge.tsx +0 -36
  288. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/breadcrumb.tsx +0 -110
  289. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/button.tsx +0 -57
  290. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/card.tsx +0 -76
  291. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/command.tsx +0 -153
  292. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/dialog.tsx +0 -122
  293. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/input.tsx +0 -24
  294. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/select.tsx +0 -159
  295. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/separator.tsx +0 -31
  296. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/skeleton.tsx +0 -15
  297. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/tabs.tsx +0 -55
  298. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/toast.tsx +0 -30
  299. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/tooltip.tsx +0 -32
  300. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/date-utils.ts +0 -76
  301. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/index.ts +0 -42
  302. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/migrate.ts +0 -18
  303. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/queries.ts +0 -114
  304. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/schema.ts +0 -123
  305. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/seed.ts +0 -156
  306. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/service-queries.ts +0 -216
  307. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/dependency-graph.ts +0 -105
  308. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/service.ts +0 -120
  309. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/sources/database-source.ts +0 -94
  310. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/sources/filesystem-source.ts +0 -249
  311. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/types.ts +0 -55
  312. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/stores/specs-sidebar-store.ts +0 -152
  313. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/sub-specs.ts +0 -171
  314. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/utils.ts +0 -17
  315. package/.next/standalone/packages/ui/dist/standalone/packages/web/src/types/specs.ts +0 -18
  316. package/.next/standalone/packages/ui/dist/standalone/packages/web/tailwind.config.ts +0 -58
  317. package/.next/standalone/packages/ui/dist/standalone/packages/web/tsconfig.json +0 -34
  318. package/.next/standalone/packages/ui/dist/standalone/packages/web/tsconfig.tsbuildinfo +0 -1
  319. package/.next/standalone/packages/ui/dist/standalone/packages/web/vitest.config.ts +0 -14
  320. package/.next/standalone/packages/ui/dist/standalone/specs/094-ai-chatbot-web-integration/README.md +0 -332
  321. package/.next/standalone/packages/ui/dist/standalone/specs/095-pr-migration-verification/README.md +0 -339
  322. package/.next/standalone/packages/ui/dist/standalone/specs/096-docs-beginner-first-reorg/README.md +0 -399
  323. package/.next/standalone/packages/ui/dist/standalone/specs/097-dag-visualization-library/README.md +0 -525
  324. package/.next/standalone/packages/ui/dist/standalone/specs/098-github-multi-project-integration/README.md +0 -387
  325. package/.next/standalone/packages/ui/dist/standalone/specs/099-enhanced-dependency-commands-cli-mcp/README.md +0 -613
  326. package/.next/standalone/packages/ui/dist/standalone/specs/100-release-process-typecheck-failure/README.md +0 -266
  327. package/.next/standalone/packages/ui/dist/standalone/specs/101-sidebar-scroll-position-drift/README.md +0 -100
  328. package/.next/standalone/packages/ui/dist/standalone/specs/102-mcp-wrapper-package/README.md +0 -172
  329. package/.next/static/chunks/16ff9833ae1bb3ae.js +0 -1
  330. package/.next/static/chunks/2204c0f16b23ec4c.js +0 -3
  331. package/.next/static/chunks/7590e65bcaa41e8b.js +0 -1
  332. package/.next/static/chunks/b6976cf6c48996e5.js +0 -1
  333. package/.next/static/chunks/b845813463167db0.js +0 -5
  334. package/.next/static/chunks/bd9893e28f8f6a9a.css +0 -1
  335. package/.next/static/chunks/d784d84d5b880e48.js +0 -1
  336. /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
  337. /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
  338. /package/.next/standalone/packages/ui/.next/static/{6nq7WNafPv5Bf_7mWgRQ- → -Mn9iD4O5f_khGd1P3kmB}/_buildManifest.js +0 -0
  339. /package/.next/standalone/packages/ui/.next/static/{6nq7WNafPv5Bf_7mWgRQ- → -Mn9iD4O5f_khGd1P3kmB}/_clientMiddlewareManifest.json +0 -0
  340. /package/.next/standalone/packages/ui/.next/static/{6nq7WNafPv5Bf_7mWgRQ- → -Mn9iD4O5f_khGd1P3kmB}/_ssgManifest.js +0 -0
  341. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/f864aa7e7061c0600e35cf3d879b27cf.txt +0 -0
  342. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/favicon.ico +0 -0
  343. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/file.svg +0 -0
  344. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/github-mark-white.svg +0 -0
  345. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/github-mark.svg +0 -0
  346. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/globe.svg +0 -0
  347. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/icon.svg +0 -0
  348. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/logo-dark-bg.svg +0 -0
  349. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/logo-with-bg.svg +0 -0
  350. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/logo.svg +0 -0
  351. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/next.svg +0 -0
  352. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/vercel.svg +0 -0
  353. /package/.next/standalone/packages/ui/dist/{standalone/packages/web/public → public}/window.svg +0 -0
  354. /package/.next/{static/6nq7WNafPv5Bf_7mWgRQ- → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_buildManifest.js +0 -0
  355. /package/.next/{static/6nq7WNafPv5Bf_7mWgRQ- → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_clientMiddlewareManifest.json +0 -0
  356. /package/.next/{static/6nq7WNafPv5Bf_7mWgRQ- → standalone/packages/ui/dist/static/4ZnYN1WbN4LGJQOwP6FkT}/_ssgManifest.js +0 -0
@@ -1,95 +0,0 @@
1
- /**
2
- * Custom link component for ReactMarkdown that handles internal spec links
3
- */
4
-
5
- import Link from 'next/link';
6
- import { AnchorHTMLAttributes } from 'react';
7
-
8
- interface MarkdownLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
9
- href?: string;
10
- children?: React.ReactNode;
11
- currentSpecNumber?: number;
12
- }
13
-
14
- /**
15
- * Transform internal spec links to proper web app routes
16
- * Examples:
17
- * - ../048-spec-complexity-analysis/ -> /specs/48
18
- * - ../048-spec-complexity-analysis/README.md -> /specs/48
19
- * - ../048-spec-complexity-analysis/DESIGN.md -> /specs/48?subspec=DESIGN.md
20
- * - ./DESIGN.md -> current spec with ?subspec=DESIGN.md
21
- * - #heading -> #heading (anchor links unchanged)
22
- * - https://... -> https://... (external links unchanged)
23
- */
24
- function transformSpecLink(href: string, currentSpecNumber?: number): string {
25
- // Don't transform anchor links or external URLs
26
- if (href.startsWith('#') || href.startsWith('http://') || href.startsWith('https://')) {
27
- return href;
28
- }
29
-
30
- // Match same-directory sub-spec links: ./FILE.md
31
- const sameDirectoryPattern = /^\.\/([^/]+\.md)$/;
32
- const sameDirectoryMatch = href.match(sameDirectoryPattern);
33
-
34
- if (sameDirectoryMatch && currentSpecNumber) {
35
- const subSpecFile = sameDirectoryMatch[1];
36
- if (subSpecFile !== 'README.md') {
37
- return `/specs/${currentSpecNumber}?subspec=${subSpecFile}`;
38
- } else {
39
- return `/specs/${currentSpecNumber}`;
40
- }
41
- }
42
-
43
- // Match internal spec links: ../NNN-spec-name/ or ../NNN-spec-name/FILE.md
44
- const specLinkPattern = /^\.\.\/(\d+)-[^/]+\/?([^/]+\.md)?$/;
45
- const match = href.match(specLinkPattern);
46
-
47
- if (match) {
48
- // Convert to number to remove leading zeros (018 -> 18)
49
- const specNumber = parseInt(match[1], 10);
50
- const subSpecFile = match[2];
51
-
52
- if (subSpecFile && subSpecFile !== 'README.md') {
53
- // Sub-spec link (e.g., DESIGN.md, IMPLEMENTATION.md)
54
- return `/specs/${specNumber}?subspec=${subSpecFile}`;
55
- } else {
56
- // Main spec link (README.md or just the directory)
57
- return `/specs/${specNumber}`;
58
- }
59
- }
60
-
61
- // If no pattern matches, return original href
62
- return href;
63
- }
64
-
65
- export function MarkdownLink({ href, children, currentSpecNumber, ...props }: MarkdownLinkProps) {
66
- if (!href) {
67
- return <a {...props}>{children}</a>;
68
- }
69
-
70
- const transformedHref = transformSpecLink(href, currentSpecNumber);
71
-
72
- // External links or anchor links - use regular <a> tag
73
- const isExternal = transformedHref.startsWith('http://') || transformedHref.startsWith('https://');
74
- const isAnchor = transformedHref.startsWith('#');
75
-
76
- if (isExternal || isAnchor) {
77
- return (
78
- <a
79
- href={transformedHref}
80
- {...props}
81
- target={isExternal ? '_blank' : undefined}
82
- rel={isExternal ? 'noopener noreferrer' : undefined}
83
- >
84
- {children}
85
- </a>
86
- );
87
- }
88
-
89
- // Internal spec links - use Next.js Link
90
- return (
91
- <Link href={transformedHref} {...props} className="text-primary hover:underline">
92
- {children}
93
- </Link>
94
- );
95
- }
@@ -1,210 +0,0 @@
1
- 'use client';
2
-
3
- import Link from 'next/link';
4
- import Image from 'next/image';
5
- import { usePathname } from 'next/navigation';
6
- import { ChevronRight, Menu, BookOpen } from 'lucide-react';
7
- import { ThemeToggle } from '@/components/theme-toggle';
8
- import { QuickSearch } from '@/components/quick-search';
9
- import { Button } from '@/components/ui/button';
10
- import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
11
-
12
- interface Spec {
13
- id: string
14
- specNumber: string
15
- title: string
16
- status: string
17
- priority: string
18
- tags: string[]
19
- createdAt: string
20
- }
21
-
22
- interface NavigationProps {
23
- specs: Spec[]
24
- }
25
-
26
- interface BreadcrumbItem {
27
- label: string;
28
- href?: string;
29
- }
30
-
31
- function Breadcrumb({ items }: { items: BreadcrumbItem[] }) {
32
- return (
33
- <nav className="flex items-center gap-1 text-sm text-muted-foreground">
34
- {items.map((item, index) => (
35
- <div key={index} className="flex items-center gap-1">
36
- {index > 0 && <ChevronRight className="h-4 w-4" />}
37
- {item.href ? (
38
- <Link
39
- href={item.href}
40
- className="hover:text-foreground transition-colors"
41
- >
42
- {item.label}
43
- </Link>
44
- ) : (
45
- <span className="text-foreground">{item.label}</span>
46
- )}
47
- </div>
48
- ))}
49
- </nav>
50
- );
51
- }
52
-
53
- function getBreadcrumbs(pathname: string): BreadcrumbItem[] {
54
- if (pathname === '/') {
55
- return [{ label: 'Home' }];
56
- }
57
-
58
- if (pathname === '/stats') {
59
- return [
60
- { label: 'Home', href: '/' },
61
- { label: 'Stats' }
62
- ];
63
- }
64
-
65
- if (pathname === '/specs' || pathname.startsWith('/specs?')) {
66
- const searchParams = new URLSearchParams(pathname.split('?')[1] || '');
67
- const view = searchParams.get('view');
68
- const viewLabel = view === 'board' ? 'Board View' : 'List View';
69
- return [
70
- { label: 'Home', href: '/' },
71
- { label: `Specs (${viewLabel})` }
72
- ];
73
- }
74
-
75
- if (pathname.startsWith('/specs/')) {
76
- const specId = pathname.split('/')[2];
77
- return [
78
- { label: 'Home', href: '/' },
79
- { label: 'Specs', href: '/specs' },
80
- { label: specId }
81
- ];
82
- }
83
-
84
- if (pathname === '/board') {
85
- return [
86
- { label: 'Home', href: '/' },
87
- { label: 'Board' }
88
- ];
89
- }
90
-
91
- return [{ label: 'Home', href: '/' }];
92
- }
93
-
94
- export function Navigation({ specs }: NavigationProps) {
95
- const pathname = usePathname();
96
- const breadcrumbs = getBreadcrumbs(pathname);
97
-
98
- const toggleSidebar = () => {
99
- if (typeof window !== 'undefined' && window.toggleMainSidebar) {
100
- window.toggleMainSidebar();
101
- }
102
- };
103
-
104
- return (
105
- <header className="sticky top-0 z-50 w-full h-14 border-b border-border bg-background">
106
- <div className="flex items-center justify-between h-full px-2 sm:px-4">
107
- {/* Left: Mobile Menu + Logo + Breadcrumb */}
108
- <div className="flex items-center gap-2 sm:gap-4 min-w-0 flex-1">
109
- {/* Mobile hamburger menu */}
110
- <Button
111
- variant="ghost"
112
- size="icon"
113
- onClick={toggleSidebar}
114
- className="lg:hidden h-9 w-9 shrink-0"
115
- >
116
- <Menu className="h-5 w-5" />
117
- <span className="sr-only">Toggle menu</span>
118
- </Button>
119
-
120
- <Link href="/" className="flex items-center space-x-2 shrink-0">
121
- <Image
122
- src="/logo-with-bg.svg"
123
- alt="LeanSpec"
124
- width={32}
125
- height={32}
126
- className="h-7 w-7 sm:h-8 sm:w-8 dark:hidden"
127
- />
128
- <Image
129
- src="/logo-dark-bg.svg"
130
- alt="LeanSpec"
131
- width={32}
132
- height={32}
133
- className="h-7 w-7 sm:h-8 sm:w-8 hidden dark:block"
134
- />
135
- <span className="font-bold text-lg sm:text-xl hidden sm:inline">LeanSpec</span>
136
- </Link>
137
- <div className="hidden md:block min-w-0">
138
- <Breadcrumb items={breadcrumbs} />
139
- </div>
140
- </div>
141
-
142
- {/* Right: Search + Theme + Docs + GitHub */}
143
- <div className="flex items-center gap-1 sm:gap-2 shrink-0">
144
- <QuickSearch specs={specs} />
145
- <TooltipProvider>
146
- <Tooltip>
147
- <TooltipTrigger asChild>
148
- <div>
149
- <ThemeToggle />
150
- </div>
151
- </TooltipTrigger>
152
- <TooltipContent>
153
- <p>Toggle theme</p>
154
- </TooltipContent>
155
- </Tooltip>
156
-
157
- <Tooltip>
158
- <TooltipTrigger asChild>
159
- <Button variant="ghost" size="icon" asChild className="h-9 w-9 sm:h-10 sm:w-10">
160
- <a
161
- href="https://www.lean-spec.dev"
162
- target="_blank"
163
- rel="noopener noreferrer"
164
- aria-label="Documentation"
165
- >
166
- <BookOpen className="h-5 w-5" />
167
- </a>
168
- </Button>
169
- </TooltipTrigger>
170
- <TooltipContent>
171
- <p>Documentation</p>
172
- </TooltipContent>
173
- </Tooltip>
174
-
175
- <Tooltip>
176
- <TooltipTrigger asChild>
177
- <Button variant="ghost" size="icon" asChild className="h-9 w-9 sm:h-10 sm:w-10">
178
- <a
179
- href="https://github.com/codervisor/lean-spec"
180
- target="_blank"
181
- rel="noopener noreferrer"
182
- aria-label="GitHub repository"
183
- >
184
- <Image
185
- src="/github-mark-white.svg"
186
- alt="GitHub"
187
- width={20}
188
- height={20}
189
- className="hidden dark:block"
190
- />
191
- <Image
192
- src="/github-mark.svg"
193
- alt="GitHub"
194
- width={20}
195
- height={20}
196
- className="dark:hidden"
197
- />
198
- </a>
199
- </Button>
200
- </TooltipTrigger>
201
- <TooltipContent>
202
- <p>GitHub repository</p>
203
- </TooltipContent>
204
- </Tooltip>
205
- </TooltipProvider>
206
- </div>
207
- </div>
208
- </header>
209
- );
210
- }
@@ -1,53 +0,0 @@
1
- /**
2
- * Priority badge component with icons
3
- */
4
-
5
- import { AlertCircle, ArrowUp, Minus, ArrowDown } from 'lucide-react';
6
- import { Badge } from '@/components/ui/badge';
7
- import { cn } from '@/lib/utils';
8
-
9
- interface PriorityBadgeProps {
10
- priority: string;
11
- className?: string;
12
- iconOnly?: boolean;
13
- }
14
-
15
- const priorityConfig = {
16
- 'critical': {
17
- icon: AlertCircle,
18
- label: 'Critical',
19
- className: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400'
20
- },
21
- 'high': {
22
- icon: ArrowUp,
23
- label: 'High',
24
- className: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400'
25
- },
26
- 'medium': {
27
- icon: Minus,
28
- label: 'Medium',
29
- className: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400'
30
- },
31
- 'low': {
32
- icon: ArrowDown,
33
- label: 'Low',
34
- className: 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-400'
35
- }
36
- };
37
-
38
- export function PriorityBadge({ priority, className, iconOnly = false }: PriorityBadgeProps) {
39
- const config = priorityConfig[priority as keyof typeof priorityConfig] || priorityConfig.medium;
40
- const Icon = config.icon;
41
-
42
- return (
43
- <Badge className={cn('flex items-center w-fit', !iconOnly && 'gap-1.5', config.className, className)}>
44
- <Icon className="h-3.5 w-3.5" />
45
- {!iconOnly && config.label}
46
- </Badge>
47
- );
48
- }
49
-
50
- export function getPriorityLabel(priority: string): string {
51
- const config = priorityConfig[priority as keyof typeof priorityConfig] || priorityConfig.medium;
52
- return config.label;
53
- }
@@ -1,180 +0,0 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import { useRouter } from "next/navigation"
5
- import { FileText, Search, Clock, Tag } from "lucide-react"
6
- import Fuse from "fuse.js"
7
-
8
- import {
9
- CommandDialog,
10
- CommandEmpty,
11
- CommandGroup,
12
- CommandInput,
13
- CommandItem,
14
- CommandList,
15
- } from "@/components/ui/command"
16
- import { StatusBadge } from "@/components/status-badge"
17
- import { PriorityBadge } from "@/components/priority-badge"
18
-
19
- interface Spec {
20
- id: string
21
- specNumber: string
22
- title: string
23
- status: string
24
- priority: string
25
- tags: string[]
26
- createdAt: string
27
- }
28
-
29
- interface QuickSearchProps {
30
- specs: Spec[]
31
- }
32
-
33
- export function QuickSearch({ specs }: QuickSearchProps) {
34
- const router = useRouter()
35
- const [open, setOpen] = React.useState(false)
36
- const [search, setSearch] = React.useState("")
37
- const [recentSearches, setRecentSearches] = React.useState<string[]>([])
38
-
39
- // Load recent searches from localStorage
40
- React.useEffect(() => {
41
- const saved = localStorage.getItem("leanspec-recent-searches")
42
- if (saved) {
43
- setRecentSearches(JSON.parse(saved))
44
- }
45
- }, [])
46
-
47
- // Setup keyboard shortcut
48
- React.useEffect(() => {
49
- const down = (e: KeyboardEvent) => {
50
- if (e.key === "k" && (e.metaKey || e.ctrlKey)) {
51
- e.preventDefault()
52
- setOpen((open) => !open)
53
- }
54
- }
55
-
56
- document.addEventListener("keydown", down)
57
- return () => document.removeEventListener("keydown", down)
58
- }, [])
59
-
60
- // Setup fuzzy search
61
- const fuse = React.useMemo(
62
- () =>
63
- new Fuse(specs, {
64
- keys: [
65
- { name: "title", weight: 2 },
66
- { name: "specNumber", weight: 1.5 },
67
- { name: "tags", weight: 0.5 },
68
- ],
69
- threshold: 0.4,
70
- includeScore: true,
71
- minMatchCharLength: 2,
72
- }),
73
- [specs]
74
- )
75
-
76
- const results = React.useMemo(() => {
77
- if (!search) return specs.slice(0, 8)
78
- return fuse.search(search).map((result) => result.item)
79
- }, [search, fuse, specs])
80
-
81
- const handleSelect = (specId: string, title: string) => {
82
- // Save to recent searches
83
- const updated = [title, ...recentSearches.filter((s) => s !== title)].slice(0, 5)
84
- setRecentSearches(updated)
85
- localStorage.setItem("leanspec-recent-searches", JSON.stringify(updated))
86
-
87
- // Navigate
88
- router.push(`/specs/${specId}`)
89
- setOpen(false)
90
- setSearch("")
91
- }
92
-
93
- return (
94
- <>
95
- <button
96
- onClick={() => setOpen(true)}
97
- className="inline-flex items-center gap-2 px-2 sm:px-3 py-2 text-sm text-muted-foreground hover:text-foreground transition-colors border rounded-md hover:border-foreground/20"
98
- >
99
- <Search className="h-4 w-4" />
100
- <span className="hidden sm:inline">Quick search...</span>
101
- <kbd className="hidden md:inline-flex pointer-events-none h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium opacity-100">
102
- <span className="text-xs">⌘</span>K
103
- </kbd>
104
- </button>
105
-
106
- <CommandDialog open={open} onOpenChange={setOpen}>
107
- <CommandInput
108
- placeholder="Search specs by title, number, or tags..."
109
- value={search}
110
- onValueChange={setSearch}
111
- />
112
- <CommandList>
113
- <CommandEmpty>No specs found.</CommandEmpty>
114
-
115
- {!search && recentSearches.length > 0 && (
116
- <CommandGroup heading="Recent Searches">
117
- {recentSearches.map((recent) => (
118
- <CommandItem
119
- key={recent}
120
- value={recent}
121
- onSelect={() => {
122
- setSearch(recent)
123
- }}
124
- >
125
- <Clock className="mr-2 h-4 w-4" />
126
- {recent}
127
- </CommandItem>
128
- ))}
129
- </CommandGroup>
130
- )}
131
-
132
- <CommandGroup heading="Specs">
133
- {results.map((spec) => (
134
- <CommandItem
135
- key={spec.id}
136
- value={`${spec.specNumber} ${spec.title}`}
137
- onSelect={() => handleSelect(spec.id, spec.title)}
138
- >
139
- <FileText className="mr-2 h-4 w-4" />
140
- <div className="flex-1 flex items-center justify-between gap-2">
141
- <div className="flex-1 min-w-0">
142
- <div className="flex items-center gap-2">
143
- <span className="font-medium">#{spec.specNumber}</span>
144
- <span className="truncate">{spec.title}</span>
145
- </div>
146
- </div>
147
- <div className="flex items-center gap-1 shrink-0">
148
- <StatusBadge status={spec.status} />
149
- <PriorityBadge priority={spec.priority} />
150
- </div>
151
- </div>
152
- </CommandItem>
153
- ))}
154
- </CommandGroup>
155
-
156
- {search && (
157
- <CommandGroup heading="Filter by Tag">
158
- {Array.from(new Set(specs.flatMap((s) => s.tags)))
159
- .filter((tag) => tag.toLowerCase().includes(search.toLowerCase()))
160
- .slice(0, 5)
161
- .map((tag) => (
162
- <CommandItem
163
- key={tag}
164
- value={tag}
165
- onSelect={() => {
166
- router.push(`/?tag=${encodeURIComponent(tag)}`)
167
- setOpen(false)
168
- }}
169
- >
170
- <Tag className="mr-2 h-4 w-4" />
171
- Filter by: <span className="ml-1 font-medium">{tag}</span>
172
- </CommandItem>
173
- ))}
174
- </CommandGroup>
175
- )}
176
- </CommandList>
177
- </CommandDialog>
178
- </>
179
- )
180
- }
@@ -1,119 +0,0 @@
1
- import { Skeleton } from "@/components/ui/skeleton"
2
- import { Card, CardContent, CardHeader } from "@/components/ui/card"
3
-
4
- export function SpecListSkeleton() {
5
- return (
6
- <div className="space-y-4">
7
- {[...Array(5)].map((_, i) => (
8
- <Card key={i}>
9
- <CardHeader>
10
- <div className="flex items-start justify-between">
11
- <div className="space-y-2 flex-1">
12
- <Skeleton className="h-6 w-3/4" />
13
- <Skeleton className="h-4 w-1/2" />
14
- </div>
15
- <Skeleton className="h-6 w-20" />
16
- </div>
17
- </CardHeader>
18
- <CardContent>
19
- <div className="flex items-center gap-2">
20
- <Skeleton className="h-5 w-16" />
21
- <Skeleton className="h-5 w-16" />
22
- <Skeleton className="h-5 w-16" />
23
- </div>
24
- </CardContent>
25
- </Card>
26
- ))}
27
- </div>
28
- )
29
- }
30
-
31
- export function SpecDetailSkeleton() {
32
- return (
33
- <div className="container mx-auto py-8 px-4 max-w-6xl">
34
- <div className="space-y-6">
35
- {/* Breadcrumb */}
36
- <Skeleton className="h-5 w-48" />
37
-
38
- {/* Header */}
39
- <div className="space-y-4">
40
- <Skeleton className="h-10 w-2/3" />
41
- <Skeleton className="h-5 w-full" />
42
- </div>
43
-
44
- {/* Metadata section */}
45
- <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
46
- {[...Array(4)].map((_, i) => (
47
- <Card key={i}>
48
- <CardContent className="p-4">
49
- <Skeleton className="h-4 w-20 mb-2" />
50
- <Skeleton className="h-6 w-24" />
51
- </CardContent>
52
- </Card>
53
- ))}
54
- </div>
55
-
56
- {/* Content */}
57
- <Card>
58
- <CardContent className="p-6 space-y-4">
59
- <Skeleton className="h-8 w-1/3" />
60
- <Skeleton className="h-4 w-full" />
61
- <Skeleton className="h-4 w-full" />
62
- <Skeleton className="h-4 w-4/5" />
63
- <div className="py-4" />
64
- <Skeleton className="h-8 w-1/4" />
65
- <Skeleton className="h-4 w-full" />
66
- <Skeleton className="h-4 w-full" />
67
- <Skeleton className="h-4 w-3/4" />
68
- </CardContent>
69
- </Card>
70
- </div>
71
- </div>
72
- )
73
- }
74
-
75
- export function StatsCardSkeleton() {
76
- return (
77
- <Card className="relative overflow-hidden">
78
- <CardHeader className="pb-3">
79
- <div className="flex items-center justify-between">
80
- <Skeleton className="h-4 w-24" />
81
- <Skeleton className="h-5 w-5 rounded-full" />
82
- </div>
83
- </CardHeader>
84
- <CardContent>
85
- <Skeleton className="h-8 w-16 mb-2" />
86
- <Skeleton className="h-3 w-32" />
87
- </CardContent>
88
- </Card>
89
- )
90
- }
91
-
92
- export function KanbanBoardSkeleton() {
93
- return (
94
- <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
95
- {[...Array(4)].map((_, i) => (
96
- <div key={i} className="space-y-4">
97
- <div className="flex items-center justify-between">
98
- <Skeleton className="h-6 w-32" />
99
- <Skeleton className="h-6 w-8" />
100
- </div>
101
- <div className="space-y-3">
102
- {[...Array(3)].map((_, j) => (
103
- <Card key={j}>
104
- <CardContent className="p-4 space-y-2">
105
- <Skeleton className="h-5 w-full" />
106
- <Skeleton className="h-4 w-3/4" />
107
- <div className="flex gap-2 pt-2">
108
- <Skeleton className="h-5 w-16" />
109
- <Skeleton className="h-5 w-16" />
110
- </div>
111
- </CardContent>
112
- </Card>
113
- ))}
114
- </div>
115
- </div>
116
- ))}
117
- </div>
118
- )
119
- }