@leanspec/ui 0.2.7 → 0.2.9

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 (262) hide show
  1. package/.next/standalone/packages/ui/.next/BUILD_ID +1 -1
  2. package/.next/standalone/packages/ui/.next/app-path-routes-manifest.json +4 -0
  3. package/.next/standalone/packages/ui/.next/build-manifest.json +4 -4
  4. package/.next/standalone/packages/ui/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/packages/ui/.next/routes-manifest.json +24 -0
  6. package/.next/standalone/packages/ui/.next/server/app/_global-error/page/build-manifest.json +2 -2
  7. package/.next/standalone/packages/ui/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/packages/ui/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/packages/ui/.next/server/app/_global-error.html +2 -2
  10. package/.next/standalone/packages/ui/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/standalone/packages/ui/.next/server/app/_not-found/page/build-manifest.json +2 -2
  16. package/.next/standalone/packages/ui/.next/server/app/_not-found/page.js +1 -1
  17. package/.next/standalone/packages/ui/.next/server/app/_not-found/page.js.nft.json +1 -1
  18. package/.next/standalone/packages/ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/packages/ui/.next/server/app/_not-found.html +2 -2
  20. package/.next/standalone/packages/ui/.next/server/app/_not-found.rsc +19 -19
  21. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_full.segment.rsc +19 -19
  22. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
  23. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
  24. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  25. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_tree.segment.rsc +6 -6
  26. package/.next/standalone/packages/ui/.next/server/app/api/context/route/app-paths-manifest.json +3 -0
  27. package/.next/standalone/packages/ui/.next/server/app/api/context/route/build-manifest.json +11 -0
  28. package/.next/standalone/packages/ui/.next/server/app/api/context/route/server-reference-manifest.json +4 -0
  29. package/.next/standalone/packages/ui/.next/server/app/api/context/route.js +8 -0
  30. package/.next/standalone/packages/ui/.next/server/app/api/context/route.js.map +5 -0
  31. package/.next/standalone/packages/ui/.next/server/app/api/context/route.js.nft.json +1 -0
  32. package/.next/standalone/packages/ui/.next/server/app/api/context/route_client-reference-manifest.js +2 -0
  33. package/.next/standalone/packages/ui/.next/server/app/api/dependencies/route/app-paths-manifest.json +3 -0
  34. package/.next/standalone/packages/ui/.next/server/app/api/dependencies/route/build-manifest.json +11 -0
  35. package/.next/standalone/packages/ui/.next/server/app/api/dependencies/route/server-reference-manifest.json +4 -0
  36. package/.next/standalone/packages/ui/.next/server/app/api/dependencies/route.js +8 -0
  37. package/.next/standalone/packages/ui/.next/server/app/api/dependencies/route.js.map +5 -0
  38. package/.next/standalone/packages/ui/.next/server/app/api/dependencies/route.js.nft.json +1 -0
  39. package/.next/standalone/packages/ui/.next/server/app/api/dependencies/route_client-reference-manifest.js +2 -0
  40. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/[id]/route.js.nft.json +1 -1
  41. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/discover/route.js.nft.json +1 -1
  42. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/list-directory/route.js.nft.json +1 -1
  43. package/.next/standalone/packages/ui/.next/server/app/api/local-projects/route.js.nft.json +1 -1
  44. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
  45. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/route.js.nft.json +1 -1
  46. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/status/route.js.nft.json +1 -1
  47. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/route.js.nft.json +1 -1
  48. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/stats/route.js.nft.json +1 -1
  49. package/.next/standalone/packages/ui/.next/server/app/api/projects/route.js.nft.json +1 -1
  50. package/.next/standalone/packages/ui/.next/server/app/api/revalidate/route.js.nft.json +1 -1
  51. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/dependency-graph/route.js.nft.json +1 -1
  52. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/route.js.nft.json +1 -1
  53. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route.js.nft.json +1 -1
  54. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/subspecs/[file]/route.js.nft.json +1 -1
  55. package/.next/standalone/packages/ui/.next/server/app/api/stats/route.js.nft.json +1 -1
  56. package/.next/standalone/packages/ui/.next/server/app/context/page/app-paths-manifest.json +3 -0
  57. package/.next/standalone/packages/ui/.next/server/app/context/page/build-manifest.json +18 -0
  58. package/.next/standalone/packages/ui/.next/server/app/context/page/next-font-manifest.json +6 -0
  59. package/.next/standalone/packages/ui/.next/server/app/context/page/react-loadable-manifest.json +1 -0
  60. package/.next/standalone/packages/ui/.next/server/app/context/page/server-reference-manifest.json +4 -0
  61. package/.next/standalone/packages/ui/.next/server/app/context/page.js +19 -0
  62. package/.next/standalone/packages/ui/.next/server/app/context/page.js.map +5 -0
  63. package/.next/standalone/packages/ui/.next/server/app/context/page.js.nft.json +1 -0
  64. package/.next/standalone/packages/ui/.next/server/app/context/page_client-reference-manifest.js +2 -0
  65. package/.next/standalone/packages/ui/.next/server/app/dependencies/page/app-paths-manifest.json +3 -0
  66. package/.next/standalone/packages/ui/.next/server/app/dependencies/page/build-manifest.json +18 -0
  67. package/.next/standalone/packages/ui/.next/server/app/dependencies/page/next-font-manifest.json +6 -0
  68. package/.next/standalone/packages/ui/.next/server/app/dependencies/page/react-loadable-manifest.json +1 -0
  69. package/.next/standalone/packages/ui/.next/server/app/dependencies/page/server-reference-manifest.json +4 -0
  70. package/.next/standalone/packages/ui/.next/server/app/dependencies/page.js +19 -0
  71. package/.next/standalone/packages/ui/.next/server/app/dependencies/page.js.map +5 -0
  72. package/.next/standalone/packages/ui/.next/server/app/dependencies/page.js.nft.json +1 -0
  73. package/.next/standalone/packages/ui/.next/server/app/dependencies/page_client-reference-manifest.js +2 -0
  74. package/.next/standalone/packages/ui/.next/server/app/page/build-manifest.json +2 -2
  75. package/.next/standalone/packages/ui/.next/server/app/page.js +1 -1
  76. package/.next/standalone/packages/ui/.next/server/app/page.js.nft.json +1 -1
  77. package/.next/standalone/packages/ui/.next/server/app/page_client-reference-manifest.js +1 -1
  78. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page/build-manifest.json +2 -2
  79. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page.js +1 -1
  80. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page.js.nft.json +1 -1
  81. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page_client-reference-manifest.js +1 -1
  82. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/[specId]/page/build-manifest.json +2 -2
  83. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/[specId]/page.js +1 -1
  84. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/[specId]/page.js.nft.json +1 -1
  85. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/[specId]/page_client-reference-manifest.js +1 -1
  86. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/page/build-manifest.json +2 -2
  87. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/page.js +1 -1
  88. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/page.js.nft.json +1 -1
  89. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/page_client-reference-manifest.js +1 -1
  90. package/.next/standalone/packages/ui/.next/server/app/projects/page/build-manifest.json +2 -2
  91. package/.next/standalone/packages/ui/.next/server/app/projects/page.js +1 -1
  92. package/.next/standalone/packages/ui/.next/server/app/projects/page.js.nft.json +1 -1
  93. package/.next/standalone/packages/ui/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  94. package/.next/standalone/packages/ui/.next/server/app/projects.html +2 -2
  95. package/.next/standalone/packages/ui/.next/server/app/projects.rsc +24 -23
  96. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_full.segment.rsc +24 -23
  97. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_index.segment.rsc +9 -9
  98. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_tree.segment.rsc +3 -3
  99. package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +2 -2
  100. package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects.segment.rsc +1 -1
  101. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page/build-manifest.json +2 -2
  102. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page.js +1 -1
  103. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page.js.nft.json +1 -1
  104. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page_client-reference-manifest.js +1 -1
  105. package/.next/standalone/packages/ui/.next/server/app/specs/page/build-manifest.json +2 -2
  106. package/.next/standalone/packages/ui/.next/server/app/specs/page.js +1 -1
  107. package/.next/standalone/packages/ui/.next/server/app/specs/page.js.nft.json +1 -1
  108. package/.next/standalone/packages/ui/.next/server/app/specs/page_client-reference-manifest.js +1 -1
  109. package/.next/standalone/packages/ui/.next/server/app/stats/page/build-manifest.json +2 -2
  110. package/.next/standalone/packages/ui/.next/server/app/stats/page.js +1 -1
  111. package/.next/standalone/packages/ui/.next/server/app/stats/page.js.nft.json +1 -1
  112. package/.next/standalone/packages/ui/.next/server/app/stats/page_client-reference-manifest.js +1 -1
  113. package/.next/standalone/packages/ui/.next/server/app-paths-manifest.json +4 -0
  114. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__3559376c._.js +2 -2
  115. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__65667b70._.js +1 -1
  116. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__803d07f0._.js +1 -1
  117. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__84cdc14a._.js +1 -1
  118. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__8a9ab1a3._.js +3 -0
  119. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__b0969111._.js +3 -0
  120. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__bdc3963a._.js +1 -1
  121. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__f5c6d6b8._.js +1 -1
  122. package/.next/standalone/packages/ui/.next/server/chunks/packages_ui__next-internal_server_app_api_context_route_actions_dead6daa.js +3 -0
  123. package/.next/standalone/packages/ui/.next/server/chunks/packages_ui__next-internal_server_app_api_dependencies_route_actions_cf6b14c3.js +3 -0
  124. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__12b4eb41._.js +3 -0
  125. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__3c77d95b._.js +3 -0
  126. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__44b603f9._.js +3 -0
  127. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__69a0d63a._.js +3 -0
  128. package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__daee3355._.js → [root-of-the-server]__8608a6fa._.js} +2 -2
  129. package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__fd80e4dd._.js → [root-of-the-server]__a965a67b._.js} +2 -2
  130. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__daedd80e._.js +3 -0
  131. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__dc176c61._.js +3 -0
  132. package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__5382b397._.js → [root-of-the-server]__ead1539c._.js} +2 -2
  133. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_000dd317._.js +1 -1
  134. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_03aa8d19._.js +7 -0
  135. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_28fe1532._.js +5 -0
  136. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_8cec504f._.js +3 -0
  137. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_959ad3d8._.js +4 -0
  138. package/.next/standalone/packages/ui/.next/server/chunks/ssr/{_22274047._.js → _adb9d7cb._.js} +2 -2
  139. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_da18b655._.js +3 -0
  140. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_ea899b87._.js +3 -0
  141. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_f38e75b7._.js +4 -0
  142. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_fe120f8a._.js +3 -0
  143. package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_015f83ca._.js +3 -0
  144. package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_1120b57c._.js +3 -0
  145. package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_151891de._.js +3 -0
  146. package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_1c916fe3._.js +3 -0
  147. package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_80605a06._.js +3 -0
  148. package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_bb80de48._.js +3 -0
  149. package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_e8075f9b._.js +3 -0
  150. package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_f919ef4a._.js +3 -0
  151. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui__next-internal_server_app_context_page_actions_1a062d48.js +3 -0
  152. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui__next-internal_server_app_dependencies_page_actions_57387d47.js +3 -0
  153. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_context_context-client_tsx_4ba99a62._.js +12 -0
  154. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_dependencies_dependencies-client_tsx_0e82443a._.js +4 -0
  155. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_specs_specs-client_tsx_0bb8f8f8._.js +1 -1
  156. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_components_spec-detail-wrapper_tsx_fd35401c._.js +3 -0
  157. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_components_specs-nav-sidebar_tsx_8237ed13._.js +1 -1
  158. package/.next/standalone/packages/ui/.next/server/middleware-build-manifest.js +2 -2
  159. package/.next/standalone/packages/ui/.next/server/pages/404.html +2 -2
  160. package/.next/standalone/packages/ui/.next/server/pages/500.html +2 -2
  161. package/.next/standalone/packages/ui/.next/server/server-reference-manifest.js +1 -1
  162. package/.next/standalone/packages/ui/.next/server/server-reference-manifest.json +1 -1
  163. package/.next/standalone/packages/ui/.next/static/chunks/094cf9f4e3553261.js +1 -0
  164. package/.next/standalone/packages/ui/.next/static/chunks/1c015eb9eaaf9f9c.js +1 -0
  165. package/.next/standalone/packages/ui/.next/static/chunks/1d36660b2877d213.js +3 -0
  166. package/.next/standalone/packages/ui/.next/static/chunks/46275d9d67603bf5.js +1 -0
  167. package/.next/standalone/packages/ui/.next/static/chunks/4d29ca0fa6843070.js +2 -0
  168. package/.next/standalone/packages/ui/.next/static/chunks/59854b15bf046467.js +1 -0
  169. package/.next/standalone/packages/ui/.next/static/chunks/{cca4441cde342ae3.js → 5fd8101e32b076b1.js} +1 -1
  170. package/.next/standalone/packages/ui/.next/static/chunks/6d938a49daa10208.js +2 -0
  171. package/.next/standalone/packages/ui/.next/static/chunks/979625373d5474b6.js +1 -0
  172. package/.next/standalone/packages/ui/.next/static/chunks/a33f10af6abef4df.js +10 -0
  173. package/.next/{static/chunks/794f3931f1ca12d2.js → standalone/packages/ui/.next/static/chunks/a3d7e1be47de010b.js} +1 -1
  174. package/.next/standalone/packages/ui/.next/static/chunks/a5e25b9fa6b88eee.js +1 -0
  175. package/.next/standalone/packages/ui/.next/static/chunks/b53250480fde6816.js +1 -0
  176. package/.next/standalone/packages/ui/.next/static/chunks/b7f19087afe1d2c9.css +1 -0
  177. package/.next/standalone/packages/ui/.next/static/chunks/c658e22a605e0ed1.js +1 -0
  178. package/.next/standalone/packages/ui/.next/static/chunks/c92660d8d0c4763d.js +1 -0
  179. package/.next/standalone/packages/ui/.next/static/chunks/ddd87cd0d26bc2f5.js +1 -0
  180. package/.next/standalone/packages/ui/.next/static/chunks/eeec245955b3b600.js +5 -0
  181. package/.next/standalone/packages/ui/.next/static/chunks/ff11efb770d5a0bc.js +1 -0
  182. package/.next/{static/chunks/turbopack-5fa55215af0efb15.js → standalone/packages/ui/.next/static/chunks/turbopack-261c5dcdd873f310.js} +1 -1
  183. package/.next/standalone/packages/ui/package.json +5 -1
  184. package/.next/standalone/packages/ui/src/app/api/context/route.ts +22 -0
  185. package/.next/standalone/packages/ui/src/app/api/dependencies/route.ts +81 -0
  186. package/.next/standalone/packages/ui/src/app/context/context-client.tsx +393 -0
  187. package/.next/standalone/packages/ui/src/app/context/page.tsx +17 -0
  188. package/.next/standalone/packages/ui/src/app/dependencies/constants.ts +24 -0
  189. package/.next/standalone/packages/ui/src/app/dependencies/dependencies-client.tsx +625 -0
  190. package/.next/standalone/packages/ui/src/app/dependencies/index.ts +19 -0
  191. package/.next/standalone/packages/ui/src/app/dependencies/page.tsx +38 -0
  192. package/.next/standalone/packages/ui/src/app/dependencies/spec-node.tsx +80 -0
  193. package/.next/standalone/packages/ui/src/app/dependencies/spec-sidebar.tsx +198 -0
  194. package/.next/standalone/packages/ui/src/app/dependencies/types.ts +37 -0
  195. package/.next/standalone/packages/ui/src/app/dependencies/utils.ts +194 -0
  196. package/.next/standalone/packages/ui/src/app/globals.css +16 -16
  197. package/.next/standalone/packages/ui/src/app/layout.tsx +4 -7
  198. package/.next/standalone/packages/ui/src/components/context-file-detail.tsx +308 -0
  199. package/.next/standalone/packages/ui/src/components/context-file-viewer.tsx +385 -0
  200. package/.next/standalone/packages/ui/src/components/main-sidebar.tsx +19 -1
  201. package/.next/standalone/packages/ui/src/components/spec-detail-client.tsx +181 -134
  202. package/.next/standalone/packages/ui/src/components/spec-detail-wrapper.tsx +20 -0
  203. package/.next/standalone/packages/ui/src/components/specs-nav-sidebar.tsx +3 -2
  204. package/.next/standalone/packages/ui/src/components/ui/accordion.tsx +58 -0
  205. package/.next/standalone/packages/ui/src/lib/db/service-queries.ts +172 -3
  206. package/.next/standalone/packages/ui/src/lib/specs/types.ts +44 -0
  207. package/.next/standalone/packages/ui/tsconfig.tsbuildinfo +1 -1
  208. package/.next/static/chunks/094cf9f4e3553261.js +1 -0
  209. package/.next/static/chunks/1c015eb9eaaf9f9c.js +1 -0
  210. package/.next/static/chunks/1d36660b2877d213.js +3 -0
  211. package/.next/static/chunks/46275d9d67603bf5.js +1 -0
  212. package/.next/static/chunks/4d29ca0fa6843070.js +2 -0
  213. package/.next/static/chunks/59854b15bf046467.js +1 -0
  214. package/.next/static/chunks/{cca4441cde342ae3.js → 5fd8101e32b076b1.js} +1 -1
  215. package/.next/static/chunks/6d938a49daa10208.js +2 -0
  216. package/.next/static/chunks/979625373d5474b6.js +1 -0
  217. package/.next/static/chunks/a33f10af6abef4df.js +10 -0
  218. package/.next/{standalone/packages/ui/.next/static/chunks/794f3931f1ca12d2.js → static/chunks/a3d7e1be47de010b.js} +1 -1
  219. package/.next/static/chunks/a5e25b9fa6b88eee.js +1 -0
  220. package/.next/static/chunks/b53250480fde6816.js +1 -0
  221. package/.next/static/chunks/b7f19087afe1d2c9.css +1 -0
  222. package/.next/static/chunks/c658e22a605e0ed1.js +1 -0
  223. package/.next/static/chunks/c92660d8d0c4763d.js +1 -0
  224. package/.next/static/chunks/ddd87cd0d26bc2f5.js +1 -0
  225. package/.next/static/chunks/eeec245955b3b600.js +5 -0
  226. package/.next/static/chunks/ff11efb770d5a0bc.js +1 -0
  227. package/.next/{standalone/packages/ui/.next/static/chunks/turbopack-5fa55215af0efb15.js → static/chunks/turbopack-261c5dcdd873f310.js} +1 -1
  228. package/package.json +6 -2
  229. package/.next/standalone/node_modules/.pnpm/source-map@0.8.0-beta.0/node_modules/source-map/package.json +0 -95
  230. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__1d0c2012._.js +0 -3
  231. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__73f60f12._.js +0 -7
  232. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__a7ae8552._.js +0 -7
  233. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_0f9ffe32._.js +0 -3
  234. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_14118969._.js +0 -3
  235. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_4129cc0f._.js +0 -3
  236. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_497c8b73._.js +0 -3
  237. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_ac867463._.js +0 -3
  238. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_c2f54661._.js +0 -5
  239. package/.next/standalone/packages/ui/.next/static/chunks/16ff9833ae1bb3ae.js +0 -1
  240. package/.next/standalone/packages/ui/.next/static/chunks/2204c0f16b23ec4c.js +0 -3
  241. package/.next/standalone/packages/ui/.next/static/chunks/294dea6dbec43ca6.js +0 -1
  242. package/.next/standalone/packages/ui/.next/static/chunks/7590e65bcaa41e8b.js +0 -1
  243. package/.next/standalone/packages/ui/.next/static/chunks/b6976cf6c48996e5.js +0 -1
  244. package/.next/standalone/packages/ui/.next/static/chunks/b8353eb8c6fb895e.js +0 -1
  245. package/.next/standalone/packages/ui/.next/static/chunks/b845813463167db0.js +0 -5
  246. package/.next/standalone/packages/ui/.next/static/chunks/bd9893e28f8f6a9a.css +0 -1
  247. package/.next/standalone/packages/ui/.next/static/chunks/d784d84d5b880e48.js +0 -1
  248. package/.next/static/chunks/16ff9833ae1bb3ae.js +0 -1
  249. package/.next/static/chunks/2204c0f16b23ec4c.js +0 -3
  250. package/.next/static/chunks/294dea6dbec43ca6.js +0 -1
  251. package/.next/static/chunks/7590e65bcaa41e8b.js +0 -1
  252. package/.next/static/chunks/b6976cf6c48996e5.js +0 -1
  253. package/.next/static/chunks/b8353eb8c6fb895e.js +0 -1
  254. package/.next/static/chunks/b845813463167db0.js +0 -5
  255. package/.next/static/chunks/bd9893e28f8f6a9a.css +0 -1
  256. package/.next/static/chunks/d784d84d5b880e48.js +0 -1
  257. /package/.next/standalone/packages/ui/.next/static/{6nq7WNafPv5Bf_7mWgRQ- → 8PwFWS-09QjFSbDbfp15t}/_buildManifest.js +0 -0
  258. /package/.next/standalone/packages/ui/.next/static/{6nq7WNafPv5Bf_7mWgRQ- → 8PwFWS-09QjFSbDbfp15t}/_clientMiddlewareManifest.json +0 -0
  259. /package/.next/standalone/packages/ui/.next/static/{6nq7WNafPv5Bf_7mWgRQ- → 8PwFWS-09QjFSbDbfp15t}/_ssgManifest.js +0 -0
  260. /package/.next/static/{6nq7WNafPv5Bf_7mWgRQ- → 8PwFWS-09QjFSbDbfp15t}/_buildManifest.js +0 -0
  261. /package/.next/static/{6nq7WNafPv5Bf_7mWgRQ- → 8PwFWS-09QjFSbDbfp15t}/_clientMiddlewareManifest.json +0 -0
  262. /package/.next/static/{6nq7WNafPv5Bf_7mWgRQ- → 8PwFWS-09QjFSbDbfp15t}/_ssgManifest.js +0 -0
@@ -0,0 +1,393 @@
1
+ /**
2
+ * Project Context Client Component
3
+ * Displays project-level context files (AGENTS.md, config, README, etc.)
4
+ * Uses sidebar + content layout similar to spec detail page
5
+ * Phases 2 & 4: Spec 131 - UI Project Context Visibility
6
+ */
7
+
8
+ 'use client';
9
+
10
+ import * as React from 'react';
11
+ import { BookOpen, Settings, FileText, Copy, Check, AlertCircle, Coins, Info, Search, X, ChevronRight, ChevronDown } from 'lucide-react';
12
+ import { Card, CardHeader, CardTitle, CardDescription, CardContent } from '@/components/ui/card';
13
+ import { Button } from '@/components/ui/button';
14
+ import { Badge } from '@/components/ui/badge';
15
+ import { Input } from '@/components/ui/input';
16
+ import { ContextFileCard, countMatches } from '@/components/context-file-viewer';
17
+ import { ContextFileDetail } from '@/components/context-file-detail';
18
+ import type { ProjectContext, ContextFile } from '@/lib/specs/types';
19
+ import { cn } from '@/lib/utils';
20
+
21
+ interface ContextClientProps {
22
+ context: ProjectContext;
23
+ }
24
+
25
+ /**
26
+ * Get token threshold color
27
+ */
28
+ function getTotalTokenColor(tokens: number): string {
29
+ if (tokens < 5000) return 'text-green-600 dark:text-green-400';
30
+ if (tokens < 10000) return 'text-blue-600 dark:text-blue-400';
31
+ if (tokens < 20000) return 'text-yellow-600 dark:text-yellow-400';
32
+ return 'text-red-600 dark:text-red-400';
33
+ }
34
+
35
+ /**
36
+ * Empty state component
37
+ */
38
+ function EmptyState({
39
+ icon: Icon,
40
+ title,
41
+ description,
42
+ suggestion
43
+ }: {
44
+ icon: React.ComponentType<{ className?: string }>;
45
+ title: string;
46
+ description: string;
47
+ suggestion?: string;
48
+ }) {
49
+ return (
50
+ <div className="flex flex-col items-center justify-center py-8 text-center">
51
+ <Icon className="h-12 w-12 text-muted-foreground/50 mb-4" />
52
+ <h3 className="text-sm font-medium text-muted-foreground">{title}</h3>
53
+ <p className="text-xs text-muted-foreground/70 mt-1 max-w-xs">{description}</p>
54
+ {suggestion && (
55
+ <p className="text-xs text-primary mt-2">{suggestion}</p>
56
+ )}
57
+ </div>
58
+ );
59
+ }
60
+
61
+ /**
62
+ * Section with collapsible file cards
63
+ */
64
+ function ContextSection({
65
+ title,
66
+ description,
67
+ icon: Icon,
68
+ files,
69
+ emptyMessage,
70
+ emptySuggestion,
71
+ defaultExpanded = true,
72
+ searchQuery,
73
+ projectRoot,
74
+ onFileSelect,
75
+ }: {
76
+ title: string;
77
+ description: string;
78
+ icon: React.ComponentType<{ className?: string }>;
79
+ files: ContextFile[];
80
+ emptyMessage: string;
81
+ emptySuggestion?: string;
82
+ defaultExpanded?: boolean;
83
+ searchQuery?: string;
84
+ projectRoot?: string;
85
+ onFileSelect?: (file: ContextFile) => void;
86
+ }) {
87
+ const totalTokens = files.reduce((sum, f) => sum + f.tokenCount, 0);
88
+
89
+ // Filter files by search if query exists
90
+ const filteredFiles = React.useMemo(() => {
91
+ if (!searchQuery || searchQuery.length < 2) return files;
92
+ return files.filter(file => {
93
+ const matches = countMatches(file.content, searchQuery);
94
+ const nameMatch = file.name.toLowerCase().includes(searchQuery.toLowerCase());
95
+ return matches > 0 || nameMatch;
96
+ });
97
+ }, [files, searchQuery]);
98
+
99
+ // Calculate total matches in this section
100
+ const totalMatches = React.useMemo(() => {
101
+ if (!searchQuery || searchQuery.length < 2) return 0;
102
+ return filteredFiles.reduce((sum, file) => sum + countMatches(file.content, searchQuery), 0);
103
+ }, [filteredFiles, searchQuery]);
104
+
105
+ return (
106
+ <Card>
107
+ <CardHeader className="pb-3">
108
+ <div className="flex items-center justify-between">
109
+ <div className="flex items-center gap-3">
110
+ <div className="p-2 rounded-lg bg-primary/10">
111
+ <Icon className="h-5 w-5 text-primary" />
112
+ </div>
113
+ <div>
114
+ <CardTitle className="text-lg">{title}</CardTitle>
115
+ <CardDescription>{description}</CardDescription>
116
+ </div>
117
+ </div>
118
+ {files.length > 0 && (
119
+ <div className="flex items-center gap-2">
120
+ {searchQuery && totalMatches > 0 && (
121
+ <Badge variant="secondary" className="text-xs bg-yellow-100 dark:bg-yellow-900 text-yellow-800 dark:text-yellow-200">
122
+ {totalMatches} match{totalMatches !== 1 ? 'es' : ''}
123
+ </Badge>
124
+ )}
125
+ <Badge variant="secondary" className="text-xs">
126
+ {filteredFiles.length}{filteredFiles.length !== files.length ? `/${files.length}` : ''} file{files.length !== 1 ? 's' : ''}
127
+ </Badge>
128
+ <Badge variant="outline" className={cn('text-xs', getTotalTokenColor(totalTokens))}>
129
+ <Coins className="h-3 w-3 mr-1" />
130
+ {totalTokens.toLocaleString()} tokens
131
+ </Badge>
132
+ </div>
133
+ )}
134
+ </div>
135
+ </CardHeader>
136
+ <CardContent>
137
+ {filteredFiles.length === 0 ? (
138
+ <EmptyState
139
+ icon={AlertCircle}
140
+ title={searchQuery ? "No matches found" : emptyMessage}
141
+ description={searchQuery ? "Try a different search term" : "No files found in this category"}
142
+ suggestion={searchQuery ? undefined : emptySuggestion}
143
+ />
144
+ ) : (
145
+ <div className="space-y-3">
146
+ {filteredFiles.map((file) => (
147
+ <ContextFileCard
148
+ key={file.path}
149
+ name={file.name}
150
+ path={file.path}
151
+ content={file.content}
152
+ tokenCount={file.tokenCount}
153
+ lastModified={file.lastModified}
154
+ searchQuery={searchQuery}
155
+ projectRoot={projectRoot}
156
+ onViewDetail={onFileSelect ? () => onFileSelect(file) : undefined}
157
+ />
158
+ ))}
159
+ </div>
160
+ )}
161
+ </CardContent>
162
+ </Card>
163
+ );
164
+ }
165
+
166
+ export function ContextClient({ context }: ContextClientProps) {
167
+ const [copiedAll, setCopiedAll] = React.useState(false);
168
+ const [searchQuery, setSearchQuery] = React.useState('');
169
+ const [selectedFile, setSelectedFile] = React.useState<ContextFile | null>(null);
170
+
171
+ // Collect all content for "Copy All" feature
172
+ const handleCopyAll = async () => {
173
+ const allContent: string[] = [];
174
+
175
+ // Agent instructions
176
+ for (const file of context.agentInstructions) {
177
+ allContent.push(`# ${file.path}\n\n${file.content}\n`);
178
+ }
179
+
180
+ // Config
181
+ if (context.config.file) {
182
+ allContent.push(`# ${context.config.file.path}\n\n${context.config.file.content}\n`);
183
+ }
184
+
185
+ // Project docs
186
+ for (const file of context.projectDocs) {
187
+ allContent.push(`# ${file.path}\n\n${file.content}\n`);
188
+ }
189
+
190
+ try {
191
+ await navigator.clipboard.writeText(allContent.join('\n---\n\n'));
192
+ setCopiedAll(true);
193
+ setTimeout(() => setCopiedAll(false), 2000);
194
+ } catch (error) {
195
+ console.error('Failed to copy all content:', error);
196
+ }
197
+ };
198
+
199
+ const hasAnyContent =
200
+ context.agentInstructions.length > 0 ||
201
+ context.config.file !== null ||
202
+ context.projectDocs.length > 0;
203
+
204
+ // Calculate total matches across all files
205
+ const totalMatches = React.useMemo(() => {
206
+ if (!searchQuery || searchQuery.length < 2) return 0;
207
+ let total = 0;
208
+ for (const file of context.agentInstructions) {
209
+ total += countMatches(file.content, searchQuery);
210
+ }
211
+ if (context.config.file) {
212
+ total += countMatches(context.config.file.content, searchQuery);
213
+ }
214
+ for (const file of context.projectDocs) {
215
+ total += countMatches(file.content, searchQuery);
216
+ }
217
+ return total;
218
+ }, [context, searchQuery]);
219
+
220
+ // If a file is selected, show the detail view
221
+ if (selectedFile) {
222
+ return (
223
+ <div className="min-h-screen bg-background">
224
+ <ContextFileDetail
225
+ file={selectedFile}
226
+ projectRoot={context.projectRoot}
227
+ onBack={() => setSelectedFile(null)}
228
+ />
229
+ </div>
230
+ );
231
+ }
232
+
233
+ return (
234
+ <div className="min-h-screen bg-background">
235
+ <div className="container mx-auto px-4 py-8 max-w-5xl">
236
+ {/* Header */}
237
+ <div className="mb-8">
238
+ <div className="flex items-start justify-between gap-4">
239
+ <div>
240
+ <h1 className="text-3xl sm:text-4xl font-bold tracking-tight flex items-center gap-3">
241
+ <BookOpen className="h-8 w-8 text-primary" />
242
+ Project Context
243
+ </h1>
244
+ <p className="text-muted-foreground mt-2">
245
+ View project-level context files that inform AI agents and development workflows
246
+ </p>
247
+ </div>
248
+ {hasAnyContent && (
249
+ <Button
250
+ variant="outline"
251
+ size="sm"
252
+ onClick={handleCopyAll}
253
+ className="shrink-0"
254
+ >
255
+ {copiedAll ? (
256
+ <>
257
+ <Check className="h-4 w-4 mr-2 text-green-600" />
258
+ Copied!
259
+ </>
260
+ ) : (
261
+ <>
262
+ <Copy className="h-4 w-4 mr-2" />
263
+ Copy All
264
+ </>
265
+ )}
266
+ </Button>
267
+ )}
268
+ </div>
269
+
270
+ {/* Search and Summary */}
271
+ {hasAnyContent && (
272
+ <div className="mt-6 space-y-4">
273
+ {/* Search bar */}
274
+ <div className="relative">
275
+ <Search className="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
276
+ <Input
277
+ type="text"
278
+ placeholder="Search within context files..."
279
+ value={searchQuery}
280
+ onChange={(e) => setSearchQuery(e.target.value)}
281
+ className="pl-10 pr-10"
282
+ />
283
+ {searchQuery && (
284
+ <Button
285
+ variant="ghost"
286
+ size="sm"
287
+ className="absolute right-1 top-1/2 -translate-y-1/2 h-7 w-7 p-0"
288
+ onClick={() => setSearchQuery('')}
289
+ >
290
+ <X className="h-4 w-4" />
291
+ </Button>
292
+ )}
293
+ </div>
294
+
295
+ {/* Search results info */}
296
+ {searchQuery && searchQuery.length >= 2 && (
297
+ <div className="flex items-center gap-2 text-sm">
298
+ {totalMatches > 0 ? (
299
+ <Badge variant="secondary" className="bg-yellow-100 dark:bg-yellow-900 text-yellow-800 dark:text-yellow-200">
300
+ {totalMatches} match{totalMatches !== 1 ? 'es' : ''} found
301
+ </Badge>
302
+ ) : (
303
+ <span className="text-muted-foreground">No matches found for &quot;{searchQuery}&quot;</span>
304
+ )}
305
+ </div>
306
+ )}
307
+
308
+ {/* Summary card */}
309
+ <Card className="bg-muted/30">
310
+ <CardContent className="py-4">
311
+ <div className="flex flex-wrap items-center gap-4 sm:gap-8">
312
+ <div className="flex items-center gap-2">
313
+ <Coins className={cn('h-5 w-5', getTotalTokenColor(context.totalTokens))} />
314
+ <span className="text-sm">
315
+ <strong className={getTotalTokenColor(context.totalTokens)}>
316
+ {context.totalTokens.toLocaleString()}
317
+ </strong>
318
+ {' '}total tokens
319
+ </span>
320
+ </div>
321
+ <div className="flex items-center gap-2 text-sm text-muted-foreground">
322
+ <Info className="h-4 w-4" />
323
+ Context budget for AI agents
324
+ </div>
325
+ </div>
326
+ </CardContent>
327
+ </Card>
328
+ </div>
329
+ )}
330
+ </div>
331
+
332
+ {/* Content sections */}
333
+ <div className="space-y-6">
334
+ {/* Agent Instructions */}
335
+ <ContextSection
336
+ title="Agent Instructions"
337
+ description="System prompts and guidelines for AI agents"
338
+ icon={BookOpen}
339
+ files={context.agentInstructions}
340
+ emptyMessage="No agent instructions found"
341
+ emptySuggestion="Create an AGENTS.md file in your project root"
342
+ defaultExpanded={context.agentInstructions.length <= 2}
343
+ searchQuery={searchQuery}
344
+ projectRoot={context.projectRoot}
345
+ onFileSelect={setSelectedFile}
346
+ />
347
+
348
+ {/* Configuration */}
349
+ <ContextSection
350
+ title="Configuration"
351
+ description="LeanSpec project configuration and settings"
352
+ icon={Settings}
353
+ files={context.config.file ? [context.config.file] : []}
354
+ emptyMessage="No configuration found"
355
+ emptySuggestion="Run 'lean-spec init' to create a config file"
356
+ defaultExpanded={true}
357
+ searchQuery={searchQuery}
358
+ projectRoot={context.projectRoot}
359
+ onFileSelect={setSelectedFile}
360
+ />
361
+
362
+ {/* Project Documentation */}
363
+ <ContextSection
364
+ title="Project Documentation"
365
+ description="README, contributing guidelines, and changelog"
366
+ icon={FileText}
367
+ files={context.projectDocs}
368
+ emptyMessage="No project docs found"
369
+ emptySuggestion="Create a README.md file in your project root"
370
+ defaultExpanded={false}
371
+ searchQuery={searchQuery}
372
+ projectRoot={context.projectRoot}
373
+ onFileSelect={setSelectedFile}
374
+ />
375
+ </div>
376
+
377
+ {/* No content state */}
378
+ {!hasAnyContent && (
379
+ <Card className="mt-8">
380
+ <CardContent className="py-12">
381
+ <EmptyState
382
+ icon={BookOpen}
383
+ title="No project context found"
384
+ description="This project doesn't have any context files yet. Context files help AI agents understand your project better."
385
+ suggestion="Start by creating AGENTS.md or running 'lean-spec init'"
386
+ />
387
+ </CardContent>
388
+ </Card>
389
+ )}
390
+ </div>
391
+ </div>
392
+ );
393
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Project Context Page
3
+ * Displays project-level context files for AI agents and development workflows
4
+ * Spec 131 - UI Project Context Visibility
5
+ */
6
+
7
+ import { getProjectContext } from '@/lib/db/service-queries';
8
+ import { ContextClient } from './context-client';
9
+
10
+ // Force dynamic rendering - this page needs runtime data
11
+ export const dynamic = 'force-dynamic';
12
+
13
+ export default async function ContextPage() {
14
+ const context = await getProjectContext();
15
+
16
+ return <ContextClient context={context} />;
17
+ }
@@ -0,0 +1,24 @@
1
+ // Node dimensions
2
+ export const NODE_WIDTH = 180;
3
+ export const NODE_HEIGHT = 60;
4
+ export const COMPACT_NODE_WIDTH = 120;
5
+ export const COMPACT_NODE_HEIGHT = 40;
6
+
7
+ // Edge colors
8
+ export const DEPENDS_ON_COLOR = '#f59e0b';
9
+
10
+ // Status tone classes for node styling (aligned with StatusBadge component)
11
+ export const toneClasses: Record<string, string> = {
12
+ planned: 'border-blue-500/80 bg-blue-950/60 text-blue-200',
13
+ 'in-progress': 'border-orange-500/80 bg-orange-950/60 text-orange-200',
14
+ complete: 'border-green-500/80 bg-green-950/60 text-green-200',
15
+ archived: 'border-gray-500/80 bg-gray-900/60 text-gray-400',
16
+ };
17
+
18
+ // Background colors for minimap (aligned with StatusBadge component)
19
+ export const toneBgColors: Record<string, string> = {
20
+ planned: '#1e3a8a', // blue-900
21
+ 'in-progress': '#7c2d12', // orange-900
22
+ complete: '#14532d', // green-900
23
+ archived: '#1f2937',
24
+ };