@tyroneross/navgator 0.1.1 → 0.2.1

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 (395) hide show
  1. package/dist/cli/index.js +201 -10
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/diagram.d.ts.map +1 -1
  4. package/dist/diagram.js +33 -0
  5. package/dist/diagram.js.map +1 -1
  6. package/dist/scanner.d.ts +2 -0
  7. package/dist/scanner.d.ts.map +1 -1
  8. package/dist/scanner.js +131 -12
  9. package/dist/scanner.js.map +1 -1
  10. package/dist/scanners/connections/ast-scanner.d.ts.map +1 -1
  11. package/dist/scanners/connections/ast-scanner.js +0 -3
  12. package/dist/scanners/connections/ast-scanner.js.map +1 -1
  13. package/dist/scanners/connections/llm-call-tracer.d.ts +83 -0
  14. package/dist/scanners/connections/llm-call-tracer.d.ts.map +1 -0
  15. package/dist/scanners/connections/llm-call-tracer.js +801 -0
  16. package/dist/scanners/connections/llm-call-tracer.js.map +1 -0
  17. package/dist/scanners/connections/service-calls.d.ts.map +1 -1
  18. package/dist/scanners/connections/service-calls.js +44 -47
  19. package/dist/scanners/connections/service-calls.js.map +1 -1
  20. package/dist/scanners/infrastructure/index.d.ts.map +1 -1
  21. package/dist/scanners/infrastructure/index.js +34 -4
  22. package/dist/scanners/infrastructure/index.js.map +1 -1
  23. package/dist/scanners/packages/swift.d.ts +14 -0
  24. package/dist/scanners/packages/swift.d.ts.map +1 -0
  25. package/dist/scanners/packages/swift.js +320 -0
  26. package/dist/scanners/packages/swift.js.map +1 -0
  27. package/dist/scanners/prompts/detector.d.ts +16 -0
  28. package/dist/scanners/prompts/detector.d.ts.map +1 -1
  29. package/dist/scanners/prompts/detector.js +90 -1
  30. package/dist/scanners/prompts/detector.js.map +1 -1
  31. package/dist/scanners/prompts/types.d.ts +4 -0
  32. package/dist/scanners/prompts/types.d.ts.map +1 -1
  33. package/dist/scanners/prompts/types.js.map +1 -1
  34. package/dist/scanners/swift/code-scanner.d.ts +14 -0
  35. package/dist/scanners/swift/code-scanner.d.ts.map +1 -0
  36. package/dist/scanners/swift/code-scanner.js +803 -0
  37. package/dist/scanners/swift/code-scanner.js.map +1 -0
  38. package/dist/storage.d.ts +2 -2
  39. package/dist/storage.d.ts.map +1 -1
  40. package/dist/storage.js +41 -2
  41. package/dist/storage.js.map +1 -1
  42. package/dist/types.d.ts +26 -2
  43. package/dist/types.d.ts.map +1 -1
  44. package/dist/types.js.map +1 -1
  45. package/dist/ui-server.d.ts +7 -7
  46. package/dist/ui-server.d.ts.map +1 -1
  47. package/dist/ui-server.js +80 -792
  48. package/dist/ui-server.js.map +1 -1
  49. package/package.json +15 -9
  50. package/web/.next/standalone/web/.next/BUILD_ID +1 -0
  51. package/web/.next/standalone/web/.next/app-path-routes-manifest.json +13 -0
  52. package/web/.next/standalone/web/.next/build-manifest.json +20 -0
  53. package/web/.next/standalone/web/.next/package.json +1 -0
  54. package/web/.next/standalone/web/.next/prerender-manifest.json +88 -0
  55. package/web/.next/standalone/web/.next/required-server-files.json +317 -0
  56. package/web/.next/standalone/web/.next/routes-manifest.json +110 -0
  57. package/web/.next/standalone/web/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  58. package/web/.next/standalone/web/.next/server/app/_global-error/page/build-manifest.json +17 -0
  59. package/web/.next/standalone/web/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  60. package/web/.next/standalone/web/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  61. package/web/.next/standalone/web/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  62. package/web/.next/standalone/web/.next/server/app/_global-error/page.js +10 -0
  63. package/web/.next/standalone/web/.next/server/app/_global-error/page.js.map +5 -0
  64. package/web/.next/standalone/web/.next/server/app/_global-error/page.js.nft.json +1 -0
  65. package/web/.next/standalone/web/.next/server/app/_global-error/page_client-reference-manifest.js +2 -0
  66. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -0
  67. package/web/.next/standalone/web/.next/server/app/_global-error.meta +15 -0
  68. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +12 -0
  69. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  70. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +12 -0
  71. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +7 -0
  72. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +4 -0
  73. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  74. package/web/.next/standalone/web/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  75. package/web/.next/standalone/web/.next/server/app/_not-found/page/build-manifest.json +17 -0
  76. package/web/.next/standalone/web/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
  77. package/web/.next/standalone/web/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  78. package/web/.next/standalone/web/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  79. package/web/.next/standalone/web/.next/server/app/_not-found/page.js +13 -0
  80. package/web/.next/standalone/web/.next/server/app/_not-found/page.js.map +5 -0
  81. package/web/.next/standalone/web/.next/server/app/_not-found/page.js.nft.json +1 -0
  82. package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +2 -0
  83. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -0
  84. package/web/.next/standalone/web/.next/server/app/_not-found.meta +16 -0
  85. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +17 -0
  86. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +17 -0
  87. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +8 -0
  88. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +8 -0
  89. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  90. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +4 -0
  91. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -0
  92. package/web/.next/standalone/web/.next/server/app/api/components/route/app-paths-manifest.json +3 -0
  93. package/web/.next/standalone/web/.next/server/app/api/components/route/build-manifest.json +11 -0
  94. package/web/.next/standalone/web/.next/server/app/api/components/route/server-reference-manifest.json +4 -0
  95. package/web/.next/standalone/web/.next/server/app/api/components/route.js +6 -0
  96. package/web/.next/standalone/web/.next/server/app/api/components/route.js.map +5 -0
  97. package/web/.next/standalone/web/.next/server/app/api/components/route.js.nft.json +1 -0
  98. package/web/.next/standalone/web/.next/server/app/api/components/route_client-reference-manifest.js +2 -0
  99. package/web/.next/standalone/web/.next/server/app/api/connections/route/app-paths-manifest.json +3 -0
  100. package/web/.next/standalone/web/.next/server/app/api/connections/route/build-manifest.json +11 -0
  101. package/web/.next/standalone/web/.next/server/app/api/connections/route/server-reference-manifest.json +4 -0
  102. package/web/.next/standalone/web/.next/server/app/api/connections/route.js +6 -0
  103. package/web/.next/standalone/web/.next/server/app/api/connections/route.js.map +5 -0
  104. package/web/.next/standalone/web/.next/server/app/api/connections/route.js.nft.json +1 -0
  105. package/web/.next/standalone/web/.next/server/app/api/connections/route_client-reference-manifest.js +2 -0
  106. package/web/.next/standalone/web/.next/server/app/api/graph/route/app-paths-manifest.json +3 -0
  107. package/web/.next/standalone/web/.next/server/app/api/graph/route/build-manifest.json +11 -0
  108. package/web/.next/standalone/web/.next/server/app/api/graph/route/server-reference-manifest.json +4 -0
  109. package/web/.next/standalone/web/.next/server/app/api/graph/route.js +6 -0
  110. package/web/.next/standalone/web/.next/server/app/api/graph/route.js.map +5 -0
  111. package/web/.next/standalone/web/.next/server/app/api/graph/route.js.nft.json +1 -0
  112. package/web/.next/standalone/web/.next/server/app/api/graph/route_client-reference-manifest.js +2 -0
  113. package/web/.next/standalone/web/.next/server/app/api/projects/route/app-paths-manifest.json +3 -0
  114. package/web/.next/standalone/web/.next/server/app/api/projects/route/build-manifest.json +11 -0
  115. package/web/.next/standalone/web/.next/server/app/api/projects/route/server-reference-manifest.json +4 -0
  116. package/web/.next/standalone/web/.next/server/app/api/projects/route.js +6 -0
  117. package/web/.next/standalone/web/.next/server/app/api/projects/route.js.map +5 -0
  118. package/web/.next/standalone/web/.next/server/app/api/projects/route.js.nft.json +1 -0
  119. package/web/.next/standalone/web/.next/server/app/api/projects/route_client-reference-manifest.js +2 -0
  120. package/web/.next/standalone/web/.next/server/app/api/prompts/route/app-paths-manifest.json +3 -0
  121. package/web/.next/standalone/web/.next/server/app/api/prompts/route/build-manifest.json +11 -0
  122. package/web/.next/standalone/web/.next/server/app/api/prompts/route/server-reference-manifest.json +4 -0
  123. package/web/.next/standalone/web/.next/server/app/api/prompts/route.js +7 -0
  124. package/web/.next/standalone/web/.next/server/app/api/prompts/route.js.map +5 -0
  125. package/web/.next/standalone/web/.next/server/app/api/prompts/route.js.nft.json +1 -0
  126. package/web/.next/standalone/web/.next/server/app/api/prompts/route_client-reference-manifest.js +2 -0
  127. package/web/.next/standalone/web/.next/server/app/api/scan/route/app-paths-manifest.json +3 -0
  128. package/web/.next/standalone/web/.next/server/app/api/scan/route/build-manifest.json +11 -0
  129. package/web/.next/standalone/web/.next/server/app/api/scan/route/server-reference-manifest.json +4 -0
  130. package/web/.next/standalone/web/.next/server/app/api/scan/route.js +6 -0
  131. package/web/.next/standalone/web/.next/server/app/api/scan/route.js.map +5 -0
  132. package/web/.next/standalone/web/.next/server/app/api/scan/route.js.nft.json +1 -0
  133. package/web/.next/standalone/web/.next/server/app/api/scan/route_client-reference-manifest.js +2 -0
  134. package/web/.next/standalone/web/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
  135. package/web/.next/standalone/web/.next/server/app/api/settings/route/build-manifest.json +11 -0
  136. package/web/.next/standalone/web/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
  137. package/web/.next/standalone/web/.next/server/app/api/settings/route.js +6 -0
  138. package/web/.next/standalone/web/.next/server/app/api/settings/route.js.map +5 -0
  139. package/web/.next/standalone/web/.next/server/app/api/settings/route.js.nft.json +1 -0
  140. package/web/.next/standalone/web/.next/server/app/api/settings/route_client-reference-manifest.js +2 -0
  141. package/web/.next/standalone/web/.next/server/app/api/status/route/app-paths-manifest.json +3 -0
  142. package/web/.next/standalone/web/.next/server/app/api/status/route/build-manifest.json +11 -0
  143. package/web/.next/standalone/web/.next/server/app/api/status/route/server-reference-manifest.json +4 -0
  144. package/web/.next/standalone/web/.next/server/app/api/status/route.js +6 -0
  145. package/web/.next/standalone/web/.next/server/app/api/status/route.js.map +5 -0
  146. package/web/.next/standalone/web/.next/server/app/api/status/route.js.nft.json +1 -0
  147. package/web/.next/standalone/web/.next/server/app/api/status/route_client-reference-manifest.js +2 -0
  148. package/web/.next/standalone/web/.next/server/app/index.html +1 -0
  149. package/web/.next/standalone/web/.next/server/app/index.meta +14 -0
  150. package/web/.next/standalone/web/.next/server/app/index.rsc +23 -0
  151. package/web/.next/standalone/web/.next/server/app/index.segments/__PAGE__.segment.rsc +9 -0
  152. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +23 -0
  153. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +8 -0
  154. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +8 -0
  155. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +5 -0
  156. package/web/.next/standalone/web/.next/server/app/page/app-paths-manifest.json +3 -0
  157. package/web/.next/standalone/web/.next/server/app/page/build-manifest.json +17 -0
  158. package/web/.next/standalone/web/.next/server/app/page/next-font-manifest.json +11 -0
  159. package/web/.next/standalone/web/.next/server/app/page/react-loadable-manifest.json +1 -0
  160. package/web/.next/standalone/web/.next/server/app/page/server-reference-manifest.json +4 -0
  161. package/web/.next/standalone/web/.next/server/app/page.js +15 -0
  162. package/web/.next/standalone/web/.next/server/app/page.js.map +5 -0
  163. package/web/.next/standalone/web/.next/server/app/page.js.nft.json +1 -0
  164. package/web/.next/standalone/web/.next/server/app/page_client-reference-manifest.js +2 -0
  165. package/web/.next/standalone/web/.next/server/app-paths-manifest.json +13 -0
  166. package/web/.next/standalone/web/.next/server/chunks/2374f_next_dist_esm_build_templates_app-route_0bb4e66a.js +19 -0
  167. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__006b837d._.js +3 -0
  168. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__1ab91221._.js +3 -0
  169. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__2e09fec9._.js +3 -0
  170. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__38d0390f._.js +3 -0
  171. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__539ef30d._.js +3 -0
  172. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__594bcf20._.js +3 -0
  173. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__b888fadf._.js +3 -0
  174. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__f3450c22._.js +21 -0
  175. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__fa2ec862._.js +3 -0
  176. package/web/.next/standalone/web/.next/server/chunks/[turbopack]_runtime.js +770 -0
  177. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_e6039567._.js +6 -0
  178. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_09351209._.js +6 -0
  179. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_222be7ae._.js +6 -0
  180. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_2346e1b3._.js +3 -0
  181. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_cec86455._.js +4 -0
  182. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_client_components_9c5d1a14._.js +3 -0
  183. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_client_components_builtin_forbidden_8eae0c85.js +3 -0
  184. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_client_components_builtin_global-error_81159d60.js +3 -0
  185. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_client_components_builtin_unauthorized_7d34a31c.js +3 -0
  186. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_e03afa0e._.js +3 -0
  187. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_esm_build_templates_app-page_2c8d71b9.js +4 -0
  188. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_server_route-modules_app-page_vendored_ssr_react-dom_8910f04c.js +3 -0
  189. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__1a0663e6._.js +3 -0
  190. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__4306eafc._.js +3 -0
  191. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__44903626._.js +3 -0
  192. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__60278e3f._.js +3 -0
  193. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__61942f24._.js +4 -0
  194. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__8c45c3c9._.js +3 -0
  195. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__9a2f110d._.js +3 -0
  196. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__ed07bd88._.js +3 -0
  197. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__f2db61af._.js +3 -0
  198. package/web/.next/standalone/web/.next/server/chunks/ssr/[turbopack]_runtime.js +770 -0
  199. package/web/.next/standalone/web/.next/server/chunks/ssr/web_0103e631._.js +4 -0
  200. package/web/.next/standalone/web/.next/server/chunks/ssr/web_171de0df._.js +14 -0
  201. package/web/.next/standalone/web/.next/server/chunks/ssr/web__next-internal_server_app__global-error_page_actions_2a1e94d4.js +3 -0
  202. package/web/.next/standalone/web/.next/server/chunks/ssr/web__next-internal_server_app__not-found_page_actions_9eaa9845.js +3 -0
  203. package/web/.next/standalone/web/.next/server/chunks/ssr/web__next-internal_server_app_page_actions_ec26bf28.js +3 -0
  204. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_components_route_actions_c88bf2a6.js +3 -0
  205. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_connections_route_actions_b1d5e95a.js +3 -0
  206. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_graph_route_actions_e2dd052c.js +3 -0
  207. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_projects_route_actions_3f671cbb.js +3 -0
  208. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_prompts_route_actions_85b56166.js +3 -0
  209. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_scan_route_actions_861cde8d.js +3 -0
  210. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_settings_route_actions_e19026ae.js +3 -0
  211. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_status_route_actions_8b8c6c89.js +3 -0
  212. package/web/.next/standalone/web/.next/server/functions-config-manifest.json +4 -0
  213. package/web/.next/standalone/web/.next/server/middleware-build-manifest.js +21 -0
  214. package/web/.next/standalone/web/.next/server/middleware-manifest.json +6 -0
  215. package/web/.next/standalone/web/.next/server/next-font-manifest.js +1 -0
  216. package/web/.next/standalone/web/.next/server/next-font-manifest.json +15 -0
  217. package/web/.next/standalone/web/.next/server/pages/404.html +1 -0
  218. package/web/.next/standalone/web/.next/server/pages/500.html +2 -0
  219. package/web/.next/standalone/web/.next/server/pages-manifest.json +4 -0
  220. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -0
  221. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +5 -0
  222. package/web/.next/standalone/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_buildManifest.js +11 -0
  223. package/web/.next/standalone/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_clientMiddlewareManifest.json +1 -0
  224. package/web/.next/standalone/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_ssgManifest.js +1 -0
  225. package/web/.next/standalone/web/.next/static/chunks/062ae79751df2759.js +1 -0
  226. package/web/.next/standalone/web/.next/static/chunks/159889e17b2cf1f8.js +2 -0
  227. package/web/.next/standalone/web/.next/static/chunks/458d6f37339fc069.js +1 -0
  228. package/web/.next/standalone/web/.next/static/chunks/6d3d39425a878d7f.js +1 -0
  229. package/web/.next/standalone/web/.next/static/chunks/8a80e7184ad3a13f.css +2 -0
  230. package/web/.next/standalone/web/.next/static/chunks/a6dad97d9634a72d.js +1 -0
  231. package/web/.next/standalone/web/.next/static/chunks/c056475f5f4424b6.css +1 -0
  232. package/web/.next/standalone/web/.next/static/chunks/c57fee8cce8d7cb9.js +1 -0
  233. package/web/.next/standalone/web/.next/static/chunks/cb3513192b63e480.js +12 -0
  234. package/web/.next/standalone/web/.next/static/chunks/dd22b5f2beb2cc31.js +1 -0
  235. package/web/.next/standalone/web/.next/static/chunks/e0affeef0ddb9a97.js +4 -0
  236. package/web/.next/standalone/web/.next/static/chunks/f74a6859e1c4d5e3.js +1 -0
  237. package/web/.next/standalone/web/.next/static/chunks/turbopack-c0c89f9e6f0a38c4.js +3 -0
  238. package/web/.next/standalone/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  239. package/web/.next/standalone/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  240. package/web/.next/standalone/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  241. package/web/.next/standalone/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  242. package/web/.next/standalone/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  243. package/web/.next/standalone/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  244. package/web/.next/standalone/web/app/api/components/route.ts +252 -0
  245. package/web/.next/standalone/web/app/api/connections/route.ts +319 -0
  246. package/web/.next/standalone/web/app/api/graph/route.ts +235 -0
  247. package/web/.next/standalone/web/app/api/projects/route.ts +221 -0
  248. package/web/.next/standalone/web/app/api/prompts/route.ts +328 -0
  249. package/web/.next/standalone/web/app/api/scan/route.ts +108 -0
  250. package/web/.next/standalone/web/app/api/settings/route.ts +198 -0
  251. package/web/.next/standalone/web/app/api/status/route.ts +169 -0
  252. package/web/.next/standalone/web/app/globals.css +99 -0
  253. package/web/.next/standalone/web/app/layout.tsx +49 -0
  254. package/web/.next/standalone/web/app/page.tsx +94 -0
  255. package/web/.next/standalone/web/components/components-panel.tsx +240 -0
  256. package/web/.next/standalone/web/components/connections-panel.tsx +220 -0
  257. package/web/.next/standalone/web/components/diagram-view.tsx +735 -0
  258. package/web/.next/standalone/web/components/header.tsx +225 -0
  259. package/web/.next/standalone/web/components/impact-analysis.tsx +358 -0
  260. package/web/.next/standalone/web/components/llm-tracking-panel.tsx +1483 -0
  261. package/web/.next/standalone/web/components/settings-panel.tsx +671 -0
  262. package/web/.next/standalone/web/components/sidebar.tsx +74 -0
  263. package/web/.next/standalone/web/components/status-overview.tsx +326 -0
  264. package/web/.next/standalone/web/components/theme-provider.tsx +11 -0
  265. package/web/.next/standalone/web/components/ui/accordion.tsx +66 -0
  266. package/web/.next/standalone/web/components/ui/alert-dialog.tsx +157 -0
  267. package/web/.next/standalone/web/components/ui/alert.tsx +66 -0
  268. package/web/.next/standalone/web/components/ui/aspect-ratio.tsx +11 -0
  269. package/web/.next/standalone/web/components/ui/avatar.tsx +53 -0
  270. package/web/.next/standalone/web/components/ui/badge.tsx +46 -0
  271. package/web/.next/standalone/web/components/ui/breadcrumb.tsx +109 -0
  272. package/web/.next/standalone/web/components/ui/button-group.tsx +83 -0
  273. package/web/.next/standalone/web/components/ui/button.tsx +60 -0
  274. package/web/.next/standalone/web/components/ui/calendar.tsx +213 -0
  275. package/web/.next/standalone/web/components/ui/card.tsx +92 -0
  276. package/web/.next/standalone/web/components/ui/carousel.tsx +241 -0
  277. package/web/.next/standalone/web/components/ui/chart.tsx +353 -0
  278. package/web/.next/standalone/web/components/ui/checkbox.tsx +32 -0
  279. package/web/.next/standalone/web/components/ui/collapsible.tsx +33 -0
  280. package/web/.next/standalone/web/components/ui/command.tsx +184 -0
  281. package/web/.next/standalone/web/components/ui/context-menu.tsx +252 -0
  282. package/web/.next/standalone/web/components/ui/dialog.tsx +143 -0
  283. package/web/.next/standalone/web/components/ui/drawer.tsx +135 -0
  284. package/web/.next/standalone/web/components/ui/dropdown-menu.tsx +257 -0
  285. package/web/.next/standalone/web/components/ui/empty.tsx +104 -0
  286. package/web/.next/standalone/web/components/ui/field.tsx +244 -0
  287. package/web/.next/standalone/web/components/ui/form.tsx +167 -0
  288. package/web/.next/standalone/web/components/ui/hover-card.tsx +44 -0
  289. package/web/.next/standalone/web/components/ui/input-group.tsx +169 -0
  290. package/web/.next/standalone/web/components/ui/input-otp.tsx +77 -0
  291. package/web/.next/standalone/web/components/ui/input.tsx +21 -0
  292. package/web/.next/standalone/web/components/ui/item.tsx +193 -0
  293. package/web/.next/standalone/web/components/ui/kbd.tsx +28 -0
  294. package/web/.next/standalone/web/components/ui/label.tsx +24 -0
  295. package/web/.next/standalone/web/components/ui/menubar.tsx +276 -0
  296. package/web/.next/standalone/web/components/ui/navigation-menu.tsx +166 -0
  297. package/web/.next/standalone/web/components/ui/pagination.tsx +127 -0
  298. package/web/.next/standalone/web/components/ui/popover.tsx +48 -0
  299. package/web/.next/standalone/web/components/ui/progress.tsx +31 -0
  300. package/web/.next/standalone/web/components/ui/radio-group.tsx +45 -0
  301. package/web/.next/standalone/web/components/ui/resizable.tsx +56 -0
  302. package/web/.next/standalone/web/components/ui/scroll-area.tsx +58 -0
  303. package/web/.next/standalone/web/components/ui/select.tsx +185 -0
  304. package/web/.next/standalone/web/components/ui/separator.tsx +28 -0
  305. package/web/.next/standalone/web/components/ui/sheet.tsx +139 -0
  306. package/web/.next/standalone/web/components/ui/sidebar.tsx +726 -0
  307. package/web/.next/standalone/web/components/ui/skeleton.tsx +13 -0
  308. package/web/.next/standalone/web/components/ui/slider.tsx +63 -0
  309. package/web/.next/standalone/web/components/ui/sonner.tsx +25 -0
  310. package/web/.next/standalone/web/components/ui/spinner.tsx +16 -0
  311. package/web/.next/standalone/web/components/ui/switch.tsx +31 -0
  312. package/web/.next/standalone/web/components/ui/table.tsx +116 -0
  313. package/web/.next/standalone/web/components/ui/tabs.tsx +66 -0
  314. package/web/.next/standalone/web/components/ui/textarea.tsx +18 -0
  315. package/web/.next/standalone/web/components/ui/toast.tsx +129 -0
  316. package/web/.next/standalone/web/components/ui/toaster.tsx +35 -0
  317. package/web/.next/standalone/web/components/ui/toggle-group.tsx +73 -0
  318. package/web/.next/standalone/web/components/ui/toggle.tsx +47 -0
  319. package/web/.next/standalone/web/components/ui/tooltip.tsx +61 -0
  320. package/web/.next/standalone/web/components/ui/use-mobile.tsx +19 -0
  321. package/web/.next/standalone/web/components/ui/use-toast.ts +191 -0
  322. package/web/.next/standalone/web/components.json +21 -0
  323. package/web/.next/standalone/web/hooks/use-mobile.ts +19 -0
  324. package/web/.next/standalone/web/hooks/use-toast.ts +191 -0
  325. package/web/.next/standalone/web/lib/hooks/index.ts +8 -0
  326. package/web/.next/standalone/web/lib/hooks/use-components.ts +83 -0
  327. package/web/.next/standalone/web/lib/hooks/use-connections.ts +83 -0
  328. package/web/.next/standalone/web/lib/hooks/use-projects.ts +116 -0
  329. package/web/.next/standalone/web/lib/hooks/use-prompts.ts +122 -0
  330. package/web/.next/standalone/web/lib/hooks/use-settings.ts +135 -0
  331. package/web/.next/standalone/web/lib/hooks/use-status.ts +80 -0
  332. package/web/.next/standalone/web/lib/project-context.tsx +46 -0
  333. package/web/.next/standalone/web/lib/transform.ts +625 -0
  334. package/web/.next/standalone/web/lib/types.ts +198 -0
  335. package/web/.next/standalone/web/lib/utils.ts +6 -0
  336. package/web/.next/standalone/web/next.config.mjs +12 -0
  337. package/web/.next/standalone/web/package-lock.json +3987 -0
  338. package/web/.next/standalone/web/package.json +73 -0
  339. package/web/.next/standalone/web/pnpm-lock.yaml +5 -0
  340. package/web/.next/standalone/web/postcss.config.mjs +8 -0
  341. package/web/.next/standalone/web/public/apple-icon.png +0 -0
  342. package/web/.next/standalone/web/public/icon-dark-32x32.png +0 -0
  343. package/web/.next/standalone/web/public/icon-light-32x32.png +0 -0
  344. package/web/.next/standalone/web/public/icon.svg +26 -0
  345. package/web/.next/standalone/web/public/navgator-logo.png +0 -0
  346. package/web/.next/standalone/web/public/placeholder-logo.png +0 -0
  347. package/web/.next/standalone/web/public/placeholder-logo.svg +1 -0
  348. package/web/.next/standalone/web/public/placeholder-user.jpg +0 -0
  349. package/web/.next/standalone/web/public/placeholder.jpg +0 -0
  350. package/web/.next/standalone/web/public/placeholder.svg +1 -0
  351. package/web/.next/standalone/web/public/public/apple-icon.png +0 -0
  352. package/web/.next/standalone/web/public/public/icon-dark-32x32.png +0 -0
  353. package/web/.next/standalone/web/public/public/icon-light-32x32.png +0 -0
  354. package/web/.next/standalone/web/public/public/icon.svg +26 -0
  355. package/web/.next/standalone/web/public/public/navgator-logo.png +0 -0
  356. package/web/.next/standalone/web/public/public/placeholder-logo.png +0 -0
  357. package/web/.next/standalone/web/public/public/placeholder-logo.svg +1 -0
  358. package/web/.next/standalone/web/public/public/placeholder-user.jpg +0 -0
  359. package/web/.next/standalone/web/public/public/placeholder.jpg +0 -0
  360. package/web/.next/standalone/web/public/public/placeholder.svg +1 -0
  361. package/web/.next/standalone/web/server.js +38 -0
  362. package/web/.next/standalone/web/styles/globals.css +125 -0
  363. package/web/.next/standalone/web/tsconfig.json +41 -0
  364. package/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_buildManifest.js +11 -0
  365. package/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_clientMiddlewareManifest.json +1 -0
  366. package/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_ssgManifest.js +1 -0
  367. package/web/.next/static/chunks/062ae79751df2759.js +1 -0
  368. package/web/.next/static/chunks/159889e17b2cf1f8.js +2 -0
  369. package/web/.next/static/chunks/458d6f37339fc069.js +1 -0
  370. package/web/.next/static/chunks/6d3d39425a878d7f.js +1 -0
  371. package/web/.next/static/chunks/8a80e7184ad3a13f.css +2 -0
  372. package/web/.next/static/chunks/a6dad97d9634a72d.js +1 -0
  373. package/web/.next/static/chunks/c056475f5f4424b6.css +1 -0
  374. package/web/.next/static/chunks/c57fee8cce8d7cb9.js +1 -0
  375. package/web/.next/static/chunks/cb3513192b63e480.js +12 -0
  376. package/web/.next/static/chunks/dd22b5f2beb2cc31.js +1 -0
  377. package/web/.next/static/chunks/e0affeef0ddb9a97.js +4 -0
  378. package/web/.next/static/chunks/f74a6859e1c4d5e3.js +1 -0
  379. package/web/.next/static/chunks/turbopack-c0c89f9e6f0a38c4.js +3 -0
  380. package/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  381. package/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  382. package/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  383. package/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  384. package/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  385. package/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  386. package/web/public/apple-icon.png +0 -0
  387. package/web/public/icon-dark-32x32.png +0 -0
  388. package/web/public/icon-light-32x32.png +0 -0
  389. package/web/public/icon.svg +26 -0
  390. package/web/public/navgator-logo.png +0 -0
  391. package/web/public/placeholder-logo.png +0 -0
  392. package/web/public/placeholder-logo.svg +1 -0
  393. package/web/public/placeholder-user.jpg +0 -0
  394. package/web/public/placeholder.jpg +0 -0
  395. package/web/public/placeholder.svg +1 -0
@@ -0,0 +1,225 @@
1
+ "use client"
2
+
3
+ import Image from "next/image"
4
+ import { Search, RefreshCw, ChevronDown, FolderOpen, Plus, X } from "lucide-react"
5
+ import { Button } from "@/components/ui/button"
6
+ import { Input } from "@/components/ui/input"
7
+ import {
8
+ DropdownMenu,
9
+ DropdownMenuContent,
10
+ DropdownMenuItem,
11
+ DropdownMenuSeparator,
12
+ DropdownMenuTrigger,
13
+ } from "@/components/ui/dropdown-menu"
14
+ import {
15
+ Tooltip,
16
+ TooltipContent,
17
+ TooltipProvider,
18
+ TooltipTrigger,
19
+ } from "@/components/ui/tooltip"
20
+ import { useState, useEffect, useRef } from "react"
21
+
22
+ interface RegisteredProject {
23
+ path: string
24
+ name: string
25
+ hasArchitecture: boolean
26
+ componentCount: number
27
+ connectionCount: number
28
+ lastScanFormatted: string | null
29
+ }
30
+
31
+ interface HeaderProps {
32
+ activeProject: string | null
33
+ projectName: string | null
34
+ projectPath: string | null
35
+ projects: RegisteredProject[]
36
+ onSelectProject: (path: string) => void
37
+ onAddProject: (path: string) => Promise<void>
38
+ onRemoveProject: (path: string) => Promise<void>
39
+ isLoadingProjects: boolean
40
+ }
41
+
42
+ export function Header({
43
+ activeProject,
44
+ projectName,
45
+ projectPath,
46
+ projects,
47
+ onSelectProject,
48
+ onAddProject,
49
+ onRemoveProject,
50
+ isLoadingProjects,
51
+ }: HeaderProps) {
52
+ const [isScanning, setIsScanning] = useState(false)
53
+ const [showAddInput, setShowAddInput] = useState(false)
54
+ const [addPath, setAddPath] = useState("")
55
+ const addInputRef = useRef<HTMLInputElement>(null)
56
+
57
+ useEffect(() => {
58
+ if (showAddInput && addInputRef.current) {
59
+ addInputRef.current.focus()
60
+ }
61
+ }, [showAddInput])
62
+
63
+ const handleScan = async () => {
64
+ setIsScanning(true)
65
+ try {
66
+ await fetch("/api/scan", {
67
+ method: "POST",
68
+ headers: { "Content-Type": "application/json" },
69
+ body: JSON.stringify({ path: activeProject }),
70
+ })
71
+ window.location.reload()
72
+ } catch (error) {
73
+ console.error("Scan failed:", error)
74
+ } finally {
75
+ setIsScanning(false)
76
+ }
77
+ }
78
+
79
+ const handleAddProject = async () => {
80
+ if (!addPath.trim()) return
81
+ await onAddProject(addPath.trim())
82
+ onSelectProject(addPath.trim())
83
+ setAddPath("")
84
+ setShowAddInput(false)
85
+ }
86
+
87
+ const displayName = projectName || "No Project"
88
+
89
+ return (
90
+ <header className="flex h-14 items-center justify-between border-b border-border bg-card px-4">
91
+ <div className="flex items-center gap-4">
92
+ <div className="flex items-center gap-2">
93
+ <Image
94
+ src="/navgator-logo.png"
95
+ alt="NavGator"
96
+ width={36}
97
+ height={36}
98
+ className="rounded-lg"
99
+ />
100
+ <span className="font-semibold text-foreground">NavGator</span>
101
+ </div>
102
+
103
+ <div className="hidden items-center gap-1 text-sm text-muted-foreground md:flex">
104
+ <span>/</span>
105
+ <DropdownMenu>
106
+ <DropdownMenuTrigger asChild>
107
+ <Button variant="ghost" size="sm" className="h-auto gap-1 px-2 py-1 text-foreground">
108
+ {isLoadingProjects ? (
109
+ <span className="animate-pulse">Loading...</span>
110
+ ) : (
111
+ displayName
112
+ )}
113
+ <ChevronDown className="h-3 w-3 text-muted-foreground" />
114
+ </Button>
115
+ </DropdownMenuTrigger>
116
+ <DropdownMenuContent align="start" className="w-72">
117
+ {projects.length === 0 && !showAddInput && (
118
+ <div className="px-3 py-2 text-sm text-muted-foreground">
119
+ No projects registered
120
+ </div>
121
+ )}
122
+
123
+ {projects.map((project) => (
124
+ <DropdownMenuItem
125
+ key={project.path}
126
+ className="flex items-center justify-between gap-2 py-2"
127
+ onSelect={() => onSelectProject(project.path)}
128
+ >
129
+ <div className="flex min-w-0 flex-1 flex-col">
130
+ <span className={`text-sm font-medium truncate ${
131
+ project.path === activeProject ? "text-blue-700 dark:text-blue-400" : ""
132
+ }`}>
133
+ {project.name}
134
+ </span>
135
+ <span className="text-xs text-muted-foreground truncate">
136
+ {project.hasArchitecture
137
+ ? `${project.componentCount} components · ${project.lastScanFormatted || "never scanned"}`
138
+ : "Not scanned yet"}
139
+ </span>
140
+ </div>
141
+ <Button
142
+ variant="ghost"
143
+ size="sm"
144
+ className="h-5 w-5 shrink-0 p-0 text-muted-foreground hover:text-red-600"
145
+ onClick={(e) => {
146
+ e.stopPropagation()
147
+ onRemoveProject(project.path)
148
+ }}
149
+ >
150
+ <X className="h-3 w-3" />
151
+ </Button>
152
+ </DropdownMenuItem>
153
+ ))}
154
+
155
+ {projects.length > 0 && <DropdownMenuSeparator />}
156
+
157
+ {showAddInput ? (
158
+ <div className="flex items-center gap-1 px-2 py-1.5" onClick={(e) => e.stopPropagation()}>
159
+ <Input
160
+ ref={addInputRef}
161
+ value={addPath}
162
+ onChange={(e) => setAddPath(e.target.value)}
163
+ onKeyDown={(e) => {
164
+ if (e.key === "Enter") handleAddProject()
165
+ if (e.key === "Escape") { setShowAddInput(false); setAddPath("") }
166
+ }}
167
+ placeholder="/path/to/project"
168
+ className="h-7 text-xs"
169
+ />
170
+ <Button
171
+ variant="ghost"
172
+ size="sm"
173
+ className="h-7 shrink-0 px-2 text-xs"
174
+ onClick={handleAddProject}
175
+ >
176
+ Add
177
+ </Button>
178
+ </div>
179
+ ) : (
180
+ <DropdownMenuItem onSelect={() => setShowAddInput(true)}>
181
+ <Plus className="mr-2 h-4 w-4" />
182
+ Add project
183
+ </DropdownMenuItem>
184
+ )}
185
+ </DropdownMenuContent>
186
+ </DropdownMenu>
187
+
188
+ {projectPath && (
189
+ <TooltipProvider>
190
+ <Tooltip>
191
+ <TooltipTrigger asChild>
192
+ <FolderOpen className="h-3.5 w-3.5 text-muted-foreground" />
193
+ </TooltipTrigger>
194
+ <TooltipContent side="bottom" className="max-w-md">
195
+ <p className="font-mono text-xs">{projectPath}</p>
196
+ </TooltipContent>
197
+ </Tooltip>
198
+ </TooltipProvider>
199
+ )}
200
+ </div>
201
+ </div>
202
+
203
+ <div className="flex items-center gap-3">
204
+ <div className="relative hidden w-64 md:block">
205
+ <Search className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
206
+ <Input
207
+ placeholder="Search components..."
208
+ className="h-8 bg-secondary pl-9 text-sm"
209
+ />
210
+ </div>
211
+
212
+ <Button
213
+ variant="outline"
214
+ size="sm"
215
+ onClick={handleScan}
216
+ disabled={isScanning}
217
+ className="gap-2 bg-transparent"
218
+ >
219
+ <RefreshCw className={`h-4 w-4 ${isScanning ? "animate-spin" : ""}`} />
220
+ <span className="hidden sm:inline">{isScanning ? "Scanning..." : "Scan"}</span>
221
+ </Button>
222
+ </div>
223
+ </header>
224
+ )
225
+ }
@@ -0,0 +1,358 @@
1
+ "use client"
2
+
3
+ import { useState, useEffect } from "react"
4
+ import {
5
+ Target,
6
+ ArrowDownToLine,
7
+ ArrowUpFromLine,
8
+ FileCode,
9
+ Code2,
10
+ AlertTriangle,
11
+ CheckCircle2,
12
+ Search,
13
+ Loader2,
14
+ } from "lucide-react"
15
+ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
16
+ import { Input } from "@/components/ui/input"
17
+ import { Badge } from "@/components/ui/badge"
18
+ import { cn } from "@/lib/utils"
19
+ import type { Component, Connection } from "@/lib/types"
20
+
21
+ interface ImpactAnalysisProps {
22
+ componentName: string | null
23
+ onSelectComponent: (name: string) => void
24
+ }
25
+
26
+ interface ComponentWithConnections {
27
+ component: Component
28
+ incoming: Connection[]
29
+ outgoing: Connection[]
30
+ }
31
+
32
+ export function ImpactAnalysis({ componentName, onSelectComponent }: ImpactAnalysisProps) {
33
+ const [search, setSearch] = useState("")
34
+ const [components, setComponents] = useState<Component[]>([])
35
+ const [connections, setConnections] = useState<Connection[]>([])
36
+ const [loading, setLoading] = useState(true)
37
+ const [error, setError] = useState<string | null>(null)
38
+
39
+ // Fetch components and connections from API
40
+ useEffect(() => {
41
+ async function fetchData() {
42
+ setLoading(true)
43
+ setError(null)
44
+ try {
45
+ const [compRes, connRes] = await Promise.all([
46
+ fetch("/api/components?refresh=true"),
47
+ fetch("/api/connections?refresh=true"),
48
+ ])
49
+
50
+ const compData = await compRes.json()
51
+ const connData = await connRes.json()
52
+
53
+ if (compData.success && compData.data?.components) {
54
+ setComponents(compData.data.components)
55
+ }
56
+ if (connData.success && connData.data?.connections) {
57
+ setConnections(connData.data.connections)
58
+ }
59
+
60
+ if (compData.error) {
61
+ setError(compData.error)
62
+ }
63
+ } catch (err) {
64
+ setError(err instanceof Error ? err.message : "Failed to load data")
65
+ } finally {
66
+ setLoading(false)
67
+ }
68
+ }
69
+
70
+ fetchData()
71
+ }, [])
72
+
73
+ // Build component data with connections
74
+ const getComponentData = (name: string): ComponentWithConnections | null => {
75
+ const component = components.find(c => c.name === name)
76
+ if (!component) return null
77
+
78
+ // Find connections TO this component (incoming)
79
+ const incoming = connections.filter(conn =>
80
+ conn.toComponent === name ||
81
+ conn.to?.includes(component.id) ||
82
+ conn.to === name
83
+ )
84
+
85
+ // Find connections FROM this component (outgoing)
86
+ const outgoing = connections.filter(conn =>
87
+ conn.fromComponent === name ||
88
+ conn.from?.includes(component.id) ||
89
+ conn.from === name
90
+ )
91
+
92
+ return { component, incoming, outgoing }
93
+ }
94
+
95
+ const filteredComponents = components.filter((c) =>
96
+ c.name.toLowerCase().includes(search.toLowerCase())
97
+ )
98
+
99
+ // Loading state
100
+ if (loading) {
101
+ return (
102
+ <div className="flex items-center justify-center py-12">
103
+ <Loader2 className="h-8 w-8 animate-spin text-muted-foreground" />
104
+ <span className="ml-3 text-muted-foreground">Loading components...</span>
105
+ </div>
106
+ )
107
+ }
108
+
109
+ // Error state
110
+ if (error && components.length === 0) {
111
+ return (
112
+ <div className="space-y-6">
113
+ <div>
114
+ <h1 className="text-2xl font-semibold text-foreground">Impact Analysis</h1>
115
+ <p className="text-sm text-muted-foreground">
116
+ Select a component to see what would be affected by changes
117
+ </p>
118
+ </div>
119
+ <Card className="bg-card border-warning/50">
120
+ <CardContent className="p-6">
121
+ <div className="flex items-start gap-3">
122
+ <AlertTriangle className="h-5 w-5 text-warning mt-0.5" />
123
+ <div>
124
+ <p className="font-medium text-card-foreground">No scan data found</p>
125
+ <p className="text-sm text-muted-foreground mt-1">{error}</p>
126
+ <p className="text-sm text-muted-foreground mt-2">
127
+ Run <code className="bg-secondary px-1.5 py-0.5 rounded text-xs">navgator scan</code> in your project to generate architecture data.
128
+ </p>
129
+ </div>
130
+ </div>
131
+ </CardContent>
132
+ </Card>
133
+ </div>
134
+ )
135
+ }
136
+
137
+ const data = componentName ? getComponentData(componentName) : null
138
+
139
+ if (!componentName || !data) {
140
+ return (
141
+ <div className="space-y-6">
142
+ <div>
143
+ <h1 className="text-2xl font-semibold text-foreground">Impact Analysis</h1>
144
+ <p className="text-sm text-muted-foreground">
145
+ Select a component to see what would be affected by changes
146
+ </p>
147
+ </div>
148
+
149
+ <div className="relative max-w-md">
150
+ <Search className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
151
+ <Input
152
+ placeholder="Search components..."
153
+ value={search}
154
+ onChange={(e) => setSearch(e.target.value)}
155
+ className="bg-card pl-9"
156
+ />
157
+ </div>
158
+
159
+ {filteredComponents.length === 0 ? (
160
+ <Card className="bg-card">
161
+ <CardContent className="p-6 text-center">
162
+ <p className="text-muted-foreground">No components found</p>
163
+ </CardContent>
164
+ </Card>
165
+ ) : (
166
+ <div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
167
+ {filteredComponents.map((comp) => (
168
+ <button
169
+ key={comp.id}
170
+ onClick={() => onSelectComponent(comp.name)}
171
+ className="flex items-center gap-3 rounded-lg border border-border bg-card p-4 text-left transition-colors hover:bg-secondary"
172
+ >
173
+ <div className="flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10">
174
+ <Target className="h-5 w-5 text-primary" />
175
+ </div>
176
+ <div>
177
+ <p className="font-medium text-card-foreground">{comp.name}</p>
178
+ <p className="text-xs text-muted-foreground">
179
+ {comp.type} · {comp.layer}
180
+ </p>
181
+ </div>
182
+ </button>
183
+ ))}
184
+ </div>
185
+ )}
186
+ </div>
187
+ )
188
+ }
189
+
190
+ const riskLevel =
191
+ data.incoming.length >= 5 ? "high" : data.incoming.length >= 3 ? "medium" : "low"
192
+
193
+ return (
194
+ <div className="space-y-6">
195
+ <div className="flex items-start justify-between">
196
+ <div>
197
+ <div className="flex items-center gap-3">
198
+ <h1 className="text-2xl font-semibold text-foreground">{componentName}</h1>
199
+ <Badge
200
+ variant="outline"
201
+ className={cn(
202
+ "text-xs",
203
+ riskLevel === "high" && "border-destructive/50 bg-destructive/10 text-destructive",
204
+ riskLevel === "medium" && "border-warning/50 bg-warning/10 text-warning",
205
+ riskLevel === "low" && "border-success/50 bg-success/10 text-success"
206
+ )}
207
+ >
208
+ {riskLevel === "high" && <AlertTriangle className="mr-1 h-3 w-3" />}
209
+ {riskLevel === "low" && <CheckCircle2 className="mr-1 h-3 w-3" />}
210
+ {riskLevel} impact risk
211
+ </Badge>
212
+ </div>
213
+ <p className="text-sm text-muted-foreground">
214
+ {data.component.type} · {data.component.layer} · {data.component.purpose || "No description"}
215
+ </p>
216
+ </div>
217
+ <button
218
+ onClick={() => onSelectComponent("")}
219
+ className="text-sm text-muted-foreground hover:text-foreground"
220
+ >
221
+ Clear selection
222
+ </button>
223
+ </div>
224
+
225
+ {/* Summary Cards */}
226
+ <div className="grid gap-4 sm:grid-cols-2">
227
+ <Card className="bg-card">
228
+ <CardContent className="p-4">
229
+ <div className="flex items-center gap-3">
230
+ <div className="flex h-10 w-10 items-center justify-center rounded-lg bg-chart-1/10">
231
+ <ArrowDownToLine className="h-5 w-5 text-chart-1" />
232
+ </div>
233
+ <div>
234
+ <p className="text-2xl font-semibold text-card-foreground">
235
+ {data.incoming.length}
236
+ </p>
237
+ <p className="text-sm text-muted-foreground">Incoming connections</p>
238
+ </div>
239
+ </div>
240
+ </CardContent>
241
+ </Card>
242
+
243
+ <Card className="bg-card">
244
+ <CardContent className="p-4">
245
+ <div className="flex items-center gap-3">
246
+ <div className="flex h-10 w-10 items-center justify-center rounded-lg bg-chart-2/10">
247
+ <ArrowUpFromLine className="h-5 w-5 text-chart-2" />
248
+ </div>
249
+ <div>
250
+ <p className="text-2xl font-semibold text-card-foreground">
251
+ {data.outgoing.length}
252
+ </p>
253
+ <p className="text-sm text-muted-foreground">Outgoing connections</p>
254
+ </div>
255
+ </div>
256
+ </CardContent>
257
+ </Card>
258
+ </div>
259
+
260
+ {/* Incoming Connections */}
261
+ {data.incoming.length > 0 && (
262
+ <Card className="bg-card">
263
+ <CardHeader className="pb-3">
264
+ <CardTitle className="flex items-center gap-2 text-base font-medium">
265
+ <ArrowDownToLine className="h-4 w-4 text-chart-1" />
266
+ Files that USE this component
267
+ <Badge variant="secondary" className="ml-auto">
268
+ {data.incoming.length}
269
+ </Badge>
270
+ </CardTitle>
271
+ <p className="text-xs text-muted-foreground">
272
+ These files may need changes if you modify {componentName}
273
+ </p>
274
+ </CardHeader>
275
+ <CardContent>
276
+ <div className="space-y-3">
277
+ {data.incoming.map((conn, idx) => (
278
+ <div
279
+ key={idx}
280
+ className="rounded-lg border border-border bg-secondary/30 p-3"
281
+ >
282
+ <div className="flex items-center gap-2">
283
+ <FileCode className="h-4 w-4 text-muted-foreground" />
284
+ <span className="font-mono text-sm text-foreground">{conn.from}</span>
285
+ <span className="text-xs text-muted-foreground">:{conn.line}</span>
286
+ </div>
287
+ <div className="mt-2 flex items-center gap-2 text-xs text-muted-foreground">
288
+ <Code2 className="h-3.5 w-3.5" />
289
+ <span className="font-medium text-foreground">{conn.symbol}</span>
290
+ </div>
291
+ {conn.code && (
292
+ <pre className="mt-2 rounded bg-background p-2 font-mono text-xs text-muted-foreground overflow-x-auto">
293
+ {conn.code}
294
+ </pre>
295
+ )}
296
+ </div>
297
+ ))}
298
+ </div>
299
+ </CardContent>
300
+ </Card>
301
+ )}
302
+
303
+ {/* Outgoing Connections */}
304
+ {data.outgoing.length > 0 && (
305
+ <Card className="bg-card">
306
+ <CardHeader className="pb-3">
307
+ <CardTitle className="flex items-center gap-2 text-base font-medium">
308
+ <ArrowUpFromLine className="h-4 w-4 text-chart-2" />
309
+ Components this CALLS
310
+ <Badge variant="secondary" className="ml-auto">
311
+ {data.outgoing.length}
312
+ </Badge>
313
+ </CardTitle>
314
+ <p className="text-xs text-muted-foreground">
315
+ External dependencies of {componentName}
316
+ </p>
317
+ </CardHeader>
318
+ <CardContent>
319
+ <div className="space-y-3">
320
+ {data.outgoing.map((conn, idx) => (
321
+ <button
322
+ key={idx}
323
+ onClick={() => conn.toComponent && onSelectComponent(conn.toComponent)}
324
+ className="w-full rounded-lg border border-border bg-secondary/30 p-3 text-left transition-colors hover:bg-secondary/50"
325
+ >
326
+ <div className="flex items-center gap-2">
327
+ <Badge variant="outline" className="bg-primary/10 text-primary">
328
+ {conn.toComponent || conn.to}
329
+ </Badge>
330
+ <span className="text-xs text-muted-foreground">:{conn.line}</span>
331
+ </div>
332
+ <div className="mt-2 flex items-center gap-2 text-xs text-muted-foreground">
333
+ <Code2 className="h-3.5 w-3.5" />
334
+ <span className="font-medium text-foreground">{conn.symbol}</span>
335
+ </div>
336
+ {conn.code && (
337
+ <pre className="mt-2 rounded bg-background p-2 font-mono text-xs text-muted-foreground overflow-x-auto">
338
+ {conn.code}
339
+ </pre>
340
+ )}
341
+ </button>
342
+ ))}
343
+ </div>
344
+ </CardContent>
345
+ </Card>
346
+ )}
347
+
348
+ {/* No connections */}
349
+ {data.incoming.length === 0 && data.outgoing.length === 0 && (
350
+ <Card className="bg-card">
351
+ <CardContent className="p-6 text-center">
352
+ <p className="text-muted-foreground">No connections found for this component</p>
353
+ </CardContent>
354
+ </Card>
355
+ )}
356
+ </div>
357
+ )
358
+ }