@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,97 @@
1
+ /**
2
+ * Self-contained enrichment cache for NavGator.
3
+ *
4
+ * Lives entirely inside NavGator — NO dependency on api-registry's registry.db
5
+ * or any external plugin. Backed by a dependency-free JSON file in NavGator's
6
+ * own shared home (`~/.navgator/enrichment-cache.json`), so resolved versions
7
+ * are reused across every repo on the machine (serves "persistent … across any
8
+ * type of app") and a scan never re-fetches what another scan already learned.
9
+ *
10
+ * The structural enrich pass (enrichFromCache) reads this synchronously and
11
+ * offline. Only the freshness path (refreshExternal / the external-resolver
12
+ * agent) writes to it, after hitting the network.
13
+ */
14
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import { homedir } from 'node:os';
17
+ /** NavGator's own cache location — independent of project storage mode. */
18
+ export function enrichmentCachePath() {
19
+ return join(process.env['NAVGATOR_HOME'] || join(homedir(), '.navgator'), 'enrichment-cache.json');
20
+ }
21
+ /** Map a component type to the ecosystem its versions resolve from. */
22
+ export function ecosystemFor(type) {
23
+ switch (type) {
24
+ case 'npm':
25
+ return 'npm';
26
+ case 'pip':
27
+ return 'pypi';
28
+ case 'cargo':
29
+ return 'cargo';
30
+ case 'go':
31
+ return 'go';
32
+ case 'spm':
33
+ return 'github'; // SPM/CocoaPods resolve via GitHub releases
34
+ default:
35
+ return 'manual'; // service / llm / infra — curated, matched by name
36
+ }
37
+ }
38
+ /** Deterministic cache key: ecosystem-scoped, lowercased package/service name. */
39
+ export function cacheKey(type, name) {
40
+ return `${ecosystemFor(type)}:${name.trim().toLowerCase()}`;
41
+ }
42
+ /** Load the cache (sync, offline). Returns an empty cache if absent/corrupt. */
43
+ export function loadCache() {
44
+ const path = enrichmentCachePath();
45
+ if (!existsSync(path))
46
+ return { version: 1, records: {} };
47
+ try {
48
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
49
+ if (parsed?.version === 1 && parsed.records)
50
+ return parsed;
51
+ }
52
+ catch {
53
+ /* corrupt cache → start fresh; never block a scan */
54
+ }
55
+ return { version: 1, records: {} };
56
+ }
57
+ /** Persist the cache atomically-ish (write temp + rename). */
58
+ export function saveCache(cache) {
59
+ const path = enrichmentCachePath();
60
+ mkdirSync(join(path, '..'), { recursive: true });
61
+ const tmp = `${path}.tmp`;
62
+ writeFileSync(tmp, JSON.stringify(cache, null, 2), 'utf8');
63
+ writeFileSync(path, JSON.stringify(cache, null, 2), 'utf8');
64
+ try {
65
+ // best-effort cleanup of temp
66
+ if (existsSync(tmp))
67
+ writeFileSync(tmp, '', 'utf8');
68
+ }
69
+ catch {
70
+ /* ignore */
71
+ }
72
+ }
73
+ /** Upsert a resolved record by ecosystem+name. */
74
+ export function upsertRecord(cache, type, name, rec) {
75
+ cache.records[cacheKey(type, name)] = rec;
76
+ }
77
+ /**
78
+ * Build the offline `lookup` the resolver needs, closed over a loaded cache.
79
+ * Matches a component to its cached record by ecosystem+name, with a fallback
80
+ * to canonical-service match for name-only nodes (service/llm/infra).
81
+ */
82
+ export function makeLookup(cache) {
83
+ // Secondary index: canonical_service → record, for non-package nodes.
84
+ const byService = new Map();
85
+ for (const rec of Object.values(cache.records)) {
86
+ if (rec.canonical_service)
87
+ byService.set(rec.canonical_service.toLowerCase(), rec);
88
+ }
89
+ return (c) => {
90
+ const direct = cache.records[cacheKey(c.type, c.name)];
91
+ if (direct)
92
+ return direct;
93
+ const svc = byService.get(c.name.trim().toLowerCase());
94
+ return svc ?? null;
95
+ };
96
+ }
97
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/enrich/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * External enrichment schema — the "live boundary" layer for NavGator.
3
+ *
4
+ * NavGator's scanners already DETECT external boundary nodes (`service`, `npm`,
5
+ * `spm`, `llm`, `infra`, `config`). What they don't do is RESOLVE them: a bare
6
+ * `npm:openai` node has no canonical identity, current/latest version, release
7
+ * date, authoritative docs, or freshness signal.
8
+ *
9
+ * This module defines the enrichment block that the external-resolver populates
10
+ * onto those nodes. It is the integration-layer twin of the database-profile
11
+ * fold (research plugin), which enriches `database` nodes with live schema/rows.
12
+ * Both folds answer the same question for opposite boundaries: "is this node a
13
+ * monitored, versioned, dated fact, or just a name?"
14
+ *
15
+ * Design rules:
16
+ * - Enrichment is ADDITIVE and OPTIONAL. A component with no `external` block
17
+ * behaves exactly as before. Removing this module degrades gracefully.
18
+ * - Two update axes (see external-resolver.ts):
19
+ * 1. structural — runs inside scan(), offline, from the registry cache.
20
+ * 2. freshness — runs on the 7-day contract, online, file-change-free.
21
+ * - No secrets ever land here. Enrichment is identity + version + docs only.
22
+ */
23
+ /** Which package/release ecosystem a version was resolved against. */
24
+ export type EnrichmentRegistry = 'npm' | 'pypi' | 'github' | 'cargo' | 'go' | 'manual';
25
+ /**
26
+ * Freshness of NavGator's KNOWLEDGE of this node — distinct from
27
+ * ComponentStatus, which describes the dependency itself.
28
+ * - current : last checked within the freshness window (default 7d).
29
+ * - drifting : window elapsed; a re-check is due but not yet run.
30
+ * - stale : re-checked and a newer version exists (mirrors status:'outdated').
31
+ * - unresolved: detected but never successfully resolved (offline / unknown service).
32
+ */
33
+ export type Freshness = 'current' | 'drifting' | 'stale' | 'unresolved';
34
+ /**
35
+ * The enrichment block hung off ArchitectureComponent.external.
36
+ * Populated by the external-resolver; consumed by `schema`, `summary`,
37
+ * `review`, and agent-output update-available messaging.
38
+ */
39
+ export interface ExternalEnrichment {
40
+ /**
41
+ * Canonical service identity from the api-registry registry (e.g. the npm
42
+ * nodes `@anthropic-ai/sdk` and `openai` both resolve to llm-provider
43
+ * services). Null when the node could not be matched to a known service.
44
+ */
45
+ canonical_service?: string;
46
+ /** Ecosystem the version facts below were resolved from. */
47
+ registry: EnrichmentRegistry;
48
+ /** Package identifiers per ecosystem, e.g. { npm: "openai", pypi: "openai" }. */
49
+ package_ids: Partial<Record<EnrichmentRegistry, string>>;
50
+ /** Latest version available upstream at last check (e.g. "4.52.0"). */
51
+ latest_version?: string;
52
+ /** ISO-8601 release date of latest_version, when the registry exposes it. */
53
+ latest_released_at?: string;
54
+ /** Context7 library id for doc routing, when known (e.g. "/openai/openai-node"). */
55
+ context7_id?: string;
56
+ /** Authoritative docs URL — overrides the scanner's guessed documentation_url. */
57
+ docs_url?: string;
58
+ /** Freshness of this enrichment (see Freshness). */
59
+ freshness: Freshness;
60
+ /** Epoch ms of the last successful upstream check. 0 = never checked. */
61
+ last_checked: number;
62
+ /**
63
+ * Freshness window in ms used for this node (default 7d). Per-node override
64
+ * lets volatile providers (LLM SDKs) re-check more often than stable infra.
65
+ */
66
+ freshness_window_ms: number;
67
+ /** True when this service is in the user's ~/.api-registry/owned.json scope. */
68
+ author_owned?: boolean;
69
+ /** Where the resolution came from, for auditability. */
70
+ resolved_via: 'cache' | 'network';
71
+ }
72
+ /**
73
+ * Additive extension to the existing ComponentHealth block. The resolver writes
74
+ * these alongside the fields NavGator already declares (update_available,
75
+ * update_type) so existing agent-output messaging lights up for free.
76
+ *
77
+ * Merge these keys into the ComponentHealth interface in types.ts (see
78
+ * docs/external-enrichment-fold.md §"Schema delta").
79
+ */
80
+ export interface ExternalHealthExtension {
81
+ /** Version NavGator believes is installed (echo of component.version). */
82
+ installed_version?: string;
83
+ /** Registry the health check ran against. */
84
+ health_source?: EnrichmentRegistry;
85
+ }
86
+ /** Default 7-day freshness window, matching api-registry's contract. */
87
+ export declare const DEFAULT_FRESHNESS_WINDOW_MS: number;
88
+ /** Component types that are external boundary nodes eligible for enrichment. */
89
+ export declare const ENRICHABLE_TYPES: readonly ["npm", "pip", "spm", "cargo", "go", "gem", "composer", "service", "llm", "infra"];
90
+ export type EnrichableType = (typeof ENRICHABLE_TYPES)[number];
91
+ //# sourceMappingURL=external-enrichment.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-enrichment.types.d.ts","sourceRoot":"","sources":["../../src/enrich/external-enrichment.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,sEAAsE;AACtE,MAAM,MAAM,kBAAkB,GAC1B,KAAK,GACL,MAAM,GACN,QAAQ,GACR,OAAO,GACP,IAAI,GACJ,QAAQ,CAAC;AAEb;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,CAAC;AAExE;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,4DAA4D;IAC5D,QAAQ,EAAE,kBAAkB,CAAC;IAE7B,iFAAiF;IACjF,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC;IAEzD,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,oDAAoD;IACpD,SAAS,EAAE,SAAS,CAAC;IAErB,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,wDAAwD;IACxD,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6CAA6C;IAC7C,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACpC;AAED,wEAAwE;AACxE,eAAO,MAAM,2BAA2B,QAA0B,CAAC;AAEnE,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,6FAWnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * External enrichment schema — the "live boundary" layer for NavGator.
3
+ *
4
+ * NavGator's scanners already DETECT external boundary nodes (`service`, `npm`,
5
+ * `spm`, `llm`, `infra`, `config`). What they don't do is RESOLVE them: a bare
6
+ * `npm:openai` node has no canonical identity, current/latest version, release
7
+ * date, authoritative docs, or freshness signal.
8
+ *
9
+ * This module defines the enrichment block that the external-resolver populates
10
+ * onto those nodes. It is the integration-layer twin of the database-profile
11
+ * fold (research plugin), which enriches `database` nodes with live schema/rows.
12
+ * Both folds answer the same question for opposite boundaries: "is this node a
13
+ * monitored, versioned, dated fact, or just a name?"
14
+ *
15
+ * Design rules:
16
+ * - Enrichment is ADDITIVE and OPTIONAL. A component with no `external` block
17
+ * behaves exactly as before. Removing this module degrades gracefully.
18
+ * - Two update axes (see external-resolver.ts):
19
+ * 1. structural — runs inside scan(), offline, from the registry cache.
20
+ * 2. freshness — runs on the 7-day contract, online, file-change-free.
21
+ * - No secrets ever land here. Enrichment is identity + version + docs only.
22
+ */
23
+ /** Default 7-day freshness window, matching api-registry's contract. */
24
+ export const DEFAULT_FRESHNESS_WINDOW_MS = 7 * 24 * 60 * 60 * 1000;
25
+ /** Component types that are external boundary nodes eligible for enrichment. */
26
+ export const ENRICHABLE_TYPES = [
27
+ 'npm',
28
+ 'pip',
29
+ 'spm',
30
+ 'cargo',
31
+ 'go',
32
+ 'gem',
33
+ 'composer',
34
+ 'service',
35
+ 'llm',
36
+ 'infra',
37
+ ];
38
+ //# sourceMappingURL=external-enrichment.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-enrichment.types.js","sourceRoot":"","sources":["../../src/enrich/external-enrichment.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAsFH,wEAAwE;AACxE,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnE,gFAAgF;AAChF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK;IACL,KAAK;IACL,KAAK;IACL,OAAO;IACP,IAAI;IACJ,KAAK;IACL,UAAU;IACV,SAAS;IACT,KAAK;IACL,OAAO;CACC,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * External resolver — the populator that turns NavGator's opaque boundary nodes
3
+ * into live, versioned, dated, doc-linked facts.
4
+ *
5
+ * It has TWO entry points, one per self-update axis:
6
+ *
7
+ * 1. enrichFromCache() — STRUCTURAL axis. Pure-local, offline, fast.
8
+ * Hook: src/scanner.ts, in scan(), just before "Store final state"
9
+ * (~line 1546). Runs every scan over the final deduped component set,
10
+ * stamping cached identity/version/docs. Never touches the network, so it
11
+ * never slows a scan.
12
+ *
13
+ * 2. refreshFreshness() — FRESHNESS axis. Network, time-triggered.
14
+ * Hook: src/scanner.ts autoRefreshIfStale() (~line 2070), plus the
15
+ * SessionStart staleness sweep. Re-checks upstream versions for nodes whose
16
+ * freshness window has elapsed — EVEN WHEN NO FILE CHANGED. This is the
17
+ * axis that makes the map "self-updating on the world changing," not just
18
+ * on the repo changing. Delegate the actual fetch to the external-resolver
19
+ * AGENT (agents/external-resolver.md) so network work runs isolated.
20
+ *
21
+ * Everything here is SELF-CONTAINED inside NavGator: the cache is NavGator's own
22
+ * JSON store (src/enrich/cache.ts → ~/.navgator/enrichment-cache.json) and the
23
+ * fetchers are vendored (src/enrich/fetchers.ts). No api-registry / external
24
+ * plugin dependency. See docs/external-enrichment-fold.md.
25
+ */
26
+ import type { ArchitectureComponent } from '../types.js';
27
+ import { type ExternalEnrichment, type Freshness } from './external-enrichment.types.js';
28
+ import { type EnrichmentCacheFile } from './cache.js';
29
+ /** A cache row from the api-registry registry, keyed by canonical service. */
30
+ export interface RegistryRecord {
31
+ canonical_service: string;
32
+ registry: ExternalEnrichment['registry'];
33
+ package_ids: ExternalEnrichment['package_ids'];
34
+ latest_version?: string;
35
+ latest_released_at?: string;
36
+ context7_id?: string;
37
+ docs_url?: string;
38
+ last_checked: number;
39
+ author_owned?: boolean;
40
+ }
41
+ /** Narrow a component to an enrichable boundary node. */
42
+ export declare function isEnrichable(c: ArchitectureComponent): boolean;
43
+ /**
44
+ * Deterministic freshness from timestamps + version comparison. No network.
45
+ * Exported so it can be unit-tested in isolation (the one piece of real logic).
46
+ */
47
+ export declare function computeFreshness(now: number, enrichment: Pick<ExternalEnrichment, 'last_checked' | 'freshness_window_ms' | 'latest_version'>, installedVersion?: string): Freshness;
48
+ /**
49
+ * STRUCTURAL axis. Stamp every enrichable node from the registry cache.
50
+ * Mutates components in place; returns the count enriched. Offline + sync-fast.
51
+ *
52
+ * @param lookup resolve a component to a cached registry record (or null).
53
+ * Injected so this module never imports the SQLite layer directly.
54
+ */
55
+ export declare function enrichFromCache(components: ArchitectureComponent[], lookup: (c: ArchitectureComponent) => RegistryRecord | null, now: number): number;
56
+ /**
57
+ * FRESHNESS axis. Returns the nodes whose enrichment is overdue and need an
58
+ * upstream re-check. The orchestrator hands this list to the external-resolver
59
+ * AGENT, which fetches latest versions and writes back into the registry cache;
60
+ * the next enrichFromCache() pass then re-stamps the graph. Kept as a SELECTOR
61
+ * (no network here) so the engine stays deterministic and offline-safe.
62
+ */
63
+ export declare function selectStaleForRefresh(components: ArchitectureComponent[], now: number): ArchitectureComponent[];
64
+ /** Report from a freshness refresh pass. */
65
+ export interface RefreshReport {
66
+ checked: number;
67
+ resolved: number;
68
+ unresolved: number;
69
+ cache_updated: number;
70
+ drift: Array<{
71
+ name: string;
72
+ type: string;
73
+ installed?: string;
74
+ latest?: string;
75
+ bump: 'patch' | 'minor' | 'major';
76
+ }>;
77
+ }
78
+ /**
79
+ * FRESHNESS axis (network). Self-contained: vendored fetchers + NavGator's own
80
+ * JSON cache. Resolves overdue/unresolved boundary nodes upstream, upserts the
81
+ * cache, and persists it. Returns a drift report. Called by the external-
82
+ * resolver agent or a `navgator refresh-external` command — NOT by scan().
83
+ *
84
+ * For spm/cargo/go nodes the upstream ref is owner/repo (from repository_url);
85
+ * pass a resolver to derive it, else those nodes stay unresolved.
86
+ */
87
+ export declare function refreshExternal(components: ArchitectureComponent[], cache: EnrichmentCacheFile, now: number, opts?: {
88
+ force?: boolean;
89
+ githubRefOf?: (c: ArchitectureComponent) => string | null;
90
+ }): Promise<RefreshReport>;
91
+ /** Best-effort owner/repo from a repository URL. */
92
+ export declare function deriveOwnerRepo(repoUrl?: string): string | null;
93
+ /** semver-ish bump classification; falls back to 'minor' when unparseable. */
94
+ export declare function classifyBump(from: string | undefined, to: string): 'patch' | 'minor' | 'major';
95
+ //# sourceMappingURL=external-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-resolver.d.ts","sourceRoot":"","sources":["../../src/enrich/external-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,SAAS,EAIf,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,KAAK,mBAAmB,EAIzB,MAAM,YAAY,CAAC;AAGpB,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACzC,WAAW,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAE9D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,IAAI,CACd,kBAAkB,EAClB,cAAc,GAAG,qBAAqB,GAAG,gBAAgB,CAC1D,EACD,gBAAgB,CAAC,EAAE,MAAM,GACxB,SAAS,CAUX;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,qBAAqB,EAAE,EACnC,MAAM,EAAE,CAAC,CAAC,EAAE,qBAAqB,KAAK,cAAc,GAAG,IAAI,EAC3D,GAAG,EAAE,MAAM,GACV,MAAM,CA0CR;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,qBAAqB,EAAE,EACnC,GAAG,EAAE,MAAM,GACV,qBAAqB,EAAE,CAMzB;AAED,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;KACnC,CAAC,CAAC;CACJ;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,qBAAqB,KAAK,MAAM,GAAG,IAAI,CAAA;CAAO,GACxF,OAAO,CAAC,aAAa,CAAC,CA2DxB;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI/D;AAaD,8EAA8E;AAC9E,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,EAAE,EAAE,MAAM,GACT,OAAO,GAAG,OAAO,GAAG,OAAO,CAO7B"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * External resolver — the populator that turns NavGator's opaque boundary nodes
3
+ * into live, versioned, dated, doc-linked facts.
4
+ *
5
+ * It has TWO entry points, one per self-update axis:
6
+ *
7
+ * 1. enrichFromCache() — STRUCTURAL axis. Pure-local, offline, fast.
8
+ * Hook: src/scanner.ts, in scan(), just before "Store final state"
9
+ * (~line 1546). Runs every scan over the final deduped component set,
10
+ * stamping cached identity/version/docs. Never touches the network, so it
11
+ * never slows a scan.
12
+ *
13
+ * 2. refreshFreshness() — FRESHNESS axis. Network, time-triggered.
14
+ * Hook: src/scanner.ts autoRefreshIfStale() (~line 2070), plus the
15
+ * SessionStart staleness sweep. Re-checks upstream versions for nodes whose
16
+ * freshness window has elapsed — EVEN WHEN NO FILE CHANGED. This is the
17
+ * axis that makes the map "self-updating on the world changing," not just
18
+ * on the repo changing. Delegate the actual fetch to the external-resolver
19
+ * AGENT (agents/external-resolver.md) so network work runs isolated.
20
+ *
21
+ * Everything here is SELF-CONTAINED inside NavGator: the cache is NavGator's own
22
+ * JSON store (src/enrich/cache.ts → ~/.navgator/enrichment-cache.json) and the
23
+ * fetchers are vendored (src/enrich/fetchers.ts). No api-registry / external
24
+ * plugin dependency. See docs/external-enrichment-fold.md.
25
+ */
26
+ import { DEFAULT_FRESHNESS_WINDOW_MS, ENRICHABLE_TYPES, } from './external-enrichment.types.js';
27
+ import { ecosystemFor, upsertRecord, saveCache, } from './cache.js';
28
+ import { fetchLatest } from './fetchers.js';
29
+ /** Narrow a component to an enrichable boundary node. */
30
+ export function isEnrichable(c) {
31
+ return ENRICHABLE_TYPES.includes(c.type);
32
+ }
33
+ /**
34
+ * Deterministic freshness from timestamps + version comparison. No network.
35
+ * Exported so it can be unit-tested in isolation (the one piece of real logic).
36
+ */
37
+ export function computeFreshness(now, enrichment, installedVersion) {
38
+ if (!enrichment.last_checked)
39
+ return 'unresolved';
40
+ const elapsed = now - enrichment.last_checked;
41
+ const overdue = elapsed > enrichment.freshness_window_ms;
42
+ const newerExists = !!installedVersion &&
43
+ !!enrichment.latest_version &&
44
+ installedVersion !== enrichment.latest_version;
45
+ if (newerExists)
46
+ return 'stale';
47
+ return overdue ? 'drifting' : 'current';
48
+ }
49
+ /**
50
+ * STRUCTURAL axis. Stamp every enrichable node from the registry cache.
51
+ * Mutates components in place; returns the count enriched. Offline + sync-fast.
52
+ *
53
+ * @param lookup resolve a component to a cached registry record (or null).
54
+ * Injected so this module never imports the SQLite layer directly.
55
+ */
56
+ export function enrichFromCache(components, lookup, now) {
57
+ let enriched = 0;
58
+ for (const c of components) {
59
+ if (!isEnrichable(c))
60
+ continue;
61
+ const rec = lookup(c);
62
+ if (!rec) {
63
+ // Detected but unknown to the registry — mark unresolved so the freshness
64
+ // sweep / agent knows to attempt a network resolve later.
65
+ c.external = unresolvedEnrichment(c.type);
66
+ continue;
67
+ }
68
+ const enrichment = {
69
+ canonical_service: rec.canonical_service,
70
+ registry: rec.registry,
71
+ package_ids: rec.package_ids,
72
+ latest_version: rec.latest_version,
73
+ latest_released_at: rec.latest_released_at,
74
+ context7_id: rec.context7_id,
75
+ docs_url: rec.docs_url,
76
+ last_checked: rec.last_checked,
77
+ freshness_window_ms: DEFAULT_FRESHNESS_WINDOW_MS,
78
+ author_owned: rec.author_owned,
79
+ resolved_via: 'cache',
80
+ freshness: 'unresolved', // set below
81
+ };
82
+ enrichment.freshness = computeFreshness(now, enrichment, c.version);
83
+ c.external = enrichment;
84
+ // Light up the health fields NavGator ALREADY consumes in agent-output.ts.
85
+ if (enrichment.freshness === 'stale' && rec.latest_version) {
86
+ c.status = c.status === 'active' ? 'outdated' : c.status;
87
+ c.health = {
88
+ ...(c.health ?? { last_audit: now }),
89
+ last_audit: now,
90
+ update_available: rec.latest_version,
91
+ update_type: classifyBump(c.version, rec.latest_version),
92
+ };
93
+ }
94
+ if (rec.docs_url)
95
+ c.documentation_url = rec.docs_url;
96
+ enriched++;
97
+ }
98
+ return enriched;
99
+ }
100
+ /**
101
+ * FRESHNESS axis. Returns the nodes whose enrichment is overdue and need an
102
+ * upstream re-check. The orchestrator hands this list to the external-resolver
103
+ * AGENT, which fetches latest versions and writes back into the registry cache;
104
+ * the next enrichFromCache() pass then re-stamps the graph. Kept as a SELECTOR
105
+ * (no network here) so the engine stays deterministic and offline-safe.
106
+ */
107
+ export function selectStaleForRefresh(components, now) {
108
+ return components.filter((c) => {
109
+ if (!isEnrichable(c) || !c.external)
110
+ return isEnrichable(c); // never-resolved → refresh
111
+ const f = computeFreshness(now, c.external, c.version);
112
+ return f === 'drifting' || f === 'unresolved';
113
+ });
114
+ }
115
+ /**
116
+ * FRESHNESS axis (network). Self-contained: vendored fetchers + NavGator's own
117
+ * JSON cache. Resolves overdue/unresolved boundary nodes upstream, upserts the
118
+ * cache, and persists it. Returns a drift report. Called by the external-
119
+ * resolver agent or a `navgator refresh-external` command — NOT by scan().
120
+ *
121
+ * For spm/cargo/go nodes the upstream ref is owner/repo (from repository_url);
122
+ * pass a resolver to derive it, else those nodes stay unresolved.
123
+ */
124
+ export async function refreshExternal(components, cache, now, opts = {}) {
125
+ const report = {
126
+ checked: 0,
127
+ resolved: 0,
128
+ unresolved: 0,
129
+ cache_updated: 0,
130
+ drift: [],
131
+ };
132
+ const targets = opts.force
133
+ ? components.filter(isEnrichable)
134
+ : selectStaleForRefresh(components, now);
135
+ for (const c of targets) {
136
+ report.checked++;
137
+ const eco = ecosystemFor(c.type);
138
+ let ref = c.name;
139
+ let registry = null;
140
+ if (eco === 'npm')
141
+ registry = 'npm';
142
+ else if (eco === 'pypi')
143
+ registry = 'pypi';
144
+ else if (eco === 'github') {
145
+ registry = 'github';
146
+ ref = opts.githubRefOf?.(c) ?? deriveOwnerRepo(c.repository_url);
147
+ }
148
+ else {
149
+ // service/llm/infra/manual — no auto-source; leave to curated cache.
150
+ report.unresolved++;
151
+ continue;
152
+ }
153
+ if (!registry || !ref) {
154
+ report.unresolved++;
155
+ continue;
156
+ }
157
+ const latest = await fetchLatest(registry, ref);
158
+ if (!latest?.version) {
159
+ report.unresolved++;
160
+ continue;
161
+ }
162
+ report.resolved++;
163
+ upsertRecord(cache, c.type, c.name, {
164
+ canonical_service: c.name,
165
+ registry: eco,
166
+ package_ids: { [eco]: c.name },
167
+ latest_version: latest.version,
168
+ latest_released_at: latest.released_at,
169
+ docs_url: latest.docs_url,
170
+ last_checked: now,
171
+ });
172
+ report.cache_updated++;
173
+ if (c.version && c.version !== latest.version) {
174
+ report.drift.push({
175
+ name: c.name,
176
+ type: c.type,
177
+ installed: c.version,
178
+ latest: latest.version,
179
+ bump: classifyBump(c.version, latest.version),
180
+ });
181
+ }
182
+ }
183
+ if (report.cache_updated > 0)
184
+ saveCache(cache);
185
+ return report;
186
+ }
187
+ /** Best-effort owner/repo from a repository URL. */
188
+ export function deriveOwnerRepo(repoUrl) {
189
+ if (!repoUrl)
190
+ return null;
191
+ const m = repoUrl.match(/github\.com[/:]([^/]+\/[^/.]+)/i);
192
+ return m ? m[1] : null;
193
+ }
194
+ function unresolvedEnrichment(_type) {
195
+ return {
196
+ registry: 'manual',
197
+ package_ids: {},
198
+ freshness: 'unresolved',
199
+ last_checked: 0,
200
+ freshness_window_ms: DEFAULT_FRESHNESS_WINDOW_MS,
201
+ resolved_via: 'cache',
202
+ };
203
+ }
204
+ /** semver-ish bump classification; falls back to 'minor' when unparseable. */
205
+ export function classifyBump(from, to) {
206
+ const a = parseSemver(from);
207
+ const b = parseSemver(to);
208
+ if (!a || !b)
209
+ return 'minor';
210
+ if (b[0] > a[0])
211
+ return 'major';
212
+ if (b[1] > a[1])
213
+ return 'minor';
214
+ return 'patch';
215
+ }
216
+ function parseSemver(v) {
217
+ if (!v)
218
+ return null;
219
+ const m = v.replace(/^[^\d]*/, '').match(/^(\d+)\.(\d+)\.(\d+)/);
220
+ return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : null;
221
+ }
222
+ //# sourceMappingURL=external-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-resolver.js","sourceRoot":"","sources":["../../src/enrich/external-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Vendored, dependency-free upstream version fetchers for NavGator.
3
+ *
4
+ * Self-contained: uses the global `fetch` (Node ≥18) — no axios, no api-registry
5
+ * import. These are the ONLY network calls in the enrichment fold, and they run
6
+ * exclusively on the freshness path (refreshExternal / the external-resolver
7
+ * agent), never inside scan(). The engine stays offline and deterministic.
8
+ *
9
+ * Equivalent to api-registry/src/http.ts's fetchers, re-implemented here so
10
+ * NavGator carries no cross-plugin dependency.
11
+ */
12
+ export interface LatestVersion {
13
+ version?: string;
14
+ released_at?: string;
15
+ docs_url?: string;
16
+ repo_url?: string;
17
+ }
18
+ /** npm: latest dist-tag + publish time. */
19
+ export declare function fetchNpmLatest(pkg: string): Promise<LatestVersion | null>;
20
+ /** PyPI: latest version + release date. */
21
+ export declare function fetchPypiLatest(pkg: string): Promise<LatestVersion | null>;
22
+ /**
23
+ * GitHub Releases: latest tag + publish date for `owner/repo`.
24
+ * Used for spm/cargo/go nodes that expose versions via tags, not a registry.
25
+ * Honors GITHUB_TOKEN when present to avoid the 60/hr unauthenticated limit.
26
+ */
27
+ export declare function fetchGitHubLatest(ownerRepo: string): Promise<LatestVersion | null>;
28
+ /** Dispatch by ecosystem. `ref` is a package name, or owner/repo for github. */
29
+ export declare function fetchLatest(registry: 'npm' | 'pypi' | 'github', ref: string): Promise<LatestVersion | null>;
30
+ //# sourceMappingURL=fetchers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchers.d.ts","sourceRoot":"","sources":["../../src/enrich/fetchers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkBD,2CAA2C;AAC3C,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAiB/E;AAED,2CAA2C;AAC3C,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAmBhF;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAexF;AAED,gFAAgF;AAChF,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,EACnC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAW/B"}