kirograph 0.16.1 → 0.19.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 (365) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +103 -1605
  3. package/dist/architecture/layers/dart.js +112 -0
  4. package/dist/architecture/layers/dart.js.map +7 -0
  5. package/dist/architecture/layers/index.js +3 -1
  6. package/dist/architecture/layers/index.js.map +2 -2
  7. package/dist/bin/banner.js +74 -6
  8. package/dist/bin/banner.js.map +2 -2
  9. package/dist/bin/commands/affected.js +40 -5
  10. package/dist/bin/commands/affected.js.map +2 -2
  11. package/dist/bin/commands/attack-surface.js +157 -0
  12. package/dist/bin/commands/attack-surface.js.map +7 -0
  13. package/dist/bin/commands/benchmark.js +206 -0
  14. package/dist/bin/commands/benchmark.js.map +7 -0
  15. package/dist/bin/commands/budget.js +70 -0
  16. package/dist/bin/commands/budget.js.map +7 -0
  17. package/dist/bin/commands/communities.js +77 -0
  18. package/dist/bin/commands/communities.js.map +7 -0
  19. package/dist/bin/commands/data.js +665 -0
  20. package/dist/bin/commands/data.js.map +7 -0
  21. package/dist/bin/commands/dep-confusion.js +119 -0
  22. package/dist/bin/commands/dep-confusion.js.map +7 -0
  23. package/dist/bin/commands/export.js +304 -10
  24. package/dist/bin/commands/export.js.map +2 -2
  25. package/dist/bin/commands/flows.js +97 -0
  26. package/dist/bin/commands/flows.js.map +7 -0
  27. package/dist/bin/commands/help.js +386 -100
  28. package/dist/bin/commands/help.js.map +2 -2
  29. package/dist/bin/commands/install.js +90 -8
  30. package/dist/bin/commands/install.js.map +2 -2
  31. package/dist/bin/commands/licenses.js +201 -0
  32. package/dist/bin/commands/licenses.js.map +7 -0
  33. package/dist/bin/commands/reachability.js +160 -0
  34. package/dist/bin/commands/reachability.js.map +7 -0
  35. package/dist/bin/commands/read.js +100 -0
  36. package/dist/bin/commands/read.js.map +7 -0
  37. package/dist/bin/commands/refactor.js +116 -0
  38. package/dist/bin/commands/refactor.js.map +7 -0
  39. package/dist/bin/commands/remediation.js +133 -0
  40. package/dist/bin/commands/remediation.js.map +7 -0
  41. package/dist/bin/commands/sbom.js +76 -0
  42. package/dist/bin/commands/sbom.js.map +7 -0
  43. package/dist/bin/commands/security-ci-report.js +267 -0
  44. package/dist/bin/commands/security-ci-report.js.map +7 -0
  45. package/dist/bin/commands/security-export.js +1349 -0
  46. package/dist/bin/commands/security-export.js.map +7 -0
  47. package/dist/bin/commands/security-flows.js +126 -0
  48. package/dist/bin/commands/security-flows.js.map +7 -0
  49. package/dist/bin/commands/security-secrets.js +170 -0
  50. package/dist/bin/commands/security-secrets.js.map +7 -0
  51. package/dist/bin/commands/security.js +193 -0
  52. package/dist/bin/commands/security.js.map +7 -0
  53. package/dist/bin/commands/staleness.js +144 -0
  54. package/dist/bin/commands/staleness.js.map +7 -0
  55. package/dist/bin/commands/status.js +102 -2
  56. package/dist/bin/commands/status.js.map +2 -2
  57. package/dist/bin/commands/supply-chain.js +138 -0
  58. package/dist/bin/commands/supply-chain.js.map +7 -0
  59. package/dist/bin/commands/uninit.js +109 -60
  60. package/dist/bin/commands/uninit.js.map +2 -2
  61. package/dist/bin/commands/vex.js +76 -0
  62. package/dist/bin/commands/vex.js.map +7 -0
  63. package/dist/bin/commands/vuln-suppress.js +95 -0
  64. package/dist/bin/commands/vuln-suppress.js.map +7 -0
  65. package/dist/bin/commands/vulns.js +382 -0
  66. package/dist/bin/commands/vulns.js.map +7 -0
  67. package/dist/bin/installer/auto-detect.js +125 -0
  68. package/dist/bin/installer/auto-detect.js.map +7 -0
  69. package/dist/bin/installer/cli-agent.js +28 -5
  70. package/dist/bin/installer/cli-agent.js.map +2 -2
  71. package/dist/bin/installer/common.js +47 -0
  72. package/dist/bin/installer/common.js.map +2 -2
  73. package/dist/bin/installer/config-prompt.js +39 -1
  74. package/dist/bin/installer/config-prompt.js.map +2 -2
  75. package/dist/bin/installer/detect.js +309 -0
  76. package/dist/bin/installer/detect.js.map +7 -0
  77. package/dist/bin/installer/index.js +36 -1
  78. package/dist/bin/installer/index.js.map +2 -2
  79. package/dist/bin/installer/instructions.js +195 -3
  80. package/dist/bin/installer/instructions.js.map +2 -2
  81. package/dist/bin/installer/steering.js +440 -0
  82. package/dist/bin/installer/steering.js.map +2 -2
  83. package/dist/bin/installer/targets/aider.js +3 -3
  84. package/dist/bin/installer/targets/aider.js.map +2 -2
  85. package/dist/bin/installer/targets/amp.js +3 -3
  86. package/dist/bin/installer/targets/amp.js.map +2 -2
  87. package/dist/bin/installer/targets/antigravity.js +35 -6
  88. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  89. package/dist/bin/installer/targets/augment.js +3 -3
  90. package/dist/bin/installer/targets/augment.js.map +2 -2
  91. package/dist/bin/installer/targets/claude.js +49 -5
  92. package/dist/bin/installer/targets/claude.js.map +2 -2
  93. package/dist/bin/installer/targets/cline.js +32 -6
  94. package/dist/bin/installer/targets/cline.js.map +2 -2
  95. package/dist/bin/installer/targets/codex.js +64 -12
  96. package/dist/bin/installer/targets/codex.js.map +2 -2
  97. package/dist/bin/installer/targets/continue.js +2 -2
  98. package/dist/bin/installer/targets/continue.js.map +2 -2
  99. package/dist/bin/installer/targets/copilot-cli.js +101 -0
  100. package/dist/bin/installer/targets/copilot-cli.js.map +7 -0
  101. package/dist/bin/installer/targets/copilot.js +31 -5
  102. package/dist/bin/installer/targets/copilot.js.map +2 -2
  103. package/dist/bin/installer/targets/cursor.js +4 -4
  104. package/dist/bin/installer/targets/cursor.js.map +2 -2
  105. package/dist/bin/installer/targets/devin.js +2 -2
  106. package/dist/bin/installer/targets/devin.js.map +2 -2
  107. package/dist/bin/installer/targets/gemini-cli.js +2 -2
  108. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  109. package/dist/bin/installer/targets/generic.js +2 -14
  110. package/dist/bin/installer/targets/generic.js.map +2 -2
  111. package/dist/bin/installer/targets/goose.js +3 -3
  112. package/dist/bin/installer/targets/goose.js.map +2 -2
  113. package/dist/bin/installer/targets/index.js +250 -0
  114. package/dist/bin/installer/targets/index.js.map +2 -2
  115. package/dist/bin/installer/targets/junie.js +2 -2
  116. package/dist/bin/installer/targets/junie.js.map +2 -2
  117. package/dist/bin/installer/targets/kilo.js +2 -2
  118. package/dist/bin/installer/targets/kilo.js.map +2 -2
  119. package/dist/bin/installer/targets/kiro.js +3 -3
  120. package/dist/bin/installer/targets/kiro.js.map +2 -2
  121. package/dist/bin/installer/targets/opencode.js +2 -2
  122. package/dist/bin/installer/targets/opencode.js.map +2 -2
  123. package/dist/bin/installer/targets/openhands.js +3 -3
  124. package/dist/bin/installer/targets/openhands.js.map +2 -2
  125. package/dist/bin/installer/targets/qoder.js +91 -0
  126. package/dist/bin/installer/targets/qoder.js.map +7 -0
  127. package/dist/bin/installer/targets/qwen.js +96 -0
  128. package/dist/bin/installer/targets/qwen.js.map +7 -0
  129. package/dist/bin/installer/targets/replit.js +3 -3
  130. package/dist/bin/installer/targets/replit.js.map +2 -2
  131. package/dist/bin/installer/targets/roo.js +2 -2
  132. package/dist/bin/installer/targets/roo.js.map +2 -2
  133. package/dist/bin/installer/targets/tabnine.js +3 -3
  134. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  135. package/dist/bin/installer/targets/trae.js +5 -5
  136. package/dist/bin/installer/targets/trae.js.map +2 -2
  137. package/dist/bin/installer/targets/warp.js +2 -2
  138. package/dist/bin/installer/targets/warp.js.map +2 -2
  139. package/dist/bin/installer/targets/windsurf.js +35 -6
  140. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  141. package/dist/bin/kirograph.js +74 -6
  142. package/dist/bin/kirograph.js.map +3 -3
  143. package/dist/bin/progress.js +30 -0
  144. package/dist/bin/progress.js.map +2 -2
  145. package/dist/compression/naive-cost.js +25 -0
  146. package/dist/compression/naive-cost.js.map +2 -2
  147. package/dist/compression/tracker.js +91 -2
  148. package/dist/compression/tracker.js.map +2 -2
  149. package/dist/compression/types.js.map +1 -1
  150. package/dist/config.js +126 -3
  151. package/dist/config.js.map +2 -2
  152. package/dist/core/pipeline.js +92 -4
  153. package/dist/core/pipeline.js.map +2 -2
  154. package/dist/data/filters.js +105 -0
  155. package/dist/data/filters.js.map +7 -0
  156. package/dist/data/indexer.js +225 -0
  157. package/dist/data/indexer.js.map +7 -0
  158. package/dist/data/linker.js +150 -0
  159. package/dist/data/linker.js.map +7 -0
  160. package/dist/data/lint.js +109 -0
  161. package/dist/data/lint.js.map +7 -0
  162. package/dist/data/parsers/csv.js +132 -0
  163. package/dist/data/parsers/csv.js.map +7 -0
  164. package/dist/data/parsers/excel.js +88 -0
  165. package/dist/data/parsers/excel.js.map +7 -0
  166. package/dist/data/parsers/index.js +79 -0
  167. package/dist/data/parsers/index.js.map +7 -0
  168. package/dist/data/parsers/json-array.js +89 -0
  169. package/dist/data/parsers/json-array.js.map +7 -0
  170. package/dist/data/parsers/jsonl.js +84 -0
  171. package/dist/data/parsers/jsonl.js.map +7 -0
  172. package/dist/data/parsers/parquet.js +95 -0
  173. package/dist/data/parsers/parquet.js.map +7 -0
  174. package/dist/data/profiler.js +182 -0
  175. package/dist/data/profiler.js.map +7 -0
  176. package/dist/data/queries.js +512 -0
  177. package/dist/data/queries.js.map +7 -0
  178. package/dist/data/types.js +17 -0
  179. package/dist/data/types.js.map +7 -0
  180. package/dist/db/data-schema.sql +61 -0
  181. package/dist/db/database.js +67 -5
  182. package/dist/db/database.js.map +2 -2
  183. package/dist/db/memory-schema.sql +5 -1
  184. package/dist/db/schema.sql +3 -1
  185. package/dist/db/security-schema.sql +72 -0
  186. package/dist/extraction/extractor.js +81 -0
  187. package/dist/extraction/extractor.js.map +2 -2
  188. package/dist/extraction/grammars.js +32 -8
  189. package/dist/extraction/grammars.js.map +2 -2
  190. package/dist/extraction/languages.js +43 -1
  191. package/dist/extraction/languages.js.map +2 -2
  192. package/dist/extraction/notebook.js +300 -0
  193. package/dist/extraction/notebook.js.map +7 -0
  194. package/dist/extraction/wasm/tree-sitter-astro.wasm +0 -0
  195. package/dist/extraction/wasm/tree-sitter-gdscript.wasm +0 -0
  196. package/dist/extraction/wasm/tree-sitter-julia.wasm +0 -0
  197. package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
  198. package/dist/extraction/wasm/tree-sitter-perl.wasm +0 -0
  199. package/dist/extraction/wasm/tree-sitter-powershell.wasm +0 -0
  200. package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
  201. package/dist/extraction/wasm/tree-sitter-sql.wasm +0 -0
  202. package/dist/extraction/wasm/tree-sitter-verilog.wasm +0 -0
  203. package/dist/frameworks/flutter.js +130 -0
  204. package/dist/frameworks/flutter.js.map +7 -0
  205. package/dist/frameworks/index.js +7 -1
  206. package/dist/frameworks/index.js.map +3 -3
  207. package/dist/graph/communities.js +317 -0
  208. package/dist/graph/communities.js.map +7 -0
  209. package/dist/graph/flows.js +138 -0
  210. package/dist/graph/flows.js.map +7 -0
  211. package/dist/graph/refactor.js +155 -0
  212. package/dist/graph/refactor.js.map +7 -0
  213. package/dist/index.js +1 -1
  214. package/dist/index.js.map +2 -2
  215. package/dist/mcp/cache.js +172 -0
  216. package/dist/mcp/cache.js.map +7 -0
  217. package/dist/mcp/read-modes.js +295 -0
  218. package/dist/mcp/read-modes.js.map +7 -0
  219. package/dist/mcp/server.js +2 -1
  220. package/dist/mcp/server.js.map +2 -2
  221. package/dist/mcp/tool-names.js +29 -1
  222. package/dist/mcp/tool-names.js.map +2 -2
  223. package/dist/mcp/tools.js +1588 -6
  224. package/dist/mcp/tools.js.map +3 -3
  225. package/dist/memory/database.js +32 -2
  226. package/dist/memory/database.js.map +2 -2
  227. package/dist/memory/types.js.map +1 -1
  228. package/dist/resolution/bridges/android-rn.js +298 -0
  229. package/dist/resolution/bridges/android-rn.js.map +7 -0
  230. package/dist/resolution/bridges/expo-modules.js +155 -0
  231. package/dist/resolution/bridges/expo-modules.js.map +7 -0
  232. package/dist/resolution/bridges/flutter-channel.js +385 -0
  233. package/dist/resolution/bridges/flutter-channel.js.map +7 -0
  234. package/dist/resolution/bridges/index.js +80 -0
  235. package/dist/resolution/bridges/index.js.map +7 -0
  236. package/dist/resolution/bridges/native-events.js +188 -0
  237. package/dist/resolution/bridges/native-events.js.map +7 -0
  238. package/dist/resolution/bridges/native-views.js +244 -0
  239. package/dist/resolution/bridges/native-views.js.map +7 -0
  240. package/dist/resolution/bridges/react-native.js +161 -0
  241. package/dist/resolution/bridges/react-native.js.map +7 -0
  242. package/dist/resolution/bridges/swift-objc.js +227 -0
  243. package/dist/resolution/bridges/swift-objc.js.map +7 -0
  244. package/dist/resolution/bridges/turbomodules.js +216 -0
  245. package/dist/resolution/bridges/turbomodules.js.map +7 -0
  246. package/dist/resolution/index.js +61 -2
  247. package/dist/resolution/index.js.map +2 -2
  248. package/dist/security/attack-surface.js +164 -0
  249. package/dist/security/attack-surface.js.map +7 -0
  250. package/dist/security/context-warnings.js +123 -0
  251. package/dist/security/context-warnings.js.map +7 -0
  252. package/dist/security/context-warnings.test.js +300 -0
  253. package/dist/security/context-warnings.test.js.map +7 -0
  254. package/dist/security/data-flows.js +228 -0
  255. package/dist/security/data-flows.js.map +7 -0
  256. package/dist/security/dep-confusion.js +255 -0
  257. package/dist/security/dep-confusion.js.map +7 -0
  258. package/dist/security/errors.js +51 -0
  259. package/dist/security/errors.js.map +7 -0
  260. package/dist/security/export/fix-suggestions.js +58 -0
  261. package/dist/security/export/fix-suggestions.js.map +7 -0
  262. package/dist/security/export/fix-suggestions.test.js +74 -0
  263. package/dist/security/export/fix-suggestions.test.js.map +7 -0
  264. package/dist/security/export/sbom.js +230 -0
  265. package/dist/security/export/sbom.js.map +7 -0
  266. package/dist/security/export/sbom.test.js +288 -0
  267. package/dist/security/export/sbom.test.js.map +7 -0
  268. package/dist/security/export/serialization.js +142 -0
  269. package/dist/security/export/serialization.js.map +7 -0
  270. package/dist/security/export/serialization.test.js +310 -0
  271. package/dist/security/export/serialization.test.js.map +7 -0
  272. package/dist/security/export/vex.js +220 -0
  273. package/dist/security/export/vex.js.map +7 -0
  274. package/dist/security/export/vex.test.js +278 -0
  275. package/dist/security/export/vex.test.js.map +7 -0
  276. package/dist/security/index.js +67 -0
  277. package/dist/security/index.js.map +7 -0
  278. package/dist/security/integrator-transitives.test.js +359 -0
  279. package/dist/security/integrator-transitives.test.js.map +7 -0
  280. package/dist/security/integrator.js +491 -0
  281. package/dist/security/integrator.js.map +7 -0
  282. package/dist/security/integrator.test.js +237 -0
  283. package/dist/security/integrator.test.js.map +7 -0
  284. package/dist/security/license.js +70 -0
  285. package/dist/security/license.js.map +7 -0
  286. package/dist/security/manifest/adapter.js +243 -0
  287. package/dist/security/manifest/adapter.js.map +7 -0
  288. package/dist/security/manifest/adapter.test.js +272 -0
  289. package/dist/security/manifest/adapter.test.js.map +7 -0
  290. package/dist/security/manifest/parser.js +376 -0
  291. package/dist/security/manifest/parser.js.map +7 -0
  292. package/dist/security/manifest/parser.test.js +110 -0
  293. package/dist/security/manifest/parser.test.js.map +7 -0
  294. package/dist/security/manifest/plugins/cargo.js +233 -0
  295. package/dist/security/manifest/plugins/cargo.js.map +7 -0
  296. package/dist/security/manifest/plugins/cargo.test.js +304 -0
  297. package/dist/security/manifest/plugins/cargo.test.js.map +7 -0
  298. package/dist/security/manifest/plugins/composer.js +152 -0
  299. package/dist/security/manifest/plugins/composer.js.map +7 -0
  300. package/dist/security/manifest/plugins/go.js +146 -0
  301. package/dist/security/manifest/plugins/go.js.map +7 -0
  302. package/dist/security/manifest/plugins/go.test.js +341 -0
  303. package/dist/security/manifest/plugins/go.test.js.map +7 -0
  304. package/dist/security/manifest/plugins/gradle.js +159 -0
  305. package/dist/security/manifest/plugins/gradle.js.map +7 -0
  306. package/dist/security/manifest/plugins/hex.js +159 -0
  307. package/dist/security/manifest/plugins/hex.js.map +7 -0
  308. package/dist/security/manifest/plugins/maven.js +128 -0
  309. package/dist/security/manifest/plugins/maven.js.map +7 -0
  310. package/dist/security/manifest/plugins/maven.test.js +389 -0
  311. package/dist/security/manifest/plugins/maven.test.js.map +7 -0
  312. package/dist/security/manifest/plugins/npm.js +284 -0
  313. package/dist/security/manifest/plugins/npm.js.map +7 -0
  314. package/dist/security/manifest/plugins/npm.test.js +298 -0
  315. package/dist/security/manifest/plugins/npm.test.js.map +7 -0
  316. package/dist/security/manifest/plugins/nuget.js +186 -0
  317. package/dist/security/manifest/plugins/nuget.js.map +7 -0
  318. package/dist/security/manifest/plugins/pip.js +123 -0
  319. package/dist/security/manifest/plugins/pip.js.map +7 -0
  320. package/dist/security/manifest/plugins/pip.test.js +208 -0
  321. package/dist/security/manifest/plugins/pip.test.js.map +7 -0
  322. package/dist/security/manifest/plugins/pubspec.js +212 -0
  323. package/dist/security/manifest/plugins/pubspec.js.map +7 -0
  324. package/dist/security/manifest/plugins/pyproject.js +261 -0
  325. package/dist/security/manifest/plugins/pyproject.js.map +7 -0
  326. package/dist/security/manifest/plugins/rubygems.js +185 -0
  327. package/dist/security/manifest/plugins/rubygems.js.map +7 -0
  328. package/dist/security/manifest/plugins/swift.js +200 -0
  329. package/dist/security/manifest/plugins/swift.js.map +7 -0
  330. package/dist/security/owasp.js +104 -0
  331. package/dist/security/owasp.js.map +7 -0
  332. package/dist/security/pipeline.js +125 -0
  333. package/dist/security/pipeline.js.map +7 -0
  334. package/dist/security/reachability.js +276 -0
  335. package/dist/security/reachability.js.map +7 -0
  336. package/dist/security/reachability.test.js +394 -0
  337. package/dist/security/reachability.test.js.map +7 -0
  338. package/dist/security/remediation.js +126 -0
  339. package/dist/security/remediation.js.map +7 -0
  340. package/dist/security/secrets.js +176 -0
  341. package/dist/security/secrets.js.map +7 -0
  342. package/dist/security/staleness.js +231 -0
  343. package/dist/security/staleness.js.map +7 -0
  344. package/dist/security/supply-chain.js +301 -0
  345. package/dist/security/supply-chain.js.map +7 -0
  346. package/dist/security/suppressions.js +106 -0
  347. package/dist/security/suppressions.js.map +7 -0
  348. package/dist/security/types.js +17 -0
  349. package/dist/security/types.js.map +7 -0
  350. package/dist/security/vuln/client.js +355 -0
  351. package/dist/security/vuln/client.js.map +7 -0
  352. package/dist/security/vuln/client.test.js +288 -0
  353. package/dist/security/vuln/client.test.js.map +7 -0
  354. package/dist/security/vuln/epss-client.js +95 -0
  355. package/dist/security/vuln/epss-client.js.map +7 -0
  356. package/dist/security/vuln/index.js +29 -0
  357. package/dist/security/vuln/index.js.map +7 -0
  358. package/dist/security/vuln/osv-adapter.js +321 -0
  359. package/dist/security/vuln/osv-adapter.js.map +7 -0
  360. package/dist/security/vuln/osv-adapter.test.js +391 -0
  361. package/dist/security/vuln/osv-adapter.test.js.map +7 -0
  362. package/dist/security/vuln/types.js +17 -0
  363. package/dist/security/vuln/types.js.map +7 -0
  364. package/dist/types.js.map +2 -2
  365. package/package.json +5 -2
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var benchmark_exports = {};
30
+ __export(benchmark_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(benchmark_exports);
34
+ var fs = __toESM(require("fs"));
35
+ var path = __toESM(require("path"));
36
+ var import_child_process = require("child_process");
37
+ var import_ui = require("../ui");
38
+ function register(program) {
39
+ program.command("benchmark").description("Run reproducible token-efficiency benchmarks").option("--repo <name>", "Run benchmark for a specific repo only").option("--report", "Generate markdown report from existing results").option("--output <dir>", "Output directory for results", "benchmarks/results").action(async (opts) => {
40
+ const configPath = path.join(process.cwd(), "benchmarks", "config.json");
41
+ if (!fs.existsSync(configPath)) {
42
+ console.error(" benchmarks/config.json not found. Run from the KiroGraph project root.");
43
+ process.exit(1);
44
+ }
45
+ const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
46
+ const outputDir = path.resolve(opts.output);
47
+ fs.mkdirSync(outputDir, { recursive: true });
48
+ if (opts.report) {
49
+ generateReport(outputDir);
50
+ return;
51
+ }
52
+ const repos = opts.repo ? config.repos.filter((r) => r.name === opts.repo) : config.repos;
53
+ if (repos.length === 0) {
54
+ console.error(` Repo "${opts.repo}" not found in config.`);
55
+ process.exit(1);
56
+ }
57
+ console.log(`
58
+ ${import_ui.bold}KiroGraph Benchmark${import_ui.reset}`);
59
+ console.log(` ${import_ui.dim}Running ${repos.length} repo(s)\u2026${import_ui.reset}
60
+ `);
61
+ for (const repo of repos) {
62
+ const result = await runRepoBenchmark(repo);
63
+ const resultPath = path.join(outputDir, `${repo.name}.json`);
64
+ fs.writeFileSync(resultPath, JSON.stringify(result, null, 2));
65
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} ${repo.name}: avg ${result.avgSavingsPct}% savings \u2192 ${resultPath}
66
+ `);
67
+ }
68
+ console.log(` ${import_ui.dim}Run \`kirograph benchmark --report\` to generate summary.${import_ui.reset}
69
+ `);
70
+ });
71
+ }
72
+ async function runRepoBenchmark(repo) {
73
+ const tmpDir = path.join(process.cwd(), ".kirograph-bench-tmp", repo.name);
74
+ console.log(` ${import_ui.violet}${repo.name}${import_ui.reset}: ${repo.description}`);
75
+ if (!fs.existsSync(tmpDir)) {
76
+ console.log(` ${import_ui.dim}Cloning ${repo.url}\u2026${import_ui.reset}`);
77
+ fs.mkdirSync(path.dirname(tmpDir), { recursive: true });
78
+ (0, import_child_process.execSync)(`git clone --depth 1 ${repo.url} ${tmpDir}`, { stdio: "pipe" });
79
+ if (repo.sha !== "main" && repo.sha !== "master") {
80
+ try {
81
+ (0, import_child_process.execSync)(`git checkout ${repo.sha}`, { cwd: tmpDir, stdio: "pipe" });
82
+ } catch {
83
+ }
84
+ }
85
+ }
86
+ console.log(` ${import_ui.dim}Indexing\u2026${import_ui.reset}`);
87
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
88
+ const indexStart = Date.now();
89
+ let cg;
90
+ if (!KiroGraph.isInitialized(tmpDir)) {
91
+ cg = await KiroGraph.init(tmpDir);
92
+ } else {
93
+ cg = await KiroGraph.open(tmpDir);
94
+ }
95
+ const indexResult = await cg.indexAll();
96
+ const indexDurationMs = Date.now() - indexStart;
97
+ console.log(` ${import_ui.dim}Indexed: ${indexResult.filesIndexed} files, ${indexResult.nodesCreated} nodes, ${indexResult.edgesCreated} edges (${indexDurationMs}ms)${import_ui.reset}`);
98
+ const allFiles = cg.getAllNodes().map((n) => n.filePath);
99
+ const uniqueFiles = [...new Set(allFiles)];
100
+ let totalNaiveTokens = 0;
101
+ for (const fp of uniqueFiles) {
102
+ try {
103
+ const fullPath = path.join(tmpDir, fp);
104
+ const stat = fs.statSync(fullPath);
105
+ totalNaiveTokens += Math.round(stat.size / 4);
106
+ } catch {
107
+ }
108
+ }
109
+ const queryResults = [];
110
+ for (const query of repo.queries) {
111
+ const start = Date.now();
112
+ let responseText = "";
113
+ try {
114
+ if (query.tool === "kirograph_context") {
115
+ const ctx = await cg.buildContext(query.args.task, { maxNodes: 20, includeCode: true });
116
+ responseText = ctx.summary + ctx.entryPoints.map((n) => n.name).join(" ");
117
+ for (const [, code] of ctx.codeSnippets) responseText += code;
118
+ } else if (query.tool === "kirograph_callers") {
119
+ const results = cg.searchNodes(query.args.symbol, void 0, 5);
120
+ if (results.length > 0) {
121
+ const callers = await cg.getCallers(results[0].node.id, 20);
122
+ responseText = callers.map((n) => `${n.name} ${n.filePath}`).join("\n");
123
+ }
124
+ } else if (query.tool === "kirograph_impact") {
125
+ const results = cg.searchNodes(query.args.symbol, void 0, 5);
126
+ if (results.length > 0) {
127
+ const impact = await cg.getImpactRadius(results[0].node.id, query.args.depth ?? 2);
128
+ responseText = impact.map((n) => `${n.name} ${n.filePath}`).join("\n");
129
+ }
130
+ }
131
+ } catch {
132
+ }
133
+ const durationMs = Date.now() - start;
134
+ const graphTokens = Math.round(responseText.length / 4);
135
+ const naiveFileCount = query.tool === "kirograph_context" ? 8 : 5;
136
+ const avgFileTokens = totalNaiveTokens / Math.max(uniqueFiles.length, 1);
137
+ const naiveTokens = Math.round(avgFileTokens * naiveFileCount);
138
+ const savingsPct = naiveTokens > 0 ? Math.round((1 - graphTokens / naiveTokens) * 100) : 0;
139
+ queryResults.push({
140
+ tool: query.tool,
141
+ args: query.args,
142
+ graphTokens,
143
+ naiveTokens,
144
+ savingsPct: Math.max(0, savingsPct),
145
+ durationMs
146
+ });
147
+ console.log(` ${import_ui.dim} ${query.tool}(${JSON.stringify(query.args).slice(0, 40)}\u2026) \u2192 ${savingsPct}% savings (${durationMs}ms)${import_ui.reset}`);
148
+ }
149
+ cg.close();
150
+ const avgSavingsPct = queryResults.length > 0 ? Math.round(queryResults.reduce((s, q) => s + q.savingsPct, 0) / queryResults.length) : 0;
151
+ return {
152
+ name: repo.name,
153
+ description: repo.description,
154
+ filesIndexed: indexResult.filesIndexed,
155
+ nodesCreated: indexResult.nodesCreated,
156
+ edgesCreated: indexResult.edgesCreated,
157
+ indexDurationMs,
158
+ queries: queryResults,
159
+ avgSavingsPct
160
+ };
161
+ }
162
+ function generateReport(outputDir) {
163
+ const files = fs.readdirSync(outputDir).filter((f) => f.endsWith(".json"));
164
+ if (files.length === 0) {
165
+ console.log(" No results found. Run `kirograph benchmark` first.");
166
+ return;
167
+ }
168
+ const results = files.map(
169
+ (f) => JSON.parse(fs.readFileSync(path.join(outputDir, f), "utf8"))
170
+ );
171
+ const lines = [
172
+ "# KiroGraph Benchmark Results",
173
+ "",
174
+ `Generated: ${(/* @__PURE__ */ new Date()).toISOString().slice(0, 19)}`,
175
+ "",
176
+ "## Summary",
177
+ "",
178
+ "| Repository | Files | Nodes | Edges | Index Time | Avg Savings |",
179
+ "|-----------|-------|-------|-------|-----------|-------------|"
180
+ ];
181
+ for (const r of results) {
182
+ lines.push(`| ${r.name} | ${r.filesIndexed} | ${r.nodesCreated} | ${r.edgesCreated} | ${r.indexDurationMs}ms | ${r.avgSavingsPct}% |`);
183
+ }
184
+ lines.push("", "## Query Details", "");
185
+ for (const r of results) {
186
+ lines.push(`### ${r.name}`, "");
187
+ lines.push("| Query | Graph Tokens | Naive Tokens | Savings | Time |");
188
+ lines.push("|-------|-------------|-------------|---------|------|");
189
+ for (const q of r.queries) {
190
+ const queryDesc = `${q.tool}(${JSON.stringify(q.args).slice(0, 30)}\u2026)`;
191
+ lines.push(`| ${queryDesc} | ${q.graphTokens} | ${q.naiveTokens} | ${q.savingsPct}% | ${q.durationMs}ms |`);
192
+ }
193
+ lines.push("");
194
+ }
195
+ const reportPath = path.join(outputDir, "REPORT.md");
196
+ fs.writeFileSync(reportPath, lines.join("\n"));
197
+ console.log(`
198
+ ${import_ui.green}Report generated${import_ui.reset}: ${reportPath}
199
+ `);
200
+ console.log(lines.join("\n"));
201
+ }
202
+ // Annotate the CommonJS export names for ESM import in node:
203
+ 0 && (module.exports = {
204
+ register
205
+ });
206
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/benchmark.ts"],
4
+ "sourcesContent": ["/**\n * KiroGraph Benchmark Runner\n *\n * Clones repos at pinned SHAs, indexes them, runs predefined queries,\n * and measures token efficiency vs naive file reading.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\nimport { Command } from 'commander';\nimport { bold, dim, green, reset, violet } from '../ui';\n\ninterface BenchmarkQuery {\n tool: string;\n args: Record<string, unknown>;\n}\n\ninterface BenchmarkRepo {\n name: string;\n url: string;\n sha: string;\n description: string;\n queries: BenchmarkQuery[];\n}\n\ninterface BenchmarkConfig {\n repos: BenchmarkRepo[];\n}\n\ninterface QueryResult {\n tool: string;\n args: Record<string, unknown>;\n graphTokens: number;\n naiveTokens: number;\n savingsPct: number;\n durationMs: number;\n}\n\ninterface RepoResult {\n name: string;\n description: string;\n filesIndexed: number;\n nodesCreated: number;\n edgesCreated: number;\n indexDurationMs: number;\n queries: QueryResult[];\n avgSavingsPct: number;\n}\n\nexport function register(program: Command): void {\n program\n .command('benchmark')\n .description('Run reproducible token-efficiency benchmarks')\n .option('--repo <name>', 'Run benchmark for a specific repo only')\n .option('--report', 'Generate markdown report from existing results')\n .option('--output <dir>', 'Output directory for results', 'benchmarks/results')\n .action(async (opts: { repo?: string; report?: boolean; output: string }) => {\n const configPath = path.join(process.cwd(), 'benchmarks', 'config.json');\n if (!fs.existsSync(configPath)) {\n console.error(' benchmarks/config.json not found. Run from the KiroGraph project root.');\n process.exit(1);\n }\n\n const config: BenchmarkConfig = JSON.parse(fs.readFileSync(configPath, 'utf8'));\n const outputDir = path.resolve(opts.output);\n fs.mkdirSync(outputDir, { recursive: true });\n\n if (opts.report) {\n generateReport(outputDir);\n return;\n }\n\n const repos = opts.repo\n ? config.repos.filter(r => r.name === opts.repo)\n : config.repos;\n\n if (repos.length === 0) {\n console.error(` Repo \"${opts.repo}\" not found in config.`);\n process.exit(1);\n }\n\n console.log(`\\n ${bold}KiroGraph Benchmark${reset}`);\n console.log(` ${dim}Running ${repos.length} repo(s)\u2026${reset}\\n`);\n\n for (const repo of repos) {\n const result = await runRepoBenchmark(repo);\n const resultPath = path.join(outputDir, `${repo.name}.json`);\n fs.writeFileSync(resultPath, JSON.stringify(result, null, 2));\n console.log(` ${green}\u2713${reset} ${repo.name}: avg ${result.avgSavingsPct}% savings \u2192 ${resultPath}\\n`);\n }\n\n console.log(` ${dim}Run \\`kirograph benchmark --report\\` to generate summary.${reset}\\n`);\n });\n}\n\nasync function runRepoBenchmark(repo: BenchmarkRepo): Promise<RepoResult> {\n const tmpDir = path.join(process.cwd(), '.kirograph-bench-tmp', repo.name);\n\n console.log(` ${violet}${repo.name}${reset}: ${repo.description}`);\n\n // Clone if not already present\n if (!fs.existsSync(tmpDir)) {\n console.log(` ${dim}Cloning ${repo.url}\u2026${reset}`);\n fs.mkdirSync(path.dirname(tmpDir), { recursive: true });\n execSync(`git clone --depth 1 ${repo.url} ${tmpDir}`, { stdio: 'pipe' });\n if (repo.sha !== 'main' && repo.sha !== 'master') {\n try {\n execSync(`git checkout ${repo.sha}`, { cwd: tmpDir, stdio: 'pipe' });\n } catch {\n // SHA might not be fetchable with --depth 1, continue with HEAD\n }\n }\n }\n\n // Index\n console.log(` ${dim}Indexing\u2026${reset}`);\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const indexStart = Date.now();\n\n let cg;\n if (!KiroGraph.isInitialized(tmpDir)) {\n cg = await KiroGraph.init(tmpDir);\n } else {\n cg = await KiroGraph.open(tmpDir);\n }\n\n const indexResult = await cg.indexAll();\n const indexDurationMs = Date.now() - indexStart;\n\n console.log(` ${dim}Indexed: ${indexResult.filesIndexed} files, ${indexResult.nodesCreated} nodes, ${indexResult.edgesCreated} edges (${indexDurationMs}ms)${reset}`);\n\n // Estimate naive tokens (reading all source files)\n const allFiles = cg.getAllNodes().map((n: any) => n.filePath as string);\n const uniqueFiles = [...new Set(allFiles)];\n let totalNaiveTokens = 0;\n for (const fp of uniqueFiles) {\n try {\n const fullPath = path.join(tmpDir, fp);\n const stat = fs.statSync(fullPath);\n totalNaiveTokens += Math.round(stat.size / 4);\n } catch { /* skip */ }\n }\n\n // Run queries\n const queryResults: QueryResult[] = [];\n for (const query of repo.queries) {\n const start = Date.now();\n let responseText = '';\n\n try {\n if (query.tool === 'kirograph_context') {\n const ctx = await cg.buildContext(query.args.task as string, { maxNodes: 20, includeCode: true });\n responseText = ctx.summary + ctx.entryPoints.map((n: any) => n.name).join(' ');\n for (const [, code] of ctx.codeSnippets) responseText += code;\n } else if (query.tool === 'kirograph_callers') {\n const results = cg.searchNodes(query.args.symbol as string, undefined, 5);\n if (results.length > 0) {\n const callers = await cg.getCallers(results[0].node.id, 20);\n responseText = callers.map((n: any) => `${n.name} ${n.filePath}`).join('\\n');\n }\n } else if (query.tool === 'kirograph_impact') {\n const results = cg.searchNodes(query.args.symbol as string, undefined, 5);\n if (results.length > 0) {\n const impact = await cg.getImpactRadius(results[0].node.id, (query.args.depth as number) ?? 2);\n responseText = impact.map((n: any) => `${n.name} ${n.filePath}`).join('\\n');\n }\n }\n } catch { /* query failed \u2014 record 0 */ }\n\n const durationMs = Date.now() - start;\n const graphTokens = Math.round(responseText.length / 4);\n\n // Naive estimate: for context queries, agent would read ~5-10 files\n // For callers/impact, agent would grep + read ~3-5 files\n const naiveFileCount = query.tool === 'kirograph_context' ? 8 : 5;\n const avgFileTokens = totalNaiveTokens / Math.max(uniqueFiles.length, 1);\n const naiveTokens = Math.round(avgFileTokens * naiveFileCount);\n\n const savingsPct = naiveTokens > 0 ? Math.round((1 - graphTokens / naiveTokens) * 100) : 0;\n\n queryResults.push({\n tool: query.tool,\n args: query.args,\n graphTokens,\n naiveTokens,\n savingsPct: Math.max(0, savingsPct),\n durationMs,\n });\n\n console.log(` ${dim} ${query.tool}(${JSON.stringify(query.args).slice(0, 40)}\u2026) \u2192 ${savingsPct}% savings (${durationMs}ms)${reset}`);\n }\n\n cg.close();\n\n const avgSavingsPct = queryResults.length > 0\n ? Math.round(queryResults.reduce((s, q) => s + q.savingsPct, 0) / queryResults.length)\n : 0;\n\n return {\n name: repo.name,\n description: repo.description,\n filesIndexed: indexResult.filesIndexed,\n nodesCreated: indexResult.nodesCreated,\n edgesCreated: indexResult.edgesCreated,\n indexDurationMs,\n queries: queryResults,\n avgSavingsPct,\n };\n}\n\nfunction generateReport(outputDir: string): void {\n const files = fs.readdirSync(outputDir).filter(f => f.endsWith('.json'));\n if (files.length === 0) {\n console.log(' No results found. Run `kirograph benchmark` first.');\n return;\n }\n\n const results: RepoResult[] = files.map(f =>\n JSON.parse(fs.readFileSync(path.join(outputDir, f), 'utf8'))\n );\n\n const lines = [\n '# KiroGraph Benchmark Results',\n '',\n `Generated: ${new Date().toISOString().slice(0, 19)}`,\n '',\n '## Summary',\n '',\n '| Repository | Files | Nodes | Edges | Index Time | Avg Savings |',\n '|-----------|-------|-------|-------|-----------|-------------|',\n ];\n\n for (const r of results) {\n lines.push(`| ${r.name} | ${r.filesIndexed} | ${r.nodesCreated} | ${r.edgesCreated} | ${r.indexDurationMs}ms | ${r.avgSavingsPct}% |`);\n }\n\n lines.push('', '## Query Details', '');\n\n for (const r of results) {\n lines.push(`### ${r.name}`, '');\n lines.push('| Query | Graph Tokens | Naive Tokens | Savings | Time |');\n lines.push('|-------|-------------|-------------|---------|------|');\n for (const q of r.queries) {\n const queryDesc = `${q.tool}(${JSON.stringify(q.args).slice(0, 30)}\u2026)`;\n lines.push(`| ${queryDesc} | ${q.graphTokens} | ${q.naiveTokens} | ${q.savingsPct}% | ${q.durationMs}ms |`);\n }\n lines.push('');\n }\n\n const reportPath = path.join(outputDir, 'REPORT.md');\n fs.writeFileSync(reportPath, lines.join('\\n'));\n console.log(`\\n ${green}Report generated${reset}: ${reportPath}\\n`);\n console.log(lines.join('\\n'));\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var budget_exports = {};
20
+ __export(budget_exports, {
21
+ register: () => register
22
+ });
23
+ module.exports = __toCommonJS(budget_exports);
24
+ function register(program) {
25
+ program.command("budget").description("Show current session context budget usage").option("--reset", "Reset session budget counters").option("--json", "Output as JSON").action(async (opts) => {
26
+ const { BudgetTracker } = await Promise.resolve().then(() => require("../../compression/tracker.js"));
27
+ const projectRoot = process.cwd();
28
+ let budgetConfig;
29
+ try {
30
+ const { loadConfig } = await Promise.resolve().then(() => require("../../config.js"));
31
+ const config = await loadConfig(projectRoot);
32
+ if (config.contextBudget) {
33
+ budgetConfig = config.contextBudget;
34
+ }
35
+ } catch {
36
+ }
37
+ const budget = BudgetTracker.getInstance(projectRoot, budgetConfig);
38
+ if (opts.reset) {
39
+ budget.reset();
40
+ if (opts.json) {
41
+ console.log(JSON.stringify({ reset: true }));
42
+ } else {
43
+ console.log(" Context budget counters reset.");
44
+ }
45
+ return;
46
+ }
47
+ const status = budget.getStatus();
48
+ if (opts.json) {
49
+ console.log(JSON.stringify(status, null, 2));
50
+ return;
51
+ }
52
+ console.log(`
53
+ Context Budget:`);
54
+ console.log(` ${"\u2500".repeat(40)}`);
55
+ console.log(` Tokens consumed: ${status.consumed.toLocaleString()}`);
56
+ console.log(` Budget limit: ${status.limit > 0 ? status.limit.toLocaleString() : "unlimited"}`);
57
+ console.log(` Remaining: ${status.limit > 0 ? status.remaining.toLocaleString() : "\u221E"}`);
58
+ console.log(` Utilization: ${status.utilization}%`);
59
+ if (status.warning) {
60
+ console.log(`
61
+ \u26A0 ${status.warning}`);
62
+ }
63
+ console.log();
64
+ });
65
+ }
66
+ // Annotate the CommonJS export names for ESM import in node:
67
+ 0 && (module.exports = {
68
+ register
69
+ });
70
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/budget.ts"],
4
+ "sourcesContent": ["/**\n * kirograph budget \u2014 Context budget governance CLI command\n */\n\nimport { Command } from 'commander';\n\nexport function register(program: Command): void {\n program\n .command('budget')\n .description('Show current session context budget usage')\n .option('--reset', 'Reset session budget counters')\n .option('--json', 'Output as JSON')\n .action(async (opts: { reset?: boolean; json?: boolean }) => {\n const { BudgetTracker } = await Promise.resolve().then(() => require('../../compression/tracker.js'));\n const projectRoot = process.cwd();\n\n // Load budget config from .kirograph/config.json if available\n let budgetConfig: { maxTokensPerSession?: number; warnAt?: number; throttleAt?: number } | undefined;\n try {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const config = await loadConfig(projectRoot);\n if (config.contextBudget) {\n budgetConfig = config.contextBudget;\n }\n } catch { /* no config \u2014 use defaults */ }\n\n const budget = BudgetTracker.getInstance(projectRoot, budgetConfig);\n\n if (opts.reset) {\n budget.reset();\n if (opts.json) {\n console.log(JSON.stringify({ reset: true }));\n } else {\n console.log(' Context budget counters reset.');\n }\n return;\n }\n\n const status = budget.getStatus();\n\n if (opts.json) {\n console.log(JSON.stringify(status, null, 2));\n return;\n }\n\n console.log(`\\n Context Budget:`);\n console.log(` ${'\u2500'.repeat(40)}`);\n console.log(` Tokens consumed: ${status.consumed.toLocaleString()}`);\n console.log(` Budget limit: ${status.limit > 0 ? status.limit.toLocaleString() : 'unlimited'}`);\n console.log(` Remaining: ${status.limit > 0 ? status.remaining.toLocaleString() : '\u221E'}`);\n console.log(` Utilization: ${status.utilization}%`);\n\n if (status.warning) {\n console.log(`\\n \u26A0 ${status.warning}`);\n }\n\n console.log();\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,QAAQ,EAChB,YAAY,2CAA2C,EACvD,OAAO,WAAW,+BAA+B,EACjD,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,SAA8C;AAC3D,UAAM,EAAE,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,8BAA8B,CAAC;AACpG,UAAM,cAAc,QAAQ,IAAI;AAGhC,QAAI;AACJ,QAAI;AACF,YAAM,EAAE,WAAW,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iBAAiB,CAAC;AACpF,YAAM,SAAS,MAAM,WAAW,WAAW;AAC3C,UAAI,OAAO,eAAe;AACxB,uBAAe,OAAO;AAAA,MACxB;AAAA,IACF,QAAQ;AAAA,IAAiC;AAEzC,UAAM,SAAS,cAAc,YAAY,aAAa,YAAY;AAElE,QAAI,KAAK,OAAO;AACd,aAAO,MAAM;AACb,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,KAAK,CAAC,CAAC;AAAA,MAC7C,OAAO;AACL,gBAAQ,IAAI,kCAAkC;AAAA,MAChD;AACA;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,UAAU;AAEhC,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,IACF;AAEA,YAAQ,IAAI;AAAA,kBAAqB;AACjC,YAAQ,IAAI,KAAK,SAAI,OAAO,EAAE,CAAC,EAAE;AACjC,YAAQ,IAAI,sBAAsB,OAAO,SAAS,eAAe,CAAC,EAAE;AACpE,YAAQ,IAAI,sBAAsB,OAAO,QAAQ,IAAI,OAAO,MAAM,eAAe,IAAI,WAAW,EAAE;AAClG,YAAQ,IAAI,sBAAsB,OAAO,QAAQ,IAAI,OAAO,UAAU,eAAe,IAAI,QAAG,EAAE;AAC9F,YAAQ,IAAI,sBAAsB,OAAO,WAAW,GAAG;AAEvD,QAAI,OAAO,SAAS;AAClB,cAAQ,IAAI;AAAA,WAAS,OAAO,OAAO,EAAE;AAAA,IACvC;AAEA,YAAQ,IAAI;AAAA,EACd,CAAC;AACL;",
6
+ "names": []
7
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var communities_exports = {};
30
+ __export(communities_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(communities_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_ui = require("../ui");
36
+ function register(program) {
37
+ program.command("communities [projectPath]").description("Detect code communities (clusters of related symbols)").option("--resolution <n>", "Resolution parameter (higher = more communities)", "1.0").option("--limit <n>", "Max communities to show", "15").option("--json", "Output as JSON").action(async (projectPath, opts) => {
38
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
39
+ const target = path.resolve(projectPath ?? process.cwd());
40
+ const cg = await KiroGraph.open(target);
41
+ const { detectCommunities } = await Promise.resolve().then(() => require("../../graph/communities.js"));
42
+ const db = cg.getDatabase();
43
+ const result = detectCommunities(db, {
44
+ resolution: parseFloat(opts.resolution)
45
+ });
46
+ if (opts.json) {
47
+ console.log(JSON.stringify(result, null, 2));
48
+ cg.close();
49
+ return;
50
+ }
51
+ if (result.communities.length === 0) {
52
+ console.log("\n No communities detected. The graph may be too small or have no edges.\n");
53
+ cg.close();
54
+ return;
55
+ }
56
+ const limit = Math.min(parseInt(opts.limit), result.communities.length);
57
+ console.log(`
58
+ ${import_ui.bold}Communities${import_ui.reset} (${result.communities.length} detected, modularity: ${result.modularity.toFixed(3)})`);
59
+ console.log(` ${import_ui.dim}${result.totalNodes} nodes, ${result.totalEdges} edges${import_ui.reset}
60
+ `);
61
+ for (const c of result.communities.slice(0, limit)) {
62
+ console.log(` ${import_ui.green}${c.label}${import_ui.reset} \u2014 ${c.memberCount} symbols`);
63
+ console.log(` ${import_ui.dim}dir: ${c.dominantDirectory} | lang: ${c.dominantLanguage} | cross-edges: ${c.interCommunityEdges}${import_ui.reset}`);
64
+ for (const m of c.members.slice(0, 5)) {
65
+ console.log(` ${import_ui.dim}${m.kind}${import_ui.reset} ${import_ui.violet}${m.name}${import_ui.reset} ${import_ui.dim}\u2014 ${m.filePath}${import_ui.reset}`);
66
+ }
67
+ if (c.memberCount > 5) console.log(` ${import_ui.dim}\u2026and ${c.memberCount - 5} more${import_ui.reset}`);
68
+ console.log();
69
+ }
70
+ cg.close();
71
+ });
72
+ }
73
+ // Annotate the CommonJS export names for ESM import in node:
74
+ 0 && (module.exports = {
75
+ register
76
+ });
77
+ //# sourceMappingURL=communities.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/communities.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { dim, reset, violet, bold, green, renderTable } from '../ui';\n\nexport function register(program: Command): void {\n program\n .command('communities [projectPath]')\n .description('Detect code communities (clusters of related symbols)')\n .option('--resolution <n>', 'Resolution parameter (higher = more communities)', '1.0')\n .option('--limit <n>', 'Max communities to show', '15')\n .option('--json', 'Output as JSON')\n .action(async (projectPath: string | undefined, opts: { resolution: string; limit: string; json?: boolean }) => {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const target = path.resolve(projectPath ?? process.cwd());\n const cg = await KiroGraph.open(target);\n const { detectCommunities } = await Promise.resolve().then(() => require('../../graph/communities.js'));\n const db = cg.getDatabase();\n\n const result = detectCommunities(db, {\n resolution: parseFloat(opts.resolution),\n });\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n cg.close();\n return;\n }\n\n if (result.communities.length === 0) {\n console.log('\\n No communities detected. The graph may be too small or have no edges.\\n');\n cg.close();\n return;\n }\n\n const limit = Math.min(parseInt(opts.limit), result.communities.length);\n\n console.log(`\\n ${bold}Communities${reset} (${result.communities.length} detected, modularity: ${result.modularity.toFixed(3)})`);\n console.log(` ${dim}${result.totalNodes} nodes, ${result.totalEdges} edges${reset}\\n`);\n\n for (const c of result.communities.slice(0, limit)) {\n console.log(` ${green}${c.label}${reset} \u2014 ${c.memberCount} symbols`);\n console.log(` ${dim}dir: ${c.dominantDirectory} | lang: ${c.dominantLanguage} | cross-edges: ${c.interCommunityEdges}${reset}`);\n for (const m of c.members.slice(0, 5)) {\n console.log(` ${dim}${m.kind}${reset} ${violet}${m.name}${reset} ${dim}\u2014 ${m.filePath}${reset}`);\n }\n if (c.memberCount > 5) console.log(` ${dim}\u2026and ${c.memberCount - 5} more${reset}`);\n console.log();\n }\n\n cg.close();\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,WAAsB;AACtB,gBAA6D;AAEtD,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,2BAA2B,EACnC,YAAY,uDAAuD,EACnE,OAAO,oBAAoB,oDAAoD,KAAK,EACpF,OAAO,eAAe,2BAA2B,IAAI,EACrD,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,aAAiC,SAAgE;AAC9G,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,UAAM,SAAS,KAAK,QAAQ,eAAe,QAAQ,IAAI,CAAC;AACxD,UAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AACtC,UAAM,EAAE,kBAAkB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,4BAA4B,CAAC;AACtG,UAAM,KAAK,GAAG,YAAY;AAE1B,UAAM,SAAS,kBAAkB,IAAI;AAAA,MACnC,YAAY,WAAW,KAAK,UAAU;AAAA,IACxC,CAAC;AAED,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C,SAAG,MAAM;AACT;AAAA,IACF;AAEA,QAAI,OAAO,YAAY,WAAW,GAAG;AACnC,cAAQ,IAAI,6EAA6E;AACzF,SAAG,MAAM;AACT;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,IAAI,SAAS,KAAK,KAAK,GAAG,OAAO,YAAY,MAAM;AAEtE,YAAQ,IAAI;AAAA,IAAO,cAAI,cAAc,eAAK,KAAK,OAAO,YAAY,MAAM,0BAA0B,OAAO,WAAW,QAAQ,CAAC,CAAC,GAAG;AACjI,YAAQ,IAAI,KAAK,aAAG,GAAG,OAAO,UAAU,WAAW,OAAO,UAAU,SAAS,eAAK;AAAA,CAAI;AAEtF,eAAW,KAAK,OAAO,YAAY,MAAM,GAAG,KAAK,GAAG;AAClD,cAAQ,IAAI,KAAK,eAAK,GAAG,EAAE,KAAK,GAAG,eAAK,WAAM,EAAE,WAAW,UAAU;AACrE,cAAQ,IAAI,KAAK,aAAG,QAAQ,EAAE,iBAAiB,YAAY,EAAE,gBAAgB,mBAAmB,EAAE,mBAAmB,GAAG,eAAK,EAAE;AAC/H,iBAAW,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG;AACrC,gBAAQ,IAAI,OAAO,aAAG,GAAG,EAAE,IAAI,GAAG,eAAK,IAAI,gBAAM,GAAG,EAAE,IAAI,GAAG,eAAK,IAAI,aAAG,UAAK,EAAE,QAAQ,GAAG,eAAK,EAAE;AAAA,MACpG;AACA,UAAI,EAAE,cAAc,EAAG,SAAQ,IAAI,OAAO,aAAG,aAAQ,EAAE,cAAc,CAAC,QAAQ,eAAK,EAAE;AACrF,cAAQ,IAAI;AAAA,IACd;AAEA,OAAG,MAAM;AAAA,EACX,CAAC;AACL;",
6
+ "names": []
7
+ }