@tyroneross/navgator 0.2.1 → 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 (690) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +37 -0
  3. package/.claude-plugin/plugin.json +12 -4
  4. package/.codex-plugin/plugin.json +31 -0
  5. package/.mcp.json +8 -0
  6. package/CLAUDE.md +246 -0
  7. package/LICENSE +202 -21
  8. package/README.md +242 -86
  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 +33 -12
  522. package/scripts/install-codex-plugin.sh +119 -0
  523. package/scripts/install-plugin.sh +103 -0
  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/commands/nav-check.md +0 -64
  660. package/commands/nav-connections.md +0 -58
  661. package/commands/nav-diagram.md +0 -106
  662. package/commands/nav-export.md +0 -71
  663. package/commands/nav-impact.md +0 -58
  664. package/commands/nav-scan.md +0 -46
  665. package/commands/nav-status.md +0 -44
  666. package/skills/architecture-awareness/SKILL.md +0 -141
  667. package/web/.next/standalone/web/.next/static/chunks/8a80e7184ad3a13f.css +0 -2
  668. package/web/.next/standalone/web/.next/static/chunks/c056475f5f4424b6.css +0 -1
  669. package/web/.next/standalone/web/.next/static/chunks/cb3513192b63e480.js +0 -12
  670. package/web/.next/standalone/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  671. package/web/.next/standalone/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  672. package/web/.next/standalone/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  673. package/web/.next/standalone/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  674. package/web/.next/standalone/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  675. package/web/.next/standalone/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  676. package/web/.next/static/chunks/8a80e7184ad3a13f.css +0 -2
  677. package/web/.next/static/chunks/c056475f5f4424b6.css +0 -1
  678. package/web/.next/static/chunks/cb3513192b63e480.js +0 -12
  679. package/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  680. package/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  681. package/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  682. package/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  683. package/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  684. package/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  685. /package/web/.next/standalone/web/.next/static/{WH0NvTGUEDs9QVUjcPJKx → qZVrJ4kmwXfw4Ikgj1oXR}/_buildManifest.js +0 -0
  686. /package/web/.next/standalone/web/.next/static/{WH0NvTGUEDs9QVUjcPJKx → qZVrJ4kmwXfw4Ikgj1oXR}/_clientMiddlewareManifest.json +0 -0
  687. /package/web/.next/standalone/web/.next/static/{WH0NvTGUEDs9QVUjcPJKx → qZVrJ4kmwXfw4Ikgj1oXR}/_ssgManifest.js +0 -0
  688. /package/web/.next/static/{WH0NvTGUEDs9QVUjcPJKx → qZVrJ4kmwXfw4Ikgj1oXR}/_buildManifest.js +0 -0
  689. /package/web/.next/static/{WH0NvTGUEDs9QVUjcPJKx → qZVrJ4kmwXfw4Ikgj1oXR}/_clientMiddlewareManifest.json +0 -0
  690. /package/web/.next/static/{WH0NvTGUEDs9QVUjcPJKx → qZVrJ4kmwXfw4Ikgj1oXR}/_ssgManifest.js +0 -0
@@ -0,0 +1,160 @@
1
+ ---
2
+ name: architecture-planner
3
+ description: |
4
+ Use this agent when the user's request requires understanding the architecture before answering — phrasings like "review architecture for X", "what's the blast radius of changing Y", "is the graph fresh", "investigate the auth flow", "should I refactor Z", "how does this connect to that", "trace this data flow", "plan a change to <component>". This agent reads NavGator's stored graph, decides whether the data is stale enough to warrant a quick incremental scan, runs that scan if needed (write-capable for `navgator scan --incremental` only), then dispatches the appropriate read-only NavGator MCP tools (`impact`, `trace`, `connections`, `review`, `dead`, `rules`) and aggregates a structured report. Examples:
5
+
6
+ <example>
7
+ Context: User is about to refactor the authentication flow.
8
+ user: "I want to migrate auth from Lucia to Better Auth — what breaks?"
9
+ assistant: "I'll dispatch the architecture-planner agent. It will check graph freshness, run an incremental scan if stale, then trace the auth component and compute blast radius before recommending a sequence."
10
+ <commentary>
11
+ This needs architecture context, not raw file reading. The planner agent owns scan-decision and MCP-tool orchestration.
12
+ </commentary>
13
+ </example>
14
+
15
+ <example>
16
+ Context: User asks an open-ended structural question.
17
+ user: "Is the architecture graph still up-to-date with main?"
18
+ assistant: "Launching the architecture-planner. It'll inspect index.json + hashes.json, decide whether incremental or full is needed, and either trigger an incremental scan or recommend a full one with reason."
19
+ <commentary>
20
+ Freshness-of-graph questions are exactly what this agent owns — it has the policy logic to decide what to do.
21
+ </commentary>
22
+ </example>
23
+
24
+ <example>
25
+ Context: User wants a connection trace.
26
+ user: "Trace what happens when a user submits a checkout request"
27
+ assistant: "Dispatching architecture-planner. It will run `navgator trace checkout-handler --agent` after confirming the graph is current, then summarize the path."
28
+ <commentary>
29
+ Trace requests benefit from the planner ensuring fresh data first; otherwise the trace may follow stale connections.
30
+ </commentary>
31
+ </example>
32
+
33
+ Do NOT use this agent for: simple `/gator:scan` requests (use the scan command directly), one-shot file reads, or non-architectural questions. Do NOT auto-trigger a full scan; if state demands one, return that as a recommendation for the user to confirm.
34
+ model: opus
35
+ color: magenta
36
+ tools: ["Bash", "Read", "Glob", "Grep"]
37
+ ---
38
+
39
+ You are NavGator's architecture planner. You read the stored graph, decide whether it's fresh enough to answer the user's intent, run an incremental scan if needed (NEVER a full scan without explicit user confirmation), then dispatch read-only NavGator MCP tools and aggregate a structured report.
40
+
41
+ ## Your Core Responsibilities
42
+
43
+ 1. **Freshness gate.** Decide whether the graph is current enough for the intent.
44
+ 2. **Bounded write authority.** You may run `navgator scan --incremental --silent` (or `--auto`) when the graph is stale. You MAY NOT run `navgator scan --full`, `navgator scan --clear`, or any destructive write. If a full scan is what's needed, recommend it and stop.
45
+ 3. **Read-only investigation.** After ensuring data is fresh, dispatch `navgator impact|trace|connections|review|dead|rules` (with `--agent` for parseable JSON) to gather evidence.
46
+ 4. **Structured aggregation.** Produce a single report that ties the user's intent to specific tool outputs, file:line references, and explicit risk levels.
47
+
48
+ ## Freshness Decision Process
49
+
50
+ Before running any tool, check architecture freshness in this order. Stop at the first decisive signal.
51
+
52
+ 1. **Does `.navgator/architecture/index.json` exist?**
53
+ ```bash
54
+ test -f .navgator/architecture/index.json && echo PRESENT || echo MISSING
55
+ ```
56
+ - MISSING → recommend `/gator:scan` (full first scan). Stop. Do NOT run a scan yourself.
57
+
58
+ 2. **Read `index.json` and inspect `last_full_scan` + `incrementals_since_full` + `last_scan`.**
59
+ ```bash
60
+ cat .navgator/architecture/index.json | python3 -c 'import json,sys,time; d=json.load(sys.stdin); now=time.time()*1000; print(f"last_scan_age_h={(now-d.get(\"last_scan\",0))/3600000:.1f} last_full_age_d={(now-d.get(\"last_full_scan\",0))/86400000:.1f} incrementals={d.get(\"incrementals_since_full\",0)}")'
61
+ ```
62
+ - If `last_full_age_d > 7` OR `incrementals_since_full >= 20` → recommend the user run a full scan. Do NOT run it yourself. Continue with stale data and prepend findings with a staleness warning.
63
+ - If `last_scan_age_h > 1` AND there are likely uncommitted file changes → run an incremental scan (next step).
64
+ - Else → graph is fresh enough; skip to investigation.
65
+
66
+ 3. **Check for changed source files via git.**
67
+ ```bash
68
+ git status --porcelain 2>/dev/null | head -20
69
+ ```
70
+ If any tracked source file is modified or untracked, the incremental scan below will pick it up.
71
+
72
+ 4. **Run incremental scan when freshness gate fires.**
73
+ ```bash
74
+ navgator scan --incremental --json
75
+ ```
76
+ - Inspect the JSON output. If the scanner promoted the run to `incremental→full` (look for `scan_type` in the timeline entry), the user should know — surface it in the report.
77
+ - If `--incremental` ran but had `no-prior-state` (first-ever scan), abort the agent flow and recommend `/gator:scan`.
78
+ - **Audit signal (Run 2).** The most recent timeline entry may carry an `audit` block with `defect_rate`, `verdict`, and `drift_breach`. Treat it as a confidence signal on the freshness of the cached graph: if `verdict === 'reject'` or `drift_breach === true`, the incremental graph is no longer reliable for blast-radius reasoning — recommend a full scan to the user and prepend findings with a low-confidence warning. If `verdict === 'accept'`, the graph is good to consume as-is. Do NOT auto-promote a full scan yourself; the scanner already handles drift via `pending_drift_breach`.
79
+
80
+ ## Investigation Process
81
+
82
+ After freshness is settled, choose tools based on the user's intent. ALL tool invocations use `--agent` for stable JSON output.
83
+
84
+ | User intent | Tool dispatch |
85
+ |---|---|
86
+ | "What breaks if I change X?" | `navgator impact "X" --agent` |
87
+ | "Trace data flow through X" | `navgator trace "X" --agent` |
88
+ | "What connects to X?" | `navgator connections "X" --agent` |
89
+ | "Review the architecture" | `navgator review --agent` |
90
+ | "Find dead code / orphans" | `navgator dead --agent` |
91
+ | "Check architecture rules" | `navgator rules --agent` |
92
+ | "Map all LLM use cases" | `navgator llm-map --agent` |
93
+ | Open-ended planning question | Combine `review` + targeted `impact`/`trace` |
94
+
95
+ For each tool, parse the JSON `data` field, extract the relevant entities (component IDs, files, line numbers, severities), and use them in the aggregated report. Quote specific output fields as evidence.
96
+
97
+ ## Operational Constraints
98
+
99
+ - **You MAY run `navgator scan --incremental` and `navgator scan --auto`.**
100
+ - **You MAY NOT run `navgator scan --full`, `navgator scan --clear`, or any non-scan write.**
101
+ - **You MAY NOT edit, create, or delete files outside of `.navgator/`** (which the scanner handles).
102
+ - **Cite tool output.** Every finding cites the command + output field that supports it.
103
+ - **Stale data warning.** If you proceed with stale data, prepend the report with: `WARNING: Architecture data is stale (<reason>). Findings below may not reflect current state. Recommend running /gator:scan before action.`
104
+ - **Scope discipline.** If the investigation surfaces adjacent issues, list them under "Out of Scope Observations" and do NOT expand the investigation.
105
+
106
+ ## Output Format
107
+
108
+ Always structure your final response as:
109
+
110
+ ### Plan Summary
111
+ - **Intent:** `<one-line restatement of user request>`
112
+ - **Scan decision:** `<what you did about freshness, with reason>`
113
+ - **Tools dispatched:** `<list>`
114
+
115
+ ### Architecture State
116
+ - **Components:** `<count>` total, layers: `<frontend/backend/database/queue/infra/external counts>`
117
+ - **Connections:** `<count>` total
118
+ - **Last full scan:** `<age in days>` · **Incrementals since:** `<count>`
119
+ - **Schema version:** `<from index.json>`
120
+
121
+ ### Findings
122
+ For each finding:
123
+ - **Severity:** Critical / Warning / Info
124
+ - **Location:** `<file>:<line>` (from MCP tool output)
125
+ - **Finding:** What was observed
126
+ - **Evidence:** `<which tool + which output field>`
127
+
128
+ ### Recommendation
129
+ 1. `<concrete action 1 — file path, what to do, why>`
130
+ 2. `<concrete action 2>`
131
+ 3. ...
132
+
133
+ Each recommendation includes:
134
+ - Files affected (`file:line`)
135
+ - Risk level (Low / Medium / High)
136
+ - Verification step
137
+
138
+ ### Out of Scope Observations
139
+ List adjacent issues you spotted but did NOT investigate.
140
+
141
+ ### What You Did NOT Do
142
+ - ❌ Did NOT run `--full` (would have if `<reason>`).
143
+ - ❌ Did NOT modify any source files.
144
+ - ❌ Did NOT make changes to `.navgator/` outside the scanner's writes.
145
+
146
+ ## Edge Cases
147
+
148
+ - **First-ever run, no `.navgator/` directory:** Stop. Tell the user to run `/gator:scan` first. Do not improvise.
149
+ - **`incremental→full` promotion happened:** Note it in the Plan Summary; the data is current after promotion.
150
+ - **MCP tool returns empty/null:** Try one alternate phrasing (e.g. exact component name from `index.json.components.by_name`). If still empty, report "no matches" with the queried key and stop — do not fan out searches.
151
+ - **User asks about a component the graph doesn't know:** Suggest scan + offer file-search via Grep as a fallback, but keep it bounded.
152
+ - **Conflicting tool outputs (e.g. `impact` says no consumers but `trace` shows one):** Report both with evidence; do not pick a winner.
153
+
154
+ ## Quality Standards
155
+
156
+ - ✅ Every Finding has a Location AND Evidence field populated.
157
+ - ✅ Recommendations cite at least one specific file:line.
158
+ - ✅ Risk levels are justified by tool output, not gut feel.
159
+ - ✅ Stale-data warning is prepended when applicable.
160
+ - ✅ Total report is under 600 words for typical investigations; longer is OK if the data justifies it.
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: external-resolver
3
+ description: Use this agent when NavGator needs its external boundary nodes (npm/pip/spm/cargo/go/service/llm/infra) resolved or refreshed against upstream registries — attaching canonical identity, latest version, release date, docs URL, and a freshness verdict. Typical triggers include the staleness sweep finding nodes past the 7-day freshness window, a scan surfacing boundary nodes the registry cache cannot resolve, and a user asking "are my dependencies current", "what's drifting", or "refresh the architecture map's external layer". Do NOT use it for internal code structure, database profiling, or anything requiring secrets. See "When to invoke" in the agent body for worked scenarios.
4
+ model: haiku
5
+ color: cyan
6
+ tools: ["Read", "Bash", "Grep", "Glob"]
7
+ ---
8
+
9
+ You are the external-resolver for NavGator. You own the FRESHNESS axis of the
10
+ architecture map: turning detected-but-opaque boundary nodes into versioned,
11
+ dated, doc-linked, freshness-graded facts, and keeping that knowledge current as
12
+ the upstream world changes — independent of whether any file in the repo changed.
13
+
14
+ You are network-bound and isolatable by design. The NavGator engine stays
15
+ deterministic and offline; you are the only component that reaches the network,
16
+ so you run as a subprocess and write results back into NavGator's own
17
+ self-contained JSON cache (`~/.navgator/enrichment-cache.json`, via
18
+ `src/enrich/cache.ts`). The engine's next `enrichFromCache()` pass re-stamps the
19
+ graph from your writes. NavGator carries no api-registry / external-plugin
20
+ dependency — the fetchers and cache are vendored inside it.
21
+
22
+ ## When to invoke
23
+
24
+ - **Staleness sweep.** `selectStaleForRefresh()` (src/enrich/external-resolver.ts)
25
+ or the SessionStart staleness hook returns boundary nodes whose freshness
26
+ window has elapsed (`drifting`) or that were never resolved (`unresolved`).
27
+ You re-check each upstream and update the cache.
28
+ - **Unknown service at scan time.** A scan detected a node (e.g. a new
29
+ `npm:some-sdk`) the registry cache has never seen. You resolve its canonical
30
+ identity, package ids, latest version, and docs URL, then insert it.
31
+ - **User freshness question.** The user asks "what dependencies are behind",
32
+ "is anything drifting", or "refresh the external layer of the map". You run a
33
+ full refresh over the project's enrichable nodes and report drift.
34
+
35
+ ## Your Core Responsibilities
36
+
37
+ 1. For each target node, resolve the correct ecosystem and package id
38
+ (npm / pypi / github-releases) using NavGator's own vendored fetchers in
39
+ `src/enrich/fetchers.ts` (`fetchNpmLatest`, `fetchPypiLatest`,
40
+ `fetchGitHubLatest`). The simplest path is to call `refreshExternal()` from
41
+ `src/enrich/external-resolver.ts`, which does steps 1–4 for you.
42
+ 2. Fetch latest version + release date; map to a canonical service and docs URL.
43
+ 3. Upsert the result into NavGator's JSON cache (`src/enrich/cache.ts`,
44
+ `~/.navgator/enrichment-cache.json`), stamping `last_checked = now`.
45
+ 4. Compute and report a per-node freshness verdict
46
+ (`current | drifting | stale | unresolved`) and version drift.
47
+ 5. Never emit, read, or store secret values. Identity + version + docs only.
48
+
49
+ ## Analysis Process
50
+
51
+ 1. **Receive the worklist** — a JSON array of `{component_id, name, type,
52
+ version, package_ids?}` from the engine selector, or derive it by reading
53
+ `.navgator/architecture/components.full.jsonl` and filtering enrichable types.
54
+ 2. **Resolve each node** — pick the ecosystem from `type`; call the matching
55
+ vendored fetcher. For `spm` nodes, GitHub Releases is derived from
56
+ `repository_url` (`deriveOwnerRepo`).
57
+ 3. **Classify** — `latest_version !== installed version` → `stale` with a
58
+ patch/minor/major bump; window elapsed but equal → re-stamp `current`;
59
+ no upstream match → `unresolved`.
60
+ 4. **Persist** — `refreshExternal()` upserts each record into NavGator's JSON
61
+ cache and saves it; the engine re-stamps the graph offline on its next scan.
62
+ 5. **Stay offline-safe** — on network failure a node degrades to `unresolved`
63
+ rather than failing the run.
64
+
65
+ ## Quality Standards
66
+
67
+ - Deterministic output: same upstream state → same verdict.
68
+ - Batch fetches; honor registry rate limits; degrade to `unresolved` on network
69
+ failure rather than failing the whole run.
70
+ - Cache-first: skip nodes already `current` unless `--force`.
71
+ - Touch only the cache and your report — never write the `.navgator/` graph
72
+ directly (that is the engine's job).
73
+
74
+ ## Output Format
75
+
76
+ Return JSON:
77
+
78
+ ```json
79
+ {
80
+ "checked": 42,
81
+ "resolved": 39,
82
+ "unresolved": 3,
83
+ "drift": [
84
+ { "name": "openai", "type": "npm", "installed": "4.20.0",
85
+ "latest": "4.52.0", "bump": "minor", "freshness": "stale" }
86
+ ],
87
+ "cache_updated": 39,
88
+ "notes": ["3 spm nodes had no GitHub releases; left unresolved"]
89
+ }
90
+ ```
91
+
92
+ ## Edge Cases
93
+
94
+ - **No network:** mark targeted nodes `unresolved`, return partial results, say so.
95
+ - **Monorepo / scoped pkgs:** resolve each `package_id` independently.
96
+ - **Unparseable version:** classify bump as `minor` (conservative) and note it.
97
+ - **Node already current:** skip unless `--force`; count it under `checked`.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for agent output formatting module
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=agent-output.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-output.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agent-output.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Tests for agent output formatting module
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { wrapInEnvelope, buildExecutiveSummary } from '../agent-output.js';
6
+ import { createMockComponent, createMockConnection } from './helpers.js';
7
+ describe('wrapInEnvelope', () => {
8
+ it('returns valid JSON string', () => {
9
+ const data = { test: 'value' };
10
+ const result = wrapInEnvelope('test-command', data);
11
+ expect(() => JSON.parse(result)).not.toThrow();
12
+ const parsed = JSON.parse(result);
13
+ expect(parsed.data).toEqual(data);
14
+ });
15
+ it('has sorted top-level keys', () => {
16
+ const data = { foo: 'bar' };
17
+ const result = wrapInEnvelope('scan', data);
18
+ const parsed = JSON.parse(result);
19
+ const keys = Object.keys(parsed);
20
+ const sortedKeys = [...keys].sort();
21
+ expect(keys).toEqual(sortedKeys);
22
+ expect(keys).toEqual(['command', 'data', 'schema_version', 'timestamp']);
23
+ });
24
+ it('includes schema_version', () => {
25
+ const result = wrapInEnvelope('test', {});
26
+ const parsed = JSON.parse(result);
27
+ expect(parsed.schema_version).toBeDefined();
28
+ expect(typeof parsed.schema_version).toBe('string');
29
+ });
30
+ it('includes timestamp', () => {
31
+ const result = wrapInEnvelope('test', {});
32
+ const parsed = JSON.parse(result);
33
+ expect(parsed.timestamp).toBeDefined();
34
+ expect(typeof parsed.timestamp).toBe('number');
35
+ expect(parsed.timestamp).toBeGreaterThan(0);
36
+ });
37
+ it('includes command', () => {
38
+ const result = wrapInEnvelope('scan', { test: 'data' });
39
+ const parsed = JSON.parse(result);
40
+ expect(parsed.command).toBe('scan');
41
+ });
42
+ it('includes metadata when provided', () => {
43
+ const metadata = { projectPath: '/test/path', git: { branch: 'main', commit: 'abc123' } };
44
+ const result = wrapInEnvelope('scan', { data: 'test' }, metadata);
45
+ const parsed = JSON.parse(result);
46
+ expect(parsed.metadata).toEqual(metadata);
47
+ });
48
+ it('omits metadata when not provided', () => {
49
+ const result = wrapInEnvelope('scan', { data: 'test' });
50
+ const parsed = JSON.parse(result);
51
+ expect(parsed.metadata).toBeUndefined();
52
+ });
53
+ it('omits metadata when empty object', () => {
54
+ const result = wrapInEnvelope('scan', { data: 'test' }, {});
55
+ const parsed = JSON.parse(result);
56
+ expect(parsed.metadata).toBeUndefined();
57
+ });
58
+ });
59
+ describe('buildExecutiveSummary', () => {
60
+ it('returns risks for vulnerable components', () => {
61
+ const vulnerableComponent = createMockComponent({
62
+ name: 'VulnerableLib',
63
+ status: 'vulnerable',
64
+ });
65
+ const summary = buildExecutiveSummary([vulnerableComponent], [], '/test/project');
66
+ expect(summary.risks).toHaveLength(1);
67
+ expect(summary.risks[0].type).toBe('vulnerability');
68
+ expect(summary.risks[0].severity).toBe('critical');
69
+ expect(summary.risks[0].component).toBe('VulnerableLib');
70
+ expect(summary.risks[0].message).toContain('has known vulnerabilities');
71
+ });
72
+ it('returns risks for deprecated components', () => {
73
+ const deprecatedComponent = createMockComponent({
74
+ name: 'OldLib',
75
+ status: 'deprecated',
76
+ });
77
+ const summary = buildExecutiveSummary([deprecatedComponent], [], '/test/project');
78
+ expect(summary.risks).toHaveLength(1);
79
+ expect(summary.risks[0].type).toBe('deprecated');
80
+ expect(summary.risks[0].severity).toBe('high');
81
+ expect(summary.risks[0].component).toBe('OldLib');
82
+ expect(summary.risks[0].message).toContain('is deprecated');
83
+ });
84
+ it('returns risks for outdated components with update info', () => {
85
+ const outdatedComponent = createMockComponent({
86
+ name: 'OutdatedLib',
87
+ status: 'outdated',
88
+ health: {
89
+ last_audit: Date.now(),
90
+ update_available: '2.0.0',
91
+ update_type: 'major',
92
+ },
93
+ });
94
+ const summary = buildExecutiveSummary([outdatedComponent], [], '/test/project');
95
+ expect(summary.risks).toHaveLength(1);
96
+ expect(summary.risks[0].type).toBe('outdated');
97
+ expect(summary.risks[0].severity).toBe('high'); // major update
98
+ expect(summary.risks[0].component).toBe('OutdatedLib');
99
+ expect(summary.risks[0].message).toContain('major update available');
100
+ expect(summary.risks[0].message).toContain('2.0.0');
101
+ });
102
+ it('returns medium severity for minor/patch updates', () => {
103
+ const outdatedComponent = createMockComponent({
104
+ name: 'OutdatedLib',
105
+ status: 'outdated',
106
+ health: {
107
+ last_audit: Date.now(),
108
+ update_available: '1.1.0',
109
+ update_type: 'minor',
110
+ },
111
+ });
112
+ const summary = buildExecutiveSummary([outdatedComponent], [], '/test/project');
113
+ expect(summary.risks[0].severity).toBe('medium');
114
+ });
115
+ it('returns blockers for unused components', () => {
116
+ const unusedComponent = createMockComponent({
117
+ name: 'UnusedLib',
118
+ status: 'unused',
119
+ });
120
+ const summary = buildExecutiveSummary([unusedComponent], [], '/test/project');
121
+ expect(summary.blockers).toHaveLength(1);
122
+ expect(summary.blockers[0].type).toBe('unused');
123
+ expect(summary.blockers[0].component).toBe('UnusedLib');
124
+ expect(summary.blockers[0].message).toContain('is detected but unused');
125
+ });
126
+ it('computes correct stats', () => {
127
+ const components = [
128
+ createMockComponent({ name: 'ActiveLib', status: 'active' }),
129
+ createMockComponent({ name: 'OutdatedLib', status: 'outdated' }),
130
+ createMockComponent({ name: 'VulnerableLib', status: 'vulnerable' }),
131
+ createMockComponent({ name: 'DeprecatedLib', status: 'deprecated' }),
132
+ ];
133
+ const connections = [
134
+ createMockConnection('COMP_npm_activelib_abc', 'COMP_npm_outdatedlib_def'),
135
+ createMockConnection('COMP_npm_vulnerablelib_ghi', 'COMP_npm_deprecatedlib_jkl'),
136
+ ];
137
+ const summary = buildExecutiveSummary(components, connections, '/test/project');
138
+ expect(summary.stats.total_components).toBe(4);
139
+ expect(summary.stats.total_connections).toBe(2);
140
+ expect(summary.stats.outdated_count).toBe(1);
141
+ expect(summary.stats.vulnerable_count).toBe(1);
142
+ });
143
+ it('includes project path and timestamp', () => {
144
+ const summary = buildExecutiveSummary([], [], '/test/project');
145
+ expect(summary.project_path).toBe('/test/project');
146
+ expect(summary.timestamp).toBeGreaterThan(0);
147
+ });
148
+ it('includes git info when provided', () => {
149
+ const git = {
150
+ branch: 'main',
151
+ commit: 'abc123',
152
+ commitFull: 'abc123def456',
153
+ };
154
+ const summary = buildExecutiveSummary([], [], '/test/project', git);
155
+ expect(summary.git).toEqual(git);
156
+ });
157
+ it('includes compact components and connections', () => {
158
+ const component = createMockComponent({
159
+ name: 'TestLib',
160
+ component_id: 'COMP_npm_testlib_abc',
161
+ type: 'npm',
162
+ version: '1.0.0',
163
+ role: { layer: 'backend', purpose: 'Test', critical: false },
164
+ status: 'active',
165
+ });
166
+ const connection = createMockConnection('COMP_npm_from_abc', 'COMP_npm_to_def', {
167
+ connection_type: 'imports',
168
+ code_reference: {
169
+ file: 'src/test.ts',
170
+ symbol: 'testFunction',
171
+ symbol_type: 'function',
172
+ line_start: 10,
173
+ },
174
+ });
175
+ const summary = buildExecutiveSummary([component], [connection], '/test/project');
176
+ expect(summary.components).toHaveLength(1);
177
+ expect(summary.components[0].id).toBe('COMP_npm_testlib_abc');
178
+ expect(summary.components[0].n).toBe('TestLib');
179
+ expect(summary.components[0].t).toBe('npm');
180
+ expect(summary.components[0].v).toBe('1.0.0');
181
+ expect(summary.components[0].l).toBe('backend');
182
+ expect(summary.components[0].s).toBe('active');
183
+ expect(summary.connections).toHaveLength(1);
184
+ expect(summary.connections[0].f).toBe('COMP_npm_from_abc');
185
+ expect(summary.connections[0].t).toBe('COMP_npm_to_def');
186
+ expect(summary.connections[0].ct).toBe('imports');
187
+ expect(summary.connections[0].sym).toBe('testFunction');
188
+ });
189
+ it('includes next actions for vulnerabilities', () => {
190
+ const vulnerableComponent = createMockComponent({
191
+ name: 'VulnerableLib',
192
+ status: 'vulnerable',
193
+ });
194
+ const summary = buildExecutiveSummary([vulnerableComponent], [], '/test/project');
195
+ expect(summary.next_actions.length).toBeGreaterThan(0);
196
+ const auditAction = summary.next_actions.find(a => a.command === 'npm audit fix');
197
+ expect(auditAction).toBeDefined();
198
+ expect(auditAction?.action).toContain('Fix');
199
+ expect(auditAction?.action).toContain('vulnerable');
200
+ });
201
+ it('includes next actions for outdated packages', () => {
202
+ const outdatedComponent = createMockComponent({
203
+ name: 'OutdatedLib',
204
+ status: 'outdated',
205
+ });
206
+ const summary = buildExecutiveSummary([outdatedComponent], [], '/test/project');
207
+ const updateAction = summary.next_actions.find(a => a.command === 'npm outdated');
208
+ expect(updateAction).toBeDefined();
209
+ expect(updateAction?.action).toContain('Update');
210
+ expect(updateAction?.action).toContain('outdated');
211
+ });
212
+ it('includes next actions for deprecated packages', () => {
213
+ const deprecatedComponent = createMockComponent({
214
+ name: 'DeprecatedLib',
215
+ status: 'deprecated',
216
+ });
217
+ const summary = buildExecutiveSummary([deprecatedComponent], [], '/test/project');
218
+ const replaceAction = summary.next_actions.find(a => a.action.includes('Replace'));
219
+ expect(replaceAction).toBeDefined();
220
+ expect(replaceAction?.action).toContain('deprecated');
221
+ });
222
+ it('includes next actions for unused components', () => {
223
+ const unusedComponent = createMockComponent({
224
+ name: 'UnusedLib',
225
+ status: 'unused',
226
+ });
227
+ const summary = buildExecutiveSummary([unusedComponent], [], '/test/project');
228
+ const reviewAction = summary.next_actions.find(a => a.action.includes('Review'));
229
+ expect(reviewAction).toBeDefined();
230
+ expect(reviewAction?.action).toContain('unused');
231
+ });
232
+ });
233
+ //# sourceMappingURL=agent-output.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-output.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-output.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzE,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAEpD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,QAAQ,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;QAC1F,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAElC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;YAC9C,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,qBAAqB,CACnC,CAAC,mBAAmB,CAAC,EACrB,EAAE,EACF,eAAe,CAChB,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;YAC9C,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,qBAAqB,CACnC,CAAC,mBAAmB,CAAC,EACrB,EAAE,EACF,eAAe,CAChB,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;YAC5C,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE;gBACN,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;gBACtB,gBAAgB,EAAE,OAAO;gBACzB,WAAW,EAAE,OAAO;aACrB;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,qBAAqB,CACnC,CAAC,iBAAiB,CAAC,EACnB,EAAE,EACF,eAAe,CAChB,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe;QAC/D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;YAC5C,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE;gBACN,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;gBACtB,gBAAgB,EAAE,OAAO;gBACzB,WAAW,EAAE,OAAO;aACrB;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,qBAAqB,CACnC,CAAC,iBAAiB,CAAC,EACnB,EAAE,EACF,eAAe,CAChB,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,eAAe,GAAG,mBAAmB,CAAC;YAC1C,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,qBAAqB,CACnC,CAAC,eAAe,CAAC,EACjB,EAAE,EACF,eAAe,CAChB,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,UAAU,GAA4B;YAC1C,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC5D,mBAAmB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAChE,mBAAmB,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;YACpE,mBAAmB,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;SACrE,CAAC;QAEF,MAAM,WAAW,GAA6B;YAC5C,oBAAoB,CAAC,wBAAwB,EAAE,0BAA0B,CAAC;YAC1E,oBAAoB,CAAC,4BAA4B,EAAE,4BAA4B,CAAC;SACjF,CAAC;QAEF,MAAM,OAAO,GAAG,qBAAqB,CACnC,UAAU,EACV,WAAW,EACX,eAAe,CAChB,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;QAE/D,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,GAAG,GAAY;YACnB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,cAAc;SAC3B,CAAC;QAEF,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;QAEpE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,SAAS,GAAG,mBAAmB,CAAC;YACpC,IAAI,EAAE,SAAS;YACf,YAAY,EAAE,sBAAsB;YACpC,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC5D,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,oBAAoB,CACrC,mBAAmB,EACnB,iBAAiB,EACjB;YACE,eAAe,EAAE,SAAS;YAC1B,cAAc,EAAE;gBACd,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,cAAc;gBACtB,WAAW,EAAE,UAAU;gBACvB,UAAU,EAAE,EAAE;aACf;SACF,CACF,CAAC;QAEF,MAAM,OAAO,GAAG,qBAAqB,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC,CAAC;QAElF,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE/C,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;YAC9C,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,qBAAqB,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;QAElF,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,eAAe,CAAC,CAAC;QAClF,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;YAC5C,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,qBAAqB,CAAC,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;QAEhF,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,cAAc,CAAC,CAAC;QAClF,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;YAC9C,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,qBAAqB,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;QAElF,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,eAAe,GAAG,mBAAmB,CAAC;YAC1C,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,qBAAqB,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;QAE9E,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjF,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Regression test for R6 stack-overflow on large/cyclic import graphs.
3
+ *
4
+ * Symptom (verified on atomize-ai 2026-05): scanning a project with ~2475
5
+ * components and deep import chains caused `detectImportCycles` to throw
6
+ * "Maximum call stack size exceeded" because its `visit()` helper recursed
7
+ * once per import edge along the longest path. Node's default V8 stack tops
8
+ * out around ~10–15k frames for this function's frame size; a single chain
9
+ * of ~10k internal imports is enough to blow it (verified empirically with
10
+ * `node -e` reproduction).
11
+ *
12
+ * The fix converts `visit()` to an explicit work-stack iteration. These tests
13
+ * lock in the post-fix invariants:
14
+ * 1. A 15,000-node deep linear import chain (well past the recursive limit)
15
+ * completes without throwing.
16
+ * 2. A 15,000-node chain that closes into a cycle still detects exactly one
17
+ * cycle and reports it correctly.
18
+ * 3. A graph mixing multiple cycles still respects the `limit` argument.
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=architecture-insights-stack.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture-insights-stack.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/architecture-insights-stack.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Regression test for R6 stack-overflow on large/cyclic import graphs.
3
+ *
4
+ * Symptom (verified on atomize-ai 2026-05): scanning a project with ~2475
5
+ * components and deep import chains caused `detectImportCycles` to throw
6
+ * "Maximum call stack size exceeded" because its `visit()` helper recursed
7
+ * once per import edge along the longest path. Node's default V8 stack tops
8
+ * out around ~10–15k frames for this function's frame size; a single chain
9
+ * of ~10k internal imports is enough to blow it (verified empirically with
10
+ * `node -e` reproduction).
11
+ *
12
+ * The fix converts `visit()` to an explicit work-stack iteration. These tests
13
+ * lock in the post-fix invariants:
14
+ * 1. A 15,000-node deep linear import chain (well past the recursive limit)
15
+ * completes without throwing.
16
+ * 2. A 15,000-node chain that closes into a cycle still detects exactly one
17
+ * cycle and reports it correctly.
18
+ * 3. A graph mixing multiple cycles still respects the `limit` argument.
19
+ */
20
+ import { describe, expect, it } from 'vitest';
21
+ import { detectImportCycles } from '../architecture-insights.js';
22
+ import { createComponent, createConnection } from './helpers.js';
23
+ function buildLinearChain(depth) {
24
+ const components = [];
25
+ const connections = [];
26
+ for (let i = 0; i < depth; i++) {
27
+ components.push(createComponent({
28
+ name: `chain/node-${i}`,
29
+ type: 'component',
30
+ file: `src/chain/node-${i}.ts`,
31
+ }));
32
+ }
33
+ for (let i = 0; i < depth - 1; i++) {
34
+ connections.push(createConnection(components[i], components[i + 1], { connection_type: 'imports' }));
35
+ }
36
+ return { components, connections };
37
+ }
38
+ describe('detectImportCycles — stack-overflow regression', () => {
39
+ it('handles a 15,000-node deep linear chain without overflowing the stack', () => {
40
+ // 15,000 is deliberately well past V8's default ~10–15k frame budget for
41
+ // this function's frame size (verified throws at this depth with a
42
+ // standalone reproduction of the recursive visit() pattern).
43
+ // A linear chain has NO cycle, so the correct answer is [].
44
+ const { components, connections } = buildLinearChain(15000);
45
+ // Pre-fix behavior: throws "Maximum call stack size exceeded".
46
+ // Post-fix: returns [] in well under a second.
47
+ expect(() => detectImportCycles(components, connections, 5)).not.toThrow();
48
+ const cycles = detectImportCycles(components, connections, 5);
49
+ expect(cycles).toEqual([]);
50
+ });
51
+ it('detects a single cycle inside a 15,000-node graph', () => {
52
+ const { components, connections } = buildLinearChain(15000);
53
+ // Close the chain back to node-0 → forms one 3,500-node cycle.
54
+ connections.push(createConnection(components[components.length - 1], components[0], {
55
+ connection_type: 'imports',
56
+ }));
57
+ expect(() => detectImportCycles(components, connections, 5)).not.toThrow();
58
+ const cycles = detectImportCycles(components, connections, 5);
59
+ expect(cycles).toHaveLength(1);
60
+ // Cycle is recorded as the full ring (start..end..start). Just spot-check
61
+ // structure — we don't want to materialize 3,500 names in the assertion.
62
+ expect(cycles[0][0]).toBe('chain/node-0');
63
+ expect(cycles[0][cycles[0].length - 1]).toBe('chain/node-0');
64
+ expect(cycles[0]).toHaveLength(15001);
65
+ });
66
+ it('respects the limit when many cycles are present', () => {
67
+ // Build 10 independent 4-node cycles.
68
+ const components = [];
69
+ const connections = [];
70
+ for (let r = 0; r < 10; r++) {
71
+ const ring = Array.from({ length: 4 }, (_, i) => createComponent({
72
+ name: `ring-${r}/node-${i}`,
73
+ type: 'component',
74
+ file: `src/ring-${r}/node-${i}.ts`,
75
+ }));
76
+ components.push(...ring);
77
+ for (let i = 0; i < ring.length; i++) {
78
+ connections.push(createConnection(ring[i], ring[(i + 1) % ring.length], { connection_type: 'imports' }));
79
+ }
80
+ }
81
+ expect(() => detectImportCycles(components, connections, 3)).not.toThrow();
82
+ const cycles = detectImportCycles(components, connections, 3);
83
+ expect(cycles).toHaveLength(3);
84
+ });
85
+ });
86
+ //# sourceMappingURL=architecture-insights-stack.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture-insights-stack.test.js","sourceRoot":"","sources":["../../src/__tests__/architecture-insights-stack.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=architecture-insights.test.d.ts.map