@tyroneross/navgator 0.2.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +21 -7
  3. package/.claude-plugin/plugin.json +16 -11
  4. package/.codex-plugin/plugin.json +31 -0
  5. package/.mcp.json +8 -0
  6. package/CLAUDE.md +197 -23
  7. package/LICENSE +202 -21
  8. package/README.md +220 -33
  9. package/agents/architecture-advisor.md +6 -2
  10. package/agents/architecture-investigator.md +163 -0
  11. package/agents/architecture-planner.md +160 -0
  12. package/agents/external-resolver.md +97 -0
  13. package/dist/__tests__/agent-output.test.d.ts +5 -0
  14. package/dist/__tests__/agent-output.test.d.ts.map +1 -0
  15. package/dist/__tests__/agent-output.test.js +233 -0
  16. package/dist/__tests__/agent-output.test.js.map +1 -0
  17. package/dist/__tests__/architecture-insights-stack.test.d.ts +21 -0
  18. package/dist/__tests__/architecture-insights-stack.test.d.ts.map +1 -0
  19. package/dist/__tests__/architecture-insights-stack.test.js +86 -0
  20. package/dist/__tests__/architecture-insights-stack.test.js.map +1 -0
  21. package/dist/__tests__/architecture-insights.test.d.ts +2 -0
  22. package/dist/__tests__/architecture-insights.test.d.ts.map +1 -0
  23. package/dist/__tests__/architecture-insights.test.js +46 -0
  24. package/dist/__tests__/architecture-insights.test.js.map +1 -0
  25. package/dist/__tests__/audit-sampler.test.d.ts +10 -0
  26. package/dist/__tests__/audit-sampler.test.d.ts.map +1 -0
  27. package/dist/__tests__/audit-sampler.test.js +172 -0
  28. package/dist/__tests__/audit-sampler.test.js.map +1 -0
  29. package/dist/__tests__/audit-spc.test.d.ts +5 -0
  30. package/dist/__tests__/audit-spc.test.d.ts.map +1 -0
  31. package/dist/__tests__/audit-spc.test.js +94 -0
  32. package/dist/__tests__/audit-spc.test.js.map +1 -0
  33. package/dist/__tests__/audit-verifiers.test.d.ts +5 -0
  34. package/dist/__tests__/audit-verifiers.test.d.ts.map +1 -0
  35. package/dist/__tests__/audit-verifiers.test.js +248 -0
  36. package/dist/__tests__/audit-verifiers.test.js.map +1 -0
  37. package/dist/__tests__/auto-refresh.test.d.ts +12 -0
  38. package/dist/__tests__/auto-refresh.test.d.ts.map +1 -0
  39. package/dist/__tests__/auto-refresh.test.js +236 -0
  40. package/dist/__tests__/auto-refresh.test.js.map +1 -0
  41. package/dist/__tests__/bare-imports.test.d.ts +8 -0
  42. package/dist/__tests__/bare-imports.test.d.ts.map +1 -0
  43. package/dist/__tests__/bare-imports.test.js +176 -0
  44. package/dist/__tests__/bare-imports.test.js.map +1 -0
  45. package/dist/__tests__/classify.test.d.ts +5 -0
  46. package/dist/__tests__/classify.test.d.ts.map +1 -0
  47. package/dist/__tests__/classify.test.js +158 -0
  48. package/dist/__tests__/classify.test.js.map +1 -0
  49. package/dist/__tests__/cli-commands.test.d.ts +8 -0
  50. package/dist/__tests__/cli-commands.test.d.ts.map +1 -0
  51. package/dist/__tests__/cli-commands.test.js +207 -0
  52. package/dist/__tests__/cli-commands.test.js.map +1 -0
  53. package/dist/__tests__/consolidated-readers.test.d.ts +23 -0
  54. package/dist/__tests__/consolidated-readers.test.d.ts.map +1 -0
  55. package/dist/__tests__/consolidated-readers.test.js +200 -0
  56. package/dist/__tests__/consolidated-readers.test.js.map +1 -0
  57. package/dist/__tests__/coverage.test.d.ts +5 -0
  58. package/dist/__tests__/coverage.test.d.ts.map +1 -0
  59. package/dist/__tests__/coverage.test.js +120 -0
  60. package/dist/__tests__/coverage.test.js.map +1 -0
  61. package/dist/__tests__/deploy-scanner-runtime.test.d.ts +6 -0
  62. package/dist/__tests__/deploy-scanner-runtime.test.d.ts.map +1 -0
  63. package/dist/__tests__/deploy-scanner-runtime.test.js +168 -0
  64. package/dist/__tests__/deploy-scanner-runtime.test.js.map +1 -0
  65. package/dist/__tests__/env-scanner.test.d.ts +2 -0
  66. package/dist/__tests__/env-scanner.test.d.ts.map +1 -0
  67. package/dist/__tests__/env-scanner.test.js +191 -0
  68. package/dist/__tests__/env-scanner.test.js.map +1 -0
  69. package/dist/__tests__/freshness/cli-freshness.test.d.ts +2 -0
  70. package/dist/__tests__/freshness/cli-freshness.test.d.ts.map +1 -0
  71. package/dist/__tests__/freshness/cli-freshness.test.js +26 -0
  72. package/dist/__tests__/freshness/cli-freshness.test.js.map +1 -0
  73. package/dist/__tests__/freshness/dirty-ledger.test.d.ts +2 -0
  74. package/dist/__tests__/freshness/dirty-ledger.test.d.ts.map +1 -0
  75. package/dist/__tests__/freshness/dirty-ledger.test.js +39 -0
  76. package/dist/__tests__/freshness/dirty-ledger.test.js.map +1 -0
  77. package/dist/__tests__/freshness/drainer.test.d.ts +2 -0
  78. package/dist/__tests__/freshness/drainer.test.d.ts.map +1 -0
  79. package/dist/__tests__/freshness/drainer.test.js +103 -0
  80. package/dist/__tests__/freshness/drainer.test.js.map +1 -0
  81. package/dist/__tests__/freshness/paths.test.d.ts +2 -0
  82. package/dist/__tests__/freshness/paths.test.d.ts.map +1 -0
  83. package/dist/__tests__/freshness/paths.test.js +19 -0
  84. package/dist/__tests__/freshness/paths.test.js.map +1 -0
  85. package/dist/__tests__/freshness/scan-lock.test.d.ts +2 -0
  86. package/dist/__tests__/freshness/scan-lock.test.d.ts.map +1 -0
  87. package/dist/__tests__/freshness/scan-lock.test.js +40 -0
  88. package/dist/__tests__/freshness/scan-lock.test.js.map +1 -0
  89. package/dist/__tests__/freshness/stamp.test.d.ts +2 -0
  90. package/dist/__tests__/freshness/stamp.test.d.ts.map +1 -0
  91. package/dist/__tests__/freshness/stamp.test.js +36 -0
  92. package/dist/__tests__/freshness/stamp.test.js.map +1 -0
  93. package/dist/__tests__/gitignore-safety.test.d.ts +2 -0
  94. package/dist/__tests__/gitignore-safety.test.d.ts.map +1 -0
  95. package/dist/__tests__/gitignore-safety.test.js +110 -0
  96. package/dist/__tests__/gitignore-safety.test.js.map +1 -0
  97. package/dist/__tests__/helpers.d.ts +37 -0
  98. package/dist/__tests__/helpers.d.ts.map +1 -0
  99. package/dist/__tests__/helpers.js +134 -0
  100. package/dist/__tests__/helpers.js.map +1 -0
  101. package/dist/__tests__/impact.test.d.ts +5 -0
  102. package/dist/__tests__/impact.test.d.ts.map +1 -0
  103. package/dist/__tests__/impact.test.js +221 -0
  104. package/dist/__tests__/impact.test.js.map +1 -0
  105. package/dist/__tests__/lessons-store.test.d.ts +8 -0
  106. package/dist/__tests__/lessons-store.test.d.ts.map +1 -0
  107. package/dist/__tests__/lessons-store.test.js +232 -0
  108. package/dist/__tests__/lessons-store.test.js.map +1 -0
  109. package/dist/__tests__/llm-dedup.test.d.ts +2 -0
  110. package/dist/__tests__/llm-dedup.test.d.ts.map +1 -0
  111. package/dist/__tests__/llm-dedup.test.js +155 -0
  112. package/dist/__tests__/llm-dedup.test.js.map +1 -0
  113. package/dist/__tests__/mjs-frontend-fetch.test.d.ts +19 -0
  114. package/dist/__tests__/mjs-frontend-fetch.test.d.ts.map +1 -0
  115. package/dist/__tests__/mjs-frontend-fetch.test.js +179 -0
  116. package/dist/__tests__/mjs-frontend-fetch.test.js.map +1 -0
  117. package/dist/__tests__/multi-stack-discovery.test.d.ts +11 -0
  118. package/dist/__tests__/multi-stack-discovery.test.d.ts.map +1 -0
  119. package/dist/__tests__/multi-stack-discovery.test.js +75 -0
  120. package/dist/__tests__/multi-stack-discovery.test.js.map +1 -0
  121. package/dist/__tests__/per-entity-files-gate.test.d.ts +22 -0
  122. package/dist/__tests__/per-entity-files-gate.test.d.ts.map +1 -0
  123. package/dist/__tests__/per-entity-files-gate.test.js +160 -0
  124. package/dist/__tests__/per-entity-files-gate.test.js.map +1 -0
  125. package/dist/__tests__/prisma-calls.test.d.ts +2 -0
  126. package/dist/__tests__/prisma-calls.test.d.ts.map +1 -0
  127. package/dist/__tests__/prisma-calls.test.js +125 -0
  128. package/dist/__tests__/prisma-calls.test.js.map +1 -0
  129. package/dist/__tests__/prisma-parser.test.d.ts +2 -0
  130. package/dist/__tests__/prisma-parser.test.d.ts.map +1 -0
  131. package/dist/__tests__/prisma-parser.test.js +252 -0
  132. package/dist/__tests__/prisma-parser.test.js.map +1 -0
  133. package/dist/__tests__/prompt-detector.test.d.ts +5 -0
  134. package/dist/__tests__/prompt-detector.test.d.ts.map +1 -0
  135. package/dist/__tests__/prompt-detector.test.js +75 -0
  136. package/dist/__tests__/prompt-detector.test.js.map +1 -0
  137. package/dist/__tests__/queue-scanner.test.d.ts +5 -0
  138. package/dist/__tests__/queue-scanner.test.d.ts.map +1 -0
  139. package/dist/__tests__/queue-scanner.test.js +85 -0
  140. package/dist/__tests__/queue-scanner.test.js.map +1 -0
  141. package/dist/__tests__/resolve.test.d.ts +5 -0
  142. package/dist/__tests__/resolve.test.d.ts.map +1 -0
  143. package/dist/__tests__/resolve.test.js +196 -0
  144. package/dist/__tests__/resolve.test.js.map +1 -0
  145. package/dist/__tests__/rules.test.d.ts +2 -0
  146. package/dist/__tests__/rules.test.d.ts.map +1 -0
  147. package/dist/__tests__/rules.test.js +343 -0
  148. package/dist/__tests__/rules.test.js.map +1 -0
  149. package/dist/__tests__/sandbox.test.d.ts +5 -0
  150. package/dist/__tests__/sandbox.test.d.ts.map +1 -0
  151. package/dist/__tests__/sandbox.test.js +189 -0
  152. package/dist/__tests__/sandbox.test.js.map +1 -0
  153. package/dist/__tests__/scanner-audit.test.d.ts +9 -0
  154. package/dist/__tests__/scanner-audit.test.d.ts.map +1 -0
  155. package/dist/__tests__/scanner-audit.test.js +64 -0
  156. package/dist/__tests__/scanner-audit.test.js.map +1 -0
  157. package/dist/__tests__/scanner-characterization.test.d.ts +16 -0
  158. package/dist/__tests__/scanner-characterization.test.d.ts.map +1 -0
  159. package/dist/__tests__/scanner-characterization.test.js +167 -0
  160. package/dist/__tests__/scanner-characterization.test.js.map +1 -0
  161. package/dist/__tests__/scanner-incremental.test.d.ts +13 -0
  162. package/dist/__tests__/scanner-incremental.test.d.ts.map +1 -0
  163. package/dist/__tests__/scanner-incremental.test.js +725 -0
  164. package/dist/__tests__/scanner-incremental.test.js.map +1 -0
  165. package/dist/__tests__/scanner-integration.test.d.ts +7 -0
  166. package/dist/__tests__/scanner-integration.test.d.ts.map +1 -0
  167. package/dist/__tests__/scanner-integration.test.js +211 -0
  168. package/dist/__tests__/scanner-integration.test.js.map +1 -0
  169. package/dist/__tests__/scip-new-catches.test.d.ts +19 -0
  170. package/dist/__tests__/scip-new-catches.test.d.ts.map +1 -0
  171. package/dist/__tests__/scip-new-catches.test.js +90 -0
  172. package/dist/__tests__/scip-new-catches.test.js.map +1 -0
  173. package/dist/__tests__/subgraph.test.d.ts +5 -0
  174. package/dist/__tests__/subgraph.test.d.ts.map +1 -0
  175. package/dist/__tests__/subgraph.test.js +145 -0
  176. package/dist/__tests__/subgraph.test.js.map +1 -0
  177. package/dist/__tests__/trace.test.d.ts +5 -0
  178. package/dist/__tests__/trace.test.d.ts.map +1 -0
  179. package/dist/__tests__/trace.test.js +221 -0
  180. package/dist/__tests__/trace.test.js.map +1 -0
  181. package/dist/agent-output.d.ts +16 -0
  182. package/dist/agent-output.d.ts.map +1 -0
  183. package/dist/agent-output.js +142 -0
  184. package/dist/agent-output.js.map +1 -0
  185. package/dist/architecture-insights.d.ts +17 -0
  186. package/dist/architecture-insights.d.ts.map +1 -0
  187. package/dist/architecture-insights.js +178 -0
  188. package/dist/architecture-insights.js.map +1 -0
  189. package/dist/audit/index.d.ts +69 -0
  190. package/dist/audit/index.d.ts.map +1 -0
  191. package/dist/audit/index.js +255 -0
  192. package/dist/audit/index.js.map +1 -0
  193. package/dist/audit/sampler.d.ts +98 -0
  194. package/dist/audit/sampler.d.ts.map +1 -0
  195. package/dist/audit/sampler.js +298 -0
  196. package/dist/audit/sampler.js.map +1 -0
  197. package/dist/audit/spc.d.ts +62 -0
  198. package/dist/audit/spc.d.ts.map +1 -0
  199. package/dist/audit/spc.js +81 -0
  200. package/dist/audit/spc.js.map +1 -0
  201. package/dist/audit/verifiers.d.ts +81 -0
  202. package/dist/audit/verifiers.d.ts.map +1 -0
  203. package/dist/audit/verifiers.js +366 -0
  204. package/dist/audit/verifiers.js.map +1 -0
  205. package/dist/classify.d.ts +19 -0
  206. package/dist/classify.d.ts.map +1 -0
  207. package/dist/classify.js +124 -0
  208. package/dist/classify.js.map +1 -0
  209. package/dist/cli/commands/connections.d.ts +3 -0
  210. package/dist/cli/commands/connections.d.ts.map +1 -0
  211. package/dist/cli/commands/connections.js +125 -0
  212. package/dist/cli/commands/connections.js.map +1 -0
  213. package/dist/cli/commands/coverage.d.ts +3 -0
  214. package/dist/cli/commands/coverage.d.ts.map +1 -0
  215. package/dist/cli/commands/coverage.js +94 -0
  216. package/dist/cli/commands/coverage.js.map +1 -0
  217. package/dist/cli/commands/dead.d.ts +3 -0
  218. package/dist/cli/commands/dead.d.ts.map +1 -0
  219. package/dist/cli/commands/dead.js +80 -0
  220. package/dist/cli/commands/dead.js.map +1 -0
  221. package/dist/cli/commands/diagram.d.ts +3 -0
  222. package/dist/cli/commands/diagram.d.ts.map +1 -0
  223. package/dist/cli/commands/diagram.js +102 -0
  224. package/dist/cli/commands/diagram.js.map +1 -0
  225. package/dist/cli/commands/find.d.ts +3 -0
  226. package/dist/cli/commands/find.d.ts.map +1 -0
  227. package/dist/cli/commands/find.js +128 -0
  228. package/dist/cli/commands/find.js.map +1 -0
  229. package/dist/cli/commands/freshness.d.ts +20 -0
  230. package/dist/cli/commands/freshness.d.ts.map +1 -0
  231. package/dist/cli/commands/freshness.js +90 -0
  232. package/dist/cli/commands/freshness.js.map +1 -0
  233. package/dist/cli/commands/helpers.d.ts +7 -0
  234. package/dist/cli/commands/helpers.d.ts.map +1 -0
  235. package/dist/cli/commands/helpers.js +30 -0
  236. package/dist/cli/commands/helpers.js.map +1 -0
  237. package/dist/cli/commands/impact.d.ts +3 -0
  238. package/dist/cli/commands/impact.d.ts.map +1 -0
  239. package/dist/cli/commands/impact.js +172 -0
  240. package/dist/cli/commands/impact.js.map +1 -0
  241. package/dist/cli/commands/lessons.d.ts +6 -0
  242. package/dist/cli/commands/lessons.d.ts.map +1 -0
  243. package/dist/cli/commands/lessons.js +279 -0
  244. package/dist/cli/commands/lessons.js.map +1 -0
  245. package/dist/cli/commands/list.d.ts +3 -0
  246. package/dist/cli/commands/list.d.ts.map +1 -0
  247. package/dist/cli/commands/list.js +91 -0
  248. package/dist/cli/commands/list.js.map +1 -0
  249. package/dist/cli/commands/llm-map.d.ts +3 -0
  250. package/dist/cli/commands/llm-map.d.ts.map +1 -0
  251. package/dist/cli/commands/llm-map.js +121 -0
  252. package/dist/cli/commands/llm-map.js.map +1 -0
  253. package/dist/cli/commands/misc.d.ts +17 -0
  254. package/dist/cli/commands/misc.d.ts.map +1 -0
  255. package/dist/cli/commands/misc.js +495 -0
  256. package/dist/cli/commands/misc.js.map +1 -0
  257. package/dist/cli/commands/prompts.d.ts +3 -0
  258. package/dist/cli/commands/prompts.d.ts.map +1 -0
  259. package/dist/cli/commands/prompts.js +74 -0
  260. package/dist/cli/commands/prompts.js.map +1 -0
  261. package/dist/cli/commands/rules.d.ts +3 -0
  262. package/dist/cli/commands/rules.d.ts.map +1 -0
  263. package/dist/cli/commands/rules.js +61 -0
  264. package/dist/cli/commands/rules.js.map +1 -0
  265. package/dist/cli/commands/scan.d.ts +3 -0
  266. package/dist/cli/commands/scan.d.ts.map +1 -0
  267. package/dist/cli/commands/scan.js +177 -0
  268. package/dist/cli/commands/scan.js.map +1 -0
  269. package/dist/cli/commands/schema.d.ts +3 -0
  270. package/dist/cli/commands/schema.d.ts.map +1 -0
  271. package/dist/cli/commands/schema.js +126 -0
  272. package/dist/cli/commands/schema.js.map +1 -0
  273. package/dist/cli/commands/status.d.ts +3 -0
  274. package/dist/cli/commands/status.d.ts.map +1 -0
  275. package/dist/cli/commands/status.js +340 -0
  276. package/dist/cli/commands/status.js.map +1 -0
  277. package/dist/cli/commands/subgraph.d.ts +3 -0
  278. package/dist/cli/commands/subgraph.d.ts.map +1 -0
  279. package/dist/cli/commands/subgraph.js +55 -0
  280. package/dist/cli/commands/subgraph.js.map +1 -0
  281. package/dist/cli/commands/temporal.d.ts +3 -0
  282. package/dist/cli/commands/temporal.d.ts.map +1 -0
  283. package/dist/cli/commands/temporal.js +112 -0
  284. package/dist/cli/commands/temporal.js.map +1 -0
  285. package/dist/cli/commands/trace.d.ts +3 -0
  286. package/dist/cli/commands/trace.d.ts.map +1 -0
  287. package/dist/cli/commands/trace.js +65 -0
  288. package/dist/cli/commands/trace.js.map +1 -0
  289. package/dist/cli/index.js +88 -825
  290. package/dist/cli/index.js.map +1 -1
  291. package/dist/config.d.ts +13 -2
  292. package/dist/config.d.ts.map +1 -1
  293. package/dist/config.js +106 -12
  294. package/dist/config.js.map +1 -1
  295. package/dist/coverage.d.ts +37 -0
  296. package/dist/coverage.d.ts.map +1 -0
  297. package/dist/coverage.js +177 -0
  298. package/dist/coverage.js.map +1 -0
  299. package/dist/diagram.d.ts.map +1 -1
  300. package/dist/diagram.js +41 -0
  301. package/dist/diagram.js.map +1 -1
  302. package/dist/diff.d.ts +57 -0
  303. package/dist/diff.d.ts.map +1 -0
  304. package/dist/diff.js +527 -0
  305. package/dist/diff.js.map +1 -0
  306. package/dist/enrich/cache.d.ts +41 -0
  307. package/dist/enrich/cache.d.ts.map +1 -0
  308. package/dist/enrich/cache.js +97 -0
  309. package/dist/enrich/cache.js.map +1 -0
  310. package/dist/enrich/external-enrichment.types.d.ts +91 -0
  311. package/dist/enrich/external-enrichment.types.d.ts.map +1 -0
  312. package/dist/enrich/external-enrichment.types.js +38 -0
  313. package/dist/enrich/external-enrichment.types.js.map +1 -0
  314. package/dist/enrich/external-resolver.d.ts +95 -0
  315. package/dist/enrich/external-resolver.d.ts.map +1 -0
  316. package/dist/enrich/external-resolver.js +222 -0
  317. package/dist/enrich/external-resolver.js.map +1 -0
  318. package/dist/enrich/fetchers.d.ts +30 -0
  319. package/dist/enrich/fetchers.d.ts.map +1 -0
  320. package/dist/enrich/fetchers.js +89 -0
  321. package/dist/enrich/fetchers.js.map +1 -0
  322. package/dist/file-resolve.d.ts +35 -0
  323. package/dist/file-resolve.d.ts.map +1 -0
  324. package/dist/file-resolve.js +159 -0
  325. package/dist/file-resolve.js.map +1 -0
  326. package/dist/freshness/dirty-ledger.d.ts +7 -0
  327. package/dist/freshness/dirty-ledger.d.ts.map +1 -0
  328. package/dist/freshness/dirty-ledger.js +56 -0
  329. package/dist/freshness/dirty-ledger.js.map +1 -0
  330. package/dist/freshness/drainer.d.ts +38 -0
  331. package/dist/freshness/drainer.d.ts.map +1 -0
  332. package/dist/freshness/drainer.js +88 -0
  333. package/dist/freshness/drainer.js.map +1 -0
  334. package/dist/freshness/paths.d.ts +9 -0
  335. package/dist/freshness/paths.d.ts.map +1 -0
  336. package/dist/freshness/paths.js +24 -0
  337. package/dist/freshness/paths.js.map +1 -0
  338. package/dist/freshness/scan-lock.d.ts +8 -0
  339. package/dist/freshness/scan-lock.d.ts.map +1 -0
  340. package/dist/freshness/scan-lock.js +68 -0
  341. package/dist/freshness/scan-lock.js.map +1 -0
  342. package/dist/freshness/stamp.d.ts +25 -0
  343. package/dist/freshness/stamp.d.ts.map +1 -0
  344. package/dist/freshness/stamp.js +50 -0
  345. package/dist/freshness/stamp.js.map +1 -0
  346. package/dist/git.d.ts +12 -0
  347. package/dist/git.d.ts.map +1 -0
  348. package/dist/git.js +42 -0
  349. package/dist/git.js.map +1 -0
  350. package/dist/gitignore-safety.d.ts +41 -0
  351. package/dist/gitignore-safety.d.ts.map +1 -0
  352. package/dist/gitignore-safety.js +107 -0
  353. package/dist/gitignore-safety.js.map +1 -0
  354. package/dist/impact.d.ts +20 -0
  355. package/dist/impact.d.ts.map +1 -0
  356. package/dist/impact.js +89 -0
  357. package/dist/impact.js.map +1 -0
  358. package/dist/index.d.ts +24 -2
  359. package/dist/index.d.ts.map +1 -1
  360. package/dist/index.js +31 -1
  361. package/dist/index.js.map +1 -1
  362. package/dist/lessons-store.d.ts +93 -0
  363. package/dist/lessons-store.d.ts.map +1 -0
  364. package/dist/lessons-store.js +265 -0
  365. package/dist/lessons-store.js.map +1 -0
  366. package/dist/llm-dedup.d.ts +40 -0
  367. package/dist/llm-dedup.d.ts.map +1 -0
  368. package/dist/llm-dedup.js +373 -0
  369. package/dist/llm-dedup.js.map +1 -0
  370. package/dist/mcp/server.d.ts +9 -0
  371. package/dist/mcp/server.d.ts.map +1 -0
  372. package/dist/mcp/server.js +87 -0
  373. package/dist/mcp/server.js.map +1 -0
  374. package/dist/mcp/tools.d.ts +198 -0
  375. package/dist/mcp/tools.d.ts.map +1 -0
  376. package/dist/mcp/tools.js +744 -0
  377. package/dist/mcp/tools.js.map +1 -0
  378. package/dist/metrics/pagerank-louvain.d.ts +44 -0
  379. package/dist/metrics/pagerank-louvain.d.ts.map +1 -0
  380. package/dist/metrics/pagerank-louvain.js +128 -0
  381. package/dist/metrics/pagerank-louvain.js.map +1 -0
  382. package/dist/parsers/scip-runner.d.ts +63 -0
  383. package/dist/parsers/scip-runner.d.ts.map +1 -0
  384. package/dist/parsers/scip-runner.js +179 -0
  385. package/dist/parsers/scip-runner.js.map +1 -0
  386. package/dist/projects.d.ts +54 -0
  387. package/dist/projects.d.ts.map +1 -0
  388. package/dist/projects.js +153 -0
  389. package/dist/projects.js.map +1 -0
  390. package/dist/resolve.d.ts +22 -0
  391. package/dist/resolve.d.ts.map +1 -0
  392. package/dist/resolve.js +128 -0
  393. package/dist/resolve.js.map +1 -0
  394. package/dist/rules.d.ts +36 -0
  395. package/dist/rules.d.ts.map +1 -0
  396. package/dist/rules.js +484 -0
  397. package/dist/rules.js.map +1 -0
  398. package/dist/sandbox.d.ts +33 -0
  399. package/dist/sandbox.d.ts.map +1 -0
  400. package/dist/sandbox.js +91 -0
  401. package/dist/sandbox.js.map +1 -0
  402. package/dist/scan-lock.d.ts +37 -0
  403. package/dist/scan-lock.d.ts.map +1 -0
  404. package/dist/scan-lock.js +145 -0
  405. package/dist/scan-lock.js.map +1 -0
  406. package/dist/scanner.d.ts +126 -1
  407. package/dist/scanner.d.ts.map +1 -1
  408. package/dist/scanner.js +1711 -235
  409. package/dist/scanner.js.map +1 -1
  410. package/dist/scanners/connections/ast-scanner.d.ts +9 -2
  411. package/dist/scanners/connections/ast-scanner.d.ts.map +1 -1
  412. package/dist/scanners/connections/ast-scanner.js +19 -4
  413. package/dist/scanners/connections/ast-scanner.js.map +1 -1
  414. package/dist/scanners/connections/import-scanner.d.ts +27 -0
  415. package/dist/scanners/connections/import-scanner.d.ts.map +1 -0
  416. package/dist/scanners/connections/import-scanner.js +537 -0
  417. package/dist/scanners/connections/import-scanner.js.map +1 -0
  418. package/dist/scanners/connections/llm-call-tracer.d.ts +1 -1
  419. package/dist/scanners/connections/llm-call-tracer.d.ts.map +1 -1
  420. package/dist/scanners/connections/llm-call-tracer.js +6 -2
  421. package/dist/scanners/connections/llm-call-tracer.js.map +1 -1
  422. package/dist/scanners/connections/prisma-calls.d.ts +11 -0
  423. package/dist/scanners/connections/prisma-calls.d.ts.map +1 -0
  424. package/dist/scanners/connections/prisma-calls.js +237 -0
  425. package/dist/scanners/connections/prisma-calls.js.map +1 -0
  426. package/dist/scanners/connections/service-calls.d.ts +1 -1
  427. package/dist/scanners/connections/service-calls.d.ts.map +1 -1
  428. package/dist/scanners/connections/service-calls.js +35 -3
  429. package/dist/scanners/connections/service-calls.js.map +1 -1
  430. package/dist/scanners/infrastructure/cron-scanner.d.ts +14 -0
  431. package/dist/scanners/infrastructure/cron-scanner.d.ts.map +1 -0
  432. package/dist/scanners/infrastructure/cron-scanner.js +383 -0
  433. package/dist/scanners/infrastructure/cron-scanner.js.map +1 -0
  434. package/dist/scanners/infrastructure/deploy-scanner.d.ts +11 -0
  435. package/dist/scanners/infrastructure/deploy-scanner.d.ts.map +1 -0
  436. package/dist/scanners/infrastructure/deploy-scanner.js +508 -0
  437. package/dist/scanners/infrastructure/deploy-scanner.js.map +1 -0
  438. package/dist/scanners/infrastructure/env-scanner.d.ts +55 -0
  439. package/dist/scanners/infrastructure/env-scanner.d.ts.map +1 -0
  440. package/dist/scanners/infrastructure/env-scanner.js +431 -0
  441. package/dist/scanners/infrastructure/env-scanner.js.map +1 -0
  442. package/dist/scanners/infrastructure/field-usage-analyzer.d.ts +52 -0
  443. package/dist/scanners/infrastructure/field-usage-analyzer.d.ts.map +1 -0
  444. package/dist/scanners/infrastructure/field-usage-analyzer.js +480 -0
  445. package/dist/scanners/infrastructure/field-usage-analyzer.js.map +1 -0
  446. package/dist/scanners/infrastructure/prisma-parser.d.ts +21 -0
  447. package/dist/scanners/infrastructure/prisma-parser.d.ts.map +1 -0
  448. package/dist/scanners/infrastructure/prisma-parser.js +58 -0
  449. package/dist/scanners/infrastructure/prisma-parser.js.map +1 -0
  450. package/dist/scanners/infrastructure/prisma-scanner.d.ts +30 -0
  451. package/dist/scanners/infrastructure/prisma-scanner.d.ts.map +1 -0
  452. package/dist/scanners/infrastructure/prisma-scanner.js +329 -0
  453. package/dist/scanners/infrastructure/prisma-scanner.js.map +1 -0
  454. package/dist/scanners/infrastructure/queue-scanner.d.ts +14 -0
  455. package/dist/scanners/infrastructure/queue-scanner.d.ts.map +1 -0
  456. package/dist/scanners/infrastructure/queue-scanner.js +455 -0
  457. package/dist/scanners/infrastructure/queue-scanner.js.map +1 -0
  458. package/dist/scanners/infrastructure/typespec-validator.d.ts +50 -0
  459. package/dist/scanners/infrastructure/typespec-validator.d.ts.map +1 -0
  460. package/dist/scanners/infrastructure/typespec-validator.js +407 -0
  461. package/dist/scanners/infrastructure/typespec-validator.js.map +1 -0
  462. package/dist/scanners/packages/swift.d.ts +5 -0
  463. package/dist/scanners/packages/swift.d.ts.map +1 -1
  464. package/dist/scanners/packages/swift.js +23 -0
  465. package/dist/scanners/packages/swift.js.map +1 -1
  466. package/dist/scanners/prompts/detector.d.ts +13 -2
  467. package/dist/scanners/prompts/detector.d.ts.map +1 -1
  468. package/dist/scanners/prompts/detector.js +97 -46
  469. package/dist/scanners/prompts/detector.js.map +1 -1
  470. package/dist/scanners/prompts/index.d.ts +1 -1
  471. package/dist/scanners/prompts/index.d.ts.map +1 -1
  472. package/dist/scanners/prompts/index.js +2 -2
  473. package/dist/scanners/prompts/index.js.map +1 -1
  474. package/dist/scanners/swift/code-scanner.d.ts +1 -1
  475. package/dist/scanners/swift/code-scanner.d.ts.map +1 -1
  476. package/dist/scanners/swift/code-scanner.js +216 -2
  477. package/dist/scanners/swift/code-scanner.js.map +1 -1
  478. package/dist/scanners/swift/swiftui-scanner.d.ts +45 -0
  479. package/dist/scanners/swift/swiftui-scanner.d.ts.map +1 -0
  480. package/dist/scanners/swift/swiftui-scanner.js +606 -0
  481. package/dist/scanners/swift/swiftui-scanner.js.map +1 -0
  482. package/dist/scanners/xcode/pbxproj-parser.d.ts +32 -0
  483. package/dist/scanners/xcode/pbxproj-parser.d.ts.map +1 -0
  484. package/dist/scanners/xcode/pbxproj-parser.js +407 -0
  485. package/dist/scanners/xcode/pbxproj-parser.js.map +1 -0
  486. package/dist/scanners/xcode/storyboard-scanner.d.ts +13 -0
  487. package/dist/scanners/xcode/storyboard-scanner.d.ts.map +1 -0
  488. package/dist/scanners/xcode/storyboard-scanner.js +236 -0
  489. package/dist/scanners/xcode/storyboard-scanner.js.map +1 -0
  490. package/dist/storage/markdown-view.d.ts +49 -0
  491. package/dist/storage/markdown-view.d.ts.map +1 -0
  492. package/dist/storage/markdown-view.js +233 -0
  493. package/dist/storage/markdown-view.js.map +1 -0
  494. package/dist/storage.d.ts +225 -9
  495. package/dist/storage.d.ts.map +1 -1
  496. package/dist/storage.js +945 -86
  497. package/dist/storage.js.map +1 -1
  498. package/dist/subgraph.d.ts +30 -0
  499. package/dist/subgraph.d.ts.map +1 -0
  500. package/dist/subgraph.js +106 -0
  501. package/dist/subgraph.js.map +1 -0
  502. package/dist/temporal/git-store.d.ts +65 -0
  503. package/dist/temporal/git-store.d.ts.map +1 -0
  504. package/dist/temporal/git-store.js +166 -0
  505. package/dist/temporal/git-store.js.map +1 -0
  506. package/dist/trace.d.ts +38 -0
  507. package/dist/trace.d.ts.map +1 -0
  508. package/dist/trace.js +292 -0
  509. package/dist/trace.js.map +1 -0
  510. package/dist/types.d.ts +322 -2
  511. package/dist/types.d.ts.map +1 -1
  512. package/dist/types.js +53 -0
  513. package/dist/types.js.map +1 -1
  514. package/hooks/hooks.json +1 -55
  515. package/hooks/mark-dirty.sh +20 -0
  516. package/hooks/post-bash-suggest.sh +30 -0
  517. package/hooks/post-edit-suggest.sh +29 -0
  518. package/hooks/pre-edit-warn.sh +28 -0
  519. package/hooks/session-start.sh +19 -0
  520. package/hooks/stop-suggest.sh +49 -0
  521. package/package.json +30 -11
  522. package/scripts/install-codex-plugin.sh +119 -0
  523. package/scripts/install-plugin.sh +29 -24
  524. package/skills/architecture-export/SKILL.md +79 -0
  525. package/skills/architecture-scan/SKILL.md +64 -0
  526. package/skills/code-review/SKILL.md +368 -0
  527. package/skills/impact-analysis/SKILL.md +80 -0
  528. package/skills/infrastructure-scanning.md +42 -0
  529. package/skills/navgator-setup/SKILL.md +108 -0
  530. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  531. package/web/.next/standalone/web/.next/app-path-routes-manifest.json +3 -0
  532. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  533. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  534. package/web/.next/standalone/web/.next/required-server-files.json +4 -4
  535. package/web/.next/standalone/web/.next/routes-manifest.json +18 -0
  536. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  537. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  538. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  539. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  540. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  541. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  542. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  543. package/web/.next/standalone/web/.next/server/app/_not-found/page/next-font-manifest.json +2 -2
  544. package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  545. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  546. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +3 -3
  547. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  548. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  549. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  550. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  551. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  552. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -3
  553. package/web/.next/standalone/web/.next/server/app/api/prompts/route.js.nft.json +1 -1
  554. package/web/.next/standalone/web/.next/server/app/api/rules/route/app-paths-manifest.json +3 -0
  555. package/web/.next/standalone/web/.next/server/app/api/rules/route/build-manifest.json +11 -0
  556. package/web/.next/standalone/web/.next/server/app/api/rules/route/server-reference-manifest.json +4 -0
  557. package/web/.next/standalone/web/.next/server/app/api/rules/route.js +6 -0
  558. package/web/.next/standalone/web/.next/server/app/api/rules/route.js.map +5 -0
  559. package/web/.next/standalone/web/.next/server/app/api/rules/route.js.nft.json +1 -0
  560. package/web/.next/standalone/web/.next/server/app/api/rules/route_client-reference-manifest.js +2 -0
  561. package/web/.next/standalone/web/.next/server/app/api/subgraph/route/app-paths-manifest.json +3 -0
  562. package/web/.next/standalone/web/.next/server/app/api/subgraph/route/build-manifest.json +11 -0
  563. package/web/.next/standalone/web/.next/server/app/api/subgraph/route/server-reference-manifest.json +4 -0
  564. package/web/.next/standalone/web/.next/server/app/api/subgraph/route.js +6 -0
  565. package/web/.next/standalone/web/.next/server/app/api/subgraph/route.js.map +5 -0
  566. package/web/.next/standalone/web/.next/server/app/api/subgraph/route.js.nft.json +1 -0
  567. package/web/.next/standalone/web/.next/server/app/api/subgraph/route_client-reference-manifest.js +2 -0
  568. package/web/.next/standalone/web/.next/server/app/api/trace/route/app-paths-manifest.json +3 -0
  569. package/web/.next/standalone/web/.next/server/app/api/trace/route/build-manifest.json +11 -0
  570. package/web/.next/standalone/web/.next/server/app/api/trace/route/server-reference-manifest.json +4 -0
  571. package/web/.next/standalone/web/.next/server/app/api/trace/route.js +6 -0
  572. package/web/.next/standalone/web/.next/server/app/api/trace/route.js.map +5 -0
  573. package/web/.next/standalone/web/.next/server/app/api/trace/route.js.nft.json +1 -0
  574. package/web/.next/standalone/web/.next/server/app/api/trace/route_client-reference-manifest.js +2 -0
  575. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  576. package/web/.next/standalone/web/.next/server/app/index.rsc +6 -6
  577. package/web/.next/standalone/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  578. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +6 -6
  579. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  580. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +3 -3
  581. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +5 -5
  582. package/web/.next/standalone/web/.next/server/app/page/next-font-manifest.json +2 -2
  583. package/web/.next/standalone/web/.next/server/app/page_client-reference-manifest.js +1 -1
  584. package/web/.next/standalone/web/.next/server/app-paths-manifest.json +3 -0
  585. package/web/.next/standalone/web/.next/server/chunks/2374f_next_dist_esm_build_templates_app-route_0bb4e66a.js +1 -1
  586. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__006b837d._.js +1 -1
  587. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__0426efe8._.js +3 -0
  588. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__2e09fec9._.js +1 -1
  589. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__38d0390f._.js +1 -1
  590. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__594bcf20._.js +1 -1
  591. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__b888fadf._.js +1 -1
  592. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__cd5f36ce._.js +3 -0
  593. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__ee6fc95f._.js +3 -0
  594. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__fa2ec862._.js +1 -1
  595. package/web/.next/standalone/web/.next/server/chunks/ssr/web_171de0df._.js +9 -4
  596. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_rules_route_actions_3de01bd5.js +3 -0
  597. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_subgraph_route_actions_d8b5a63f.js +3 -0
  598. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_trace_route_actions_b0703ae2.js +3 -0
  599. package/web/.next/standalone/web/.next/server/next-font-manifest.js +1 -1
  600. package/web/.next/standalone/web/.next/server/next-font-manifest.json +4 -4
  601. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  602. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  603. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  604. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  605. package/web/.next/standalone/web/.next/static/chunks/22a09ecf6ba35cfd.js +17 -0
  606. package/web/.next/standalone/web/.next/static/chunks/9857ba86ce4e82d8.css +2 -0
  607. package/web/.next/standalone/web/.next/static/chunks/f899547f99ef4b76.css +1 -0
  608. package/web/.next/standalone/web/.next/static/media/4fa387ec64143e14-s.c36e1862.woff2 +0 -0
  609. package/web/.next/standalone/web/.next/static/media/53b9e256198e5412-s.853d50a3.woff2 +0 -0
  610. package/web/.next/standalone/web/.next/static/media/5ce348bf30bf5439-s.ebceb24d.woff2 +0 -0
  611. package/web/.next/standalone/web/.next/static/media/6306c77e7c8268e4-s.ff4a2084.woff2 +0 -0
  612. package/web/.next/standalone/web/.next/static/media/7178b3e590c64307-s.55554cd0.woff2 +0 -0
  613. package/web/.next/standalone/web/.next/static/media/797e433ab948586e-s.p.479bea2b.woff2 +0 -0
  614. package/web/.next/standalone/web/.next/static/media/7d817b4c03b0c5f1-s.f377b9c4.woff2 +0 -0
  615. package/web/.next/standalone/web/.next/static/media/8a480f0b521d4e75-s.ea323500.woff2 +0 -0
  616. package/web/.next/standalone/web/.next/static/media/bbc41e54d2fcbd21-s.d1207556.woff2 +0 -0
  617. package/web/.next/standalone/web/.next/static/media/caa3a2e1cccd8315-s.p.3b6cae6d.woff2 +0 -0
  618. package/web/.next/standalone/web/.next/static/media/fef07dbb0973bf53-s.518e079e.woff2 +0 -0
  619. package/web/.next/standalone/web/app/api/components/route.ts +1 -1
  620. package/web/.next/standalone/web/app/api/connections/route.ts +3 -1
  621. package/web/.next/standalone/web/app/api/graph/route.ts +3 -3
  622. package/web/.next/standalone/web/app/api/projects/route.ts +1 -1
  623. package/web/.next/standalone/web/app/api/prompts/route.ts +2 -2
  624. package/web/.next/standalone/web/app/api/rules/route.ts +213 -0
  625. package/web/.next/standalone/web/app/api/settings/route.ts +2 -2
  626. package/web/.next/standalone/web/app/api/status/route.ts +1 -1
  627. package/web/.next/standalone/web/app/api/subgraph/route.ts +267 -0
  628. package/web/.next/standalone/web/app/api/trace/route.ts +321 -0
  629. package/web/.next/standalone/web/app/page.tsx +9 -1
  630. package/web/.next/standalone/web/components/connections-panel.tsx +23 -6
  631. package/web/.next/standalone/web/components/coverage-panel.tsx +309 -0
  632. package/web/.next/standalone/web/components/rules-panel.tsx +156 -0
  633. package/web/.next/standalone/web/components/sidebar.tsx +8 -0
  634. package/web/.next/standalone/web/components/status-overview.tsx +24 -1
  635. package/web/.next/standalone/web/components/subgraph-panel.tsx +382 -0
  636. package/web/.next/standalone/web/components/trace-panel.tsx +325 -0
  637. package/web/.next/standalone/web/lib/hooks/index.ts +3 -0
  638. package/web/.next/standalone/web/lib/hooks/use-coverage.ts +68 -0
  639. package/web/.next/standalone/web/lib/hooks/use-subgraph.ts +85 -0
  640. package/web/.next/standalone/web/lib/hooks/use-trace.ts +84 -0
  641. package/web/.next/standalone/web/lib/types.ts +108 -0
  642. package/web/.next/standalone/web/package-lock.json +218 -0
  643. package/web/.next/standalone/web/package.json +4 -2
  644. package/web/.next/standalone/web/server.js +1 -1
  645. package/web/.next/static/chunks/22a09ecf6ba35cfd.js +17 -0
  646. package/web/.next/static/chunks/9857ba86ce4e82d8.css +2 -0
  647. package/web/.next/static/chunks/f899547f99ef4b76.css +1 -0
  648. package/web/.next/static/media/4fa387ec64143e14-s.c36e1862.woff2 +0 -0
  649. package/web/.next/static/media/53b9e256198e5412-s.853d50a3.woff2 +0 -0
  650. package/web/.next/static/media/5ce348bf30bf5439-s.ebceb24d.woff2 +0 -0
  651. package/web/.next/static/media/6306c77e7c8268e4-s.ff4a2084.woff2 +0 -0
  652. package/web/.next/static/media/7178b3e590c64307-s.55554cd0.woff2 +0 -0
  653. package/web/.next/static/media/797e433ab948586e-s.p.479bea2b.woff2 +0 -0
  654. package/web/.next/static/media/7d817b4c03b0c5f1-s.f377b9c4.woff2 +0 -0
  655. package/web/.next/static/media/8a480f0b521d4e75-s.ea323500.woff2 +0 -0
  656. package/web/.next/static/media/bbc41e54d2fcbd21-s.d1207556.woff2 +0 -0
  657. package/web/.next/static/media/caa3a2e1cccd8315-s.p.3b6cae6d.woff2 +0 -0
  658. package/web/.next/static/media/fef07dbb0973bf53-s.518e079e.woff2 +0 -0
  659. package/skills/check/SKILL.md +0 -64
  660. package/skills/connections/SKILL.md +0 -54
  661. package/skills/diagram/SKILL.md +0 -64
  662. package/skills/export/SKILL.md +0 -49
  663. package/skills/impact/SKILL.md +0 -58
  664. package/skills/install/SKILL.md +0 -94
  665. package/skills/scan/SKILL.md +0 -75
  666. package/skills/status/SKILL.md +0 -37
  667. package/skills/ui/SKILL.md +0 -43
  668. package/skills/update/SKILL.md +0 -43
  669. package/web/.next/standalone/web/.next/static/chunks/8a80e7184ad3a13f.css +0 -2
  670. package/web/.next/standalone/web/.next/static/chunks/c056475f5f4424b6.css +0 -1
  671. package/web/.next/standalone/web/.next/static/chunks/cb3513192b63e480.js +0 -12
  672. package/web/.next/standalone/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  673. package/web/.next/standalone/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  674. package/web/.next/standalone/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  675. package/web/.next/standalone/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  676. package/web/.next/standalone/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  677. package/web/.next/standalone/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  678. package/web/.next/static/chunks/8a80e7184ad3a13f.css +0 -2
  679. package/web/.next/static/chunks/c056475f5f4424b6.css +0 -1
  680. package/web/.next/static/chunks/cb3513192b63e480.js +0 -12
  681. package/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  682. package/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  683. package/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  684. package/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  685. package/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  686. package/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  687. /package/web/.next/standalone/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_buildManifest.js +0 -0
  688. /package/web/.next/standalone/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_clientMiddlewareManifest.json +0 -0
  689. /package/web/.next/standalone/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_ssgManifest.js +0 -0
  690. /package/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_buildManifest.js +0 -0
  691. /package/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_clientMiddlewareManifest.json +0 -0
  692. /package/web/.next/static/{P-ZMQO7_Wnj487ks3guqa → qZVrJ4kmwXfw4Ikgj1oXR}/_ssgManifest.js +0 -0
package/dist/cli/index.js CHANGED
@@ -4,17 +4,25 @@
4
4
  * Architecture connection tracker for Claude Code
5
5
  */
6
6
  import { Command } from 'commander';
7
- import * as fs from 'fs';
8
- import * as os from 'os';
9
- import * as path from 'path';
10
- import * as readline from 'readline';
11
- import { scan, scanPromptsOnly, formatPromptsOutput, formatPromptDetail } from '../scanner.js';
12
- import { loadIndex, loadAllComponents, loadAllConnections, loadGraph } from '../storage.js';
13
- import { getConfig } from '../config.js';
14
- import { generateMermaidDiagram, generateComponentDiagram, generateLayerDiagram, generateSummaryDiagram, wrapInMarkdown, } from '../diagram.js';
15
- import { setup, isSetupComplete, formatSetupStatus } from '../setup.js';
16
- import { fileURLToPath } from 'url';
17
- import { spawn } from 'child_process';
7
+ import { registerScanCommand } from './commands/scan.js';
8
+ import { registerStatusCommand } from './commands/status.js';
9
+ import { registerImpactCommand } from './commands/impact.js';
10
+ import { registerConnectionsCommand } from './commands/connections.js';
11
+ import { registerListCommand } from './commands/list.js';
12
+ import { registerFindCommand } from './commands/find.js';
13
+ import { registerTemporalCommands } from './commands/temporal.js';
14
+ import { registerDiagramCommand } from './commands/diagram.js';
15
+ import { registerPromptsCommand } from './commands/prompts.js';
16
+ import { registerTraceCommand } from './commands/trace.js';
17
+ import { registerRulesCommand } from './commands/rules.js';
18
+ import { registerCoverageCommand } from './commands/coverage.js';
19
+ import { registerSubgraphCommand } from './commands/subgraph.js';
20
+ import { registerLLMMapCommand } from './commands/llm-map.js';
21
+ import { registerSchemaCommand } from './commands/schema.js';
22
+ import { registerDeadCommand } from './commands/dead.js';
23
+ import { registerLessonsCommand } from './commands/lessons.js';
24
+ import { registerFreshnessCommands } from './commands/freshness.js';
25
+ import { registerSetupCommand, registerUICommand, registerHistoryCommand, registerDiffCommand, registerProjectsCommand, registerSummaryCommand, showWelcomeMenu, } from './commands/misc.js';
18
26
  const NAVGATOR_LOGO = `
19
27
  _ _ ____ _
20
28
  | \\ | | __ ___ _/ ___| __ _| |_ ___ _ __
@@ -29,822 +37,40 @@ const program = new Command();
29
37
  program
30
38
  .name('navgator')
31
39
  .description('Architecture connection tracker - know your stack before you change it')
32
- .version('0.2.1')
40
+ .version('0.9.0')
41
+ .option('--sandbox', 'Run in sandbox mode (restricts network, interactive, child processes)')
33
42
  .addHelpText('beforeAll', NAVGATOR_LOGO);
34
- // =============================================================================
35
- // WELCOME MENU (shown after setup or when no command provided)
36
- // =============================================================================
37
- async function launchWebUI(options) {
38
- const port = options.port || 3000;
39
- const projectPath = options.projectPath || process.cwd();
40
- // Resolve standalone server.js relative to package root
41
- const cliDir = path.dirname(fileURLToPath(import.meta.url));
42
- const packageRoot = path.resolve(cliDir, '..', '..');
43
- const serverJs = path.join(packageRoot, 'web', '.next', 'standalone', 'web', 'server.js');
44
- if (!fs.existsSync(serverJs)) {
45
- throw new Error(`Next.js standalone server not found at:\n ${serverJs}\n\n` +
46
- 'Run `npm run build` from the NavGator root to build the web UI.');
47
- }
48
- const child = spawn('node', [serverJs], {
49
- env: {
50
- ...process.env,
51
- PORT: String(port),
52
- HOSTNAME: '0.0.0.0',
53
- NAVGATOR_PROJECT_PATH: projectPath,
54
- },
55
- cwd: path.dirname(serverJs),
56
- stdio: ['ignore', 'pipe', 'pipe'],
57
- });
58
- // Wait for "Ready" or listening message
59
- await new Promise((resolve, reject) => {
60
- const timeout = setTimeout(() => {
61
- resolve(); // proceed even if no explicit "Ready" message after 5s
62
- }, 5000);
63
- const onData = (data) => {
64
- const msg = data.toString();
65
- if (msg.includes('Ready') || msg.includes('ready') || msg.includes('started') || msg.includes('listening')) {
66
- clearTimeout(timeout);
67
- resolve();
68
- }
69
- };
70
- child.stdout?.on('data', onData);
71
- child.stderr?.on('data', onData);
72
- child.on('error', (err) => {
73
- clearTimeout(timeout);
74
- reject(err);
75
- });
76
- child.on('exit', (code) => {
77
- if (code !== null && code !== 0) {
78
- clearTimeout(timeout);
79
- reject(new Error(`Server exited with code ${code}`));
80
- }
81
- });
82
- });
83
- return { port, process: child };
84
- }
85
- async function launchUI(projectPath) {
86
- const resolvedPath = projectPath || process.cwd();
87
- const port = 3000;
88
- console.log('');
89
- console.log('🐊 NavGator Dashboard');
90
- console.log(` Project: ${resolvedPath}`);
91
- console.log('');
92
- const { process: serverProcess } = await launchWebUI({
93
- port,
94
- projectPath: resolvedPath,
95
- });
96
- const url = `http://localhost:${port}`;
97
- console.log(`Dashboard running at: ${url}`);
98
- console.log('');
99
- console.log('Press Ctrl+C to stop');
100
- console.log('');
101
- // Try to open browser
102
- const { exec } = await import('child_process');
103
- const openCmd = process.platform === 'darwin' ? 'open' :
104
- process.platform === 'win32' ? 'start' : 'xdg-open';
105
- exec(`${openCmd} ${url}`);
106
- // Keep process running, clean up child on exit
107
- const cleanup = () => {
108
- console.log('\nShutting down...');
109
- serverProcess.kill();
110
- process.exit(0);
111
- };
112
- process.on('SIGINT', cleanup);
113
- process.on('SIGTERM', cleanup);
114
- }
115
- async function runScan() {
116
- console.log('NavGator - Scanning architecture...\n');
117
- const result = await scan(process.cwd(), {
118
- prompts: true,
119
- verbose: false,
120
- });
121
- console.log('\n========================================');
122
- console.log('SCAN COMPLETE');
123
- console.log('========================================\n');
124
- const byType = {};
125
- for (const c of result.components) {
126
- byType[c.type] = (byType[c.type] || 0) + 1;
127
- }
128
- console.log('COMPONENTS:');
129
- for (const [type, count] of Object.entries(byType)) {
130
- console.log(` ${type}: ${count}`);
131
- }
132
- console.log(`\nFiles scanned: ${result.stats.files_scanned}`);
133
- console.log(`Scan completed in ${result.stats.scan_duration_ms}ms`);
134
- }
135
- async function showStatus() {
136
- const config = getConfig();
137
- const index = await loadIndex(config);
138
- if (!index) {
139
- console.log('No architecture data found. Run `navgator setup` first.');
140
- return;
141
- }
142
- console.log('NavGator - Architecture Status\n');
143
- console.log('========================================');
144
- const lastScan = new Date(index.last_scan);
145
- const hoursSince = Math.round((Date.now() - index.last_scan) / (1000 * 60 * 60));
146
- console.log(`Last scan: ${lastScan.toLocaleString()} (${hoursSince}h ago)`);
147
- console.log(`Total components: ${index.stats.total_components}`);
148
- console.log(`Total connections: ${index.stats.total_connections}`);
149
- if (index.stats.outdated_count > 0) {
150
- console.log(`Outdated packages: ${index.stats.outdated_count}`);
151
- }
152
- console.log('\nCOMPONENTS BY TYPE:');
153
- for (const [type, count] of Object.entries(index.stats.components_by_type)) {
154
- console.log(` ${type}: ${count}`);
155
- }
156
- }
157
- function showPostSetupGuidance() {
158
- console.log('');
159
- console.log(' Your architecture dashboard is ready!');
160
- console.log('');
161
- console.log(' What NavGator gives you:');
162
- console.log(' - Interactive SVG diagrams (zoom, pan, click) + Mermaid export');
163
- console.log(' - LLM call site tracking with provider/model analysis');
164
- console.log(' - Component & connection maps with code-level evidence');
165
- console.log('');
166
- console.log(' Quick reference:');
167
- console.log(' navgator Open the welcome menu');
168
- console.log(' navgator ui Launch the full dashboard');
169
- console.log(' navgator scan Re-scan the project');
170
- console.log(' navgator diagram Generate a Mermaid diagram');
171
- console.log('');
172
- }
173
- async function showWelcomeMenu(context) {
174
- if (context === 'no-command') {
175
- console.log(NAVGATOR_LOGO);
176
- console.log(' Tip: Run `navgator ui` to launch the full dashboard.\n');
177
- }
178
- console.log(' What would you like to do?\n');
179
- console.log(' 1) Launch the dashboard UI');
180
- console.log(' 2) Run a scan');
181
- console.log(' 3) View project status');
182
- console.log(' 4) Exit');
183
- console.log('');
184
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
185
- const answer = await new Promise((resolve) => {
186
- rl.question(' Choose (1-4): ', resolve);
187
- });
188
- rl.close();
189
- switch (answer.trim()) {
190
- case '1':
191
- await launchUI();
192
- break;
193
- case '2':
194
- await runScan();
195
- break;
196
- case '3':
197
- await showStatus();
198
- break;
199
- default:
200
- console.log('');
201
- break;
202
- }
203
- }
204
- // =============================================================================
205
- // SETUP COMMAND (New - Initial Installation)
206
- // =============================================================================
207
- program
208
- .command('setup')
209
- .description('Initialize NavGator with a two-phase scan (fast initial + deep follow-up)')
210
- .option('-f, --fast', 'Run fast scan only (skip deep analysis)')
211
- .option('-v, --verbose', 'Show detailed progress')
212
- .option('--no-diagram', 'Skip diagram generation')
213
- .action(async (options) => {
214
- try {
215
- console.log('');
216
- console.log('🐊 NavGator - Architecture Connection Tracker');
217
- console.log(' Know your stack before you change it');
218
- console.log('');
219
- // Offer to link as Claude Code plugin
220
- const claudeDir = path.join(os.homedir(), '.claude');
221
- if (fs.existsSync(claudeDir)) {
222
- const pluginDir = path.join(claudeDir, 'plugins');
223
- const linkPath = path.join(pluginDir, 'navgator');
224
- const packageRoot = path.resolve(import.meta.dirname, '..', '..');
225
- let alreadyLinked = false;
226
- try {
227
- const existing = fs.readlinkSync(linkPath);
228
- if (existing === packageRoot)
229
- alreadyLinked = true;
230
- }
231
- catch { }
232
- if (!alreadyLinked) {
233
- console.log('Claude Code detected.');
234
- console.log('NavGator can register as a Claude Code plugin by creating a symlink:');
235
- console.log(` ${linkPath} -> ${packageRoot}`);
236
- console.log('This enables hooks, skills, and slash commands inside Claude Code.\n');
237
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
238
- const answer = await new Promise((resolve) => {
239
- rl.question('Link NavGator as a Claude Code plugin? (y/N) ', resolve);
240
- });
241
- rl.close();
242
- if (answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes') {
243
- try {
244
- fs.mkdirSync(pluginDir, { recursive: true });
245
- // Remove stale link if it points elsewhere
246
- try {
247
- fs.unlinkSync(linkPath);
248
- }
249
- catch { }
250
- fs.symlinkSync(packageRoot, linkPath, 'dir');
251
- console.log('Plugin linked successfully.\n');
252
- }
253
- catch (err) {
254
- console.log('Could not auto-link. Link manually:');
255
- console.log(` ln -s ${packageRoot} ${linkPath}\n`);
256
- }
257
- }
258
- else {
259
- console.log('Skipped plugin linking. You can link manually later:');
260
- console.log(` ln -s ${packageRoot} ${linkPath}\n`);
261
- }
262
- }
263
- }
264
- // Check if already set up
265
- const status = await isSetupComplete();
266
- if (status.hasScanned && !status.stale) {
267
- console.log('NavGator is already set up for this project.');
268
- console.log(`Last scan: ${status.lastScan?.toLocaleString()}`);
269
- console.log(`Scan depth: ${status.phase}`);
270
- console.log('');
271
- await showWelcomeMenu('post-setup');
272
- return;
273
- }
274
- // Progress callback
275
- const onProgress = (phase, message) => {
276
- const icon = phase === 'FAST' ? '⚡' : '🔍';
277
- console.log(`${icon} [${phase}] ${message}`);
278
- };
279
- // Run setup
280
- const result = await setup({
281
- fastOnly: options.fast,
282
- generateDiagram: options.diagram !== false,
283
- verbose: options.verbose,
284
- onProgress,
285
- });
286
- // Display results
287
- console.log(formatSetupStatus(result));
288
- // Show diagram preview if generated
289
- if (result.diagram) {
290
- console.log('Architecture Diagram Preview:');
291
- console.log('─'.repeat(60));
292
- // Show first 30 lines
293
- const lines = result.diagram.split('\n').slice(0, 30);
294
- console.log(lines.join('\n'));
295
- if (result.diagram.split('\n').length > 30) {
296
- console.log('... (run `navgator diagram` to see full diagram)');
297
- }
298
- console.log('');
299
- }
300
- // Show post-setup guidance + welcome menu
301
- showPostSetupGuidance();
302
- await showWelcomeMenu('post-setup');
303
- }
304
- catch (error) {
305
- console.error('Setup failed:', error);
306
- process.exit(1);
307
- }
308
- });
309
- // =============================================================================
310
- // SCAN COMMAND
311
- // =============================================================================
312
- program
313
- .command('scan')
314
- .description('Scan project architecture and update connection tracking')
315
- .option('-q, --quick', 'Quick scan (packages only, no code analysis)')
316
- .option('-c, --connections', 'Focus on connection detection')
317
- .option('-p, --prompts', 'Enhanced AI prompt scanning with full content')
318
- .option('-v, --verbose', 'Show detailed output')
319
- .option('--clear', 'Clear existing data before scanning')
320
- .option('--ast', 'Use AST-based scanning (more accurate, slightly slower)')
321
- .action(async (options) => {
322
- try {
323
- console.log('NavGator - Scanning architecture...\n');
324
- const result = await scan(process.cwd(), {
325
- quick: options.quick,
326
- connections: options.connections,
327
- prompts: options.prompts,
328
- verbose: options.verbose,
329
- clearFirst: options.clear,
330
- useAST: options.ast,
331
- });
332
- console.log('\n========================================');
333
- console.log('SCAN COMPLETE');
334
- console.log('========================================\n');
335
- // Group components by type
336
- const byType = {};
337
- for (const c of result.components) {
338
- byType[c.type] = (byType[c.type] || 0) + 1;
339
- }
340
- console.log('COMPONENTS:');
341
- for (const [type, count] of Object.entries(byType)) {
342
- console.log(` ${type}: ${count}`);
343
- }
344
- // Group connections by type
345
- const connByType = {};
346
- for (const c of result.connections) {
347
- connByType[c.connection_type] = (connByType[c.connection_type] || 0) + 1;
348
- }
349
- if (Object.keys(connByType).length > 0) {
350
- console.log('\nCONNECTIONS:');
351
- for (const [type, count] of Object.entries(connByType)) {
352
- console.log(` ${type}: ${count}`);
353
- }
354
- }
355
- if (result.warnings.length > 0) {
356
- console.log(`\nWARNINGS: ${result.warnings.length}`);
357
- for (const w of result.warnings.slice(0, 5)) {
358
- console.log(` - ${w.message}`);
359
- }
360
- if (result.warnings.length > 5) {
361
- console.log(` ... and ${result.warnings.length - 5} more`);
362
- }
363
- }
364
- // Show file change summary
365
- if (result.fileChanges) {
366
- const { added, modified, removed } = result.fileChanges;
367
- if (added.length > 0 || modified.length > 0 || removed.length > 0) {
368
- console.log('\nFILE CHANGES:');
369
- if (added.length > 0)
370
- console.log(` Added: ${added.length}`);
371
- if (modified.length > 0)
372
- console.log(` Modified: ${modified.length}`);
373
- if (removed.length > 0)
374
- console.log(` Removed: ${removed.length}`);
375
- }
376
- }
377
- // Show prompt scan results if enhanced scanning was used
378
- if (result.promptScan && result.promptScan.prompts.length > 0) {
379
- console.log('\nAI PROMPTS:');
380
- console.log(` Total: ${result.promptScan.summary.totalPrompts}`);
381
- console.log(` Templates: ${result.promptScan.summary.templatesCount}`);
382
- if (Object.keys(result.promptScan.summary.byProvider).length > 0) {
383
- console.log(' By provider:');
384
- for (const [provider, count] of Object.entries(result.promptScan.summary.byProvider)) {
385
- console.log(` ${provider}: ${count}`);
386
- }
387
- }
388
- }
389
- console.log(`\nFiles scanned: ${result.stats.files_scanned}`);
390
- console.log(`Scan completed in ${result.stats.scan_duration_ms}ms`);
391
- // Auto-register project in ~/.navgator/projects.json
392
- try {
393
- const os = await import('os');
394
- const path = await import('path');
395
- const registryDir = path.join(os.homedir(), '.navgator');
396
- const registryPath = path.join(registryDir, 'projects.json');
397
- await fs.promises.mkdir(registryDir, { recursive: true });
398
- let registry;
399
- try {
400
- registry = JSON.parse(await fs.promises.readFile(registryPath, 'utf-8'));
401
- }
402
- catch {
403
- registry = { version: 1, projects: [] };
404
- }
405
- const projectRoot = process.cwd();
406
- const existing = registry.projects.find(p => p.path === projectRoot);
407
- if (existing) {
408
- existing.lastScan = Date.now();
409
- }
410
- else {
411
- const dirName = projectRoot.split(path.sep).pop() || 'project';
412
- const name = dirName.replace(/[-_]/g, ' ').replace(/\b\w/g, c => c.toUpperCase()).trim();
413
- registry.projects.push({ path: projectRoot, name, addedAt: Date.now(), lastScan: Date.now() });
414
- }
415
- await fs.promises.writeFile(registryPath, JSON.stringify(registry, null, 2), 'utf-8');
416
- }
417
- catch {
418
- // Non-critical — don't fail the scan
419
- }
420
- }
421
- catch (error) {
422
- console.error('Scan failed:', error);
423
- process.exit(1);
424
- }
425
- });
426
- // =============================================================================
427
- // STATUS COMMAND
428
- // =============================================================================
429
- program
430
- .command('status')
431
- .description('Show architecture summary and health status')
432
- .option('--json', 'Output as JSON')
433
- .action(async (options) => {
434
- try {
435
- const config = getConfig();
436
- const index = await loadIndex(config);
437
- if (!index) {
438
- console.log('No architecture data found. Run `navgator scan` first.');
439
- return;
440
- }
441
- if (options.json) {
442
- console.log(JSON.stringify(index, null, 2));
443
- return;
444
- }
445
- console.log('NavGator - Architecture Status\n');
446
- console.log('========================================');
447
- const lastScan = new Date(index.last_scan);
448
- const hoursSince = Math.round((Date.now() - index.last_scan) / (1000 * 60 * 60));
449
- console.log(`Last scan: ${lastScan.toLocaleString()} (${hoursSince}h ago)`);
450
- console.log(`Total components: ${index.stats.total_components}`);
451
- console.log(`Total connections: ${index.stats.total_connections}`);
452
- if (index.stats.outdated_count > 0) {
453
- console.log(`Outdated packages: ${index.stats.outdated_count}`);
454
- }
455
- if (index.stats.vulnerable_count > 0) {
456
- console.log(`Vulnerable packages: ${index.stats.vulnerable_count}`);
457
- }
458
- console.log('\nCOMPONENTS BY TYPE:');
459
- for (const [type, count] of Object.entries(index.stats.components_by_type)) {
460
- console.log(` ${type}: ${count}`);
461
- }
462
- if (Object.keys(index.stats.connections_by_type).length > 0) {
463
- console.log('\nCONNECTIONS BY TYPE:');
464
- for (const [type, count] of Object.entries(index.stats.connections_by_type)) {
465
- console.log(` ${type}: ${count}`);
466
- }
467
- }
468
- if (hoursSince > 24) {
469
- console.log('\n⚠️ Architecture data is stale. Consider running `navgator scan`');
470
- }
471
- }
472
- catch (error) {
473
- console.error('Status check failed:', error);
474
- process.exit(1);
475
- }
476
- });
477
- // =============================================================================
478
- // IMPACT COMMAND
479
- // =============================================================================
480
- program
481
- .command('impact <component>')
482
- .description('Show what\'s affected if you change a component')
483
- .option('--json', 'Output as JSON')
484
- .action(async (componentName, options) => {
485
- try {
486
- const config = getConfig();
487
- const components = await loadAllComponents(config);
488
- const connections = await loadAllConnections(config);
489
- // Find the component
490
- const component = components.find((c) => c.name.toLowerCase() === componentName.toLowerCase());
491
- if (!component) {
492
- console.log(`Component "${componentName}" not found.`);
493
- console.log('\nAvailable components:');
494
- for (const c of components.slice(0, 10)) {
495
- console.log(` - ${c.name} (${c.type})`);
496
- }
497
- if (components.length > 10) {
498
- console.log(` ... and ${components.length - 10} more`);
499
- }
500
- return;
501
- }
502
- // Find connections TO this component
503
- const incoming = connections.filter((c) => c.to.component_id === component.component_id);
504
- // Find connections FROM this component
505
- const outgoing = connections.filter((c) => c.from.component_id === component.component_id);
506
- if (options.json) {
507
- console.log(JSON.stringify({ component, incoming, outgoing }, null, 2));
508
- return;
509
- }
510
- console.log(`NavGator - Impact Analysis: ${component.name}\n`);
511
- console.log('========================================');
512
- console.log(`Component: ${component.name}`);
513
- console.log(`Type: ${component.type}`);
514
- console.log(`Layer: ${component.role.layer}`);
515
- console.log(`Purpose: ${component.role.purpose}`);
516
- if (incoming.length > 0) {
517
- console.log(`\nINCOMING CONNECTIONS (${incoming.length}):`);
518
- console.log('These files/components USE this component:\n');
519
- for (const conn of incoming) {
520
- const lineInfo = conn.code_reference.line_start ? `:${conn.code_reference.line_start}` : '';
521
- console.log(` ${conn.code_reference.file}${lineInfo}`);
522
- // Use symbol as primary identifier
523
- if (conn.code_reference.symbol) {
524
- const symbolType = conn.code_reference.symbol_type ? ` (${conn.code_reference.symbol_type})` : '';
525
- console.log(` Symbol: ${conn.code_reference.symbol}${symbolType}`);
526
- }
527
- if (conn.code_reference.code_snippet) {
528
- console.log(` Code: ${conn.code_reference.code_snippet}`);
529
- }
530
- console.log('');
531
- }
532
- }
533
- if (outgoing.length > 0) {
534
- console.log(`\nOUTGOING CONNECTIONS (${outgoing.length}):`);
535
- console.log('This component USES these:\n');
536
- for (const conn of outgoing) {
537
- const target = components.find((c) => c.component_id === conn.to.component_id);
538
- console.log(` → ${target?.name || conn.to.component_id}`);
539
- console.log(` Type: ${conn.connection_type}`);
540
- console.log('');
541
- }
542
- }
543
- if (incoming.length === 0 && outgoing.length === 0) {
544
- console.log('\nNo connections found for this component.');
545
- }
546
- console.log('\n========================================');
547
- console.log(`Files that may need changes if you modify ${component.name}:`);
548
- const affectedFiles = new Set(incoming.map((c) => c.code_reference.file));
549
- for (const file of affectedFiles) {
550
- console.log(` - ${file}`);
551
- }
552
- }
553
- catch (error) {
554
- console.error('Impact analysis failed:', error);
555
- process.exit(1);
556
- }
557
- });
558
- // =============================================================================
559
- // CONNECTIONS COMMAND
560
- // =============================================================================
561
- program
562
- .command('connections <component>')
563
- .description('Show all connections for a specific component')
564
- .option('--json', 'Output as JSON')
565
- .option('--incoming', 'Show only incoming connections')
566
- .option('--outgoing', 'Show only outgoing connections')
567
- .action(async (componentName, options) => {
568
- try {
569
- const config = getConfig();
570
- const components = await loadAllComponents(config);
571
- const connections = await loadAllConnections(config);
572
- const component = components.find((c) => c.name.toLowerCase() === componentName.toLowerCase());
573
- if (!component) {
574
- console.log(`Component "${componentName}" not found.`);
575
- return;
576
- }
577
- const incoming = options.outgoing
578
- ? []
579
- : connections.filter((c) => c.to.component_id === component.component_id);
580
- const outgoing = options.incoming
581
- ? []
582
- : connections.filter((c) => c.from.component_id === component.component_id);
583
- if (options.json) {
584
- console.log(JSON.stringify({ component, incoming, outgoing }, null, 2));
585
- return;
586
- }
587
- console.log(`NavGator - Connections: ${component.name}\n`);
588
- console.log('========================================');
589
- console.log(`Component: ${component.name} (${component.type})`);
590
- console.log(`Layer: ${component.role.layer}`);
591
- if (!options.outgoing && incoming.length > 0) {
592
- console.log(`\nINCOMING (${incoming.length}):`);
593
- for (const conn of incoming) {
594
- const lineInfo = conn.code_reference.line_start ? `:${conn.code_reference.line_start}` : '';
595
- const symbolInfo = conn.code_reference.symbol ? ` (${conn.code_reference.symbol})` : '';
596
- console.log(`├── ${conn.connection_type}`);
597
- console.log(`│ └── ${conn.code_reference.file}${lineInfo}${symbolInfo}`);
598
- }
599
- }
600
- if (!options.incoming && outgoing.length > 0) {
601
- console.log(`\nOUTGOING (${outgoing.length}):`);
602
- for (const conn of outgoing) {
603
- const target = components.find((c) => c.component_id === conn.to.component_id);
604
- console.log(`├── ${conn.connection_type} → ${target?.name || 'unknown'}`);
605
- }
606
- }
607
- }
608
- catch (error) {
609
- console.error('Connections query failed:', error);
610
- process.exit(1);
611
- }
612
- });
613
- // =============================================================================
614
- // LIST COMMAND
615
- // =============================================================================
616
- program
617
- .command('list')
618
- .description('List all tracked components')
619
- .option('-t, --type <type>', 'Filter by type')
620
- .option('-l, --layer <layer>', 'Filter by layer')
621
- .option('--json', 'Output as JSON')
622
- .action(async (options) => {
623
- try {
624
- const config = getConfig();
625
- let components = await loadAllComponents(config);
626
- if (options.type) {
627
- components = components.filter((c) => c.type === options.type);
628
- }
629
- if (options.layer) {
630
- components = components.filter((c) => c.role.layer === options.layer);
631
- }
632
- if (options.json) {
633
- console.log(JSON.stringify(components, null, 2));
634
- return;
635
- }
636
- console.log(`NavGator - Components (${components.length})\n`);
637
- // Group by layer
638
- const byLayer = {};
639
- for (const c of components) {
640
- if (!byLayer[c.role.layer])
641
- byLayer[c.role.layer] = [];
642
- byLayer[c.role.layer].push(c);
643
- }
644
- for (const [layer, comps] of Object.entries(byLayer)) {
645
- console.log(`\n${layer.toUpperCase()}:`);
646
- for (const c of comps) {
647
- const version = c.version ? `@${c.version}` : '';
648
- console.log(` ${c.name}${version} (${c.type})`);
649
- }
650
- }
651
- }
652
- catch (error) {
653
- console.error('List failed:', error);
654
- process.exit(1);
655
- }
656
- });
657
- // =============================================================================
658
- // DIAGRAM COMMAND
659
- // =============================================================================
660
- program
661
- .command('diagram')
662
- .description('Generate a Mermaid diagram of the architecture')
663
- .option('-f, --focus <component>', 'Center diagram on a specific component')
664
- .option('-l, --layer <layer>', 'Show only a specific layer')
665
- .option('-s, --summary', 'Show only top connected components')
666
- .option('-d, --direction <dir>', 'Diagram direction: TB, BT, LR, RL', 'TB')
667
- .option('--no-styles', 'Disable color styling')
668
- .option('--no-labels', 'Hide connection labels')
669
- .option('-o, --output <file>', 'Save to file instead of stdout')
670
- .option('-m, --max-nodes <n>', 'Maximum nodes to show', '50')
671
- .option('--markdown', 'Wrap diagram in markdown code block')
672
- .action(async (options) => {
673
- try {
674
- const config = getConfig();
675
- const graph = await loadGraph(config);
676
- if (!graph) {
677
- console.error('No architecture data found. Run `navgator scan` first.');
678
- process.exit(1);
679
- }
680
- const diagramOpts = {
681
- direction: options.direction,
682
- includeStyles: options.styles !== false,
683
- showLabels: options.labels !== false,
684
- maxNodes: parseInt(options.maxNodes, 10),
685
- };
686
- let diagram;
687
- if (options.focus) {
688
- // Find component by name
689
- const components = await loadAllComponents(config);
690
- const component = components.find((c) => c.name.toLowerCase() === options.focus.toLowerCase());
691
- if (!component) {
692
- console.error(`Component "${options.focus}" not found.`);
693
- console.log('Available components:');
694
- for (const c of components.slice(0, 10)) {
695
- console.log(` - ${c.name}`);
696
- }
697
- process.exit(1);
698
- }
699
- diagram = generateComponentDiagram(graph, component.component_id, 2, diagramOpts);
700
- }
701
- else if (options.layer) {
702
- const validLayers = ['frontend', 'backend', 'database', 'queue', 'infra', 'external'];
703
- if (!validLayers.includes(options.layer)) {
704
- console.error(`Invalid layer "${options.layer}". Valid layers: ${validLayers.join(', ')}`);
705
- process.exit(1);
706
- }
707
- diagram = generateLayerDiagram(graph, options.layer, diagramOpts);
708
- }
709
- else if (options.summary) {
710
- diagram = generateSummaryDiagram(graph, { ...diagramOpts, maxNodes: 20 });
711
- }
712
- else {
713
- diagram = generateMermaidDiagram(graph, diagramOpts);
714
- }
715
- // Optionally wrap in markdown
716
- if (options.markdown) {
717
- const title = options.focus
718
- ? `Architecture: ${options.focus}`
719
- : options.layer
720
- ? `${options.layer} Layer`
721
- : 'Architecture Diagram';
722
- diagram = wrapInMarkdown(diagram, title);
723
- }
724
- // Output
725
- if (options.output) {
726
- await fs.promises.writeFile(options.output, diagram, 'utf-8');
727
- console.log(`Diagram saved to ${options.output}`);
728
- }
729
- else {
730
- console.log(diagram);
731
- }
732
- }
733
- catch (error) {
734
- console.error('Diagram generation failed:', error);
735
- process.exit(1);
736
- }
737
- });
738
- // =============================================================================
739
- // UI COMMAND
740
- // =============================================================================
741
- program
742
- .command('ui')
743
- .description('Launch the NavGator dashboard in your browser')
744
- .option('-p, --port <port>', 'Port to serve on', '3000')
745
- .option('--path <path>', 'Project path to analyze (defaults to current directory)')
746
- .option('--no-open', 'Don\'t open browser automatically')
747
- .action(async (options) => {
748
- try {
749
- const port = parseInt(options.port, 10);
750
- const projectPath = options.path
751
- ? (await import('path')).resolve(options.path)
752
- : process.cwd();
753
- console.log('');
754
- console.log('🐊 NavGator Dashboard');
755
- console.log(` Project: ${projectPath}`);
756
- console.log('');
757
- const { process: serverProcess } = await launchWebUI({
758
- port,
759
- projectPath,
760
- });
761
- const url = `http://localhost:${port}`;
762
- console.log(`Dashboard running at: ${url}`);
763
- console.log('');
764
- console.log('Press Ctrl+C to stop');
765
- console.log('');
766
- // Try to open browser
767
- if (options.open !== false) {
768
- const { exec } = await import('child_process');
769
- const openCmd = process.platform === 'darwin' ? 'open' :
770
- process.platform === 'win32' ? 'start' : 'xdg-open';
771
- exec(`${openCmd} ${url}`);
772
- }
773
- // Keep process running, clean up child on exit
774
- const cleanup = () => {
775
- console.log('\nShutting down...');
776
- serverProcess.kill();
777
- process.exit(0);
778
- };
779
- process.on('SIGINT', cleanup);
780
- process.on('SIGTERM', cleanup);
781
- }
782
- catch (error) {
783
- console.error('Failed to start UI:', error);
784
- process.exit(1);
785
- }
786
- });
787
- // =============================================================================
788
- // PROMPTS COMMAND
789
- // =============================================================================
790
- program
791
- .command('prompts')
792
- .description('Scan and display AI prompts in the codebase')
793
- .option('-v, --verbose', 'Show full prompt content')
794
- .option('--json', 'Output as JSON')
795
- .option('--detail <name>', 'Show detailed view of a specific prompt')
796
- .action(async (options) => {
797
- try {
798
- const result = await scanPromptsOnly(process.cwd());
799
- if (options.json) {
800
- console.log(JSON.stringify(result, null, 2));
801
- return;
802
- }
803
- if (options.detail) {
804
- // Find specific prompt
805
- const prompt = result.prompts.find((p) => p.name.toLowerCase() === options.detail.toLowerCase() ||
806
- p.id.toLowerCase() === options.detail.toLowerCase());
807
- if (!prompt) {
808
- console.log(`Prompt "${options.detail}" not found.`);
809
- console.log('\nAvailable prompts:');
810
- for (const p of result.prompts.slice(0, 10)) {
811
- console.log(` - ${p.name} (${p.location.file}:${p.location.lineStart})`);
812
- }
813
- return;
814
- }
815
- console.log(formatPromptDetail(prompt));
816
- return;
817
- }
818
- // Standard output
819
- console.log(formatPromptsOutput(result));
820
- // Show prompt details if verbose
821
- if (options.verbose && result.prompts.length > 0) {
822
- console.log('\n' + '='.repeat(60));
823
- console.log('PROMPT DETAILS');
824
- console.log('='.repeat(60));
825
- for (const prompt of result.prompts) {
826
- console.log(`\n--- ${prompt.name} ---`);
827
- console.log(`File: ${prompt.location.file}:${prompt.location.lineStart}`);
828
- if (prompt.purpose) {
829
- console.log(`Purpose: ${prompt.purpose}`);
830
- }
831
- for (const msg of prompt.messages) {
832
- console.log(`\n[${msg.role.toUpperCase()}]:`);
833
- // Show up to 300 chars of content
834
- const preview = msg.content.slice(0, 300);
835
- console.log(preview);
836
- if (msg.content.length > 300) {
837
- console.log(`... (${msg.content.length - 300} more chars)`);
838
- }
839
- }
840
- }
841
- }
842
- }
843
- catch (error) {
844
- console.error('Prompt scan failed:', error);
845
- process.exit(1);
43
+ // Apply sandbox flag globally before any command runs
44
+ program.hook('preAction', () => {
45
+ if (program.opts().sandbox) {
46
+ process.env.NAVGATOR_SANDBOX = '1';
846
47
  }
847
48
  });
49
+ // Register all commands
50
+ registerSetupCommand(program);
51
+ registerScanCommand(program);
52
+ registerStatusCommand(program);
53
+ registerFreshnessCommands(program);
54
+ registerImpactCommand(program);
55
+ registerConnectionsCommand(program);
56
+ registerListCommand(program);
57
+ registerFindCommand(program);
58
+ registerTemporalCommands(program);
59
+ registerDiagramCommand(program);
60
+ registerUICommand(program);
61
+ registerPromptsCommand(program);
62
+ registerHistoryCommand(program);
63
+ registerDiffCommand(program);
64
+ registerProjectsCommand(program);
65
+ registerSummaryCommand(program);
66
+ registerTraceCommand(program);
67
+ registerRulesCommand(program);
68
+ registerCoverageCommand(program);
69
+ registerSubgraphCommand(program);
70
+ registerLLMMapCommand(program);
71
+ registerSchemaCommand(program);
72
+ registerDeadCommand(program);
73
+ registerLessonsCommand(program);
848
74
  // =============================================================================
849
75
  // PARSE AND RUN
850
76
  // =============================================================================
@@ -852,6 +78,29 @@ program
852
78
  const arg = process.argv[2];
853
79
  const isFlag = arg?.startsWith('-');
854
80
  const hasCommandOrFlag = process.argv.length > 2;
81
+ /**
82
+ * Detect a natural-language intent argument: a non-flag, non-subcommand
83
+ * first arg that contains spaces or quotes (e.g. `navgator "review my auth"`).
84
+ *
85
+ * Run 1 — D3: redirect such input to /navgator:plan. The planner agent runs
86
+ * inside Claude Code; the bare CLI cannot reach it. Print a redirect message
87
+ * and exit 0 so wrappers don't treat this as a failure.
88
+ */
89
+ function looksLikeNaturalLanguage(rawArg, knownCommands) {
90
+ if (!rawArg)
91
+ return false;
92
+ if (rawArg.startsWith('-'))
93
+ return false;
94
+ // Subcommand match → not natural language.
95
+ if (knownCommands.has(rawArg))
96
+ return false;
97
+ // Quotes, spaces, or known NL-shaped punctuation → treat as intent.
98
+ if (rawArg.includes(' ') || rawArg.includes('"') || rawArg.includes("'"))
99
+ return true;
100
+ // Single token that's NOT a registered command and NOT in knownCommands:
101
+ // let commander handle it (will produce its own unknown-command error).
102
+ return false;
103
+ }
855
104
  if (!hasCommandOrFlag) {
856
105
  // No arguments at all → show welcome menu
857
106
  showWelcomeMenu('no-command').catch((err) => {
@@ -859,8 +108,22 @@ if (!hasCommandOrFlag) {
859
108
  process.exit(1);
860
109
  });
861
110
  }
111
+ else if (!isFlag && arg !== undefined) {
112
+ // Build the set of registered subcommand names from commander's metadata.
113
+ const knownCommands = new Set(program.commands.map((c) => c.name()));
114
+ if (looksLikeNaturalLanguage(arg, knownCommands)) {
115
+ // Natural-language intent — redirect to /navgator:plan.
116
+ const intent = arg;
117
+ process.stdout.write(`navgator "${intent}" needs Claude Code. From a terminal use a subcommand directly ` +
118
+ `(e.g. \`navgator scan\`, \`navgator impact <component>\`), or run /navgator:plan "${intent}" ` +
119
+ `from inside Claude Code.\n`);
120
+ process.exit(0);
121
+ }
122
+ // Non-NL token → fall through to commander (it will print its own error).
123
+ program.parse();
124
+ }
862
125
  else {
863
- // Has a command or flag (--help, --version, etc.) → let Commander handle it
126
+ // Has a flag (--help, --version, etc.) → let Commander handle it
864
127
  program.parse();
865
128
  }
866
129
  //# sourceMappingURL=index.js.map