@tyroneross/navgator 0.2.2 → 0.9.0

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 (692) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +21 -7
  3. package/.claude-plugin/plugin.json +16 -11
  4. package/.codex-plugin/plugin.json +31 -0
  5. package/.mcp.json +8 -0
  6. package/CLAUDE.md +197 -23
  7. package/LICENSE +202 -21
  8. package/README.md +220 -33
  9. package/agents/architecture-advisor.md +6 -2
  10. package/agents/architecture-investigator.md +163 -0
  11. package/agents/architecture-planner.md +160 -0
  12. package/agents/external-resolver.md +97 -0
  13. package/dist/__tests__/agent-output.test.d.ts +5 -0
  14. package/dist/__tests__/agent-output.test.d.ts.map +1 -0
  15. package/dist/__tests__/agent-output.test.js +233 -0
  16. package/dist/__tests__/agent-output.test.js.map +1 -0
  17. package/dist/__tests__/architecture-insights-stack.test.d.ts +21 -0
  18. package/dist/__tests__/architecture-insights-stack.test.d.ts.map +1 -0
  19. package/dist/__tests__/architecture-insights-stack.test.js +86 -0
  20. package/dist/__tests__/architecture-insights-stack.test.js.map +1 -0
  21. package/dist/__tests__/architecture-insights.test.d.ts +2 -0
  22. package/dist/__tests__/architecture-insights.test.d.ts.map +1 -0
  23. package/dist/__tests__/architecture-insights.test.js +46 -0
  24. package/dist/__tests__/architecture-insights.test.js.map +1 -0
  25. package/dist/__tests__/audit-sampler.test.d.ts +10 -0
  26. package/dist/__tests__/audit-sampler.test.d.ts.map +1 -0
  27. package/dist/__tests__/audit-sampler.test.js +172 -0
  28. package/dist/__tests__/audit-sampler.test.js.map +1 -0
  29. package/dist/__tests__/audit-spc.test.d.ts +5 -0
  30. package/dist/__tests__/audit-spc.test.d.ts.map +1 -0
  31. package/dist/__tests__/audit-spc.test.js +94 -0
  32. package/dist/__tests__/audit-spc.test.js.map +1 -0
  33. package/dist/__tests__/audit-verifiers.test.d.ts +5 -0
  34. package/dist/__tests__/audit-verifiers.test.d.ts.map +1 -0
  35. package/dist/__tests__/audit-verifiers.test.js +248 -0
  36. package/dist/__tests__/audit-verifiers.test.js.map +1 -0
  37. package/dist/__tests__/auto-refresh.test.d.ts +12 -0
  38. package/dist/__tests__/auto-refresh.test.d.ts.map +1 -0
  39. package/dist/__tests__/auto-refresh.test.js +236 -0
  40. package/dist/__tests__/auto-refresh.test.js.map +1 -0
  41. package/dist/__tests__/bare-imports.test.d.ts +8 -0
  42. package/dist/__tests__/bare-imports.test.d.ts.map +1 -0
  43. package/dist/__tests__/bare-imports.test.js +176 -0
  44. package/dist/__tests__/bare-imports.test.js.map +1 -0
  45. package/dist/__tests__/classify.test.d.ts +5 -0
  46. package/dist/__tests__/classify.test.d.ts.map +1 -0
  47. package/dist/__tests__/classify.test.js +158 -0
  48. package/dist/__tests__/classify.test.js.map +1 -0
  49. package/dist/__tests__/cli-commands.test.d.ts +8 -0
  50. package/dist/__tests__/cli-commands.test.d.ts.map +1 -0
  51. package/dist/__tests__/cli-commands.test.js +207 -0
  52. package/dist/__tests__/cli-commands.test.js.map +1 -0
  53. package/dist/__tests__/consolidated-readers.test.d.ts +23 -0
  54. package/dist/__tests__/consolidated-readers.test.d.ts.map +1 -0
  55. package/dist/__tests__/consolidated-readers.test.js +200 -0
  56. package/dist/__tests__/consolidated-readers.test.js.map +1 -0
  57. package/dist/__tests__/coverage.test.d.ts +5 -0
  58. package/dist/__tests__/coverage.test.d.ts.map +1 -0
  59. package/dist/__tests__/coverage.test.js +120 -0
  60. package/dist/__tests__/coverage.test.js.map +1 -0
  61. package/dist/__tests__/deploy-scanner-runtime.test.d.ts +6 -0
  62. package/dist/__tests__/deploy-scanner-runtime.test.d.ts.map +1 -0
  63. package/dist/__tests__/deploy-scanner-runtime.test.js +168 -0
  64. package/dist/__tests__/deploy-scanner-runtime.test.js.map +1 -0
  65. package/dist/__tests__/env-scanner.test.d.ts +2 -0
  66. package/dist/__tests__/env-scanner.test.d.ts.map +1 -0
  67. package/dist/__tests__/env-scanner.test.js +191 -0
  68. package/dist/__tests__/env-scanner.test.js.map +1 -0
  69. package/dist/__tests__/freshness/cli-freshness.test.d.ts +2 -0
  70. package/dist/__tests__/freshness/cli-freshness.test.d.ts.map +1 -0
  71. package/dist/__tests__/freshness/cli-freshness.test.js +26 -0
  72. package/dist/__tests__/freshness/cli-freshness.test.js.map +1 -0
  73. package/dist/__tests__/freshness/dirty-ledger.test.d.ts +2 -0
  74. package/dist/__tests__/freshness/dirty-ledger.test.d.ts.map +1 -0
  75. package/dist/__tests__/freshness/dirty-ledger.test.js +39 -0
  76. package/dist/__tests__/freshness/dirty-ledger.test.js.map +1 -0
  77. package/dist/__tests__/freshness/drainer.test.d.ts +2 -0
  78. package/dist/__tests__/freshness/drainer.test.d.ts.map +1 -0
  79. package/dist/__tests__/freshness/drainer.test.js +103 -0
  80. package/dist/__tests__/freshness/drainer.test.js.map +1 -0
  81. package/dist/__tests__/freshness/paths.test.d.ts +2 -0
  82. package/dist/__tests__/freshness/paths.test.d.ts.map +1 -0
  83. package/dist/__tests__/freshness/paths.test.js +19 -0
  84. package/dist/__tests__/freshness/paths.test.js.map +1 -0
  85. package/dist/__tests__/freshness/scan-lock.test.d.ts +2 -0
  86. package/dist/__tests__/freshness/scan-lock.test.d.ts.map +1 -0
  87. package/dist/__tests__/freshness/scan-lock.test.js +40 -0
  88. package/dist/__tests__/freshness/scan-lock.test.js.map +1 -0
  89. package/dist/__tests__/freshness/stamp.test.d.ts +2 -0
  90. package/dist/__tests__/freshness/stamp.test.d.ts.map +1 -0
  91. package/dist/__tests__/freshness/stamp.test.js +36 -0
  92. package/dist/__tests__/freshness/stamp.test.js.map +1 -0
  93. package/dist/__tests__/gitignore-safety.test.d.ts +2 -0
  94. package/dist/__tests__/gitignore-safety.test.d.ts.map +1 -0
  95. package/dist/__tests__/gitignore-safety.test.js +110 -0
  96. package/dist/__tests__/gitignore-safety.test.js.map +1 -0
  97. package/dist/__tests__/helpers.d.ts +37 -0
  98. package/dist/__tests__/helpers.d.ts.map +1 -0
  99. package/dist/__tests__/helpers.js +134 -0
  100. package/dist/__tests__/helpers.js.map +1 -0
  101. package/dist/__tests__/impact.test.d.ts +5 -0
  102. package/dist/__tests__/impact.test.d.ts.map +1 -0
  103. package/dist/__tests__/impact.test.js +221 -0
  104. package/dist/__tests__/impact.test.js.map +1 -0
  105. package/dist/__tests__/lessons-store.test.d.ts +8 -0
  106. package/dist/__tests__/lessons-store.test.d.ts.map +1 -0
  107. package/dist/__tests__/lessons-store.test.js +232 -0
  108. package/dist/__tests__/lessons-store.test.js.map +1 -0
  109. package/dist/__tests__/llm-dedup.test.d.ts +2 -0
  110. package/dist/__tests__/llm-dedup.test.d.ts.map +1 -0
  111. package/dist/__tests__/llm-dedup.test.js +155 -0
  112. package/dist/__tests__/llm-dedup.test.js.map +1 -0
  113. package/dist/__tests__/mjs-frontend-fetch.test.d.ts +19 -0
  114. package/dist/__tests__/mjs-frontend-fetch.test.d.ts.map +1 -0
  115. package/dist/__tests__/mjs-frontend-fetch.test.js +179 -0
  116. package/dist/__tests__/mjs-frontend-fetch.test.js.map +1 -0
  117. package/dist/__tests__/multi-stack-discovery.test.d.ts +11 -0
  118. package/dist/__tests__/multi-stack-discovery.test.d.ts.map +1 -0
  119. package/dist/__tests__/multi-stack-discovery.test.js +75 -0
  120. package/dist/__tests__/multi-stack-discovery.test.js.map +1 -0
  121. package/dist/__tests__/per-entity-files-gate.test.d.ts +22 -0
  122. package/dist/__tests__/per-entity-files-gate.test.d.ts.map +1 -0
  123. package/dist/__tests__/per-entity-files-gate.test.js +160 -0
  124. package/dist/__tests__/per-entity-files-gate.test.js.map +1 -0
  125. package/dist/__tests__/prisma-calls.test.d.ts +2 -0
  126. package/dist/__tests__/prisma-calls.test.d.ts.map +1 -0
  127. package/dist/__tests__/prisma-calls.test.js +125 -0
  128. package/dist/__tests__/prisma-calls.test.js.map +1 -0
  129. package/dist/__tests__/prisma-parser.test.d.ts +2 -0
  130. package/dist/__tests__/prisma-parser.test.d.ts.map +1 -0
  131. package/dist/__tests__/prisma-parser.test.js +252 -0
  132. package/dist/__tests__/prisma-parser.test.js.map +1 -0
  133. package/dist/__tests__/prompt-detector.test.d.ts +5 -0
  134. package/dist/__tests__/prompt-detector.test.d.ts.map +1 -0
  135. package/dist/__tests__/prompt-detector.test.js +75 -0
  136. package/dist/__tests__/prompt-detector.test.js.map +1 -0
  137. package/dist/__tests__/queue-scanner.test.d.ts +5 -0
  138. package/dist/__tests__/queue-scanner.test.d.ts.map +1 -0
  139. package/dist/__tests__/queue-scanner.test.js +85 -0
  140. package/dist/__tests__/queue-scanner.test.js.map +1 -0
  141. package/dist/__tests__/resolve.test.d.ts +5 -0
  142. package/dist/__tests__/resolve.test.d.ts.map +1 -0
  143. package/dist/__tests__/resolve.test.js +196 -0
  144. package/dist/__tests__/resolve.test.js.map +1 -0
  145. package/dist/__tests__/rules.test.d.ts +2 -0
  146. package/dist/__tests__/rules.test.d.ts.map +1 -0
  147. package/dist/__tests__/rules.test.js +343 -0
  148. package/dist/__tests__/rules.test.js.map +1 -0
  149. package/dist/__tests__/sandbox.test.d.ts +5 -0
  150. package/dist/__tests__/sandbox.test.d.ts.map +1 -0
  151. package/dist/__tests__/sandbox.test.js +189 -0
  152. package/dist/__tests__/sandbox.test.js.map +1 -0
  153. package/dist/__tests__/scanner-audit.test.d.ts +9 -0
  154. package/dist/__tests__/scanner-audit.test.d.ts.map +1 -0
  155. package/dist/__tests__/scanner-audit.test.js +64 -0
  156. package/dist/__tests__/scanner-audit.test.js.map +1 -0
  157. package/dist/__tests__/scanner-characterization.test.d.ts +16 -0
  158. package/dist/__tests__/scanner-characterization.test.d.ts.map +1 -0
  159. package/dist/__tests__/scanner-characterization.test.js +167 -0
  160. package/dist/__tests__/scanner-characterization.test.js.map +1 -0
  161. package/dist/__tests__/scanner-incremental.test.d.ts +13 -0
  162. package/dist/__tests__/scanner-incremental.test.d.ts.map +1 -0
  163. package/dist/__tests__/scanner-incremental.test.js +725 -0
  164. package/dist/__tests__/scanner-incremental.test.js.map +1 -0
  165. package/dist/__tests__/scanner-integration.test.d.ts +7 -0
  166. package/dist/__tests__/scanner-integration.test.d.ts.map +1 -0
  167. package/dist/__tests__/scanner-integration.test.js +211 -0
  168. package/dist/__tests__/scanner-integration.test.js.map +1 -0
  169. package/dist/__tests__/scip-new-catches.test.d.ts +19 -0
  170. package/dist/__tests__/scip-new-catches.test.d.ts.map +1 -0
  171. package/dist/__tests__/scip-new-catches.test.js +90 -0
  172. package/dist/__tests__/scip-new-catches.test.js.map +1 -0
  173. package/dist/__tests__/subgraph.test.d.ts +5 -0
  174. package/dist/__tests__/subgraph.test.d.ts.map +1 -0
  175. package/dist/__tests__/subgraph.test.js +145 -0
  176. package/dist/__tests__/subgraph.test.js.map +1 -0
  177. package/dist/__tests__/trace.test.d.ts +5 -0
  178. package/dist/__tests__/trace.test.d.ts.map +1 -0
  179. package/dist/__tests__/trace.test.js +221 -0
  180. package/dist/__tests__/trace.test.js.map +1 -0
  181. package/dist/agent-output.d.ts +16 -0
  182. package/dist/agent-output.d.ts.map +1 -0
  183. package/dist/agent-output.js +142 -0
  184. package/dist/agent-output.js.map +1 -0
  185. package/dist/architecture-insights.d.ts +17 -0
  186. package/dist/architecture-insights.d.ts.map +1 -0
  187. package/dist/architecture-insights.js +178 -0
  188. package/dist/architecture-insights.js.map +1 -0
  189. package/dist/audit/index.d.ts +69 -0
  190. package/dist/audit/index.d.ts.map +1 -0
  191. package/dist/audit/index.js +255 -0
  192. package/dist/audit/index.js.map +1 -0
  193. package/dist/audit/sampler.d.ts +98 -0
  194. package/dist/audit/sampler.d.ts.map +1 -0
  195. package/dist/audit/sampler.js +298 -0
  196. package/dist/audit/sampler.js.map +1 -0
  197. package/dist/audit/spc.d.ts +62 -0
  198. package/dist/audit/spc.d.ts.map +1 -0
  199. package/dist/audit/spc.js +81 -0
  200. package/dist/audit/spc.js.map +1 -0
  201. package/dist/audit/verifiers.d.ts +81 -0
  202. package/dist/audit/verifiers.d.ts.map +1 -0
  203. package/dist/audit/verifiers.js +366 -0
  204. package/dist/audit/verifiers.js.map +1 -0
  205. package/dist/classify.d.ts +19 -0
  206. package/dist/classify.d.ts.map +1 -0
  207. package/dist/classify.js +124 -0
  208. package/dist/classify.js.map +1 -0
  209. package/dist/cli/commands/connections.d.ts +3 -0
  210. package/dist/cli/commands/connections.d.ts.map +1 -0
  211. package/dist/cli/commands/connections.js +125 -0
  212. package/dist/cli/commands/connections.js.map +1 -0
  213. package/dist/cli/commands/coverage.d.ts +3 -0
  214. package/dist/cli/commands/coverage.d.ts.map +1 -0
  215. package/dist/cli/commands/coverage.js +94 -0
  216. package/dist/cli/commands/coverage.js.map +1 -0
  217. package/dist/cli/commands/dead.d.ts +3 -0
  218. package/dist/cli/commands/dead.d.ts.map +1 -0
  219. package/dist/cli/commands/dead.js +80 -0
  220. package/dist/cli/commands/dead.js.map +1 -0
  221. package/dist/cli/commands/diagram.d.ts +3 -0
  222. package/dist/cli/commands/diagram.d.ts.map +1 -0
  223. package/dist/cli/commands/diagram.js +102 -0
  224. package/dist/cli/commands/diagram.js.map +1 -0
  225. package/dist/cli/commands/find.d.ts +3 -0
  226. package/dist/cli/commands/find.d.ts.map +1 -0
  227. package/dist/cli/commands/find.js +128 -0
  228. package/dist/cli/commands/find.js.map +1 -0
  229. package/dist/cli/commands/freshness.d.ts +20 -0
  230. package/dist/cli/commands/freshness.d.ts.map +1 -0
  231. package/dist/cli/commands/freshness.js +90 -0
  232. package/dist/cli/commands/freshness.js.map +1 -0
  233. package/dist/cli/commands/helpers.d.ts +7 -0
  234. package/dist/cli/commands/helpers.d.ts.map +1 -0
  235. package/dist/cli/commands/helpers.js +30 -0
  236. package/dist/cli/commands/helpers.js.map +1 -0
  237. package/dist/cli/commands/impact.d.ts +3 -0
  238. package/dist/cli/commands/impact.d.ts.map +1 -0
  239. package/dist/cli/commands/impact.js +172 -0
  240. package/dist/cli/commands/impact.js.map +1 -0
  241. package/dist/cli/commands/lessons.d.ts +6 -0
  242. package/dist/cli/commands/lessons.d.ts.map +1 -0
  243. package/dist/cli/commands/lessons.js +279 -0
  244. package/dist/cli/commands/lessons.js.map +1 -0
  245. package/dist/cli/commands/list.d.ts +3 -0
  246. package/dist/cli/commands/list.d.ts.map +1 -0
  247. package/dist/cli/commands/list.js +91 -0
  248. package/dist/cli/commands/list.js.map +1 -0
  249. package/dist/cli/commands/llm-map.d.ts +3 -0
  250. package/dist/cli/commands/llm-map.d.ts.map +1 -0
  251. package/dist/cli/commands/llm-map.js +121 -0
  252. package/dist/cli/commands/llm-map.js.map +1 -0
  253. package/dist/cli/commands/misc.d.ts +17 -0
  254. package/dist/cli/commands/misc.d.ts.map +1 -0
  255. package/dist/cli/commands/misc.js +495 -0
  256. package/dist/cli/commands/misc.js.map +1 -0
  257. package/dist/cli/commands/prompts.d.ts +3 -0
  258. package/dist/cli/commands/prompts.d.ts.map +1 -0
  259. package/dist/cli/commands/prompts.js +74 -0
  260. package/dist/cli/commands/prompts.js.map +1 -0
  261. package/dist/cli/commands/rules.d.ts +3 -0
  262. package/dist/cli/commands/rules.d.ts.map +1 -0
  263. package/dist/cli/commands/rules.js +61 -0
  264. package/dist/cli/commands/rules.js.map +1 -0
  265. package/dist/cli/commands/scan.d.ts +3 -0
  266. package/dist/cli/commands/scan.d.ts.map +1 -0
  267. package/dist/cli/commands/scan.js +177 -0
  268. package/dist/cli/commands/scan.js.map +1 -0
  269. package/dist/cli/commands/schema.d.ts +3 -0
  270. package/dist/cli/commands/schema.d.ts.map +1 -0
  271. package/dist/cli/commands/schema.js +126 -0
  272. package/dist/cli/commands/schema.js.map +1 -0
  273. package/dist/cli/commands/status.d.ts +3 -0
  274. package/dist/cli/commands/status.d.ts.map +1 -0
  275. package/dist/cli/commands/status.js +340 -0
  276. package/dist/cli/commands/status.js.map +1 -0
  277. package/dist/cli/commands/subgraph.d.ts +3 -0
  278. package/dist/cli/commands/subgraph.d.ts.map +1 -0
  279. package/dist/cli/commands/subgraph.js +55 -0
  280. package/dist/cli/commands/subgraph.js.map +1 -0
  281. package/dist/cli/commands/temporal.d.ts +3 -0
  282. package/dist/cli/commands/temporal.d.ts.map +1 -0
  283. package/dist/cli/commands/temporal.js +112 -0
  284. package/dist/cli/commands/temporal.js.map +1 -0
  285. package/dist/cli/commands/trace.d.ts +3 -0
  286. package/dist/cli/commands/trace.d.ts.map +1 -0
  287. package/dist/cli/commands/trace.js +65 -0
  288. package/dist/cli/commands/trace.js.map +1 -0
  289. package/dist/cli/index.js +88 -825
  290. package/dist/cli/index.js.map +1 -1
  291. package/dist/config.d.ts +13 -2
  292. package/dist/config.d.ts.map +1 -1
  293. package/dist/config.js +106 -12
  294. package/dist/config.js.map +1 -1
  295. package/dist/coverage.d.ts +37 -0
  296. package/dist/coverage.d.ts.map +1 -0
  297. package/dist/coverage.js +177 -0
  298. package/dist/coverage.js.map +1 -0
  299. package/dist/diagram.d.ts.map +1 -1
  300. package/dist/diagram.js +41 -0
  301. package/dist/diagram.js.map +1 -1
  302. package/dist/diff.d.ts +57 -0
  303. package/dist/diff.d.ts.map +1 -0
  304. package/dist/diff.js +527 -0
  305. package/dist/diff.js.map +1 -0
  306. package/dist/enrich/cache.d.ts +41 -0
  307. package/dist/enrich/cache.d.ts.map +1 -0
  308. package/dist/enrich/cache.js +97 -0
  309. package/dist/enrich/cache.js.map +1 -0
  310. package/dist/enrich/external-enrichment.types.d.ts +91 -0
  311. package/dist/enrich/external-enrichment.types.d.ts.map +1 -0
  312. package/dist/enrich/external-enrichment.types.js +38 -0
  313. package/dist/enrich/external-enrichment.types.js.map +1 -0
  314. package/dist/enrich/external-resolver.d.ts +95 -0
  315. package/dist/enrich/external-resolver.d.ts.map +1 -0
  316. package/dist/enrich/external-resolver.js +222 -0
  317. package/dist/enrich/external-resolver.js.map +1 -0
  318. package/dist/enrich/fetchers.d.ts +30 -0
  319. package/dist/enrich/fetchers.d.ts.map +1 -0
  320. package/dist/enrich/fetchers.js +89 -0
  321. package/dist/enrich/fetchers.js.map +1 -0
  322. package/dist/file-resolve.d.ts +35 -0
  323. package/dist/file-resolve.d.ts.map +1 -0
  324. package/dist/file-resolve.js +159 -0
  325. package/dist/file-resolve.js.map +1 -0
  326. package/dist/freshness/dirty-ledger.d.ts +7 -0
  327. package/dist/freshness/dirty-ledger.d.ts.map +1 -0
  328. package/dist/freshness/dirty-ledger.js +56 -0
  329. package/dist/freshness/dirty-ledger.js.map +1 -0
  330. package/dist/freshness/drainer.d.ts +38 -0
  331. package/dist/freshness/drainer.d.ts.map +1 -0
  332. package/dist/freshness/drainer.js +88 -0
  333. package/dist/freshness/drainer.js.map +1 -0
  334. package/dist/freshness/paths.d.ts +9 -0
  335. package/dist/freshness/paths.d.ts.map +1 -0
  336. package/dist/freshness/paths.js +24 -0
  337. package/dist/freshness/paths.js.map +1 -0
  338. package/dist/freshness/scan-lock.d.ts +8 -0
  339. package/dist/freshness/scan-lock.d.ts.map +1 -0
  340. package/dist/freshness/scan-lock.js +68 -0
  341. package/dist/freshness/scan-lock.js.map +1 -0
  342. package/dist/freshness/stamp.d.ts +25 -0
  343. package/dist/freshness/stamp.d.ts.map +1 -0
  344. package/dist/freshness/stamp.js +50 -0
  345. package/dist/freshness/stamp.js.map +1 -0
  346. package/dist/git.d.ts +12 -0
  347. package/dist/git.d.ts.map +1 -0
  348. package/dist/git.js +42 -0
  349. package/dist/git.js.map +1 -0
  350. package/dist/gitignore-safety.d.ts +41 -0
  351. package/dist/gitignore-safety.d.ts.map +1 -0
  352. package/dist/gitignore-safety.js +107 -0
  353. package/dist/gitignore-safety.js.map +1 -0
  354. package/dist/impact.d.ts +20 -0
  355. package/dist/impact.d.ts.map +1 -0
  356. package/dist/impact.js +89 -0
  357. package/dist/impact.js.map +1 -0
  358. package/dist/index.d.ts +24 -2
  359. package/dist/index.d.ts.map +1 -1
  360. package/dist/index.js +31 -1
  361. package/dist/index.js.map +1 -1
  362. package/dist/lessons-store.d.ts +93 -0
  363. package/dist/lessons-store.d.ts.map +1 -0
  364. package/dist/lessons-store.js +265 -0
  365. package/dist/lessons-store.js.map +1 -0
  366. package/dist/llm-dedup.d.ts +40 -0
  367. package/dist/llm-dedup.d.ts.map +1 -0
  368. package/dist/llm-dedup.js +373 -0
  369. package/dist/llm-dedup.js.map +1 -0
  370. package/dist/mcp/server.d.ts +9 -0
  371. package/dist/mcp/server.d.ts.map +1 -0
  372. package/dist/mcp/server.js +87 -0
  373. package/dist/mcp/server.js.map +1 -0
  374. package/dist/mcp/tools.d.ts +198 -0
  375. package/dist/mcp/tools.d.ts.map +1 -0
  376. package/dist/mcp/tools.js +744 -0
  377. package/dist/mcp/tools.js.map +1 -0
  378. package/dist/metrics/pagerank-louvain.d.ts +44 -0
  379. package/dist/metrics/pagerank-louvain.d.ts.map +1 -0
  380. package/dist/metrics/pagerank-louvain.js +128 -0
  381. package/dist/metrics/pagerank-louvain.js.map +1 -0
  382. package/dist/parsers/scip-runner.d.ts +63 -0
  383. package/dist/parsers/scip-runner.d.ts.map +1 -0
  384. package/dist/parsers/scip-runner.js +179 -0
  385. package/dist/parsers/scip-runner.js.map +1 -0
  386. package/dist/projects.d.ts +54 -0
  387. package/dist/projects.d.ts.map +1 -0
  388. package/dist/projects.js +153 -0
  389. package/dist/projects.js.map +1 -0
  390. package/dist/resolve.d.ts +22 -0
  391. package/dist/resolve.d.ts.map +1 -0
  392. package/dist/resolve.js +128 -0
  393. package/dist/resolve.js.map +1 -0
  394. package/dist/rules.d.ts +36 -0
  395. package/dist/rules.d.ts.map +1 -0
  396. package/dist/rules.js +484 -0
  397. package/dist/rules.js.map +1 -0
  398. package/dist/sandbox.d.ts +33 -0
  399. package/dist/sandbox.d.ts.map +1 -0
  400. package/dist/sandbox.js +91 -0
  401. package/dist/sandbox.js.map +1 -0
  402. package/dist/scan-lock.d.ts +37 -0
  403. package/dist/scan-lock.d.ts.map +1 -0
  404. package/dist/scan-lock.js +145 -0
  405. package/dist/scan-lock.js.map +1 -0
  406. package/dist/scanner.d.ts +126 -1
  407. package/dist/scanner.d.ts.map +1 -1
  408. package/dist/scanner.js +1711 -235
  409. package/dist/scanner.js.map +1 -1
  410. package/dist/scanners/connections/ast-scanner.d.ts +9 -2
  411. package/dist/scanners/connections/ast-scanner.d.ts.map +1 -1
  412. package/dist/scanners/connections/ast-scanner.js +19 -4
  413. package/dist/scanners/connections/ast-scanner.js.map +1 -1
  414. package/dist/scanners/connections/import-scanner.d.ts +27 -0
  415. package/dist/scanners/connections/import-scanner.d.ts.map +1 -0
  416. package/dist/scanners/connections/import-scanner.js +537 -0
  417. package/dist/scanners/connections/import-scanner.js.map +1 -0
  418. package/dist/scanners/connections/llm-call-tracer.d.ts +1 -1
  419. package/dist/scanners/connections/llm-call-tracer.d.ts.map +1 -1
  420. package/dist/scanners/connections/llm-call-tracer.js +6 -2
  421. package/dist/scanners/connections/llm-call-tracer.js.map +1 -1
  422. package/dist/scanners/connections/prisma-calls.d.ts +11 -0
  423. package/dist/scanners/connections/prisma-calls.d.ts.map +1 -0
  424. package/dist/scanners/connections/prisma-calls.js +237 -0
  425. package/dist/scanners/connections/prisma-calls.js.map +1 -0
  426. package/dist/scanners/connections/service-calls.d.ts +1 -1
  427. package/dist/scanners/connections/service-calls.d.ts.map +1 -1
  428. package/dist/scanners/connections/service-calls.js +35 -3
  429. package/dist/scanners/connections/service-calls.js.map +1 -1
  430. package/dist/scanners/infrastructure/cron-scanner.d.ts +14 -0
  431. package/dist/scanners/infrastructure/cron-scanner.d.ts.map +1 -0
  432. package/dist/scanners/infrastructure/cron-scanner.js +383 -0
  433. package/dist/scanners/infrastructure/cron-scanner.js.map +1 -0
  434. package/dist/scanners/infrastructure/deploy-scanner.d.ts +11 -0
  435. package/dist/scanners/infrastructure/deploy-scanner.d.ts.map +1 -0
  436. package/dist/scanners/infrastructure/deploy-scanner.js +508 -0
  437. package/dist/scanners/infrastructure/deploy-scanner.js.map +1 -0
  438. package/dist/scanners/infrastructure/env-scanner.d.ts +55 -0
  439. package/dist/scanners/infrastructure/env-scanner.d.ts.map +1 -0
  440. package/dist/scanners/infrastructure/env-scanner.js +431 -0
  441. package/dist/scanners/infrastructure/env-scanner.js.map +1 -0
  442. package/dist/scanners/infrastructure/field-usage-analyzer.d.ts +52 -0
  443. package/dist/scanners/infrastructure/field-usage-analyzer.d.ts.map +1 -0
  444. package/dist/scanners/infrastructure/field-usage-analyzer.js +480 -0
  445. package/dist/scanners/infrastructure/field-usage-analyzer.js.map +1 -0
  446. package/dist/scanners/infrastructure/prisma-parser.d.ts +21 -0
  447. package/dist/scanners/infrastructure/prisma-parser.d.ts.map +1 -0
  448. package/dist/scanners/infrastructure/prisma-parser.js +58 -0
  449. package/dist/scanners/infrastructure/prisma-parser.js.map +1 -0
  450. package/dist/scanners/infrastructure/prisma-scanner.d.ts +30 -0
  451. package/dist/scanners/infrastructure/prisma-scanner.d.ts.map +1 -0
  452. package/dist/scanners/infrastructure/prisma-scanner.js +329 -0
  453. package/dist/scanners/infrastructure/prisma-scanner.js.map +1 -0
  454. package/dist/scanners/infrastructure/queue-scanner.d.ts +14 -0
  455. package/dist/scanners/infrastructure/queue-scanner.d.ts.map +1 -0
  456. package/dist/scanners/infrastructure/queue-scanner.js +455 -0
  457. package/dist/scanners/infrastructure/queue-scanner.js.map +1 -0
  458. package/dist/scanners/infrastructure/typespec-validator.d.ts +50 -0
  459. package/dist/scanners/infrastructure/typespec-validator.d.ts.map +1 -0
  460. package/dist/scanners/infrastructure/typespec-validator.js +407 -0
  461. package/dist/scanners/infrastructure/typespec-validator.js.map +1 -0
  462. package/dist/scanners/packages/swift.d.ts +5 -0
  463. package/dist/scanners/packages/swift.d.ts.map +1 -1
  464. package/dist/scanners/packages/swift.js +23 -0
  465. package/dist/scanners/packages/swift.js.map +1 -1
  466. package/dist/scanners/prompts/detector.d.ts +13 -2
  467. package/dist/scanners/prompts/detector.d.ts.map +1 -1
  468. package/dist/scanners/prompts/detector.js +97 -46
  469. package/dist/scanners/prompts/detector.js.map +1 -1
  470. package/dist/scanners/prompts/index.d.ts +1 -1
  471. package/dist/scanners/prompts/index.d.ts.map +1 -1
  472. package/dist/scanners/prompts/index.js +2 -2
  473. package/dist/scanners/prompts/index.js.map +1 -1
  474. package/dist/scanners/swift/code-scanner.d.ts +1 -1
  475. package/dist/scanners/swift/code-scanner.d.ts.map +1 -1
  476. package/dist/scanners/swift/code-scanner.js +216 -2
  477. package/dist/scanners/swift/code-scanner.js.map +1 -1
  478. package/dist/scanners/swift/swiftui-scanner.d.ts +45 -0
  479. package/dist/scanners/swift/swiftui-scanner.d.ts.map +1 -0
  480. package/dist/scanners/swift/swiftui-scanner.js +606 -0
  481. package/dist/scanners/swift/swiftui-scanner.js.map +1 -0
  482. package/dist/scanners/xcode/pbxproj-parser.d.ts +32 -0
  483. package/dist/scanners/xcode/pbxproj-parser.d.ts.map +1 -0
  484. package/dist/scanners/xcode/pbxproj-parser.js +407 -0
  485. package/dist/scanners/xcode/pbxproj-parser.js.map +1 -0
  486. package/dist/scanners/xcode/storyboard-scanner.d.ts +13 -0
  487. package/dist/scanners/xcode/storyboard-scanner.d.ts.map +1 -0
  488. package/dist/scanners/xcode/storyboard-scanner.js +236 -0
  489. package/dist/scanners/xcode/storyboard-scanner.js.map +1 -0
  490. package/dist/storage/markdown-view.d.ts +49 -0
  491. package/dist/storage/markdown-view.d.ts.map +1 -0
  492. package/dist/storage/markdown-view.js +233 -0
  493. package/dist/storage/markdown-view.js.map +1 -0
  494. package/dist/storage.d.ts +225 -9
  495. package/dist/storage.d.ts.map +1 -1
  496. package/dist/storage.js +945 -86
  497. package/dist/storage.js.map +1 -1
  498. package/dist/subgraph.d.ts +30 -0
  499. package/dist/subgraph.d.ts.map +1 -0
  500. package/dist/subgraph.js +106 -0
  501. package/dist/subgraph.js.map +1 -0
  502. package/dist/temporal/git-store.d.ts +65 -0
  503. package/dist/temporal/git-store.d.ts.map +1 -0
  504. package/dist/temporal/git-store.js +166 -0
  505. package/dist/temporal/git-store.js.map +1 -0
  506. package/dist/trace.d.ts +38 -0
  507. package/dist/trace.d.ts.map +1 -0
  508. package/dist/trace.js +292 -0
  509. package/dist/trace.js.map +1 -0
  510. package/dist/types.d.ts +322 -2
  511. package/dist/types.d.ts.map +1 -1
  512. package/dist/types.js +53 -0
  513. package/dist/types.js.map +1 -1
  514. package/hooks/hooks.json +1 -55
  515. package/hooks/mark-dirty.sh +20 -0
  516. package/hooks/post-bash-suggest.sh +30 -0
  517. package/hooks/post-edit-suggest.sh +29 -0
  518. package/hooks/pre-edit-warn.sh +28 -0
  519. package/hooks/session-start.sh +19 -0
  520. package/hooks/stop-suggest.sh +49 -0
  521. package/package.json +30 -11
  522. package/scripts/install-codex-plugin.sh +119 -0
  523. package/scripts/install-plugin.sh +29 -24
  524. package/skills/architecture-export/SKILL.md +79 -0
  525. package/skills/architecture-scan/SKILL.md +64 -0
  526. package/skills/code-review/SKILL.md +368 -0
  527. package/skills/impact-analysis/SKILL.md +80 -0
  528. package/skills/infrastructure-scanning.md +42 -0
  529. package/skills/navgator-setup/SKILL.md +108 -0
  530. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  531. package/web/.next/standalone/web/.next/app-path-routes-manifest.json +3 -0
  532. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  533. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  534. package/web/.next/standalone/web/.next/required-server-files.json +4 -4
  535. package/web/.next/standalone/web/.next/routes-manifest.json +18 -0
  536. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  537. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  538. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  539. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  540. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  541. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  542. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  543. package/web/.next/standalone/web/.next/server/app/_not-found/page/next-font-manifest.json +2 -2
  544. package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  545. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  546. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +3 -3
  547. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  548. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  549. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  550. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  551. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  552. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -3
  553. package/web/.next/standalone/web/.next/server/app/api/prompts/route.js.nft.json +1 -1
  554. package/web/.next/standalone/web/.next/server/app/api/rules/route/app-paths-manifest.json +3 -0
  555. package/web/.next/standalone/web/.next/server/app/api/rules/route/build-manifest.json +11 -0
  556. package/web/.next/standalone/web/.next/server/app/api/rules/route/server-reference-manifest.json +4 -0
  557. package/web/.next/standalone/web/.next/server/app/api/rules/route.js +6 -0
  558. package/web/.next/standalone/web/.next/server/app/api/rules/route.js.map +5 -0
  559. package/web/.next/standalone/web/.next/server/app/api/rules/route.js.nft.json +1 -0
  560. package/web/.next/standalone/web/.next/server/app/api/rules/route_client-reference-manifest.js +2 -0
  561. package/web/.next/standalone/web/.next/server/app/api/subgraph/route/app-paths-manifest.json +3 -0
  562. package/web/.next/standalone/web/.next/server/app/api/subgraph/route/build-manifest.json +11 -0
  563. package/web/.next/standalone/web/.next/server/app/api/subgraph/route/server-reference-manifest.json +4 -0
  564. package/web/.next/standalone/web/.next/server/app/api/subgraph/route.js +6 -0
  565. package/web/.next/standalone/web/.next/server/app/api/subgraph/route.js.map +5 -0
  566. package/web/.next/standalone/web/.next/server/app/api/subgraph/route.js.nft.json +1 -0
  567. package/web/.next/standalone/web/.next/server/app/api/subgraph/route_client-reference-manifest.js +2 -0
  568. package/web/.next/standalone/web/.next/server/app/api/trace/route/app-paths-manifest.json +3 -0
  569. package/web/.next/standalone/web/.next/server/app/api/trace/route/build-manifest.json +11 -0
  570. package/web/.next/standalone/web/.next/server/app/api/trace/route/server-reference-manifest.json +4 -0
  571. package/web/.next/standalone/web/.next/server/app/api/trace/route.js +6 -0
  572. package/web/.next/standalone/web/.next/server/app/api/trace/route.js.map +5 -0
  573. package/web/.next/standalone/web/.next/server/app/api/trace/route.js.nft.json +1 -0
  574. package/web/.next/standalone/web/.next/server/app/api/trace/route_client-reference-manifest.js +2 -0
  575. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  576. package/web/.next/standalone/web/.next/server/app/index.rsc +6 -6
  577. package/web/.next/standalone/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  578. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +6 -6
  579. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  580. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +3 -3
  581. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +5 -5
  582. package/web/.next/standalone/web/.next/server/app/page/next-font-manifest.json +2 -2
  583. package/web/.next/standalone/web/.next/server/app/page_client-reference-manifest.js +1 -1
  584. package/web/.next/standalone/web/.next/server/app-paths-manifest.json +3 -0
  585. package/web/.next/standalone/web/.next/server/chunks/2374f_next_dist_esm_build_templates_app-route_0bb4e66a.js +1 -1
  586. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__006b837d._.js +1 -1
  587. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__0426efe8._.js +3 -0
  588. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__2e09fec9._.js +1 -1
  589. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__38d0390f._.js +1 -1
  590. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__594bcf20._.js +1 -1
  591. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__b888fadf._.js +1 -1
  592. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__cd5f36ce._.js +3 -0
  593. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__ee6fc95f._.js +3 -0
  594. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__fa2ec862._.js +1 -1
  595. package/web/.next/standalone/web/.next/server/chunks/ssr/web_171de0df._.js +9 -4
  596. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_rules_route_actions_3de01bd5.js +3 -0
  597. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_subgraph_route_actions_d8b5a63f.js +3 -0
  598. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_trace_route_actions_b0703ae2.js +3 -0
  599. package/web/.next/standalone/web/.next/server/next-font-manifest.js +1 -1
  600. package/web/.next/standalone/web/.next/server/next-font-manifest.json +4 -4
  601. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  602. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  603. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  604. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  605. package/web/.next/standalone/web/.next/static/chunks/22a09ecf6ba35cfd.js +17 -0
  606. package/web/.next/standalone/web/.next/static/chunks/9857ba86ce4e82d8.css +2 -0
  607. package/web/.next/standalone/web/.next/static/chunks/f899547f99ef4b76.css +1 -0
  608. package/web/.next/standalone/web/.next/static/media/4fa387ec64143e14-s.c36e1862.woff2 +0 -0
  609. package/web/.next/standalone/web/.next/static/media/53b9e256198e5412-s.853d50a3.woff2 +0 -0
  610. package/web/.next/standalone/web/.next/static/media/5ce348bf30bf5439-s.ebceb24d.woff2 +0 -0
  611. package/web/.next/standalone/web/.next/static/media/6306c77e7c8268e4-s.ff4a2084.woff2 +0 -0
  612. package/web/.next/standalone/web/.next/static/media/7178b3e590c64307-s.55554cd0.woff2 +0 -0
  613. package/web/.next/standalone/web/.next/static/media/797e433ab948586e-s.p.479bea2b.woff2 +0 -0
  614. package/web/.next/standalone/web/.next/static/media/7d817b4c03b0c5f1-s.f377b9c4.woff2 +0 -0
  615. package/web/.next/standalone/web/.next/static/media/8a480f0b521d4e75-s.ea323500.woff2 +0 -0
  616. package/web/.next/standalone/web/.next/static/media/bbc41e54d2fcbd21-s.d1207556.woff2 +0 -0
  617. package/web/.next/standalone/web/.next/static/media/caa3a2e1cccd8315-s.p.3b6cae6d.woff2 +0 -0
  618. package/web/.next/standalone/web/.next/static/media/fef07dbb0973bf53-s.518e079e.woff2 +0 -0
  619. package/web/.next/standalone/web/app/api/components/route.ts +1 -1
  620. package/web/.next/standalone/web/app/api/connections/route.ts +3 -1
  621. package/web/.next/standalone/web/app/api/graph/route.ts +3 -3
  622. package/web/.next/standalone/web/app/api/projects/route.ts +1 -1
  623. package/web/.next/standalone/web/app/api/prompts/route.ts +2 -2
  624. package/web/.next/standalone/web/app/api/rules/route.ts +213 -0
  625. package/web/.next/standalone/web/app/api/settings/route.ts +2 -2
  626. package/web/.next/standalone/web/app/api/status/route.ts +1 -1
  627. package/web/.next/standalone/web/app/api/subgraph/route.ts +267 -0
  628. package/web/.next/standalone/web/app/api/trace/route.ts +321 -0
  629. package/web/.next/standalone/web/app/page.tsx +9 -1
  630. package/web/.next/standalone/web/components/connections-panel.tsx +23 -6
  631. package/web/.next/standalone/web/components/coverage-panel.tsx +309 -0
  632. package/web/.next/standalone/web/components/rules-panel.tsx +156 -0
  633. package/web/.next/standalone/web/components/sidebar.tsx +8 -0
  634. package/web/.next/standalone/web/components/status-overview.tsx +24 -1
  635. package/web/.next/standalone/web/components/subgraph-panel.tsx +382 -0
  636. package/web/.next/standalone/web/components/trace-panel.tsx +325 -0
  637. package/web/.next/standalone/web/lib/hooks/index.ts +3 -0
  638. package/web/.next/standalone/web/lib/hooks/use-coverage.ts +68 -0
  639. package/web/.next/standalone/web/lib/hooks/use-subgraph.ts +85 -0
  640. package/web/.next/standalone/web/lib/hooks/use-trace.ts +84 -0
  641. package/web/.next/standalone/web/lib/types.ts +108 -0
  642. package/web/.next/standalone/web/package-lock.json +218 -0
  643. package/web/.next/standalone/web/package.json +4 -2
  644. package/web/.next/standalone/web/server.js +1 -1
  645. package/web/.next/static/chunks/22a09ecf6ba35cfd.js +17 -0
  646. package/web/.next/static/chunks/9857ba86ce4e82d8.css +2 -0
  647. package/web/.next/static/chunks/f899547f99ef4b76.css +1 -0
  648. package/web/.next/static/media/4fa387ec64143e14-s.c36e1862.woff2 +0 -0
  649. package/web/.next/static/media/53b9e256198e5412-s.853d50a3.woff2 +0 -0
  650. package/web/.next/static/media/5ce348bf30bf5439-s.ebceb24d.woff2 +0 -0
  651. package/web/.next/static/media/6306c77e7c8268e4-s.ff4a2084.woff2 +0 -0
  652. package/web/.next/static/media/7178b3e590c64307-s.55554cd0.woff2 +0 -0
  653. package/web/.next/static/media/797e433ab948586e-s.p.479bea2b.woff2 +0 -0
  654. package/web/.next/static/media/7d817b4c03b0c5f1-s.f377b9c4.woff2 +0 -0
  655. package/web/.next/static/media/8a480f0b521d4e75-s.ea323500.woff2 +0 -0
  656. package/web/.next/static/media/bbc41e54d2fcbd21-s.d1207556.woff2 +0 -0
  657. package/web/.next/static/media/caa3a2e1cccd8315-s.p.3b6cae6d.woff2 +0 -0
  658. package/web/.next/static/media/fef07dbb0973bf53-s.518e079e.woff2 +0 -0
  659. package/skills/check/SKILL.md +0 -64
  660. package/skills/connections/SKILL.md +0 -54
  661. package/skills/diagram/SKILL.md +0 -64
  662. package/skills/export/SKILL.md +0 -49
  663. package/skills/impact/SKILL.md +0 -58
  664. package/skills/install/SKILL.md +0 -94
  665. package/skills/scan/SKILL.md +0 -75
  666. package/skills/status/SKILL.md +0 -37
  667. package/skills/ui/SKILL.md +0 -43
  668. package/skills/update/SKILL.md +0 -43
  669. package/web/.next/standalone/web/.next/static/chunks/8a80e7184ad3a13f.css +0 -2
  670. package/web/.next/standalone/web/.next/static/chunks/c056475f5f4424b6.css +0 -1
  671. package/web/.next/standalone/web/.next/static/chunks/cb3513192b63e480.js +0 -12
  672. package/web/.next/standalone/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  673. package/web/.next/standalone/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  674. package/web/.next/standalone/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  675. package/web/.next/standalone/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  676. package/web/.next/standalone/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  677. package/web/.next/standalone/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  678. package/web/.next/static/chunks/8a80e7184ad3a13f.css +0 -2
  679. package/web/.next/static/chunks/c056475f5f4424b6.css +0 -1
  680. package/web/.next/static/chunks/cb3513192b63e480.js +0 -12
  681. package/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  682. package/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  683. package/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  684. package/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  685. package/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  686. package/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  687. /package/web/.next/standalone/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_buildManifest.js +0 -0
  688. /package/web/.next/standalone/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_clientMiddlewareManifest.json +0 -0
  689. /package/web/.next/standalone/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_ssgManifest.js +0 -0
  690. /package/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_buildManifest.js +0 -0
  691. /package/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_clientMiddlewareManifest.json +0 -0
  692. /package/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_ssgManifest.js +0 -0
@@ -0,0 +1,744 @@
1
+ /**
2
+ * NavGator MCP Tool Definitions
3
+ *
4
+ * Each tool maps to existing NavGator programmatic APIs.
5
+ * Responses are formatted as concise text for LLM consumption.
6
+ */
7
+ import { scan, getScanStatus, autoRefreshIfStale } from "../scanner.js";
8
+ import { loadAllComponents, loadAllConnections, loadIndex, loadGraph, } from "../storage.js";
9
+ import { computeImpact } from "../impact.js";
10
+ import { resolveComponent, findCandidates } from "../resolve.js";
11
+ import { traceDataflow, formatTraceOutput } from "../trace.js";
12
+ import { generateComponentDiagram, generateLayerDiagram, generateSummaryDiagram, } from "../diagram.js";
13
+ import { buildExecutiveSummary } from "../agent-output.js";
14
+ import { checkRules } from "../rules.js";
15
+ import { deduplicateLLMUseCases } from "../llm-dedup.js";
16
+ import { getConfig, getPromptsPath } from "../config.js";
17
+ import { getGitInfo } from "../git.js";
18
+ import * as fs from "fs";
19
+ import * as path from "path";
20
+ // --- Response helpers ---
21
+ function textResponse(text) {
22
+ return { content: [{ type: "text", text }] };
23
+ }
24
+ function errorResponse(text) {
25
+ return { content: [{ type: "text", text }], isError: true };
26
+ }
27
+ // --- Tool definitions ---
28
+ export const TOOLS = [
29
+ {
30
+ name: "scan",
31
+ description: "Scan project architecture — detect components (packages, services, databases) and connections between them. Use after adding dependencies, changing API routes, or modifying database schemas. Returns a summary of what was found and what changed since last scan.",
32
+ inputSchema: {
33
+ type: "object",
34
+ properties: {
35
+ quick: {
36
+ type: "boolean",
37
+ description: "Quick scan (packages only, skip code analysis). Faster but less thorough.",
38
+ },
39
+ },
40
+ },
41
+ annotations: {
42
+ title: "Scan Architecture",
43
+ readOnlyHint: false,
44
+ destructiveHint: false,
45
+ idempotentHint: true,
46
+ openWorldHint: false,
47
+ },
48
+ },
49
+ {
50
+ name: "status",
51
+ description: "Architecture summary — component counts by type/layer, connection counts, data freshness, and health overview. Use to get a quick picture of the project's architecture without running a new scan.",
52
+ inputSchema: {
53
+ type: "object",
54
+ properties: {},
55
+ },
56
+ annotations: {
57
+ title: "Architecture Status",
58
+ readOnlyHint: true,
59
+ destructiveHint: false,
60
+ idempotentHint: true,
61
+ openWorldHint: false,
62
+ },
63
+ },
64
+ {
65
+ name: "impact",
66
+ description: "What breaks if you change this component? Shows downstream dependencies, affected files, and severity assessment. Use before modifying critical components like database tables, API endpoints, or shared services.",
67
+ inputSchema: {
68
+ type: "object",
69
+ properties: {
70
+ component: {
71
+ type: "string",
72
+ description: "Component name, file path, or partial match (e.g. 'prisma', 'stripe', 'api/users')",
73
+ },
74
+ },
75
+ required: ["component"],
76
+ },
77
+ annotations: {
78
+ title: "Impact Analysis",
79
+ readOnlyHint: true,
80
+ destructiveHint: false,
81
+ idempotentHint: true,
82
+ openWorldHint: false,
83
+ },
84
+ },
85
+ {
86
+ name: "connections",
87
+ description: "All connections for a component — incoming (what depends on it) and outgoing (what it depends on). Shows connection types, file locations, and semantic classification.",
88
+ inputSchema: {
89
+ type: "object",
90
+ properties: {
91
+ component: {
92
+ type: "string",
93
+ description: "Component name, file path, or partial match",
94
+ },
95
+ direction: {
96
+ type: "string",
97
+ enum: ["in", "out", "both"],
98
+ description: "Filter direction: 'in' (dependents), 'out' (dependencies), 'both' (default)",
99
+ },
100
+ },
101
+ required: ["component"],
102
+ },
103
+ annotations: {
104
+ title: "Component Connections",
105
+ readOnlyHint: true,
106
+ destructiveHint: false,
107
+ idempotentHint: true,
108
+ openWorldHint: false,
109
+ },
110
+ },
111
+ {
112
+ name: "diagram",
113
+ description: "Generate a Mermaid architecture diagram. Modes: 'summary' (high-level overview), 'focus' (single component and its connections), 'layer' (grouped by architectural layer — specify which layer: frontend, backend, database, queue, infra, external).",
114
+ inputSchema: {
115
+ type: "object",
116
+ properties: {
117
+ mode: {
118
+ type: "string",
119
+ enum: ["summary", "focus", "layer"],
120
+ description: "Diagram mode (default: 'summary')",
121
+ },
122
+ focus: {
123
+ type: "string",
124
+ description: "Component name for 'focus' mode, or layer name for 'layer' mode (e.g. 'frontend', 'backend')",
125
+ },
126
+ },
127
+ },
128
+ annotations: {
129
+ title: "Architecture Diagram",
130
+ readOnlyHint: true,
131
+ destructiveHint: false,
132
+ idempotentHint: true,
133
+ openWorldHint: false,
134
+ },
135
+ },
136
+ {
137
+ name: "trace",
138
+ description: "Trace dataflow paths through the architecture — follow how data moves from one component to others. Shows the chain of connections and which layers are crossed.",
139
+ inputSchema: {
140
+ type: "object",
141
+ properties: {
142
+ component: {
143
+ type: "string",
144
+ description: "Starting component for the trace",
145
+ },
146
+ direction: {
147
+ type: "string",
148
+ enum: ["forward", "backward", "both"],
149
+ description: "Trace direction: 'forward' (downstream), 'backward' (upstream), 'both' (default)",
150
+ },
151
+ },
152
+ required: ["component"],
153
+ },
154
+ annotations: {
155
+ title: "Dataflow Trace",
156
+ readOnlyHint: true,
157
+ destructiveHint: false,
158
+ idempotentHint: true,
159
+ openWorldHint: false,
160
+ },
161
+ },
162
+ {
163
+ name: "summary",
164
+ description: "Executive summary with risks, blockers, and recommended next actions. Provides a high-level assessment of architecture health and areas needing attention.",
165
+ inputSchema: {
166
+ type: "object",
167
+ properties: {},
168
+ },
169
+ annotations: {
170
+ title: "Executive Summary",
171
+ readOnlyHint: true,
172
+ destructiveHint: false,
173
+ idempotentHint: true,
174
+ openWorldHint: false,
175
+ },
176
+ },
177
+ {
178
+ name: "review",
179
+ description: "Composite architectural review — runs impact analysis, architecture rules, and runtime topology checks in a single call. Returns a compact, severity-scored report. Use before merging or after significant changes.",
180
+ inputSchema: {
181
+ type: "object",
182
+ properties: {
183
+ component: {
184
+ type: "string",
185
+ description: "Optional: focus review on a specific component",
186
+ },
187
+ },
188
+ },
189
+ annotations: {
190
+ title: "Architecture Review",
191
+ readOnlyHint: true,
192
+ destructiveHint: false,
193
+ idempotentHint: true,
194
+ openWorldHint: false,
195
+ },
196
+ },
197
+ {
198
+ name: "explore",
199
+ description: "Deep dive into one component — shows its connections, runtime identity, impact severity, trace paths, and layer position in a single response. Use when you need to understand a component before modifying it.",
200
+ inputSchema: {
201
+ type: "object",
202
+ properties: {
203
+ component: {
204
+ type: "string",
205
+ description: "Component name, file path, or partial match",
206
+ },
207
+ depth: {
208
+ type: "number",
209
+ description: "How many hops to include (default: 2)",
210
+ },
211
+ },
212
+ required: ["component"],
213
+ },
214
+ annotations: {
215
+ title: "Explore Component",
216
+ readOnlyHint: true,
217
+ destructiveHint: false,
218
+ idempotentHint: true,
219
+ openWorldHint: false,
220
+ },
221
+ },
222
+ {
223
+ name: "rules",
224
+ description: "Check architecture against built-in rules — detects orphan components, layer violations, circular dependencies, hotspots, high fan-out, and more. Returns violations with severity and suggestions.",
225
+ inputSchema: {
226
+ type: "object",
227
+ properties: {},
228
+ },
229
+ annotations: {
230
+ title: "Architecture Rules",
231
+ readOnlyHint: true,
232
+ destructiveHint: false,
233
+ idempotentHint: true,
234
+ openWorldHint: false,
235
+ },
236
+ },
237
+ ];
238
+ // --- Tool handlers ---
239
+ function getProjectRoot() {
240
+ return process.cwd();
241
+ }
242
+ export async function handleToolCall(name, args) {
243
+ try {
244
+ switch (name) {
245
+ case "scan":
246
+ return await handleScan(args);
247
+ case "status":
248
+ return await handleStatus();
249
+ case "impact":
250
+ return await handleImpact(args);
251
+ case "connections":
252
+ return await handleConnections(args);
253
+ case "diagram":
254
+ return await handleDiagram(args);
255
+ case "trace":
256
+ return await handleTrace(args);
257
+ case "summary":
258
+ return await handleSummary();
259
+ case "review":
260
+ return await handleReview(args);
261
+ case "explore":
262
+ return await handleExplore(args);
263
+ case "rules":
264
+ return await handleRules();
265
+ default:
266
+ return errorResponse(`Unknown tool: ${name}`);
267
+ }
268
+ }
269
+ catch (err) {
270
+ return errorResponse(err instanceof Error ? err.message : "Tool execution failed");
271
+ }
272
+ }
273
+ async function handleScan(args) {
274
+ const projectRoot = getProjectRoot();
275
+ const quick = args.quick === true;
276
+ const result = await scan(projectRoot, {
277
+ quick,
278
+ incremental: !quick,
279
+ });
280
+ const lines = [
281
+ `Scan complete: ${result.stats.components_found} components, ${result.stats.connections_found} connections`,
282
+ `Duration: ${result.stats.scan_duration_ms}ms`,
283
+ `Files scanned: ${result.stats.files_scanned}`,
284
+ ];
285
+ if (result.stats.files_changed > 0) {
286
+ lines.push(`Files changed since last scan: ${result.stats.files_changed}`);
287
+ }
288
+ if (result.warnings.length > 0) {
289
+ lines.push(`\nWarnings (${result.warnings.length}):`);
290
+ for (const w of result.warnings.slice(0, 5)) {
291
+ lines.push(`- ${w.message}`);
292
+ }
293
+ if (result.warnings.length > 5) {
294
+ lines.push(` ... and ${result.warnings.length - 5} more`);
295
+ }
296
+ }
297
+ // Component breakdown by type
298
+ const byType = {};
299
+ for (const c of result.components) {
300
+ byType[c.type] = (byType[c.type] || 0) + 1;
301
+ }
302
+ const typeBreakdown = Object.entries(byType)
303
+ .sort(([, a], [, b]) => b - a)
304
+ .map(([type, count]) => `${type}: ${count}`)
305
+ .join(", ");
306
+ lines.push(`\nBy type: ${typeBreakdown}`);
307
+ // Connection breakdown
308
+ const connByType = {};
309
+ for (const c of result.connections) {
310
+ connByType[c.connection_type] = (connByType[c.connection_type] || 0) + 1;
311
+ }
312
+ if (Object.keys(connByType).length > 0) {
313
+ const connBreakdown = Object.entries(connByType)
314
+ .sort(([, a], [, b]) => b - a)
315
+ .slice(0, 8)
316
+ .map(([type, count]) => `${type}: ${count}`)
317
+ .join(", ");
318
+ lines.push(`Connections: ${connBreakdown}`);
319
+ }
320
+ return textResponse(lines.join("\n"));
321
+ }
322
+ async function handleStatus() {
323
+ const projectRoot = getProjectRoot();
324
+ // R6 auto-refresh: cheapest read entrypoint — kick an incremental scan
325
+ // when the index is stale so callers never operate on a graph that is
326
+ // hours/days behind reality. Best-effort: failures don't block status.
327
+ const refresh = await autoRefreshIfStale(projectRoot);
328
+ const status = await getScanStatus(projectRoot);
329
+ if (!status.initialized) {
330
+ return textResponse("No architecture data found. Run the scan tool first to map the project.");
331
+ }
332
+ const config = getConfig();
333
+ const index = await loadIndex(config, projectRoot);
334
+ const staleness = status.needs_rescan ? "stale" : "fresh";
335
+ const lastScanStr = status.last_scan
336
+ ? new Date(status.last_scan).toISOString()
337
+ : "unknown";
338
+ const lines = [];
339
+ if (refresh.refreshed) {
340
+ lines.push(refresh.message);
341
+ }
342
+ lines.push(`Architecture data: ${staleness}`, `Last scan: ${lastScanStr}`, `Components: ${status.component_count}`, `Connections: ${status.connection_count}`);
343
+ if (index) {
344
+ if (index.stats.components_by_type) {
345
+ const types = Object.entries(index.stats.components_by_type)
346
+ .sort(([, a], [, b]) => b - a)
347
+ .map(([type, count]) => `${type}: ${count}`)
348
+ .join(", ");
349
+ lines.push(`\nBy type: ${types}`);
350
+ }
351
+ if (index.stats.outdated_count > 0) {
352
+ lines.push(`Outdated packages: ${index.stats.outdated_count}`);
353
+ }
354
+ if (index.stats.vulnerable_count > 0) {
355
+ lines.push(`Vulnerable packages: ${index.stats.vulnerable_count}`);
356
+ }
357
+ }
358
+ return textResponse(lines.join("\n"));
359
+ }
360
+ async function handleImpact(args) {
361
+ const query = String(args.component);
362
+ const projectRoot = getProjectRoot();
363
+ const config = getConfig();
364
+ const components = await loadAllComponents(config, projectRoot);
365
+ const connections = await loadAllConnections(config, projectRoot);
366
+ if (components.length === 0) {
367
+ return errorResponse("No architecture data. Run the scan tool first.");
368
+ }
369
+ const component = resolveComponent(query, components);
370
+ if (!component) {
371
+ const candidates = findCandidates(query, components, 5);
372
+ if (candidates.length > 0) {
373
+ return errorResponse(`Component "${query}" not found. Did you mean:\n${candidates.map((c) => `- ${c}`).join("\n")}`);
374
+ }
375
+ return errorResponse(`Component "${query}" not found.`);
376
+ }
377
+ const impact = computeImpact(component, components, connections);
378
+ const lines = [
379
+ `Impact analysis for: ${component.name} (${component.type})`,
380
+ `Severity: ${impact.severity.toUpperCase()}`,
381
+ `${impact.summary}`,
382
+ `Total files affected: ${impact.total_files_affected}`,
383
+ ];
384
+ if (impact.affected.length > 0) {
385
+ lines.push(`\nAffected components (${impact.affected.length}):`);
386
+ for (const a of impact.affected.slice(0, 10)) {
387
+ lines.push(`- ${a.component.name} (${a.component.type}) — ${a.change_required}`);
388
+ }
389
+ if (impact.affected.length > 10) {
390
+ lines.push(` ... and ${impact.affected.length - 10} more`);
391
+ }
392
+ }
393
+ return textResponse(lines.join("\n"));
394
+ }
395
+ async function handleConnections(args) {
396
+ const query = String(args.component);
397
+ const direction = args.direction || "both";
398
+ const projectRoot = getProjectRoot();
399
+ const config = getConfig();
400
+ const components = await loadAllComponents(config, projectRoot);
401
+ const connections = await loadAllConnections(config, projectRoot);
402
+ if (components.length === 0) {
403
+ return errorResponse("No architecture data. Run the scan tool first.");
404
+ }
405
+ const component = resolveComponent(query, components);
406
+ if (!component) {
407
+ const candidates = findCandidates(query, components, 5);
408
+ if (candidates.length > 0) {
409
+ return errorResponse(`Component "${query}" not found. Did you mean:\n${candidates.map((c) => `- ${c}`).join("\n")}`);
410
+ }
411
+ return errorResponse(`Component "${query}" not found.`);
412
+ }
413
+ const outgoing = direction === "in"
414
+ ? []
415
+ : connections.filter((c) => c.from.component_id === component.component_id);
416
+ const incoming = direction === "out"
417
+ ? []
418
+ : connections.filter((c) => c.to.component_id === component.component_id);
419
+ const lines = [
420
+ `Connections for: ${component.name} (${component.type}, ${component.role.layer})`,
421
+ ];
422
+ if (outgoing.length > 0) {
423
+ lines.push(`\nOutgoing (${outgoing.length} — what this depends on):`);
424
+ for (const c of outgoing.slice(0, 15)) {
425
+ const target = components.find((comp) => comp.component_id === c.to.component_id);
426
+ const targetName = target ? target.name : c.to.component_id;
427
+ const semantic = c.semantic
428
+ ? ` [${c.semantic.classification}]`
429
+ : "";
430
+ const fileRef = c.code_reference?.file
431
+ ? `${path.basename(c.code_reference.file)}:${c.code_reference.line_start ?? c.code_reference.symbol ?? "?"}`
432
+ : "";
433
+ lines.push(`- ${targetName} (${c.connection_type})${semantic}${fileRef ? ` -- ${fileRef}` : ""}`);
434
+ }
435
+ if (outgoing.length > 15) {
436
+ lines.push(` ... and ${outgoing.length - 15} more`);
437
+ }
438
+ }
439
+ if (incoming.length > 0) {
440
+ lines.push(`\nIncoming (${incoming.length} — what depends on this):`);
441
+ for (const c of incoming.slice(0, 15)) {
442
+ const source = components.find((comp) => comp.component_id === c.from.component_id);
443
+ const sourceName = source ? source.name : c.from.component_id;
444
+ const semantic = c.semantic
445
+ ? ` [${c.semantic.classification}]`
446
+ : "";
447
+ const fileRef = c.code_reference?.file
448
+ ? `${path.basename(c.code_reference.file)}:${c.code_reference.line_start ?? c.code_reference.symbol ?? "?"}`
449
+ : "";
450
+ lines.push(`- ${sourceName} (${c.connection_type})${semantic}${fileRef ? ` -- ${fileRef}` : ""}`);
451
+ }
452
+ if (incoming.length > 15) {
453
+ lines.push(` ... and ${incoming.length - 15} more`);
454
+ }
455
+ }
456
+ if (outgoing.length === 0 && incoming.length === 0) {
457
+ lines.push("\nNo connections found (orphaned component).");
458
+ }
459
+ return textResponse(lines.join("\n"));
460
+ }
461
+ async function handleDiagram(args) {
462
+ const mode = args.mode || "summary";
463
+ const focus = args.focus;
464
+ const projectRoot = getProjectRoot();
465
+ const config = getConfig();
466
+ const graph = await loadGraph(config, projectRoot);
467
+ if (!graph) {
468
+ return errorResponse("No graph data. Run the scan tool first.");
469
+ }
470
+ if (mode === "focus") {
471
+ if (!focus) {
472
+ return errorResponse("The 'focus' parameter is required when mode is 'focus'.");
473
+ }
474
+ const components = await loadAllComponents(config, projectRoot);
475
+ const component = resolveComponent(focus, components);
476
+ if (!component) {
477
+ const candidates = findCandidates(focus, components, 5);
478
+ if (candidates.length > 0) {
479
+ return errorResponse(`Component "${focus}" not found. Did you mean:\n${candidates.map((c) => `- ${c}`).join("\n")}`);
480
+ }
481
+ return errorResponse(`Component "${focus}" not found.`);
482
+ }
483
+ const diagram = generateComponentDiagram(graph, component.component_id);
484
+ return textResponse(`Architecture diagram (focus: ${component.name}):\n\n\`\`\`mermaid\n${diagram}\n\`\`\``);
485
+ }
486
+ if (mode === "layer") {
487
+ const layer = (focus || "backend");
488
+ const diagram = generateLayerDiagram(graph, layer);
489
+ return textResponse(`Architecture diagram (${layer} layer):\n\n\`\`\`mermaid\n${diagram}\n\`\`\``);
490
+ }
491
+ // Default: summary
492
+ const diagram = generateSummaryDiagram(graph);
493
+ return textResponse(`Architecture diagram (summary):\n\n\`\`\`mermaid\n${diagram}\n\`\`\``);
494
+ }
495
+ async function handleTrace(args) {
496
+ const query = String(args.component);
497
+ const direction = args.direction || "both";
498
+ const projectRoot = getProjectRoot();
499
+ const config = getConfig();
500
+ const components = await loadAllComponents(config, projectRoot);
501
+ const connections = await loadAllConnections(config, projectRoot);
502
+ if (components.length === 0) {
503
+ return errorResponse("No architecture data. Run the scan tool first.");
504
+ }
505
+ const component = resolveComponent(query, components);
506
+ if (!component) {
507
+ const candidates = findCandidates(query, components, 5);
508
+ if (candidates.length > 0) {
509
+ return errorResponse(`Component "${query}" not found. Did you mean:\n${candidates.map((c) => `- ${c}`).join("\n")}`);
510
+ }
511
+ return errorResponse(`Component "${query}" not found.`);
512
+ }
513
+ const result = traceDataflow(component, components, connections, {
514
+ direction,
515
+ });
516
+ return textResponse(formatTraceOutput(result));
517
+ }
518
+ async function handleSummary() {
519
+ const projectRoot = getProjectRoot();
520
+ const config = getConfig();
521
+ const components = await loadAllComponents(config, projectRoot);
522
+ const connections = await loadAllConnections(config, projectRoot);
523
+ if (components.length === 0) {
524
+ return textResponse("No architecture data found. Run the scan tool first to map the project.");
525
+ }
526
+ const git = await getGitInfo(projectRoot);
527
+ const summary = buildExecutiveSummary(components, connections, projectRoot, git || undefined);
528
+ const projectName = projectRoot.split("/").pop() || projectRoot;
529
+ const lines = [
530
+ `Executive Summary — ${projectName}`,
531
+ `Components: ${summary.stats.total_components} | Connections: ${summary.stats.total_connections}`,
532
+ ];
533
+ if (summary.risks.length > 0) {
534
+ lines.push(`\nRisks (${summary.risks.length}):`);
535
+ for (const r of summary.risks.slice(0, 10)) {
536
+ lines.push(`[${r.severity.toUpperCase()}] ${r.message}`);
537
+ }
538
+ if (summary.risks.length > 10) {
539
+ lines.push(` ... and ${summary.risks.length - 10} more`);
540
+ }
541
+ }
542
+ if (summary.blockers.length > 0) {
543
+ lines.push(`\nBlockers (${summary.blockers.length}):`);
544
+ for (const b of summary.blockers) {
545
+ lines.push(`- ${b.message}`);
546
+ }
547
+ }
548
+ if (summary.next_actions.length > 0) {
549
+ lines.push(`\nRecommended actions:`);
550
+ for (const a of summary.next_actions) {
551
+ lines.push(`- ${a.action}${a.reason ? ` — ${a.reason}` : ""}`);
552
+ }
553
+ }
554
+ return textResponse(lines.join("\n"));
555
+ }
556
+ async function handleReview(args) {
557
+ const projectRoot = getProjectRoot();
558
+ const config = getConfig();
559
+ const components = await loadAllComponents(config, projectRoot);
560
+ const connections = await loadAllConnections(config, projectRoot);
561
+ if (components.length === 0) {
562
+ return errorResponse("No architecture data. Run the scan tool first.");
563
+ }
564
+ const lines = ["ARCHITECTURE REVIEW"];
565
+ // 1. Rules check — grouped by severity, capped at 5 per group
566
+ const violations = checkRules(components, connections);
567
+ if (violations.length > 0) {
568
+ lines.push(`\nRule violations (${violations.length}):`);
569
+ const bySev = {};
570
+ for (const v of violations) {
571
+ if (!bySev[v.severity])
572
+ bySev[v.severity] = [];
573
+ bySev[v.severity].push(v);
574
+ }
575
+ for (const sev of ["error", "warning", "info"]) {
576
+ const group = bySev[sev];
577
+ if (!group || group.length === 0)
578
+ continue;
579
+ lines.push(`\n${sev.toUpperCase()} (${group.length}):`);
580
+ for (const v of group.slice(0, 5)) {
581
+ lines.push(`[${v.severity.toUpperCase()}] ${v.message}`);
582
+ if (v.suggestion)
583
+ lines.push(` -> ${v.suggestion}`);
584
+ }
585
+ if (group.length > 5) {
586
+ lines.push(` ... and ${group.length - 5} more ${sev} violations`);
587
+ }
588
+ }
589
+ }
590
+ else {
591
+ lines.push("\nRules: all passed");
592
+ }
593
+ // 2. Focused impact (if component specified)
594
+ const focusQuery = args.component;
595
+ if (focusQuery) {
596
+ const component = resolveComponent(focusQuery, components);
597
+ if (component) {
598
+ const impact = computeImpact(component, components, connections);
599
+ lines.push(`\nImpact for ${component.name}: ${impact.severity.toUpperCase()}`);
600
+ lines.push(impact.summary);
601
+ if (impact.affected.length > 0) {
602
+ lines.push(`Affected: ${impact.affected.slice(0, 5).map(a => a.component.name).join(", ")}${impact.affected.length > 5 ? ` +${impact.affected.length - 5} more` : ""}`);
603
+ }
604
+ }
605
+ }
606
+ // 3. Runtime topology summary
607
+ const withRuntime = components.filter(c => c.runtime?.resource_type);
608
+ if (withRuntime.length > 0) {
609
+ const rtGroups = {};
610
+ for (const c of withRuntime) {
611
+ const rt = c.runtime.resource_type;
612
+ rtGroups[rt] = (rtGroups[rt] || 0) + 1;
613
+ }
614
+ const rtSummary = Object.entries(rtGroups).map(([t, n]) => `${t}: ${n}`).join(", ");
615
+ lines.push(`\nRuntime topology: ${rtSummary}`);
616
+ }
617
+ // 4. LLM use case summary
618
+ try {
619
+ let prompts;
620
+ try {
621
+ const promptsPath = getPromptsPath(config, projectRoot);
622
+ const raw = await fs.promises.readFile(promptsPath, "utf-8");
623
+ prompts = JSON.parse(raw)?.prompts;
624
+ }
625
+ catch { /* no prompts */ }
626
+ const dedup = deduplicateLLMUseCases(components, connections, prompts);
627
+ if (dedup.useCases.length > 0) {
628
+ lines.push(`\nAI/LLM: ${dedup.useCases.length} use cases across ${dedup.providers.length} providers`);
629
+ }
630
+ }
631
+ catch { /* dedup not available */ }
632
+ return textResponse(lines.join("\n"));
633
+ }
634
+ async function handleExplore(args) {
635
+ const query = String(args.component);
636
+ const depth = typeof args.depth === "number" ? args.depth : 2;
637
+ const projectRoot = getProjectRoot();
638
+ const config = getConfig();
639
+ const components = await loadAllComponents(config, projectRoot);
640
+ const connections = await loadAllConnections(config, projectRoot);
641
+ if (components.length === 0) {
642
+ return errorResponse("No architecture data. Run the scan tool first.");
643
+ }
644
+ const component = resolveComponent(query, components);
645
+ if (!component) {
646
+ const candidates = findCandidates(query, components, 5);
647
+ if (candidates.length > 0) {
648
+ return errorResponse(`Component "${query}" not found. Did you mean:\n${candidates.map(c => `- ${c}`).join("\n")}`);
649
+ }
650
+ return errorResponse(`Component "${query}" not found.`);
651
+ }
652
+ const lines = [
653
+ `COMPONENT: ${component.name}`,
654
+ `Type: ${component.type} | Layer: ${component.role.layer} | Status: ${component.status}`,
655
+ `Purpose: ${component.role.purpose}`,
656
+ ];
657
+ // Runtime identity
658
+ if (component.runtime) {
659
+ const r = component.runtime;
660
+ const parts = [];
661
+ if (r.engine)
662
+ parts.push(`engine: ${r.engine}`);
663
+ if (r.service_name)
664
+ parts.push(`service: ${r.service_name}`);
665
+ if (r.platform)
666
+ parts.push(`platform: ${r.platform}`);
667
+ if (r.endpoint?.host)
668
+ parts.push(`host: ${r.endpoint.host}${r.endpoint.port ? `:${r.endpoint.port}` : ""}`);
669
+ if (r.connection_env_var)
670
+ parts.push(`env: ${r.connection_env_var}`);
671
+ if (parts.length > 0) {
672
+ lines.push(`Runtime: ${parts.join(", ")}`);
673
+ }
674
+ }
675
+ // Impact
676
+ const impact = computeImpact(component, components, connections);
677
+ lines.push(`\nImpact severity: ${impact.severity.toUpperCase()} (${impact.total_files_affected} files)`);
678
+ // Connections
679
+ const outgoing = connections.filter(c => c.from.component_id === component.component_id);
680
+ const incoming = connections.filter(c => c.to.component_id === component.component_id);
681
+ if (outgoing.length > 0) {
682
+ lines.push(`\nDepends on (${outgoing.length}):`);
683
+ for (const c of outgoing.slice(0, 10)) {
684
+ const target = components.find(comp => comp.component_id === c.to.component_id);
685
+ lines.push(` → ${target?.name || c.to.component_id} (${c.connection_type})`);
686
+ }
687
+ if (outgoing.length > 10)
688
+ lines.push(` ... +${outgoing.length - 10} more`);
689
+ }
690
+ if (incoming.length > 0) {
691
+ lines.push(`\nDepended on by (${incoming.length}):`);
692
+ for (const c of incoming.slice(0, 10)) {
693
+ const source = components.find(comp => comp.component_id === c.from.component_id);
694
+ lines.push(` ← ${source?.name || c.from.component_id} (${c.connection_type})`);
695
+ }
696
+ if (incoming.length > 10)
697
+ lines.push(` ... +${incoming.length - 10} more`);
698
+ }
699
+ // Trace
700
+ const trace = traceDataflow(component, components, connections, { direction: "both", maxDepth: depth });
701
+ if (trace.paths.length > 0) {
702
+ lines.push(`\nData flow paths (${trace.paths.length}, layers: ${trace.layers_crossed.join(" → ")}):`);
703
+ for (const p of trace.paths.slice(0, 5)) {
704
+ const chain = p.steps.map(s => s.component.n).join(" → ");
705
+ lines.push(` ${chain}`);
706
+ }
707
+ if (trace.paths.length > 5)
708
+ lines.push(` ... +${trace.paths.length - 5} more paths`);
709
+ }
710
+ return textResponse(lines.join("\n"));
711
+ }
712
+ async function handleRules() {
713
+ const projectRoot = getProjectRoot();
714
+ const config = getConfig();
715
+ const components = await loadAllComponents(config, projectRoot);
716
+ const connections = await loadAllConnections(config, projectRoot);
717
+ if (components.length === 0) {
718
+ return textResponse("No architecture data. Run the scan tool first.");
719
+ }
720
+ const violations = checkRules(components, connections);
721
+ if (violations.length === 0) {
722
+ return textResponse("All architecture rules passed. No violations detected.");
723
+ }
724
+ const byLevel = {};
725
+ for (const v of violations) {
726
+ if (!byLevel[v.severity])
727
+ byLevel[v.severity] = [];
728
+ byLevel[v.severity].push(v);
729
+ }
730
+ const lines = [`Architecture rule violations (${violations.length}):`];
731
+ for (const level of ["error", "warning", "info"]) {
732
+ const group = byLevel[level];
733
+ if (!group)
734
+ continue;
735
+ lines.push(`\n${level.toUpperCase()} (${group.length}):`);
736
+ for (const v of group.slice(0, 10)) {
737
+ lines.push(`- ${v.message}${v.suggestion ? ` → ${v.suggestion}` : ""}`);
738
+ }
739
+ if (group.length > 10)
740
+ lines.push(` ... +${group.length - 10} more`);
741
+ }
742
+ return textResponse(lines.join("\n"));
743
+ }
744
+ //# sourceMappingURL=tools.js.map