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,160 @@
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 reachability_exports = {};
30
+ __export(reachability_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(reachability_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_config = require("../../config");
36
+ var import_ui = require("../ui");
37
+ const red = "\x1B[31m";
38
+ const yellow = "\x1B[33m";
39
+ function register(program) {
40
+ program.command("reachability <target> [projectPath]").description("Check reachability for a dependency or CVE: verdict, call paths, impact summary").action(async (target, projectPath) => {
41
+ const projectRoot = path.resolve(projectPath ?? process.cwd());
42
+ const config = await (0, import_config.loadConfig)(projectRoot);
43
+ if (!config.enableSecurity) {
44
+ console.error(`
45
+ ${yellow}\u26A0 Security analysis is disabled.${import_ui.reset}`);
46
+ console.error(` ${import_ui.dim}Enable it in .kirograph/config.json:${import_ui.reset} ${import_ui.violet}${import_ui.bold}"enableSecurity": true${import_ui.reset}`);
47
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
48
+ `);
49
+ process.exit(1);
50
+ }
51
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
52
+ if (!KiroGraph.isInitialized(projectRoot)) {
53
+ console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
54
+ process.exit(1);
55
+ }
56
+ const cg = await KiroGraph.open(projectRoot);
57
+ const db = cg.getDatabase();
58
+ db.applySecuritySchema();
59
+ const rawDb = db.getRawDb();
60
+ let vulnerabilityNodeId = null;
61
+ let targetLabel = target;
62
+ const vulnRow = rawDb.get(
63
+ `SELECT node_id FROM sec_vulnerabilities WHERE cve_id = ?`,
64
+ [target]
65
+ );
66
+ if (vulnRow) {
67
+ vulnerabilityNodeId = vulnRow.node_id;
68
+ } else {
69
+ const depRow = rawDb.get(
70
+ `SELECT node_id, package_name FROM sec_dependencies WHERE package_name = ?`,
71
+ [target]
72
+ );
73
+ if (depRow) {
74
+ targetLabel = depRow.package_name;
75
+ const vulnEdge = rawDb.get(
76
+ `SELECT target FROM edges WHERE source = ? AND kind = 'has_vulnerability' LIMIT 1`,
77
+ [depRow.node_id]
78
+ );
79
+ if (vulnEdge) {
80
+ vulnerabilityNodeId = vulnEdge.target;
81
+ } else {
82
+ console.error(`
83
+ ${import_ui.dim}No vulnerabilities found for dependency "${target}". The dependency exists but has no known CVEs.${import_ui.reset}
84
+ `);
85
+ cg.close();
86
+ process.exit(0);
87
+ }
88
+ } else {
89
+ console.error(`
90
+ \u2716 Target "${target}" not found. Provide a valid CVE ID or dependency package name.
91
+ `);
92
+ cg.close();
93
+ process.exit(1);
94
+ }
95
+ }
96
+ const { ReachabilityAnalyzer } = await Promise.resolve().then(() => require("../../security/reachability.js"));
97
+ const analyzer = new ReachabilityAnalyzer(db, config);
98
+ const result = await analyzer.analyze(vulnerabilityNodeId);
99
+ let verdictColor;
100
+ let verdictLabel;
101
+ if (result.verdict === "affected") {
102
+ verdictColor = red;
103
+ verdictLabel = "affected";
104
+ } else if (result.verdict === "not_affected") {
105
+ verdictColor = import_ui.green;
106
+ verdictLabel = "not affected";
107
+ } else {
108
+ verdictColor = yellow;
109
+ verdictLabel = "under investigation";
110
+ }
111
+ console.log(`
112
+ ${import_ui.violet}${import_ui.bold}Reachability:${import_ui.reset} ${targetLabel}`);
113
+ console.log(` ${import_ui.dim}Verdict:${import_ui.reset} ${verdictColor}${import_ui.bold}${verdictLabel}${import_ui.reset}`);
114
+ console.log(` ${import_ui.dim}Reaching entry points:${import_ui.reset} ${import_ui.bold}${result.reachingEntryPointCount}${import_ui.reset}`);
115
+ if (result.paths.length > 0) {
116
+ console.log(`
117
+ ${import_ui.violet}${import_ui.bold}Call Paths${import_ui.reset} ${import_ui.dim}(showing up to 5)${import_ui.reset}
118
+ `);
119
+ for (const p of result.paths.slice(0, 5)) {
120
+ console.log(` ${import_ui.dim}from${import_ui.reset} ${import_ui.violet}${p.entryPoint}${import_ui.reset}`);
121
+ console.log(` ${p.path.join(` ${import_ui.dim}\u2192${import_ui.reset} `)}`);
122
+ }
123
+ if (result.paths.length > 5) {
124
+ console.log(`
125
+ ${import_ui.dim}\u2026and ${result.paths.length - 5} more paths${import_ui.reset}`);
126
+ }
127
+ }
128
+ if (result.unresolvedSymbols.length > 0) {
129
+ console.log(`
130
+ ${yellow}Unresolved Symbols${import_ui.reset} ${import_ui.dim}(${result.unresolvedSymbols.length} total, showing up to 10)${import_ui.reset}
131
+ `);
132
+ for (const sym of result.unresolvedSymbols.slice(0, 10)) {
133
+ console.log(` ${import_ui.dim}\xB7${import_ui.reset} ${sym}`);
134
+ }
135
+ if (result.unresolvedSymbols.length > 10) {
136
+ console.log(` ${import_ui.dim}\u2026and ${result.unresolvedSymbols.length - 10} more${import_ui.reset}`);
137
+ }
138
+ }
139
+ if (result.verdict === "affected") {
140
+ const impact = await analyzer.getImpactSummary(vulnerabilityNodeId);
141
+ if (impact) {
142
+ console.log(`
143
+ ${import_ui.violet}${import_ui.bold}Impact Summary${import_ui.reset}
144
+ `);
145
+ if (impact.affectedLayers.length > 0) {
146
+ console.log(` ${import_ui.dim}Affected layers:${import_ui.reset} ${impact.affectedLayers.join(", ")}`);
147
+ }
148
+ console.log(` ${import_ui.dim}Affected entry points:${import_ui.reset} ${import_ui.bold}${impact.affectedEntryPoints.length}${import_ui.reset}`);
149
+ console.log(` ${import_ui.dim}Distinct paths:${import_ui.reset} ${import_ui.bold}${impact.distinctPathCount}${import_ui.reset}`);
150
+ }
151
+ }
152
+ console.log();
153
+ cg.close();
154
+ });
155
+ }
156
+ // Annotate the CommonJS export names for ESM import in node:
157
+ 0 && (module.exports = {
158
+ register
159
+ });
160
+ //# sourceMappingURL=reachability.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/reachability.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, green } from '../ui';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[33m';\n\nexport function register(program: Command): void {\n program\n .command('reachability <target> [projectPath]')\n .description('Check reachability for a dependency or CVE: verdict, call paths, impact summary')\n .action(async (target: string, projectPath: string | undefined) => {\n const projectRoot = path.resolve(projectPath ?? process.cwd());\n const config = await loadConfig(projectRoot);\n\n if (!config.enableSecurity) {\n console.error(`\\n ${yellow}\u26A0 Security analysis is disabled.${reset}`);\n console.error(` ${dim}Enable it in .kirograph/config.json:${reset} ${violet}${bold}\"enableSecurity\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(projectRoot)) {\n console.error(' \u2716 KiroGraph not initialized. Run: kirograph init');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(projectRoot);\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n // Resolve target to a vulnerability node ID (CVE ID or package name)\n let vulnerabilityNodeId: string | null = null;\n let targetLabel = target;\n\n const vulnRow: { node_id: string } | undefined = rawDb.get(\n `SELECT node_id FROM sec_vulnerabilities WHERE cve_id = ?`,\n [target],\n );\n\n if (vulnRow) {\n vulnerabilityNodeId = vulnRow.node_id;\n } else {\n const depRow: { node_id: string; package_name: string } | undefined = rawDb.get(\n `SELECT node_id, package_name FROM sec_dependencies WHERE package_name = ?`,\n [target],\n );\n\n if (depRow) {\n targetLabel = depRow.package_name;\n const vulnEdge: { target: string } | undefined = rawDb.get(\n `SELECT target FROM edges WHERE source = ? AND kind = 'has_vulnerability' LIMIT 1`,\n [depRow.node_id],\n );\n\n if (vulnEdge) {\n vulnerabilityNodeId = vulnEdge.target;\n } else {\n console.error(`\\n ${dim}No vulnerabilities found for dependency \"${target}\". The dependency exists but has no known CVEs.${reset}\\n`);\n cg.close();\n process.exit(0);\n }\n } else {\n console.error(`\\n \u2716 Target \"${target}\" not found. Provide a valid CVE ID or dependency package name.\\n`);\n cg.close();\n process.exit(1);\n }\n }\n\n const { ReachabilityAnalyzer } = await Promise.resolve().then(() => require('../../security/reachability.js'));\n const analyzer = new ReachabilityAnalyzer(db, config);\n const result = await analyzer.analyze(vulnerabilityNodeId);\n\n // Verdict line\n let verdictColor: string;\n let verdictLabel: string;\n if (result.verdict === 'affected') {\n verdictColor = red; verdictLabel = 'affected';\n } else if (result.verdict === 'not_affected') {\n verdictColor = green; verdictLabel = 'not affected';\n } else {\n verdictColor = yellow; verdictLabel = 'under investigation';\n }\n\n console.log(`\\n ${violet}${bold}Reachability:${reset} ${targetLabel}`);\n console.log(` ${dim}Verdict:${reset} ${verdictColor}${bold}${verdictLabel}${reset}`);\n console.log(` ${dim}Reaching entry points:${reset} ${bold}${result.reachingEntryPointCount}${reset}`);\n\n // Call paths\n if (result.paths.length > 0) {\n console.log(`\\n ${violet}${bold}Call Paths${reset} ${dim}(showing up to 5)${reset}\\n`);\n for (const p of result.paths.slice(0, 5)) {\n console.log(` ${dim}from${reset} ${violet}${p.entryPoint}${reset}`);\n console.log(` ${p.path.join(` ${dim}\u2192${reset} `)}`);\n }\n if (result.paths.length > 5) {\n console.log(`\\n ${dim}\u2026and ${result.paths.length - 5} more paths${reset}`);\n }\n }\n\n // Unresolved symbols\n if (result.unresolvedSymbols.length > 0) {\n console.log(`\\n ${yellow}Unresolved Symbols${reset} ${dim}(${result.unresolvedSymbols.length} total, showing up to 10)${reset}\\n`);\n for (const sym of result.unresolvedSymbols.slice(0, 10)) {\n console.log(` ${dim}\u00B7${reset} ${sym}`);\n }\n if (result.unresolvedSymbols.length > 10) {\n console.log(` ${dim}\u2026and ${result.unresolvedSymbols.length - 10} more${reset}`);\n }\n }\n\n // Impact summary (only when affected)\n if (result.verdict === 'affected') {\n const impact = await analyzer.getImpactSummary(vulnerabilityNodeId);\n if (impact) {\n console.log(`\\n ${violet}${bold}Impact Summary${reset}\\n`);\n if (impact.affectedLayers.length > 0) {\n console.log(` ${dim}Affected layers:${reset} ${impact.affectedLayers.join(', ')}`);\n }\n console.log(` ${dim}Affected entry points:${reset} ${bold}${impact.affectedEntryPoints.length}${reset}`);\n console.log(` ${dim}Distinct paths:${reset} ${bold}${impact.distinctPathCount}${reset}`);\n }\n }\n\n console.log();\n cg.close();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,100 @@
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 read_exports = {};
30
+ __export(read_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(read_exports);
34
+ var path = __toESM(require("path"));
35
+ var fs = __toESM(require("fs"));
36
+ function register(program) {
37
+ program.command("read <path>").description("Read a file with caching and multiple modes").option("--no-cache", "Force fresh read, bypass cache").option("--mode <mode>", "Read mode: full, map, signatures, diff, lines, imports, exports", "full").option("--start <n>", "Start line (for lines mode)", parseInt).option("--end <n>", "End line (for lines mode)", parseInt).option("--json", "Output as JSON").action(async (filePath, opts) => {
38
+ const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
39
+ if (!fs.existsSync(resolvedPath)) {
40
+ console.error(` Error: File not found: ${resolvedPath}`);
41
+ process.exit(1);
42
+ }
43
+ const { getFileReadCache } = await Promise.resolve().then(() => require("../../mcp/cache.js"));
44
+ const { executeReadMode } = await Promise.resolve().then(() => require("../../mcp/read-modes.js"));
45
+ const cache = getFileReadCache();
46
+ const mode = opts.mode;
47
+ const noCache = !opts.cache;
48
+ if (mode !== "full") {
49
+ let cg = null;
50
+ try {
51
+ const { findNearestKiroGraphRoot } = await Promise.resolve().then(() => require("../../index.js"));
52
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
53
+ const root = findNearestKiroGraphRoot(process.cwd());
54
+ if (root) {
55
+ cg = await KiroGraph.open(root);
56
+ }
57
+ } catch {
58
+ }
59
+ const result2 = executeReadMode({
60
+ mode,
61
+ filePath: resolvedPath,
62
+ start: opts.start,
63
+ end: opts.end,
64
+ cg
65
+ });
66
+ cache.read(resolvedPath, true);
67
+ if (opts.json) {
68
+ console.log(JSON.stringify({ mode: result2.mode, tokenEstimate: result2.tokenEstimate, content: result2.content }, null, 2));
69
+ } else {
70
+ console.log(result2.content);
71
+ }
72
+ if (cg) {
73
+ try {
74
+ cg.close();
75
+ } catch {
76
+ }
77
+ }
78
+ return;
79
+ }
80
+ const result = cache.read(resolvedPath, noCache);
81
+ if (opts.json) {
82
+ console.log(JSON.stringify({ cached: result.cached, changed: result.changed, content: result.content }, null, 2));
83
+ return;
84
+ }
85
+ if (result.cached) {
86
+ console.log(result.content);
87
+ } else if (result.changed) {
88
+ console.log(`[file changed since last read]
89
+ `);
90
+ console.log(result.content);
91
+ } else {
92
+ console.log(result.content);
93
+ }
94
+ });
95
+ }
96
+ // Annotate the CommonJS export names for ESM import in node:
97
+ 0 && (module.exports = {
98
+ register
99
+ });
100
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/read.ts"],
4
+ "sourcesContent": ["/**\n * kirograph read \u2014 File read with caching and multiple modes\n */\n\nimport { Command } from 'commander';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nexport function register(program: Command): void {\n program\n .command('read <path>')\n .description('Read a file with caching and multiple modes')\n .option('--no-cache', 'Force fresh read, bypass cache')\n .option('--mode <mode>', 'Read mode: full, map, signatures, diff, lines, imports, exports', 'full')\n .option('--start <n>', 'Start line (for lines mode)', parseInt)\n .option('--end <n>', 'End line (for lines mode)', parseInt)\n .option('--json', 'Output as JSON')\n .action(async (filePath: string, opts: { cache: boolean; mode: string; start?: number; end?: number; json?: boolean }) => {\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);\n\n if (!fs.existsSync(resolvedPath)) {\n console.error(` Error: File not found: ${resolvedPath}`);\n process.exit(1);\n }\n\n const { getFileReadCache } = await Promise.resolve().then(() => require('../../mcp/cache.js'));\n const { executeReadMode } = await Promise.resolve().then(() => require('../../mcp/read-modes.js'));\n const cache = getFileReadCache();\n\n const mode = opts.mode as any;\n const noCache = !opts.cache;\n\n if (mode !== 'full') {\n // For non-full modes, try to get graph connection\n let cg = null;\n try {\n const { findNearestKiroGraphRoot } = await Promise.resolve().then(() => require('../../index.js'));\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const root = findNearestKiroGraphRoot(process.cwd());\n if (root) {\n cg = await KiroGraph.open(root);\n }\n } catch { /* no graph available */ }\n\n const result = executeReadMode({\n mode,\n filePath: resolvedPath,\n start: opts.start,\n end: opts.end,\n cg,\n });\n\n // Update cache for future diff mode\n cache.read(resolvedPath, true);\n\n if (opts.json) {\n console.log(JSON.stringify({ mode: result.mode, tokenEstimate: result.tokenEstimate, content: result.content }, null, 2));\n } else {\n console.log(result.content);\n }\n\n if (cg) {\n try { (cg as any).close(); } catch { /* ignore */ }\n }\n return;\n }\n\n // Full mode with caching\n const result = cache.read(resolvedPath, noCache);\n\n if (opts.json) {\n console.log(JSON.stringify({ cached: result.cached, changed: result.changed, content: result.content }, null, 2));\n return;\n }\n\n if (result.cached) {\n console.log(result.content);\n } else if (result.changed) {\n console.log(`[file changed since last read]\\n`);\n console.log(result.content);\n } else {\n console.log(result.content);\n }\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,WAAsB;AACtB,SAAoB;AAEb,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,aAAa,EACrB,YAAY,6CAA6C,EACzD,OAAO,cAAc,gCAAgC,EACrD,OAAO,iBAAiB,mEAAmE,MAAM,EACjG,OAAO,eAAe,+BAA+B,QAAQ,EAC7D,OAAO,aAAa,6BAA6B,QAAQ,EACzD,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,UAAkB,SAAyF;AACxH,UAAM,eAAe,KAAK,WAAW,QAAQ,IAAI,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,QAAQ;AAEhG,QAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,cAAQ,MAAM,4BAA4B,YAAY,EAAE;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,EAAE,iBAAiB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,oBAAoB,CAAC;AAC7F,UAAM,EAAE,gBAAgB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,yBAAyB,CAAC;AACjG,UAAM,QAAQ,iBAAiB;AAE/B,UAAM,OAAO,KAAK;AAClB,UAAM,UAAU,CAAC,KAAK;AAEtB,QAAI,SAAS,QAAQ;AAEnB,UAAI,KAAK;AACT,UAAI;AACF,cAAM,EAAE,yBAAyB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC;AACjG,cAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,cAAM,OAAO,yBAAyB,QAAQ,IAAI,CAAC;AACnD,YAAI,MAAM;AACR,eAAK,MAAM,UAAU,KAAK,IAAI;AAAA,QAChC;AAAA,MACF,QAAQ;AAAA,MAA2B;AAEnC,YAAMA,UAAS,gBAAgB;AAAA,QAC7B;AAAA,QACA,UAAU;AAAA,QACV,OAAO,KAAK;AAAA,QACZ,KAAK,KAAK;AAAA,QACV;AAAA,MACF,CAAC;AAGD,YAAM,KAAK,cAAc,IAAI;AAE7B,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,EAAE,MAAMA,QAAO,MAAM,eAAeA,QAAO,eAAe,SAASA,QAAO,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,MAC1H,OAAO;AACL,gBAAQ,IAAIA,QAAO,OAAO;AAAA,MAC5B;AAEA,UAAI,IAAI;AACN,YAAI;AAAE,UAAC,GAAW,MAAM;AAAA,QAAG,QAAQ;AAAA,QAAe;AAAA,MACpD;AACA;AAAA,IACF;AAGA,UAAM,SAAS,MAAM,KAAK,cAAc,OAAO;AAE/C,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,OAAO,QAAQ,SAAS,OAAO,SAAS,SAAS,OAAO,QAAQ,GAAG,MAAM,CAAC,CAAC;AAChH;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ;AACjB,cAAQ,IAAI,OAAO,OAAO;AAAA,IAC5B,WAAW,OAAO,SAAS;AACzB,cAAQ,IAAI;AAAA,CAAkC;AAC9C,cAAQ,IAAI,OAAO,OAAO;AAAA,IAC5B,OAAO;AACL,cAAQ,IAAI,OAAO,OAAO;AAAA,IAC5B;AAAA,EACF,CAAC;AACL;",
6
+ "names": ["result"]
7
+ }
@@ -0,0 +1,116 @@
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 refactor_exports = {};
30
+ __export(refactor_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(refactor_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_ui = require("../ui");
36
+ function register(program) {
37
+ const refactorCmd = program.command("refactor").description("Refactoring tools: rename preview and suggestions");
38
+ refactorCmd.command("rename <symbol> [projectPath]").description("Preview all locations that reference a symbol (rename preview)").option("--json", "Output as JSON").action(async (symbol, projectPath, opts) => {
39
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
40
+ const target = path.resolve(projectPath ?? process.cwd());
41
+ const cg = await KiroGraph.open(target);
42
+ const { renamePreview } = await Promise.resolve().then(() => require("../../graph/refactor.js"));
43
+ const db = cg.getDatabase();
44
+ const preview = renamePreview(db, symbol);
45
+ if (!preview) {
46
+ console.error(` Symbol "${symbol}" not found in index.`);
47
+ cg.close();
48
+ process.exit(1);
49
+ }
50
+ if (opts.json) {
51
+ console.log(JSON.stringify(preview, null, 2));
52
+ cg.close();
53
+ return;
54
+ }
55
+ console.log(`
56
+ ${import_ui.bold}Rename Preview:${import_ui.reset} ${import_ui.violet}${preview.symbol}${import_ui.reset} (${preview.kind})`);
57
+ console.log(` ${import_ui.dim}Defined at: ${preview.filePath}:${preview.line}${import_ui.reset}`);
58
+ console.log(` ${import_ui.dim}Total references: ${preview.totalReferences}${import_ui.reset}
59
+ `);
60
+ if (preview.references.length === 0) {
61
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} No references found \u2014 safe to rename without affecting other code.
62
+ `);
63
+ } else {
64
+ const byFile = /* @__PURE__ */ new Map();
65
+ for (const ref of preview.references) {
66
+ if (!byFile.has(ref.filePath)) byFile.set(ref.filePath, []);
67
+ byFile.get(ref.filePath).push(ref);
68
+ }
69
+ for (const [file, refs] of byFile) {
70
+ console.log(` ${import_ui.bold}${file}${import_ui.reset} (${refs.length})`);
71
+ for (const ref of refs.slice(0, 10)) {
72
+ console.log(` ${import_ui.dim}line ${ref.line}:${import_ui.reset} ${ref.context} ${import_ui.dim}(${ref.edgeKind})${import_ui.reset}`);
73
+ }
74
+ if (refs.length > 10) console.log(` ${import_ui.dim}\u2026and ${refs.length - 10} more${import_ui.reset}`);
75
+ console.log();
76
+ }
77
+ }
78
+ cg.close();
79
+ });
80
+ refactorCmd.command("suggest [projectPath]").description("Get community-driven refactoring suggestions").option("--limit <n>", "Max suggestions", "10").option("--json", "Output as JSON").action(async (projectPath, opts) => {
81
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
82
+ const target = path.resolve(projectPath ?? process.cwd());
83
+ const cg = await KiroGraph.open(target);
84
+ const { suggestRefactorings } = await Promise.resolve().then(() => require("../../graph/refactor.js"));
85
+ const db = cg.getDatabase();
86
+ const suggestions = suggestRefactorings(db, parseInt(opts.limit));
87
+ if (opts.json) {
88
+ console.log(JSON.stringify(suggestions, null, 2));
89
+ cg.close();
90
+ return;
91
+ }
92
+ if (suggestions.length === 0) {
93
+ console.log(`
94
+ ${import_ui.green}\u2713${import_ui.reset} No refactoring suggestions \u2014 the codebase structure looks clean.
95
+ `);
96
+ cg.close();
97
+ return;
98
+ }
99
+ console.log(`
100
+ ${import_ui.bold}Refactoring Suggestions${import_ui.reset} (${suggestions.length})
101
+ `);
102
+ for (const s of suggestions) {
103
+ const icon = s.priority === "high" ? "\u{1F534}" : s.priority === "medium" ? "\u{1F7E1}" : "\u{1F7E2}";
104
+ console.log(` ${icon} ${import_ui.bold}${s.type}${import_ui.reset} [${s.priority}]`);
105
+ console.log(` ${s.description}`);
106
+ console.log(` ${import_ui.dim}${s.rationale}${import_ui.reset}`);
107
+ console.log();
108
+ }
109
+ cg.close();
110
+ });
111
+ }
112
+ // Annotate the CommonJS export names for ESM import in node:
113
+ 0 && (module.exports = {
114
+ register
115
+ });
116
+ //# sourceMappingURL=refactor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/refactor.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { dim, reset, violet, bold, green } from '../ui';\n\nexport function register(program: Command): void {\n const refactorCmd = program\n .command('refactor')\n .description('Refactoring tools: rename preview and suggestions');\n\n refactorCmd\n .command('rename <symbol> [projectPath]')\n .description('Preview all locations that reference a symbol (rename preview)')\n .option('--json', 'Output as JSON')\n .action(async (symbol: string, projectPath: string | undefined, opts: { 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 { renamePreview } = await Promise.resolve().then(() => require('../../graph/refactor.js'));\n const db = cg.getDatabase();\n\n const preview = renamePreview(db, symbol);\n\n if (!preview) {\n console.error(` Symbol \"${symbol}\" not found in index.`);\n cg.close();\n process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(preview, null, 2));\n cg.close();\n return;\n }\n\n console.log(`\\n ${bold}Rename Preview:${reset} ${violet}${preview.symbol}${reset} (${preview.kind})`);\n console.log(` ${dim}Defined at: ${preview.filePath}:${preview.line}${reset}`);\n console.log(` ${dim}Total references: ${preview.totalReferences}${reset}\\n`);\n\n if (preview.references.length === 0) {\n console.log(` ${green}\u2713${reset} No references found \u2014 safe to rename without affecting other code.\\n`);\n } else {\n // Group by file\n const byFile = new Map<string, typeof preview.references>();\n for (const ref of preview.references) {\n if (!byFile.has(ref.filePath)) byFile.set(ref.filePath, []);\n byFile.get(ref.filePath)!.push(ref);\n }\n\n for (const [file, refs] of byFile) {\n console.log(` ${bold}${file}${reset} (${refs.length})`);\n for (const ref of refs.slice(0, 10)) {\n console.log(` ${dim}line ${ref.line}:${reset} ${ref.context} ${dim}(${ref.edgeKind})${reset}`);\n }\n if (refs.length > 10) console.log(` ${dim}\u2026and ${refs.length - 10} more${reset}`);\n console.log();\n }\n }\n\n cg.close();\n });\n\n refactorCmd\n .command('suggest [projectPath]')\n .description('Get community-driven refactoring suggestions')\n .option('--limit <n>', 'Max suggestions', '10')\n .option('--json', 'Output as JSON')\n .action(async (projectPath: string | undefined, opts: { 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 { suggestRefactorings } = await Promise.resolve().then(() => require('../../graph/refactor.js'));\n const db = cg.getDatabase();\n\n const suggestions = suggestRefactorings(db, parseInt(opts.limit));\n\n if (opts.json) {\n console.log(JSON.stringify(suggestions, null, 2));\n cg.close();\n return;\n }\n\n if (suggestions.length === 0) {\n console.log(`\\n ${green}\u2713${reset} No refactoring suggestions \u2014 the codebase structure looks clean.\\n`);\n cg.close();\n return;\n }\n\n console.log(`\\n ${bold}Refactoring Suggestions${reset} (${suggestions.length})\\n`);\n\n for (const s of suggestions) {\n const icon = s.priority === 'high' ? '\uD83D\uDD34' : s.priority === 'medium' ? '\uD83D\uDFE1' : '\uD83D\uDFE2';\n console.log(` ${icon} ${bold}${s.type}${reset} [${s.priority}]`);\n console.log(` ${s.description}`);\n console.log(` ${dim}${s.rationale}${reset}`);\n console.log();\n }\n\n cg.close();\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,WAAsB;AACtB,gBAAgD;AAEzC,SAAS,SAAS,SAAwB;AAC/C,QAAM,cAAc,QACjB,QAAQ,UAAU,EAClB,YAAY,mDAAmD;AAElE,cACG,QAAQ,+BAA+B,EACvC,YAAY,gEAAgE,EAC5E,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,QAAgB,aAAiC,SAA6B;AAC3F,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,cAAc,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,yBAAyB,CAAC;AAC/F,UAAM,KAAK,GAAG,YAAY;AAE1B,UAAM,UAAU,cAAc,IAAI,MAAM;AAExC,QAAI,CAAC,SAAS;AACZ,cAAQ,MAAM,aAAa,MAAM,uBAAuB;AACxD,SAAG,MAAM;AACT,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,SAAG,MAAM;AACT;AAAA,IACF;AAEA,YAAQ,IAAI;AAAA,IAAO,cAAI,kBAAkB,eAAK,IAAI,gBAAM,GAAG,QAAQ,MAAM,GAAG,eAAK,KAAK,QAAQ,IAAI,GAAG;AACrG,YAAQ,IAAI,KAAK,aAAG,eAAe,QAAQ,QAAQ,IAAI,QAAQ,IAAI,GAAG,eAAK,EAAE;AAC7E,YAAQ,IAAI,KAAK,aAAG,qBAAqB,QAAQ,eAAe,GAAG,eAAK;AAAA,CAAI;AAE5E,QAAI,QAAQ,WAAW,WAAW,GAAG;AACnC,cAAQ,IAAI,KAAK,eAAK,SAAI,eAAK;AAAA,CAAuE;AAAA,IACxG,OAAO;AAEL,YAAM,SAAS,oBAAI,IAAuC;AAC1D,iBAAW,OAAO,QAAQ,YAAY;AACpC,YAAI,CAAC,OAAO,IAAI,IAAI,QAAQ,EAAG,QAAO,IAAI,IAAI,UAAU,CAAC,CAAC;AAC1D,eAAO,IAAI,IAAI,QAAQ,EAAG,KAAK,GAAG;AAAA,MACpC;AAEA,iBAAW,CAAC,MAAM,IAAI,KAAK,QAAQ;AACjC,gBAAQ,IAAI,KAAK,cAAI,GAAG,IAAI,GAAG,eAAK,KAAK,KAAK,MAAM,GAAG;AACvD,mBAAW,OAAO,KAAK,MAAM,GAAG,EAAE,GAAG;AACnC,kBAAQ,IAAI,OAAO,aAAG,QAAQ,IAAI,IAAI,IAAI,eAAK,IAAI,IAAI,OAAO,IAAI,aAAG,IAAI,IAAI,QAAQ,IAAI,eAAK,EAAE;AAAA,QAClG;AACA,YAAI,KAAK,SAAS,GAAI,SAAQ,IAAI,OAAO,aAAG,aAAQ,KAAK,SAAS,EAAE,QAAQ,eAAK,EAAE;AACnF,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF;AAEA,OAAG,MAAM;AAAA,EACX,CAAC;AAEH,cACG,QAAQ,uBAAuB,EAC/B,YAAY,8CAA8C,EAC1D,OAAO,eAAe,mBAAmB,IAAI,EAC7C,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,aAAiC,SAA4C;AAC1F,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,oBAAoB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,yBAAyB,CAAC;AACrG,UAAM,KAAK,GAAG,YAAY;AAE1B,UAAM,cAAc,oBAAoB,IAAI,SAAS,KAAK,KAAK,CAAC;AAEhE,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAChD,SAAG,MAAM;AACT;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,GAAG;AAC5B,cAAQ,IAAI;AAAA,IAAO,eAAK,SAAI,eAAK;AAAA,CAAqE;AACtG,SAAG,MAAM;AACT;AAAA,IACF;AAEA,YAAQ,IAAI;AAAA,IAAO,cAAI,0BAA0B,eAAK,KAAK,YAAY,MAAM;AAAA,CAAK;AAElF,eAAW,KAAK,aAAa;AAC3B,YAAM,OAAO,EAAE,aAAa,SAAS,cAAO,EAAE,aAAa,WAAW,cAAO;AAC7E,cAAQ,IAAI,KAAK,IAAI,IAAI,cAAI,GAAG,EAAE,IAAI,GAAG,eAAK,KAAK,EAAE,QAAQ,GAAG;AAChE,cAAQ,IAAI,QAAQ,EAAE,WAAW,EAAE;AACnC,cAAQ,IAAI,QAAQ,aAAG,GAAG,EAAE,SAAS,GAAG,eAAK,EAAE;AAC/C,cAAQ,IAAI;AAAA,IACd;AAEA,OAAG,MAAM;AAAA,EACX,CAAC;AACL;",
6
+ "names": []
7
+ }
@@ -0,0 +1,133 @@
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 remediation_exports = {};
30
+ __export(remediation_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(remediation_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_config = require("../../config");
36
+ var import_ui = require("../ui");
37
+ const red = "\x1B[31m";
38
+ const yellow = "\x1B[33m";
39
+ function slaColor(status) {
40
+ switch (status) {
41
+ case "ok":
42
+ return import_ui.green;
43
+ case "warning":
44
+ return yellow;
45
+ case "overdue":
46
+ return red;
47
+ case "no_fix":
48
+ return import_ui.dim;
49
+ default:
50
+ return import_ui.dim;
51
+ }
52
+ }
53
+ function formatDate(epochMs) {
54
+ if (epochMs === null) return "n/a";
55
+ return new Date(epochMs).toISOString().slice(0, 10);
56
+ }
57
+ function register(program) {
58
+ program.command("remediation [projectPath]").description("Track remediation SLA: how long vulnerabilities have been open and whether fixes are overdue").option("--overdue-only", "Show only overdue items").option("--format <fmt>", "Output format: table | json (default: table)", "table").action(async (projectPath, opts) => {
59
+ const target = path.resolve(projectPath ?? process.cwd());
60
+ const config = await (0, import_config.loadConfig)(target);
61
+ if (!config.enableSecurity) {
62
+ console.error(`
63
+ ${yellow}\u26A0 Security analysis is disabled.${import_ui.reset}`);
64
+ console.error(` ${import_ui.dim}Enable it in .kirograph/config.json:${import_ui.reset} ${import_ui.violet}${import_ui.bold}"enableSecurity": true${import_ui.reset}`);
65
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
66
+ `);
67
+ process.exit(1);
68
+ }
69
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
70
+ if (!KiroGraph.isInitialized(target)) {
71
+ console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
72
+ process.exit(1);
73
+ }
74
+ const cg = await KiroGraph.open(target);
75
+ const db = cg.getDatabase();
76
+ db.applySecuritySchema();
77
+ const { RemediationTracker } = await Promise.resolve().then(() => require("../../security/remediation.js"));
78
+ const tracker = new RemediationTracker(db);
79
+ let statuses = tracker.getStatus();
80
+ const ORDER = { overdue: 3, warning: 2, no_fix: 1, ok: 0 };
81
+ statuses.sort((a, b) => {
82
+ const diff = (ORDER[b.slaStatus] ?? 0) - (ORDER[a.slaStatus] ?? 0);
83
+ if (diff !== 0) return diff;
84
+ return (b.daysOpen ?? 0) - (a.daysOpen ?? 0);
85
+ });
86
+ if (opts.overdueOnly) {
87
+ statuses = statuses.filter((s) => s.isOverdue);
88
+ }
89
+ if (opts.format === "json") {
90
+ console.log(JSON.stringify(statuses, null, 2));
91
+ cg.close();
92
+ return;
93
+ }
94
+ if (statuses.length === 0) {
95
+ const msg = opts.overdueOnly ? "No overdue vulnerabilities found." : "No tracked vulnerabilities with detection timestamps found.";
96
+ console.log(`
97
+ ${import_ui.dim}${msg}${import_ui.reset}`);
98
+ console.log(` ${import_ui.dim}Detection timestamps are recorded when vulnerabilities are first inserted via${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph vulns --refresh${import_ui.reset}
99
+ `);
100
+ cg.close();
101
+ return;
102
+ }
103
+ console.log(`
104
+ ${import_ui.violet}${import_ui.bold}Remediation SLA Tracking${import_ui.reset}
105
+ `);
106
+ for (const s of statuses) {
107
+ const sevStr = s.severity !== null ? s.severity.toFixed(1) : "n/a";
108
+ const daysOpen = s.daysOpen !== null ? `${s.daysOpen}d` : "n/a";
109
+ const fixSince = s.fixAvailableSince !== null ? `${s.daysWithFixAvailable}d ago (${formatDate(s.fixAvailableSince)})` : "no fix";
110
+ const deadline = s.slaDeadline !== null ? formatDate(s.slaDeadline) : "n/a";
111
+ const color = slaColor(s.slaStatus);
112
+ console.log(` ${import_ui.violet}${import_ui.bold}${s.cveId}${import_ui.reset} ${import_ui.dim}${s.packageName}${import_ui.reset}`);
113
+ console.log(` CVSS: ${import_ui.dim}${sevStr}${import_ui.reset} Open: ${import_ui.dim}${daysOpen}${import_ui.reset} Fix available: ${import_ui.dim}${fixSince}${import_ui.reset}`);
114
+ console.log(` SLA status: ${color}${import_ui.bold}${s.slaStatus.toUpperCase()}${import_ui.reset} Deadline: ${import_ui.dim}${deadline}${import_ui.reset}`);
115
+ console.log();
116
+ }
117
+ const overdueCount = statuses.filter((s) => s.slaStatus === "overdue").length;
118
+ const warningCount = statuses.filter((s) => s.slaStatus === "warning").length;
119
+ const noFixCount = statuses.filter((s) => s.slaStatus === "no_fix").length;
120
+ const parts = [];
121
+ if (overdueCount > 0) parts.push(`${red}${import_ui.bold}${overdueCount} overdue${import_ui.reset}`);
122
+ if (warningCount > 0) parts.push(`${yellow}${import_ui.bold}${warningCount} warning${import_ui.reset}`);
123
+ if (noFixCount > 0) parts.push(`${import_ui.dim}${noFixCount} no fix available${import_ui.reset}`);
124
+ console.log(` ${import_ui.bold}${statuses.length}${import_ui.reset} open vulnerabilit${statuses.length === 1 ? "y" : "ies"}${parts.length > 0 ? `: ${parts.join(", ")}` : ""}
125
+ `);
126
+ cg.close();
127
+ });
128
+ }
129
+ // Annotate the CommonJS export names for ESM import in node:
130
+ 0 && (module.exports = {
131
+ register
132
+ });
133
+ //# sourceMappingURL=remediation.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/remediation.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, green } from '../ui';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[33m';\n\nfunction slaColor(status: string): string {\n switch (status) {\n case 'ok': return green;\n case 'warning': return yellow;\n case 'overdue': return red;\n case 'no_fix': return dim;\n default: return dim;\n }\n}\n\nfunction formatDate(epochMs: number | null): string {\n if (epochMs === null) return 'n/a';\n return new Date(epochMs).toISOString().slice(0, 10);\n}\n\nexport function register(program: Command): void {\n program\n .command('remediation [projectPath]')\n .description('Track remediation SLA: how long vulnerabilities have been open and whether fixes are overdue')\n .option('--overdue-only', 'Show only overdue items')\n .option('--format <fmt>', 'Output format: table | json (default: table)', 'table')\n .action(async (projectPath: string | undefined, opts: {\n overdueOnly?: boolean;\n format: string;\n }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const config = await loadConfig(target);\n\n if (!config.enableSecurity) {\n console.error(`\\n ${yellow}\u26A0 Security analysis is disabled.${reset}`);\n console.error(` ${dim}Enable it in .kirograph/config.json:${reset} ${violet}${bold}\"enableSecurity\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(target)) {\n console.error(' \u2716 KiroGraph not initialized. Run: kirograph init');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(target);\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { RemediationTracker } = await Promise.resolve().then(() => require('../../security/remediation.js'));\n const tracker = new RemediationTracker(db);\n\n let statuses = tracker.getStatus();\n\n // Sort: overdue first, then warning, then by daysOpen desc\n const ORDER: Record<string, number> = { overdue: 3, warning: 2, no_fix: 1, ok: 0 };\n statuses.sort((a, b) => {\n const diff = (ORDER[b.slaStatus] ?? 0) - (ORDER[a.slaStatus] ?? 0);\n if (diff !== 0) return diff;\n return (b.daysOpen ?? 0) - (a.daysOpen ?? 0);\n });\n\n if (opts.overdueOnly) {\n statuses = statuses.filter(s => s.isOverdue);\n }\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(statuses, null, 2));\n cg.close();\n return;\n }\n\n if (statuses.length === 0) {\n const msg = opts.overdueOnly\n ? 'No overdue vulnerabilities found.'\n : 'No tracked vulnerabilities with detection timestamps found.';\n console.log(`\\n ${dim}${msg}${reset}`);\n console.log(` ${dim}Detection timestamps are recorded when vulnerabilities are first inserted via${reset} ${violet}${bold}kirograph vulns --refresh${reset}\\n`);\n cg.close();\n return;\n }\n\n console.log(`\\n ${violet}${bold}Remediation SLA Tracking${reset}\\n`);\n\n for (const s of statuses) {\n const sevStr = s.severity !== null ? s.severity.toFixed(1) : 'n/a';\n const daysOpen = s.daysOpen !== null ? `${s.daysOpen}d` : 'n/a';\n const fixSince = s.fixAvailableSince !== null ? `${s.daysWithFixAvailable}d ago (${formatDate(s.fixAvailableSince)})` : 'no fix';\n const deadline = s.slaDeadline !== null ? formatDate(s.slaDeadline) : 'n/a';\n const color = slaColor(s.slaStatus);\n\n console.log(` ${violet}${bold}${s.cveId}${reset} ${dim}${s.packageName}${reset}`);\n console.log(` CVSS: ${dim}${sevStr}${reset} Open: ${dim}${daysOpen}${reset} Fix available: ${dim}${fixSince}${reset}`);\n console.log(` SLA status: ${color}${bold}${s.slaStatus.toUpperCase()}${reset} Deadline: ${dim}${deadline}${reset}`);\n console.log();\n }\n\n const overdueCount = statuses.filter(s => s.slaStatus === 'overdue').length;\n const warningCount = statuses.filter(s => s.slaStatus === 'warning').length;\n const noFixCount = statuses.filter(s => s.slaStatus === 'no_fix').length;\n\n const parts: string[] = [];\n if (overdueCount > 0) parts.push(`${red}${bold}${overdueCount} overdue${reset}`);\n if (warningCount > 0) parts.push(`${yellow}${bold}${warningCount} warning${reset}`);\n if (noFixCount > 0) parts.push(`${dim}${noFixCount} no fix available${reset}`);\n\n console.log(` ${bold}${statuses.length}${reset} open vulnerabilit${statuses.length === 1 ? 'y' : 'ies'}${parts.length > 0 ? `: ${parts.join(', ')}` : ''}\\n`);\n\n cg.close();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }