@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
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Context File Viewer Component
3
+ * Displays a single context file with token count, copy button, and syntax highlighting
4
+ * Phase 1 & 4: Spec 131 - UI Project Context Visibility
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import * as React from 'react';
10
+ import { Copy, Check, FileText, Clock, Coins, ExternalLink } from 'lucide-react';
11
+ import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
12
+ import { Button } from '@/components/ui/button';
13
+ import { Badge } from '@/components/ui/badge';
14
+ import { cn } from '@/lib/utils';
15
+ import ReactMarkdown from 'react-markdown';
16
+ import remarkGfm from 'remark-gfm';
17
+ import rehypeHighlight from 'rehype-highlight';
18
+
19
+ interface ContextFileViewerProps {
20
+ name: string;
21
+ path: string;
22
+ content: string;
23
+ tokenCount: number;
24
+ lastModified: Date | string;
25
+ isExpanded?: boolean;
26
+ onToggle?: () => void;
27
+ className?: string;
28
+ searchQuery?: string;
29
+ projectRoot?: string;
30
+ }
31
+
32
+ /**
33
+ * Get token count color based on thresholds
34
+ */
35
+ function getTokenColor(tokens: number): string {
36
+ if (tokens < 2000) return 'text-green-600 dark:text-green-400';
37
+ if (tokens < 3500) return 'text-blue-600 dark:text-blue-400';
38
+ if (tokens < 5000) return 'text-yellow-600 dark:text-yellow-400';
39
+ return 'text-red-600 dark:text-red-400';
40
+ }
41
+
42
+ /**
43
+ * Get token status label
44
+ */
45
+ function getTokenStatus(tokens: number): string {
46
+ if (tokens < 2000) return 'Optimal';
47
+ if (tokens < 3500) return 'Good';
48
+ if (tokens < 5000) return 'Large';
49
+ return 'Very Large';
50
+ }
51
+
52
+ /**
53
+ * Format date for display
54
+ */
55
+ function formatDate(date: Date | string): string {
56
+ const d = typeof date === 'string' ? new Date(date) : date;
57
+ return d.toLocaleDateString('en-US', {
58
+ year: 'numeric',
59
+ month: 'short',
60
+ day: 'numeric',
61
+ hour: '2-digit',
62
+ minute: '2-digit',
63
+ });
64
+ }
65
+
66
+ /**
67
+ * Highlight search matches in text
68
+ */
69
+ function highlightMatches(text: string, query: string): React.ReactNode {
70
+ if (!query || query.length < 2) return text;
71
+
72
+ const escapedQuery = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
73
+ const regex = new RegExp(`(${escapedQuery})`, 'gi');
74
+ const parts = text.split(regex);
75
+
76
+ return parts.map((part, i) =>
77
+ regex.test(part) ? (
78
+ <mark key={i} className="bg-yellow-200 dark:bg-yellow-800 rounded px-0.5">
79
+ {part}
80
+ </mark>
81
+ ) : (
82
+ part
83
+ )
84
+ );
85
+ }
86
+
87
+ /**
88
+ * Count search matches in content
89
+ */
90
+ export function countMatches(content: string, query: string): number {
91
+ if (!query || query.length < 2) return 0;
92
+ const escapedQuery = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
93
+ const matches = content.match(new RegExp(escapedQuery, 'gi'));
94
+ return matches ? matches.length : 0;
95
+ }
96
+
97
+ /**
98
+ * Generate VS Code URI to open file
99
+ */
100
+ function getVSCodeUri(projectRoot: string, filePath: string): string {
101
+ const fullPath = filePath.startsWith('/') ? filePath : `${projectRoot}/${filePath}`;
102
+ return `vscode://file${fullPath}`;
103
+ }
104
+
105
+ export function ContextFileViewer({
106
+ name,
107
+ path,
108
+ content,
109
+ tokenCount,
110
+ lastModified,
111
+ isExpanded = false,
112
+ onToggle,
113
+ className,
114
+ searchQuery,
115
+ projectRoot,
116
+ }: ContextFileViewerProps) {
117
+ const [copied, setCopied] = React.useState(false);
118
+ const matchCount = searchQuery ? countMatches(content, searchQuery) : 0;
119
+
120
+ const handleCopy = async (e: React.MouseEvent) => {
121
+ e.stopPropagation();
122
+ try {
123
+ await navigator.clipboard.writeText(content);
124
+ setCopied(true);
125
+ setTimeout(() => setCopied(false), 2000);
126
+ } catch (error) {
127
+ console.error('Failed to copy content:', error);
128
+ }
129
+ };
130
+
131
+ const handleOpenInEditor = (e: React.MouseEvent) => {
132
+ e.stopPropagation();
133
+ if (projectRoot) {
134
+ window.open(getVSCodeUri(projectRoot, path), '_blank');
135
+ }
136
+ };
137
+
138
+ const isJson = name.endsWith('.json');
139
+ const isMarkdown = name.endsWith('.md');
140
+
141
+ // For non-markdown content with search, highlight matches
142
+ const renderPlainContent = (text: string) => {
143
+ if (searchQuery && searchQuery.length >= 2) {
144
+ return highlightMatches(text, searchQuery);
145
+ }
146
+ return text;
147
+ };
148
+
149
+ return (
150
+ <Card className={cn('overflow-hidden', className)}>
151
+ <CardHeader
152
+ className={cn(
153
+ 'cursor-pointer hover:bg-muted/50 transition-colors py-3 px-4',
154
+ isExpanded && 'border-b'
155
+ )}
156
+ onClick={onToggle}
157
+ >
158
+ <div className="flex items-center justify-between gap-2">
159
+ <div className="flex items-center gap-3 min-w-0">
160
+ <FileText className="h-4 w-4 shrink-0 text-muted-foreground" />
161
+ <div className="min-w-0">
162
+ <CardTitle className="text-sm font-medium truncate">{name}</CardTitle>
163
+ <p className="text-xs text-muted-foreground truncate">{path}</p>
164
+ </div>
165
+ </div>
166
+ <div className="flex items-center gap-2 shrink-0">
167
+ {searchQuery && matchCount > 0 && (
168
+ <Badge variant="secondary" className="text-xs bg-yellow-100 dark:bg-yellow-900 text-yellow-800 dark:text-yellow-200">
169
+ {matchCount} match{matchCount !== 1 ? 'es' : ''}
170
+ </Badge>
171
+ )}
172
+ <Badge variant="outline" className={cn('text-xs', getTokenColor(tokenCount))}>
173
+ <Coins className="h-3 w-3 mr-1" />
174
+ {tokenCount.toLocaleString()} tokens
175
+ </Badge>
176
+ <span className="text-xs text-muted-foreground hidden sm:inline">
177
+ {getTokenStatus(tokenCount)}
178
+ </span>
179
+ {projectRoot && (
180
+ <Button
181
+ variant="ghost"
182
+ size="sm"
183
+ className="h-7 w-7 p-0"
184
+ onClick={handleOpenInEditor}
185
+ title="Open in VS Code"
186
+ >
187
+ <ExternalLink className="h-3.5 w-3.5" />
188
+ </Button>
189
+ )}
190
+ <Button
191
+ variant="ghost"
192
+ size="sm"
193
+ className="h-7 w-7 p-0"
194
+ onClick={handleCopy}
195
+ title="Copy content"
196
+ >
197
+ {copied ? (
198
+ <Check className="h-3.5 w-3.5 text-green-600" />
199
+ ) : (
200
+ <Copy className="h-3.5 w-3.5" />
201
+ )}
202
+ </Button>
203
+ </div>
204
+ </div>
205
+ </CardHeader>
206
+
207
+ {isExpanded && (
208
+ <CardContent className="p-0">
209
+ {/* Metadata bar */}
210
+ <div className="flex items-center gap-4 px-4 py-2 bg-muted/30 text-xs text-muted-foreground border-b">
211
+ <span className="flex items-center gap-1">
212
+ <Clock className="h-3 w-3" />
213
+ Modified {formatDate(lastModified)}
214
+ </span>
215
+ <span>{content.split('\n').length} lines</span>
216
+ </div>
217
+
218
+ {/* Content area */}
219
+ <div className="max-h-[500px] overflow-auto">
220
+ {isJson ? (
221
+ <pre className="p-4 text-sm overflow-x-auto bg-muted/20 whitespace-pre-wrap">
222
+ {renderPlainContent(JSON.stringify(JSON.parse(content), null, 2))}
223
+ </pre>
224
+ ) : isMarkdown ? (
225
+ searchQuery && searchQuery.length >= 2 ? (
226
+ // Render as plain text with highlighting when searching
227
+ <pre className="p-4 text-sm overflow-x-auto bg-muted/20 whitespace-pre-wrap font-mono">
228
+ {renderPlainContent(content)}
229
+ </pre>
230
+ ) : (
231
+ <article className="prose prose-slate dark:prose-invert max-w-none prose-sm p-4">
232
+ <ReactMarkdown
233
+ remarkPlugins={[remarkGfm]}
234
+ rehypePlugins={[rehypeHighlight]}
235
+ >
236
+ {content}
237
+ </ReactMarkdown>
238
+ </article>
239
+ )
240
+ ) : (
241
+ <pre className="p-4 text-sm overflow-x-auto bg-muted/20 whitespace-pre-wrap">
242
+ {renderPlainContent(content)}
243
+ </pre>
244
+ )}
245
+ </div>
246
+ </CardContent>
247
+ )}
248
+ </Card>
249
+ );
250
+ }
251
+
252
+ /**
253
+ * Compact version for listing in accordion
254
+ */
255
+ export function ContextFileCard({
256
+ name,
257
+ path,
258
+ content,
259
+ tokenCount,
260
+ lastModified,
261
+ className,
262
+ searchQuery,
263
+ projectRoot,
264
+ }: Omit<ContextFileViewerProps, 'isExpanded' | 'onToggle'>) {
265
+ const [expanded, setExpanded] = React.useState(false);
266
+
267
+ // Auto-expand when there are search matches
268
+ React.useEffect(() => {
269
+ if (searchQuery && searchQuery.length >= 2) {
270
+ const matches = countMatches(content, searchQuery);
271
+ if (matches > 0) {
272
+ setExpanded(true);
273
+ }
274
+ }
275
+ }, [searchQuery, content]);
276
+
277
+ return (
278
+ <ContextFileViewer
279
+ name={name}
280
+ path={path}
281
+ content={content}
282
+ tokenCount={tokenCount}
283
+ lastModified={lastModified}
284
+ isExpanded={expanded}
285
+ onToggle={() => setExpanded(!expanded)}
286
+ className={className}
287
+ searchQuery={searchQuery}
288
+ projectRoot={projectRoot}
289
+ />
290
+ );
291
+ }
@@ -2,7 +2,7 @@
2
2
 
3
3
  import Link from 'next/link';
4
4
  import { usePathname } from 'next/navigation';
5
- import { Home, FileText, BarChart3, ChevronLeft, ChevronRight, X } from 'lucide-react';
5
+ import { Home, FileText, BarChart3, BookOpen, ChevronLeft, ChevronRight, X } from 'lucide-react';
6
6
  import { ProjectSwitcher } from '@/components/project-switcher';
7
7
  import { Button } from '@/components/ui/button';
8
8
  import { cn } from '@/lib/utils';
@@ -152,6 +152,15 @@ export function MainSidebar() {
152
152
  >
153
153
  Stats
154
154
  </SidebarLink>
155
+ <SidebarLink
156
+ href="/context"
157
+ icon={BookOpen}
158
+ currentPath={pathname}
159
+ description={(!isCollapsed || mobileOpen) ? "Project Context" : undefined}
160
+ isCollapsed={isCollapsed && !mobileOpen}
161
+ >
162
+ Context
163
+ </SidebarLink>
155
164
  </nav>}
156
165
 
157
166
  {/* Collapse Toggle (desktop only) */}