@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,277 +0,0 @@
1
- 'use client';
2
-
3
- import { useState, useMemo } from 'react';
4
- import Link from 'next/link';
5
- import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
6
- import { Input } from '@/components/ui/input';
7
- import {
8
- Select,
9
- SelectContent,
10
- SelectItem,
11
- SelectTrigger,
12
- SelectValue
13
- } from '@/components/ui/select';
14
- import { Search, FileText, CheckCircle2, PlayCircle, Clock } from 'lucide-react';
15
- import { StatusBadge } from '@/components/status-badge';
16
- import { PriorityBadge } from '@/components/priority-badge';
17
-
18
- interface Spec {
19
- id: string;
20
- specNumber: number | null;
21
- specName: string;
22
- title: string | null;
23
- status: string | null;
24
- priority: string | null;
25
- tags: string[] | null;
26
- }
27
-
28
- interface Stats {
29
- totalSpecs: number;
30
- completionRate: number;
31
- specsByStatus: { status: string; count: number }[];
32
- }
33
-
34
- interface HomeClientProps {
35
- initialProjects: unknown[];
36
- initialStats: Stats;
37
- initialSpecs: Spec[];
38
- }
39
-
40
- export function HomeClient({ initialProjects: _initialProjects, initialStats, initialSpecs }: HomeClientProps) {
41
- void _initialProjects;
42
- const [searchQuery, setSearchQuery] = useState('');
43
- const [statusFilter, setStatusFilter] = useState<string>('all');
44
- const [priorityFilter, setPriorityFilter] = useState<string>('all');
45
-
46
- const filteredSpecs = useMemo(() => {
47
- return initialSpecs.filter(spec => {
48
- const matchesSearch = !searchQuery ||
49
- spec.title?.toLowerCase().includes(searchQuery.toLowerCase()) ||
50
- spec.specName.toLowerCase().includes(searchQuery.toLowerCase()) ||
51
- spec.tags?.some(tag => tag.toLowerCase().includes(searchQuery.toLowerCase()));
52
-
53
- const matchesStatus = statusFilter === 'all' || spec.status === statusFilter;
54
- const matchesPriority = priorityFilter === 'all' || spec.priority === priorityFilter;
55
-
56
- return matchesSearch && matchesStatus && matchesPriority;
57
- });
58
- }, [initialSpecs, searchQuery, statusFilter, priorityFilter]);
59
-
60
- const stats = initialStats;
61
-
62
- return (
63
- <div className="min-h-screen bg-background">
64
- {/* Stats Section */}
65
- <section className="container mx-auto px-4 py-8">
66
- <div className="mb-8">
67
- <h1 className="text-3xl sm:text-4xl font-bold tracking-tight">LeanSpec Web</h1>
68
- <p className="text-muted-foreground mt-2">Interactive spec showcase for AI-powered development</p>
69
- </div>
70
-
71
- <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-8">
72
- {/* Total Specs */}
73
- <Card className="relative overflow-hidden">
74
- <div className="absolute inset-0 bg-linear-to-br from-blue-500/10 to-transparent" />
75
- <CardHeader className="relative pb-3">
76
- <div className="flex items-center justify-between">
77
- <CardTitle className="text-sm font-medium text-muted-foreground">Total Specs</CardTitle>
78
- <FileText className="h-5 w-5 text-blue-600" />
79
- </div>
80
- </CardHeader>
81
- <CardContent className="relative">
82
- <div className="text-3xl font-bold">{stats.totalSpecs}</div>
83
- </CardContent>
84
- </Card>
85
-
86
- {/* Completed */}
87
- <Card className="relative overflow-hidden">
88
- <div className="absolute inset-0 bg-linear-to-br from-green-500/10 to-transparent" />
89
- <CardHeader className="relative pb-3">
90
- <div className="flex items-center justify-between">
91
- <CardTitle className="text-sm font-medium text-muted-foreground">Completed</CardTitle>
92
- <CheckCircle2 className="h-5 w-5 text-green-600" />
93
- </div>
94
- </CardHeader>
95
- <CardContent className="relative">
96
- <div className="text-3xl font-bold">
97
- {stats.specsByStatus.find(s => s.status === 'complete')?.count || 0}
98
- </div>
99
- <p className="text-xs text-muted-foreground mt-1 flex items-center gap-1">
100
- <span className="text-green-600">{stats.completionRate}%</span>
101
- completion rate
102
- </p>
103
- </CardContent>
104
- </Card>
105
-
106
- {/* In Progress */}
107
- <Card className="relative overflow-hidden">
108
- <div className="absolute inset-0 bg-linear-to-br from-orange-500/10 to-transparent" />
109
- <CardHeader className="relative pb-3">
110
- <div className="flex items-center justify-between">
111
- <CardTitle className="text-sm font-medium text-muted-foreground">In Progress</CardTitle>
112
- <PlayCircle className="h-5 w-5 text-orange-600" />
113
- </div>
114
- </CardHeader>
115
- <CardContent className="relative">
116
- <div className="text-3xl font-bold">
117
- {stats.specsByStatus.find(s => s.status === 'in-progress')?.count || 0}
118
- </div>
119
- </CardContent>
120
- </Card>
121
-
122
- {/* Planned */}
123
- <Card className="relative overflow-hidden">
124
- <div className="absolute inset-0 bg-linear-to-br from-blue-500/10 to-transparent" />
125
- <CardHeader className="relative pb-3">
126
- <div className="flex items-center justify-between">
127
- <CardTitle className="text-sm font-medium text-muted-foreground">Planned</CardTitle>
128
- <Clock className="h-5 w-5 text-blue-600" />
129
- </div>
130
- </CardHeader>
131
- <CardContent className="relative">
132
- <div className="text-3xl font-bold">
133
- {stats.specsByStatus.find(s => s.status === 'planned')?.count || 0}
134
- </div>
135
- </CardContent>
136
- </Card>
137
- </div>
138
- </section>
139
-
140
- {/* Specs List */}
141
- <section className="container mx-auto px-4 py-4">
142
- <div className="mb-1">
143
- <h2 className="text-xl sm:text-2xl font-bold mb-4">Specifications</h2>
144
-
145
- {/* Search and Filters */}
146
- <div className="lg:sticky lg:top-14 lg:z-40 bg-background pb-4 pt-2 mb-1">
147
- <div className="flex flex-col gap-3 mb-3">
148
- <div className="relative flex-1">
149
- <Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground h-4 w-4" />
150
- <Input
151
- placeholder="Search specs..."
152
- value={searchQuery}
153
- onChange={(e) => setSearchQuery(e.target.value)}
154
- className="pl-10"
155
- />
156
- </div>
157
-
158
- <div className="flex gap-2 overflow-x-auto pb-2">
159
- <Select value={statusFilter} onValueChange={setStatusFilter}>
160
- <SelectTrigger className="w-[140px] sm:w-[180px]">
161
- <SelectValue placeholder="All Status" />
162
- </SelectTrigger>
163
- <SelectContent>
164
- <SelectItem value="all">All Status</SelectItem>
165
- <SelectItem value="planned">Planned</SelectItem>
166
- <SelectItem value="in-progress">In Progress</SelectItem>
167
- <SelectItem value="complete">Complete</SelectItem>
168
- <SelectItem value="archived">Archived</SelectItem>
169
- </SelectContent>
170
- </Select>
171
-
172
- <Select value={priorityFilter} onValueChange={setPriorityFilter}>
173
- <SelectTrigger className="w-[140px] sm:w-[180px]">
174
- <SelectValue placeholder="All Priority" />
175
- </SelectTrigger>
176
- <SelectContent>
177
- <SelectItem value="all">All Priority</SelectItem>
178
- <SelectItem value="critical">Critical</SelectItem>
179
- <SelectItem value="high">High</SelectItem>
180
- <SelectItem value="medium">Medium</SelectItem>
181
- <SelectItem value="low">Low</SelectItem>
182
- </SelectContent>
183
- </Select>
184
- </div>
185
- </div>
186
- </div>
187
- </div>
188
-
189
- {/* Desktop Table View */}
190
- <div className="hidden md:block border rounded-lg border-gray-200 dark:border-gray-800 overflow-x-auto">
191
- <table className="w-full">
192
- <thead className="lg:sticky lg:top-14 lg:z-30 border-b backdrop-blur border-gray-200 bg-background/95 dark:border-gray-800">
193
- <tr>
194
- <th className="px-6 py-3 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider">
195
- Spec
196
- </th>
197
- <th className="px-6 py-3 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider">
198
- Title
199
- </th>
200
- <th className="px-6 py-3 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider">
201
- Status
202
- </th>
203
- <th className="px-6 py-3 text-left text-xs font-medium text-muted-foreground uppercase tracking-wider">
204
- Priority
205
- </th>
206
- </tr>
207
- </thead>
208
- <tbody className="divide-y divide-gray-200 dark:divide-gray-800">
209
- {filteredSpecs.map((spec) => (
210
- <tr
211
- key={spec.id}
212
- className="group hover:bg-muted/50 transition-colors cursor-pointer"
213
- onClick={() => window.location.href = `/specs/${spec.specNumber || spec.id}`}
214
- >
215
- <td className="px-6 py-4 whitespace-nowrap">
216
- <span className="text-primary group-hover:underline font-medium">
217
- {spec.specNumber ? `#${spec.specNumber}` : spec.specName}
218
- </span>
219
- </td>
220
- <td className="px-6 py-4">
221
- <div className="text-sm">{spec.title || spec.specName}</div>
222
- </td>
223
- <td className="px-6 py-4 whitespace-nowrap">
224
- <StatusBadge status={spec.status || 'planned'} />
225
- </td>
226
- <td className="px-6 py-4 whitespace-nowrap">
227
- <PriorityBadge priority={spec.priority || 'medium'} />
228
- </td>
229
- </tr>
230
- ))}
231
- </tbody>
232
- </table>
233
- </div>
234
-
235
- {/* Mobile Card View */}
236
- <div className="md:hidden space-y-3">
237
- {filteredSpecs.map((spec) => (
238
- <Link
239
- key={spec.id}
240
- href={`/specs/${spec.specNumber || spec.id}`}
241
- className="block"
242
- >
243
- <Card className="hover:bg-muted/50 transition-colors">
244
- <CardContent className="p-4">
245
- <div className="flex items-start justify-between gap-2 mb-2">
246
- <div className="flex-1 min-w-0">
247
- <div className="font-medium text-primary mb-1">
248
- {spec.specNumber ? `#${spec.specNumber}` : spec.specName}
249
- </div>
250
- <div className="text-sm text-foreground truncate">
251
- {spec.title || spec.specName}
252
- </div>
253
- </div>
254
- </div>
255
- <div className="flex items-center gap-2 mt-3">
256
- <StatusBadge status={spec.status || 'planned'} />
257
- <PriorityBadge priority={spec.priority || 'medium'} />
258
- </div>
259
- </CardContent>
260
- </Card>
261
- </Link>
262
- ))}
263
- </div>
264
- </section>
265
-
266
- {/* Footer */}
267
- <footer className="container mx-auto px-4 py-8 text-center text-muted-foreground border-t border-gray-200 dark:border-gray-800 mt-12">
268
- <p>LeanSpec - Lightweight spec methodology for AI-powered development</p>
269
- <p className="mt-2 text-sm">
270
- <a href="https://github.com/codervisor/lean-spec" className="text-primary hover:underline">
271
- View on GitHub
272
- </a>
273
- </p>
274
- </footer>
275
- </div>
276
- );
277
- }
@@ -1,70 +0,0 @@
1
- import type { Metadata } from "next";
2
- import "./globals.css";
3
- import { Navigation } from "@/components/navigation";
4
- import { MainSidebar } from "@/components/main-sidebar";
5
- import { ThemeProvider } from "@/components/theme-provider";
6
- import { Toast } from "@/components/ui/toast";
7
- import { getSpecs } from "@/lib/db/service-queries";
8
-
9
- export const metadata: Metadata = {
10
- title: "LeanSpec Web - Interactive Spec Showcase",
11
- description: "Browse and explore LeanSpec specifications in a rich, interactive format",
12
- icons: {
13
- icon: [
14
- { url: '/favicon.ico' },
15
- { url: '/logo.svg', type: 'image/svg+xml' },
16
- ],
17
- apple: '/logo.svg',
18
- },
19
- openGraph: {
20
- title: "LeanSpec Web",
21
- description: "Browse and explore LeanSpec specifications in a rich, interactive format",
22
- type: "website",
23
- },
24
- viewport: {
25
- width: 'device-width',
26
- initialScale: 1,
27
- maximumScale: 5,
28
- },
29
- };
30
-
31
- export default async function RootLayout({
32
- children,
33
- }: Readonly<{
34
- children: React.ReactNode;
35
- }>) {
36
- const specs = await getSpecs();
37
- const specsForSearch = specs
38
- .filter(spec => spec.specNumber && spec.title && spec.status && spec.priority)
39
- .map(spec => ({
40
- id: spec.id,
41
- specNumber: spec.specNumber!.toString(),
42
- title: spec.title!,
43
- status: spec.status!,
44
- priority: spec.priority!,
45
- tags: spec.tags || [],
46
- createdAt: spec.createdAt ? spec.createdAt.toISOString() : '',
47
- }));
48
-
49
- return (
50
- <html lang="en" suppressHydrationWarning>
51
- <body className="antialiased bg-background overflow-x-hidden">
52
- <ThemeProvider
53
- attribute="class"
54
- defaultTheme="system"
55
- enableSystem
56
- disableTransitionOnChange
57
- >
58
- <Navigation specs={specsForSearch} />
59
- <div className="flex w-full min-w-0">
60
- <MainSidebar />
61
- <main className="flex-1 min-h-[calc(100vh-3.5rem)] min-w-0 w-full lg:w-[calc(100vw-var(--main-sidebar-width,240px))]">
62
- {children}
63
- </main>
64
- </div>
65
- <Toast />
66
- </ThemeProvider>
67
- </body>
68
- </html>
69
- );
70
- }
@@ -1,87 +0,0 @@
1
- import { Card, CardContent, CardHeader } from '@/components/ui/card';
2
- import { Skeleton } from '@/components/ui/skeleton';
3
-
4
- export default function Loading() {
5
- return (
6
- <div className="min-h-screen bg-background">
7
- {/* Stats Section */}
8
- <section className="container mx-auto px-4 py-8">
9
- <div className="mb-8">
10
- <Skeleton className="h-10 w-64 mb-2" />
11
- <Skeleton className="h-5 w-96" />
12
- </div>
13
-
14
- <div className="grid grid-cols-1 md:grid-cols-4 gap-4 mb-8">
15
- {[...Array(4)].map((_, i) => (
16
- <Card key={i}>
17
- <CardHeader className="pb-3">
18
- <Skeleton className="h-4 w-24" />
19
- </CardHeader>
20
- <CardContent>
21
- <Skeleton className="h-9 w-16" />
22
- </CardContent>
23
- </Card>
24
- ))}
25
- </div>
26
- </section>
27
-
28
- {/* Specs List */}
29
- <section className="container mx-auto px-4 py-8">
30
- <div className="mb-6">
31
- <Skeleton className="h-8 w-48 mb-4" />
32
-
33
- <div className="flex flex-col sm:flex-row gap-4 mb-6">
34
- <Skeleton className="h-9 flex-1" />
35
- <div className="flex gap-2">
36
- <Skeleton className="h-9 w-32" />
37
- <Skeleton className="h-9 w-32" />
38
- </div>
39
- </div>
40
-
41
- <Skeleton className="h-4 w-48 mb-4" />
42
- </div>
43
-
44
- <Card>
45
- <div className="overflow-x-auto">
46
- <table className="w-full">
47
- <thead className="border-b">
48
- <tr>
49
- <th className="px-6 py-3 text-left">
50
- <Skeleton className="h-4 w-12" />
51
- </th>
52
- <th className="px-6 py-3 text-left">
53
- <Skeleton className="h-4 w-16" />
54
- </th>
55
- <th className="px-6 py-3 text-left">
56
- <Skeleton className="h-4 w-16" />
57
- </th>
58
- <th className="px-6 py-3 text-left">
59
- <Skeleton className="h-4 w-16" />
60
- </th>
61
- </tr>
62
- </thead>
63
- <tbody className="divide-y">
64
- {[...Array(10)].map((_, i) => (
65
- <tr key={i}>
66
- <td className="px-6 py-4">
67
- <Skeleton className="h-5 w-12" />
68
- </td>
69
- <td className="px-6 py-4">
70
- <Skeleton className="h-5 w-64" />
71
- </td>
72
- <td className="px-6 py-4">
73
- <Skeleton className="h-6 w-20" />
74
- </td>
75
- <td className="px-6 py-4">
76
- <Skeleton className="h-6 w-16" />
77
- </td>
78
- </tr>
79
- ))}
80
- </tbody>
81
- </table>
82
- </div>
83
- </Card>
84
- </section>
85
- </div>
86
- );
87
- }
@@ -1,27 +0,0 @@
1
- import Link from 'next/link';
2
- import { Button } from '@/components/ui/button';
3
-
4
- export default function NotFound() {
5
- return (
6
- <div className="min-h-screen bg-background flex items-center justify-center px-4">
7
- <div className="text-center space-y-6">
8
- <div className="space-y-2">
9
- <h1 className="text-6xl font-bold text-primary">404</h1>
10
- <h2 className="text-2xl font-semibold">Page Not Found</h2>
11
- <p className="text-muted-foreground max-w-md mx-auto">
12
- The page you&rsquo;re looking for doesn&rsquo;t exist or has been moved.
13
- </p>
14
- </div>
15
-
16
- <div className="flex gap-4 justify-center">
17
- <Button asChild>
18
- <Link href="/">Go Home</Link>
19
- </Button>
20
- <Button variant="outline" asChild>
21
- <Link href="/board">View Board</Link>
22
- </Button>
23
- </div>
24
- </div>
25
- </div>
26
- );
27
- }
@@ -1,18 +0,0 @@
1
- /**
2
- * Home page - Dashboard with project overview
3
- */
4
-
5
- import { getStats, getSpecs } from '@/lib/db/service-queries';
6
- import { DashboardClient } from './dashboard-client';
7
-
8
- // Force dynamic rendering - this page needs runtime data
9
- export const dynamic = 'force-dynamic';
10
-
11
- export default async function Home() {
12
- const [stats, specs] = await Promise.all([
13
- getStats(),
14
- getSpecs(),
15
- ]);
16
-
17
- return <DashboardClient initialSpecs={specs} initialStats={stats} />;
18
- }
@@ -1,5 +0,0 @@
1
- import { SpecDetailLoadingShell } from '@/components/spec-detail-loading-shell';
2
-
3
- export default function SpecLoading() {
4
- return <SpecDetailLoadingShell />;
5
- }
@@ -1,43 +0,0 @@
1
- /**
2
- * Spec detail page with markdown rendering and enhanced UI
3
- * Phase 2: Tier 2 - Hybrid Rendering with client-side caching
4
- */
5
-
6
- import { notFound } from 'next/navigation';
7
- import { getSpecById, getSpecsWithSubSpecCount } from '@/lib/db/service-queries';
8
- import { SpecDetailWrapper } from '@/components/spec-detail-wrapper';
9
-
10
- // Tier 1: Route segment caching for performance
11
- export const revalidate = 60; // Cache rendered pages for 60s
12
- export const dynamicParams = true; // Generate new pages on demand
13
-
14
- export default async function SpecDetailPage({
15
- params,
16
- searchParams
17
- }: {
18
- params: Promise<{ id: string }>;
19
- searchParams: Promise<{ subspec?: string }>;
20
- }) {
21
- const { id } = await params;
22
- const { subspec: currentSubSpec } = await searchParams;
23
-
24
- const [spec, allSpecs] = await Promise.all([
25
- getSpecById(id),
26
- getSpecsWithSubSpecCount()
27
- ]);
28
-
29
- if (!spec) {
30
- notFound();
31
- }
32
-
33
- return (
34
- <SpecDetailWrapper
35
- spec={spec}
36
- allSpecs={allSpecs}
37
- currentSubSpec={currentSubSpec}
38
- />
39
- );
40
- }
41
-
42
-
43
-
@@ -1,18 +0,0 @@
1
- /**
2
- * Specs page - Browse all LeanSpec specifications with list/board switcher
3
- */
4
-
5
- import { getSpecs, getStats } from '@/lib/db/service-queries';
6
- import { SpecsClient } from './specs-client';
7
-
8
- // Force dynamic rendering - this page needs runtime data
9
- export const dynamic = 'force-dynamic';
10
-
11
- export default async function SpecsPage() {
12
- const [specs, stats] = await Promise.all([
13
- getSpecs(),
14
- getStats(),
15
- ]);
16
-
17
- return <SpecsClient initialSpecs={specs} initialStats={stats} />;
18
- }