@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,372 +0,0 @@
1
- /**
2
- * Client component for spec detail page with SWR caching and instant sub-spec navigation
3
- * Phase 2: Tier 2 - Hybrid Rendering
4
- */
5
-
6
- 'use client';
7
-
8
- import * as React from 'react';
9
- import { useRouter, useSearchParams } from 'next/navigation';
10
- import useSWR from 'swr';
11
- import ReactMarkdown from 'react-markdown';
12
- import remarkGfm from 'remark-gfm';
13
- import rehypeHighlight from 'rehype-highlight';
14
- import rehypeSlug from 'rehype-slug';
15
- import { Badge } from '@/components/ui/badge';
16
- import { Button } from '@/components/ui/button';
17
- import { SpecTimeline } from '@/components/spec-timeline';
18
- import { StatusBadge } from '@/components/status-badge';
19
- import { PriorityBadge } from '@/components/priority-badge';
20
- import { MarkdownLink } from '@/components/markdown-link';
21
- import { TableOfContents } from '@/components/table-of-contents';
22
- import { BackToTop } from '@/components/back-to-top';
23
- import { SpecDependencyGraph } from '@/components/spec-dependency-graph';
24
- import {
25
- Dialog,
26
- DialogContent,
27
- DialogDescription,
28
- DialogHeader,
29
- DialogTitle,
30
- DialogTrigger,
31
- } from '@/components/ui/dialog';
32
- import { extractH1Title, cn } from '@/lib/utils';
33
- import { formatRelativeTime } from '@/lib/date-utils';
34
- import type { SpecWithMetadata } from '@/types/specs';
35
- import {
36
- FileText,
37
- Palette,
38
- Code,
39
- TestTube,
40
- CheckSquare,
41
- Wrench,
42
- Map,
43
- GitBranch,
44
- Home,
45
- TrendingUp,
46
- Clock,
47
- Maximize2
48
- } from 'lucide-react';
49
- import type { Plugin } from 'unified';
50
- import { visit } from 'unist-util-visit';
51
- import type { Html, Root } from 'mdast';
52
-
53
- const remarkStripHtmlComments: Plugin<[], Root> = () => (tree: Root) => {
54
- visit(tree, 'html', (node: Html) => {
55
- if (typeof node.value === 'string' && node.value.trim().startsWith('<!--')) {
56
- node.value = '';
57
- }
58
- });
59
- };
60
-
61
- // Icon mapping for sub-specs
62
- const SUB_SPEC_ICONS: Record<string, React.ComponentType<{ className?: string }>> = {
63
- 'FileText': FileText,
64
- 'Palette': Palette,
65
- 'Code': Code,
66
- 'TestTube': TestTube,
67
- 'CheckSquare': CheckSquare,
68
- 'Wrench': Wrench,
69
- 'Map': Map,
70
- 'GitBranch': GitBranch,
71
- 'Home': Home,
72
- 'TrendingUp': TrendingUp,
73
- };
74
-
75
- interface SpecDetailClientProps {
76
- initialSpec: SpecWithMetadata;
77
- initialSubSpec?: string;
78
- }
79
-
80
- // SWR fetcher with error handling
81
- const fetcher = (url: string) => fetch(url).then((res) => {
82
- if (!res.ok) {
83
- throw new Error(`HTTP error! status: ${res.status}`);
84
- }
85
- return res.json();
86
- });
87
-
88
- export function SpecDetailClient({ initialSpec, initialSubSpec }: SpecDetailClientProps) {
89
- const router = useRouter();
90
- const searchParams = useSearchParams();
91
- const currentSubSpec = searchParams.get('subspec') || initialSubSpec;
92
- const [timelineDialogOpen, setTimelineDialogOpen] = React.useState(false);
93
- const [dependenciesDialogOpen, setDependenciesDialogOpen] = React.useState(false);
94
-
95
- // Use SWR for client-side caching with the initial spec as fallback
96
- const { data: specData, error, isLoading } = useSWR<{ spec: SpecWithMetadata }>(
97
- `/api/specs/${initialSpec.specNumber || initialSpec.id}`,
98
- fetcher,
99
- {
100
- fallbackData: { spec: initialSpec },
101
- revalidateOnFocus: false,
102
- dedupingInterval: 5000, // Don't refetch within 5 seconds
103
- }
104
- );
105
-
106
- // Fetch complete dependency graph when dialog opens
107
- const { data: dependencyGraphData } = useSWR<{
108
- current: any;
109
- dependsOn: any[];
110
- requiredBy: any[];
111
- related: any[];
112
- }>(
113
- dependenciesDialogOpen ? `/api/specs/${initialSpec.specNumber || initialSpec.id}/dependency-graph` : null,
114
- fetcher,
115
- {
116
- revalidateOnFocus: false,
117
- dedupingInterval: 60000, // Cache for 1 minute
118
- }
119
- );
120
-
121
- const spec = specData?.spec || initialSpec;
122
- const tags = spec.tags || [];
123
- const updatedRelative = spec.updatedAt ? formatRelativeTime(spec.updatedAt) : 'N/A';
124
- const relationships = spec.relationships;
125
-
126
- // Use complete graph if available, otherwise fall back to basic relationships
127
- const completeRelationships = dependencyGraphData
128
- ? {
129
- dependsOn: dependencyGraphData.dependsOn.map(s => s.specName),
130
- requiredBy: dependencyGraphData.requiredBy.map(s => s.specName),
131
- related: dependencyGraphData.related.map(s => s.specName),
132
- }
133
- : relationships;
134
-
135
- const hasRelationships = Boolean(
136
- relationships && ((relationships.dependsOn?.length ?? 0) > 0 || (relationships.related?.length ?? 0) > 0)
137
- );
138
-
139
- React.useEffect(() => {
140
- if (!hasRelationships) {
141
- setDependenciesDialogOpen(false);
142
- }
143
- }, [hasRelationships]);
144
-
145
- // Extract H1 title from markdown content
146
- const h1Title = extractH1Title(spec.contentMd);
147
- const displayTitle = h1Title || spec.title || spec.specName;
148
-
149
- // Get content to display (main or sub-spec)
150
- let displayContent = spec.contentMd;
151
-
152
- if (currentSubSpec && spec.subSpecs) {
153
- const subSpecData = spec.subSpecs.find(s => s.file === currentSubSpec);
154
- if (subSpecData) {
155
- displayContent = subSpecData.content;
156
- }
157
- }
158
-
159
- // Format dates
160
- const formatDate = (date: Date | string | number | null) => {
161
- if (!date) return 'N/A';
162
- return new Date(date).toLocaleDateString('en-US', {
163
- year: 'numeric',
164
- month: 'short',
165
- day: 'numeric'
166
- });
167
- };
168
-
169
- // Handle sub-spec switching with optimistic UI (instant, no network)
170
- const handleSubSpecSwitch = (file: string | null) => {
171
- const newUrl = file
172
- ? `/specs/${spec.specNumber || spec.id}?subspec=${file}`
173
- : `/specs/${spec.specNumber || spec.id}`;
174
-
175
- // Use shallow routing to avoid full page reload
176
- router.push(newUrl, { scroll: false });
177
- };
178
-
179
- return (
180
- <>
181
- {/* Compact Header - sticky on desktop, static on mobile */}
182
- <header className="lg:sticky lg:top-14 lg:z-20 border-b bg-card">
183
- <div className="px-3 sm:px-6 py-3 sm:py-4">
184
- {/* Line 1: Spec number + H1 Title */}
185
- <h1 className="text-xl sm:text-2xl font-bold tracking-tight mb-2 sm:mb-3">
186
- {spec.specNumber && (
187
- <span className="text-muted-foreground">#{spec.specNumber.toString().padStart(3, '0')} </span>
188
- )}
189
- {displayTitle}
190
- </h1>
191
-
192
- {/* Line 2: Status, Priority, Tags, Actions */}
193
- <div className="flex flex-wrap items-center gap-2">
194
- <StatusBadge status={spec.status || 'planned'} />
195
- <PriorityBadge priority={spec.priority || 'medium'} />
196
-
197
- {tags.length > 0 && (
198
- <>
199
- <div className="h-4 w-px bg-border mx-1 hidden sm:block" />
200
- <div className="flex flex-wrap gap-1">
201
- {tags.slice(0, 5).map((tag: string) => (
202
- <Badge key={tag} variant="secondary" className="text-xs">
203
- {tag}
204
- </Badge>
205
- ))}
206
- {tags.length > 5 && (
207
- <Badge variant="secondary" className="text-xs">
208
- +{tags.length - 5} more
209
- </Badge>
210
- )}
211
- </div>
212
- </>
213
- )}
214
- </div>
215
-
216
- {/* Line 3: Small metadata row */}
217
- <div className="flex flex-wrap gap-2 sm:gap-4 text-xs text-muted-foreground mt-2 sm:mt-3">
218
- <span className="hidden sm:inline">Created: {formatDate(spec.createdAt)}</span>
219
- <span className="hidden sm:inline">•</span>
220
- <span>
221
- Updated: {formatDate(spec.updatedAt)}
222
- {spec.updatedAt && (
223
- <span className="ml-1 text-[11px] text-muted-foreground/80">({updatedRelative})</span>
224
- )}
225
- </span>
226
- <span className="hidden sm:inline">•</span>
227
- <span className="hidden md:inline">Name: {spec.specName}</span>
228
- {spec.assignee && (
229
- <>
230
- <span className="hidden sm:inline">•</span>
231
- <span className="hidden sm:inline">Assignee: {spec.assignee}</span>
232
- </>
233
- )}
234
- </div>
235
-
236
- <div className="flex flex-wrap items-center gap-2 mt-3">
237
- <Dialog open={timelineDialogOpen} onOpenChange={setTimelineDialogOpen}>
238
- <DialogTrigger asChild>
239
- <Button
240
- type="button"
241
- variant="outline"
242
- size="sm"
243
- className="h-8 rounded-full border px-3 text-xs font-medium text-muted-foreground transition-colors hover:text-foreground"
244
- >
245
- <Clock className="mr-1.5 h-3.5 w-3.5" />
246
- View Timeline
247
- <Maximize2 className="ml-1.5 h-3.5 w-3.5" />
248
- </Button>
249
- </DialogTrigger>
250
- <DialogContent className="w-[min(900px,90vw)] max-w-3xl max-h-[90vh] overflow-y-auto">
251
- <DialogHeader>
252
- <DialogTitle>Spec Timeline</DialogTitle>
253
- <DialogDescription>Created, updated, and completion milestones.</DialogDescription>
254
- </DialogHeader>
255
- <div className="rounded-xl border border-border bg-muted/30 p-4">
256
- <SpecTimeline
257
- createdAt={spec.createdAt}
258
- updatedAt={spec.updatedAt}
259
- completedAt={spec.completedAt}
260
- status={spec.status || 'planned'}
261
- />
262
- </div>
263
- </DialogContent>
264
- </Dialog>
265
-
266
- <Dialog open={dependenciesDialogOpen} onOpenChange={setDependenciesDialogOpen}>
267
- <DialogTrigger asChild>
268
- <Button
269
- type="button"
270
- variant="outline"
271
- size="sm"
272
- disabled={!hasRelationships}
273
- className={cn(
274
- 'h-8 rounded-full border px-3 text-xs font-medium text-muted-foreground transition-colors hover:text-foreground',
275
- !hasRelationships && 'cursor-not-allowed opacity-50'
276
- )}
277
- >
278
- <GitBranch className="mr-1.5 h-3.5 w-3.5" />
279
- View Dependencies
280
- <Maximize2 className="ml-1.5 h-3.5 w-3.5" />
281
- </Button>
282
- </DialogTrigger>
283
- <DialogContent className="flex h-[85vh] w-[min(1200px,95vw)] max-w-6xl flex-col gap-4 overflow-hidden">
284
- <DialogHeader>
285
- <DialogTitle>Dependency Graph</DialogTitle>
286
- <DialogDescription>
287
- Precedence requirements and connected specs rendered with automatic layout.
288
- </DialogDescription>
289
- </DialogHeader>
290
- <div className="min-h-0 flex-1">
291
- {completeRelationships && (
292
- <SpecDependencyGraph
293
- relationships={completeRelationships}
294
- specNumber={spec.specNumber}
295
- specTitle={displayTitle}
296
- />
297
- )}
298
- </div>
299
- </DialogContent>
300
- </Dialog>
301
- </div>
302
- </div>
303
-
304
- {/* Horizontal Tabs for Sub-specs (only if sub-specs exist) */}
305
- {spec.subSpecs && spec.subSpecs.length > 0 && (
306
- <div className="border-t bg-muted/30">
307
- <div className="px-3 sm:px-6 overflow-x-auto">
308
- <div className="flex gap-1 py-2 min-w-max">
309
- {/* Overview tab (README.md) */}
310
- <button
311
- onClick={() => handleSubSpecSwitch(null)}
312
- className={`flex items-center gap-2 px-3 sm:px-4 py-2 text-xs sm:text-sm font-medium rounded-md whitespace-nowrap transition-colors ${
313
- !currentSubSpec
314
- ? 'bg-background text-foreground shadow-sm'
315
- : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'
316
- }`}
317
- >
318
- <Home className="h-4 w-4" />
319
- <span className="hidden sm:inline">Overview</span>
320
- </button>
321
-
322
-
323
- {/* Sub-spec tabs */}
324
- {spec.subSpecs.map((subSpec) => {
325
- const Icon = SUB_SPEC_ICONS[subSpec.iconName] || FileText;
326
- return (
327
- <button
328
- key={subSpec.file}
329
- onClick={() => handleSubSpecSwitch(subSpec.file)}
330
- className={`flex items-center gap-2 px-3 sm:px-4 py-2 text-xs sm:text-sm font-medium rounded-md whitespace-nowrap transition-colors ${
331
- currentSubSpec === subSpec.file
332
- ? 'bg-background text-foreground shadow-sm'
333
- : 'text-muted-foreground hover:text-foreground hover:bg-muted/50'
334
- }`}
335
- >
336
- <Icon className={`h-4 w-4 ${subSpec.color}`} />
337
- <span className="hidden sm:inline">{subSpec.name}</span>
338
- </button>
339
- );
340
- })}
341
- </div>
342
- </div>
343
- </div>
344
- )}
345
- </header>
346
-
347
- {/* Main content (full width) */}
348
- <main className="px-3 sm:px-6 py-4 sm:py-8">
349
- <div className="space-y-6">
350
- {isLoading && <div className="text-sm text-muted-foreground">Loading...</div>}
351
- {error && <div className="text-sm text-destructive">Error loading spec</div>}
352
-
353
- <article className="prose prose-slate dark:prose-invert max-w-none prose-sm sm:prose-base">
354
- <ReactMarkdown
355
- remarkPlugins={[remarkGfm, remarkStripHtmlComments]}
356
- rehypePlugins={[rehypeHighlight, rehypeSlug]}
357
- components={{
358
- a: (props) => <MarkdownLink {...props} currentSpecNumber={spec.specNumber || undefined} />,
359
- }}
360
- >
361
- {displayContent}
362
- </ReactMarkdown>
363
- </article>
364
- </div>
365
- </main>
366
-
367
- {/* Floating action buttons */}
368
- <TableOfContents content={displayContent} />
369
- <BackToTop />
370
- </>
371
- );
372
- }
@@ -1,42 +0,0 @@
1
- "use client";
2
-
3
- import { SpecsNavSidebar } from '@/components/specs-nav-sidebar';
4
- import { Skeleton } from '@/components/ui/skeleton';
5
- import { useSpecsSidebarState } from '@/lib/stores/specs-sidebar-store';
6
-
7
- export function SpecDetailLoadingShell() {
8
- const sidebarState = useSpecsSidebarState();
9
- const cachedSpecs = sidebarState.specs;
10
- const activeSpecId = sidebarState.activeSpecId || '';
11
-
12
- return (
13
- <div className="flex min-h-[calc(100vh-3.5rem)] w-full min-w-0">
14
- <SpecsNavSidebar initialSpecs={cachedSpecs} currentSpecId={activeSpecId} />
15
-
16
- <div className="flex-1 min-w-0 px-4 py-6 sm:px-8 sm:py-10">
17
- <div className="space-y-6">
18
- <div className="space-y-3">
19
- <Skeleton className="h-7 w-56" />
20
- <div className="flex flex-wrap gap-3">
21
- <Skeleton className="h-6 w-24" />
22
- <Skeleton className="h-6 w-24" />
23
- <Skeleton className="h-6 w-20" />
24
- </div>
25
- <Skeleton className="h-4 w-64" />
26
- </div>
27
-
28
- <div className="space-y-4">
29
- <Skeleton className="h-5 w-40" />
30
- <Skeleton className="h-32 w-full" />
31
- </div>
32
-
33
- <div className="space-y-4">
34
- {[...Array(6)].map((_, idx) => (
35
- <Skeleton key={idx} className="h-4 w-full" />
36
- ))}
37
- </div>
38
- </div>
39
- </div>
40
- </div>
41
- );
42
- }
@@ -1,70 +0,0 @@
1
- /**
2
- * Client wrapper for spec detail page with prefetching support
3
- * Phase 2: Tier 2 - Hybrid Rendering
4
- */
5
-
6
- 'use client';
7
-
8
- import * as React from 'react';
9
- import { SpecsNavSidebar } from '@/components/specs-nav-sidebar';
10
- import { SpecDetailClient } from '@/components/spec-detail-client';
11
- import { primeSpecsSidebar, setActiveSidebarSpec } from '@/lib/stores/specs-sidebar-store';
12
- import type { SpecWithMetadata, SidebarSpec } from '@/types/specs';
13
- import type { ParsedSpec } from '@/lib/db/service-queries';
14
-
15
- interface SpecDetailWrapperProps {
16
- spec: SpecWithMetadata;
17
- allSpecs: ParsedSpec[];
18
- currentSubSpec?: string;
19
- }
20
-
21
- export function SpecDetailWrapper({ spec, allSpecs, currentSubSpec }: SpecDetailWrapperProps) {
22
- const sidebarSpecs = React.useMemo<SidebarSpec[]>(() => (
23
- allSpecs.map((item) => ({
24
- id: item.id,
25
- specNumber: item.specNumber,
26
- title: item.title,
27
- specName: item.specName,
28
- status: item.status,
29
- priority: item.priority,
30
- tags: item.tags,
31
- contentMd: item.contentMd,
32
- updatedAt: item.updatedAt,
33
- subSpecsCount: ('subSpecsCount' in item) ? (item as any).subSpecsCount : undefined,
34
- }))
35
- ), [allSpecs]);
36
-
37
- // Prime sidebar store with latest metadata (only publishes when signature changes)
38
- React.useEffect(() => {
39
- primeSpecsSidebar(sidebarSpecs);
40
- }, [sidebarSpecs]);
41
-
42
- React.useEffect(() => {
43
- setActiveSidebarSpec(spec.id);
44
- }, [spec.id]);
45
-
46
- // Prefetch spec data on hover
47
- const handleSpecPrefetch = React.useCallback((specId: string) => {
48
- fetch(`/api/specs/${specId}`).catch(() => {
49
- // Prefetch is opportunistic, ignore failures
50
- });
51
- }, []);
52
-
53
- return (
54
- <div className="flex min-h-[calc(100vh-3.5rem)] w-full min-w-0">
55
- <SpecsNavSidebar
56
- initialSpecs={sidebarSpecs}
57
- currentSpecId={spec.id}
58
- currentSubSpec={currentSubSpec}
59
- onSpecHover={handleSpecPrefetch}
60
- />
61
-
62
- <div className="flex-1 min-w-0">
63
- <SpecDetailClient
64
- initialSpec={spec}
65
- initialSubSpec={currentSubSpec}
66
- />
67
- </div>
68
- </div>
69
- );
70
- }
@@ -1,136 +0,0 @@
1
- /**
2
- * Metadata card component with icons for spec details
3
- */
4
-
5
- import { Calendar, User, Tag, GitBranch, ExternalLink } from 'lucide-react';
6
- import { Card, CardContent } from '@/components/ui/card';
7
- import { Badge } from '@/components/ui/badge';
8
- import { Avatar, AvatarFallback } from '@/components/ui/avatar';
9
- import { StatusBadge } from '@/components/status-badge';
10
- import { PriorityBadge } from '@/components/priority-badge';
11
- import { formatDate, formatRelativeTime } from '@/lib/date-utils';
12
- import type { Spec } from '@/lib/db/schema';
13
-
14
- interface SpecMetadataProps {
15
- spec: Spec & { tags: string[] | null };
16
- }
17
-
18
- export function SpecMetadata({ spec }: SpecMetadataProps) {
19
- return (
20
- <Card>
21
- <CardContent className="pt-6">
22
- <dl className="grid grid-cols-2 gap-4">
23
- {/* Status */}
24
- <div>
25
- <dt className="text-sm font-medium text-muted-foreground flex items-center gap-1.5 mb-1">
26
- Status
27
- </dt>
28
- <dd>
29
- <StatusBadge status={spec.status || 'planned'} />
30
- </dd>
31
- </div>
32
-
33
- {/* Priority */}
34
- <div>
35
- <dt className="text-sm font-medium text-muted-foreground flex items-center gap-1.5 mb-1">
36
- Priority
37
- </dt>
38
- <dd>
39
- <PriorityBadge priority={spec.priority || 'medium'} />
40
- </dd>
41
- </div>
42
-
43
- {/* Created */}
44
- <div>
45
- <dt className="text-sm font-medium text-muted-foreground flex items-center gap-1.5 mb-1">
46
- <Calendar className="h-4 w-4" />
47
- Created
48
- </dt>
49
- <dd className="text-sm">
50
- {formatDate(spec.createdAt)}
51
- {spec.createdAt && (
52
- <span className="text-muted-foreground ml-1">
53
- ({formatRelativeTime(spec.createdAt)})
54
- </span>
55
- )}
56
- </dd>
57
- </div>
58
-
59
- {/* Updated */}
60
- <div>
61
- <dt className="text-sm font-medium text-muted-foreground flex items-center gap-1.5 mb-1">
62
- <Calendar className="h-4 w-4" />
63
- Updated
64
- </dt>
65
- <dd className="text-sm">
66
- {formatDate(spec.updatedAt)}
67
- {spec.updatedAt && (
68
- <span className="text-muted-foreground ml-1">
69
- ({formatRelativeTime(spec.updatedAt)})
70
- </span>
71
- )}
72
- </dd>
73
- </div>
74
-
75
- {/* Assignee */}
76
- {spec.assignee && (
77
- <div>
78
- <dt className="text-sm font-medium text-muted-foreground flex items-center gap-1.5 mb-1">
79
- <User className="h-4 w-4" />
80
- Assignee
81
- </dt>
82
- <dd>
83
- <div className="flex items-center gap-2">
84
- <Avatar className="h-6 w-6">
85
- <AvatarFallback className="text-xs">
86
- {spec.assignee.substring(0, 2).toUpperCase()}
87
- </AvatarFallback>
88
- </Avatar>
89
- <span className="text-sm">{spec.assignee}</span>
90
- </div>
91
- </dd>
92
- </div>
93
- )}
94
-
95
- {/* Tags */}
96
- {spec.tags && spec.tags.length > 0 && (
97
- <div className={spec.assignee ? '' : 'col-span-2'}>
98
- <dt className="text-sm font-medium text-muted-foreground flex items-center gap-1.5 mb-1">
99
- <Tag className="h-4 w-4" />
100
- Tags
101
- </dt>
102
- <dd className="flex gap-1 flex-wrap">
103
- {spec.tags.map((tag) => (
104
- <Badge key={tag} variant="outline" className="text-xs">
105
- {tag}
106
- </Badge>
107
- ))}
108
- </dd>
109
- </div>
110
- )}
111
-
112
- {/* GitHub URL */}
113
- {spec.githubUrl && (
114
- <div className="col-span-2">
115
- <dt className="text-sm font-medium text-muted-foreground flex items-center gap-1.5 mb-1">
116
- <GitBranch className="h-4 w-4" />
117
- Source
118
- </dt>
119
- <dd>
120
- <a
121
- href={spec.githubUrl}
122
- target="_blank"
123
- rel="noopener noreferrer"
124
- className="text-sm text-primary hover:underline flex items-center gap-1"
125
- >
126
- View on GitHub
127
- <ExternalLink className="h-3.5 w-3.5" />
128
- </a>
129
- </dd>
130
- </div>
131
- )}
132
- </dl>
133
- </CardContent>
134
- </Card>
135
- );
136
- }