kirograph 0.17.0 → 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 (329) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +103 -1822
  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/attack-surface.js +157 -0
  10. package/dist/bin/commands/attack-surface.js.map +7 -0
  11. package/dist/bin/commands/benchmark.js +206 -0
  12. package/dist/bin/commands/benchmark.js.map +7 -0
  13. package/dist/bin/commands/budget.js +70 -0
  14. package/dist/bin/commands/budget.js.map +7 -0
  15. package/dist/bin/commands/communities.js +77 -0
  16. package/dist/bin/commands/communities.js.map +7 -0
  17. package/dist/bin/commands/dep-confusion.js +119 -0
  18. package/dist/bin/commands/dep-confusion.js.map +7 -0
  19. package/dist/bin/commands/export.js +304 -10
  20. package/dist/bin/commands/export.js.map +2 -2
  21. package/dist/bin/commands/flows.js +97 -0
  22. package/dist/bin/commands/flows.js.map +7 -0
  23. package/dist/bin/commands/help.js +382 -101
  24. package/dist/bin/commands/help.js.map +2 -2
  25. package/dist/bin/commands/install.js +90 -8
  26. package/dist/bin/commands/install.js.map +2 -2
  27. package/dist/bin/commands/licenses.js +201 -0
  28. package/dist/bin/commands/licenses.js.map +7 -0
  29. package/dist/bin/commands/reachability.js +160 -0
  30. package/dist/bin/commands/reachability.js.map +7 -0
  31. package/dist/bin/commands/read.js +100 -0
  32. package/dist/bin/commands/read.js.map +7 -0
  33. package/dist/bin/commands/refactor.js +116 -0
  34. package/dist/bin/commands/refactor.js.map +7 -0
  35. package/dist/bin/commands/remediation.js +133 -0
  36. package/dist/bin/commands/remediation.js.map +7 -0
  37. package/dist/bin/commands/sbom.js +76 -0
  38. package/dist/bin/commands/sbom.js.map +7 -0
  39. package/dist/bin/commands/security-ci-report.js +267 -0
  40. package/dist/bin/commands/security-ci-report.js.map +7 -0
  41. package/dist/bin/commands/security-export.js +1349 -0
  42. package/dist/bin/commands/security-export.js.map +7 -0
  43. package/dist/bin/commands/security-flows.js +126 -0
  44. package/dist/bin/commands/security-flows.js.map +7 -0
  45. package/dist/bin/commands/security-secrets.js +170 -0
  46. package/dist/bin/commands/security-secrets.js.map +7 -0
  47. package/dist/bin/commands/security.js +193 -0
  48. package/dist/bin/commands/security.js.map +7 -0
  49. package/dist/bin/commands/staleness.js +144 -0
  50. package/dist/bin/commands/staleness.js.map +7 -0
  51. package/dist/bin/commands/status.js +102 -2
  52. package/dist/bin/commands/status.js.map +2 -2
  53. package/dist/bin/commands/supply-chain.js +138 -0
  54. package/dist/bin/commands/supply-chain.js.map +7 -0
  55. package/dist/bin/commands/uninit.js +109 -60
  56. package/dist/bin/commands/uninit.js.map +2 -2
  57. package/dist/bin/commands/vex.js +76 -0
  58. package/dist/bin/commands/vex.js.map +7 -0
  59. package/dist/bin/commands/vuln-suppress.js +95 -0
  60. package/dist/bin/commands/vuln-suppress.js.map +7 -0
  61. package/dist/bin/commands/vulns.js +382 -0
  62. package/dist/bin/commands/vulns.js.map +7 -0
  63. package/dist/bin/installer/auto-detect.js +125 -0
  64. package/dist/bin/installer/auto-detect.js.map +7 -0
  65. package/dist/bin/installer/cli-agent.js +28 -5
  66. package/dist/bin/installer/cli-agent.js.map +2 -2
  67. package/dist/bin/installer/common.js +47 -0
  68. package/dist/bin/installer/common.js.map +2 -2
  69. package/dist/bin/installer/config-prompt.js +12 -1
  70. package/dist/bin/installer/config-prompt.js.map +2 -2
  71. package/dist/bin/installer/detect.js +309 -0
  72. package/dist/bin/installer/detect.js.map +7 -0
  73. package/dist/bin/installer/index.js +9 -1
  74. package/dist/bin/installer/index.js.map +2 -2
  75. package/dist/bin/installer/instructions.js +195 -3
  76. package/dist/bin/installer/instructions.js.map +2 -2
  77. package/dist/bin/installer/steering.js +407 -0
  78. package/dist/bin/installer/steering.js.map +2 -2
  79. package/dist/bin/installer/targets/aider.js +3 -3
  80. package/dist/bin/installer/targets/aider.js.map +2 -2
  81. package/dist/bin/installer/targets/amp.js +3 -3
  82. package/dist/bin/installer/targets/amp.js.map +2 -2
  83. package/dist/bin/installer/targets/antigravity.js +35 -6
  84. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  85. package/dist/bin/installer/targets/augment.js +3 -3
  86. package/dist/bin/installer/targets/augment.js.map +2 -2
  87. package/dist/bin/installer/targets/claude.js +49 -5
  88. package/dist/bin/installer/targets/claude.js.map +2 -2
  89. package/dist/bin/installer/targets/cline.js +32 -6
  90. package/dist/bin/installer/targets/cline.js.map +2 -2
  91. package/dist/bin/installer/targets/codex.js +64 -12
  92. package/dist/bin/installer/targets/codex.js.map +2 -2
  93. package/dist/bin/installer/targets/continue.js +2 -2
  94. package/dist/bin/installer/targets/continue.js.map +2 -2
  95. package/dist/bin/installer/targets/copilot-cli.js +101 -0
  96. package/dist/bin/installer/targets/copilot-cli.js.map +7 -0
  97. package/dist/bin/installer/targets/copilot.js +31 -5
  98. package/dist/bin/installer/targets/copilot.js.map +2 -2
  99. package/dist/bin/installer/targets/cursor.js +4 -4
  100. package/dist/bin/installer/targets/cursor.js.map +2 -2
  101. package/dist/bin/installer/targets/devin.js +2 -2
  102. package/dist/bin/installer/targets/devin.js.map +2 -2
  103. package/dist/bin/installer/targets/gemini-cli.js +2 -2
  104. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  105. package/dist/bin/installer/targets/generic.js +2 -14
  106. package/dist/bin/installer/targets/generic.js.map +2 -2
  107. package/dist/bin/installer/targets/goose.js +3 -3
  108. package/dist/bin/installer/targets/goose.js.map +2 -2
  109. package/dist/bin/installer/targets/index.js +250 -0
  110. package/dist/bin/installer/targets/index.js.map +2 -2
  111. package/dist/bin/installer/targets/junie.js +2 -2
  112. package/dist/bin/installer/targets/junie.js.map +2 -2
  113. package/dist/bin/installer/targets/kilo.js +2 -2
  114. package/dist/bin/installer/targets/kilo.js.map +2 -2
  115. package/dist/bin/installer/targets/kiro.js +3 -3
  116. package/dist/bin/installer/targets/kiro.js.map +2 -2
  117. package/dist/bin/installer/targets/opencode.js +2 -2
  118. package/dist/bin/installer/targets/opencode.js.map +2 -2
  119. package/dist/bin/installer/targets/openhands.js +3 -3
  120. package/dist/bin/installer/targets/openhands.js.map +2 -2
  121. package/dist/bin/installer/targets/qoder.js +91 -0
  122. package/dist/bin/installer/targets/qoder.js.map +7 -0
  123. package/dist/bin/installer/targets/qwen.js +96 -0
  124. package/dist/bin/installer/targets/qwen.js.map +7 -0
  125. package/dist/bin/installer/targets/replit.js +3 -3
  126. package/dist/bin/installer/targets/replit.js.map +2 -2
  127. package/dist/bin/installer/targets/roo.js +2 -2
  128. package/dist/bin/installer/targets/roo.js.map +2 -2
  129. package/dist/bin/installer/targets/tabnine.js +3 -3
  130. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  131. package/dist/bin/installer/targets/trae.js +5 -5
  132. package/dist/bin/installer/targets/trae.js.map +2 -2
  133. package/dist/bin/installer/targets/warp.js +2 -2
  134. package/dist/bin/installer/targets/warp.js.map +2 -2
  135. package/dist/bin/installer/targets/windsurf.js +35 -6
  136. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  137. package/dist/bin/kirograph.js +72 -6
  138. package/dist/bin/kirograph.js.map +3 -3
  139. package/dist/compression/tracker.js +80 -0
  140. package/dist/compression/tracker.js.map +2 -2
  141. package/dist/config.js +90 -3
  142. package/dist/config.js.map +2 -2
  143. package/dist/core/pipeline.js +36 -2
  144. package/dist/core/pipeline.js.map +2 -2
  145. package/dist/db/database.js +56 -5
  146. package/dist/db/database.js.map +2 -2
  147. package/dist/db/memory-schema.sql +5 -1
  148. package/dist/db/schema.sql +3 -1
  149. package/dist/db/security-schema.sql +72 -0
  150. package/dist/extraction/extractor.js +81 -0
  151. package/dist/extraction/extractor.js.map +2 -2
  152. package/dist/extraction/grammars.js +32 -8
  153. package/dist/extraction/grammars.js.map +2 -2
  154. package/dist/extraction/languages.js +43 -1
  155. package/dist/extraction/languages.js.map +2 -2
  156. package/dist/extraction/notebook.js +300 -0
  157. package/dist/extraction/notebook.js.map +7 -0
  158. package/dist/extraction/wasm/tree-sitter-astro.wasm +0 -0
  159. package/dist/extraction/wasm/tree-sitter-gdscript.wasm +0 -0
  160. package/dist/extraction/wasm/tree-sitter-julia.wasm +0 -0
  161. package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
  162. package/dist/extraction/wasm/tree-sitter-perl.wasm +0 -0
  163. package/dist/extraction/wasm/tree-sitter-powershell.wasm +0 -0
  164. package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
  165. package/dist/extraction/wasm/tree-sitter-sql.wasm +0 -0
  166. package/dist/extraction/wasm/tree-sitter-verilog.wasm +0 -0
  167. package/dist/frameworks/flutter.js +130 -0
  168. package/dist/frameworks/flutter.js.map +7 -0
  169. package/dist/frameworks/index.js +7 -1
  170. package/dist/frameworks/index.js.map +3 -3
  171. package/dist/graph/communities.js +317 -0
  172. package/dist/graph/communities.js.map +7 -0
  173. package/dist/graph/flows.js +138 -0
  174. package/dist/graph/flows.js.map +7 -0
  175. package/dist/graph/refactor.js +155 -0
  176. package/dist/graph/refactor.js.map +7 -0
  177. package/dist/index.js +1 -1
  178. package/dist/index.js.map +2 -2
  179. package/dist/mcp/cache.js +172 -0
  180. package/dist/mcp/cache.js.map +7 -0
  181. package/dist/mcp/read-modes.js +295 -0
  182. package/dist/mcp/read-modes.js.map +7 -0
  183. package/dist/mcp/server.js +2 -1
  184. package/dist/mcp/server.js.map +2 -2
  185. package/dist/mcp/tool-names.js +21 -1
  186. package/dist/mcp/tool-names.js.map +2 -2
  187. package/dist/mcp/tools.js +1160 -1
  188. package/dist/mcp/tools.js.map +3 -3
  189. package/dist/memory/database.js +32 -2
  190. package/dist/memory/database.js.map +2 -2
  191. package/dist/memory/types.js.map +1 -1
  192. package/dist/resolution/bridges/android-rn.js +298 -0
  193. package/dist/resolution/bridges/android-rn.js.map +7 -0
  194. package/dist/resolution/bridges/expo-modules.js +155 -0
  195. package/dist/resolution/bridges/expo-modules.js.map +7 -0
  196. package/dist/resolution/bridges/flutter-channel.js +385 -0
  197. package/dist/resolution/bridges/flutter-channel.js.map +7 -0
  198. package/dist/resolution/bridges/index.js +80 -0
  199. package/dist/resolution/bridges/index.js.map +7 -0
  200. package/dist/resolution/bridges/native-events.js +188 -0
  201. package/dist/resolution/bridges/native-events.js.map +7 -0
  202. package/dist/resolution/bridges/native-views.js +244 -0
  203. package/dist/resolution/bridges/native-views.js.map +7 -0
  204. package/dist/resolution/bridges/react-native.js +161 -0
  205. package/dist/resolution/bridges/react-native.js.map +7 -0
  206. package/dist/resolution/bridges/swift-objc.js +227 -0
  207. package/dist/resolution/bridges/swift-objc.js.map +7 -0
  208. package/dist/resolution/bridges/turbomodules.js +216 -0
  209. package/dist/resolution/bridges/turbomodules.js.map +7 -0
  210. package/dist/resolution/index.js +61 -2
  211. package/dist/resolution/index.js.map +2 -2
  212. package/dist/security/attack-surface.js +164 -0
  213. package/dist/security/attack-surface.js.map +7 -0
  214. package/dist/security/context-warnings.js +123 -0
  215. package/dist/security/context-warnings.js.map +7 -0
  216. package/dist/security/context-warnings.test.js +300 -0
  217. package/dist/security/context-warnings.test.js.map +7 -0
  218. package/dist/security/data-flows.js +228 -0
  219. package/dist/security/data-flows.js.map +7 -0
  220. package/dist/security/dep-confusion.js +255 -0
  221. package/dist/security/dep-confusion.js.map +7 -0
  222. package/dist/security/errors.js +51 -0
  223. package/dist/security/errors.js.map +7 -0
  224. package/dist/security/export/fix-suggestions.js +58 -0
  225. package/dist/security/export/fix-suggestions.js.map +7 -0
  226. package/dist/security/export/fix-suggestions.test.js +74 -0
  227. package/dist/security/export/fix-suggestions.test.js.map +7 -0
  228. package/dist/security/export/sbom.js +230 -0
  229. package/dist/security/export/sbom.js.map +7 -0
  230. package/dist/security/export/sbom.test.js +288 -0
  231. package/dist/security/export/sbom.test.js.map +7 -0
  232. package/dist/security/export/serialization.js +142 -0
  233. package/dist/security/export/serialization.js.map +7 -0
  234. package/dist/security/export/serialization.test.js +310 -0
  235. package/dist/security/export/serialization.test.js.map +7 -0
  236. package/dist/security/export/vex.js +220 -0
  237. package/dist/security/export/vex.js.map +7 -0
  238. package/dist/security/export/vex.test.js +278 -0
  239. package/dist/security/export/vex.test.js.map +7 -0
  240. package/dist/security/index.js +67 -0
  241. package/dist/security/index.js.map +7 -0
  242. package/dist/security/integrator-transitives.test.js +359 -0
  243. package/dist/security/integrator-transitives.test.js.map +7 -0
  244. package/dist/security/integrator.js +491 -0
  245. package/dist/security/integrator.js.map +7 -0
  246. package/dist/security/integrator.test.js +237 -0
  247. package/dist/security/integrator.test.js.map +7 -0
  248. package/dist/security/license.js +70 -0
  249. package/dist/security/license.js.map +7 -0
  250. package/dist/security/manifest/adapter.js +243 -0
  251. package/dist/security/manifest/adapter.js.map +7 -0
  252. package/dist/security/manifest/adapter.test.js +272 -0
  253. package/dist/security/manifest/adapter.test.js.map +7 -0
  254. package/dist/security/manifest/parser.js +376 -0
  255. package/dist/security/manifest/parser.js.map +7 -0
  256. package/dist/security/manifest/parser.test.js +110 -0
  257. package/dist/security/manifest/parser.test.js.map +7 -0
  258. package/dist/security/manifest/plugins/cargo.js +233 -0
  259. package/dist/security/manifest/plugins/cargo.js.map +7 -0
  260. package/dist/security/manifest/plugins/cargo.test.js +304 -0
  261. package/dist/security/manifest/plugins/cargo.test.js.map +7 -0
  262. package/dist/security/manifest/plugins/composer.js +152 -0
  263. package/dist/security/manifest/plugins/composer.js.map +7 -0
  264. package/dist/security/manifest/plugins/go.js +146 -0
  265. package/dist/security/manifest/plugins/go.js.map +7 -0
  266. package/dist/security/manifest/plugins/go.test.js +341 -0
  267. package/dist/security/manifest/plugins/go.test.js.map +7 -0
  268. package/dist/security/manifest/plugins/gradle.js +159 -0
  269. package/dist/security/manifest/plugins/gradle.js.map +7 -0
  270. package/dist/security/manifest/plugins/hex.js +159 -0
  271. package/dist/security/manifest/plugins/hex.js.map +7 -0
  272. package/dist/security/manifest/plugins/maven.js +128 -0
  273. package/dist/security/manifest/plugins/maven.js.map +7 -0
  274. package/dist/security/manifest/plugins/maven.test.js +389 -0
  275. package/dist/security/manifest/plugins/maven.test.js.map +7 -0
  276. package/dist/security/manifest/plugins/npm.js +284 -0
  277. package/dist/security/manifest/plugins/npm.js.map +7 -0
  278. package/dist/security/manifest/plugins/npm.test.js +298 -0
  279. package/dist/security/manifest/plugins/npm.test.js.map +7 -0
  280. package/dist/security/manifest/plugins/nuget.js +186 -0
  281. package/dist/security/manifest/plugins/nuget.js.map +7 -0
  282. package/dist/security/manifest/plugins/pip.js +123 -0
  283. package/dist/security/manifest/plugins/pip.js.map +7 -0
  284. package/dist/security/manifest/plugins/pip.test.js +208 -0
  285. package/dist/security/manifest/plugins/pip.test.js.map +7 -0
  286. package/dist/security/manifest/plugins/pubspec.js +212 -0
  287. package/dist/security/manifest/plugins/pubspec.js.map +7 -0
  288. package/dist/security/manifest/plugins/pyproject.js +261 -0
  289. package/dist/security/manifest/plugins/pyproject.js.map +7 -0
  290. package/dist/security/manifest/plugins/rubygems.js +185 -0
  291. package/dist/security/manifest/plugins/rubygems.js.map +7 -0
  292. package/dist/security/manifest/plugins/swift.js +200 -0
  293. package/dist/security/manifest/plugins/swift.js.map +7 -0
  294. package/dist/security/owasp.js +104 -0
  295. package/dist/security/owasp.js.map +7 -0
  296. package/dist/security/pipeline.js +125 -0
  297. package/dist/security/pipeline.js.map +7 -0
  298. package/dist/security/reachability.js +276 -0
  299. package/dist/security/reachability.js.map +7 -0
  300. package/dist/security/reachability.test.js +394 -0
  301. package/dist/security/reachability.test.js.map +7 -0
  302. package/dist/security/remediation.js +126 -0
  303. package/dist/security/remediation.js.map +7 -0
  304. package/dist/security/secrets.js +176 -0
  305. package/dist/security/secrets.js.map +7 -0
  306. package/dist/security/staleness.js +231 -0
  307. package/dist/security/staleness.js.map +7 -0
  308. package/dist/security/supply-chain.js +301 -0
  309. package/dist/security/supply-chain.js.map +7 -0
  310. package/dist/security/suppressions.js +106 -0
  311. package/dist/security/suppressions.js.map +7 -0
  312. package/dist/security/types.js +17 -0
  313. package/dist/security/types.js.map +7 -0
  314. package/dist/security/vuln/client.js +355 -0
  315. package/dist/security/vuln/client.js.map +7 -0
  316. package/dist/security/vuln/client.test.js +288 -0
  317. package/dist/security/vuln/client.test.js.map +7 -0
  318. package/dist/security/vuln/epss-client.js +95 -0
  319. package/dist/security/vuln/epss-client.js.map +7 -0
  320. package/dist/security/vuln/index.js +29 -0
  321. package/dist/security/vuln/index.js.map +7 -0
  322. package/dist/security/vuln/osv-adapter.js +321 -0
  323. package/dist/security/vuln/osv-adapter.js.map +7 -0
  324. package/dist/security/vuln/osv-adapter.test.js +391 -0
  325. package/dist/security/vuln/osv-adapter.test.js.map +7 -0
  326. package/dist/security/vuln/types.js +17 -0
  327. package/dist/security/vuln/types.js.map +7 -0
  328. package/dist/types.js.map +2 -2
  329. package/package.json +2 -1
@@ -0,0 +1,138 @@
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 supply_chain_exports = {};
30
+ __export(supply_chain_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(supply_chain_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
+ const RISK_ORDER = {
40
+ critical: 4,
41
+ high: 3,
42
+ medium: 2,
43
+ low: 1,
44
+ unknown: 0
45
+ };
46
+ function riskColor(level) {
47
+ switch (level) {
48
+ case "critical":
49
+ return red;
50
+ case "high":
51
+ return yellow;
52
+ case "medium":
53
+ return "\x1B[33m";
54
+ case "low":
55
+ return import_ui.green;
56
+ default:
57
+ return import_ui.dim;
58
+ }
59
+ }
60
+ function register(program) {
61
+ program.command("supply-chain [projectPath]").description("Assess supply-chain health: OpenSSF Scorecard, maintainer count, package age, and risk level").option("--threshold <level>", "Show only at or above risk level: critical|high|medium|low (default: low)", "low").option("--refresh", "Re-fetch data from registries and Scorecard API").option("--format <fmt>", "Output format: table | json (default: table)", "table").action(async (projectPath, opts) => {
62
+ const target = path.resolve(projectPath ?? process.cwd());
63
+ const config = await (0, import_config.loadConfig)(target);
64
+ if (!config.enableSecurity) {
65
+ console.error(`
66
+ ${yellow}\u26A0 Security analysis is disabled.${import_ui.reset}`);
67
+ 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}`);
68
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
69
+ `);
70
+ process.exit(1);
71
+ }
72
+ const thresholdLevel = opts.threshold;
73
+ if (!["critical", "high", "medium", "low"].includes(thresholdLevel)) {
74
+ console.error(` \u2716 --threshold must be one of: critical | high | medium | low`);
75
+ process.exit(1);
76
+ }
77
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
78
+ if (!KiroGraph.isInitialized(target)) {
79
+ console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
80
+ process.exit(1);
81
+ }
82
+ const cg = await KiroGraph.open(target);
83
+ const db = cg.getDatabase();
84
+ db.applySecuritySchema();
85
+ const { SupplyChainChecker } = await Promise.resolve().then(() => require("../../security/supply-chain.js"));
86
+ const checker = new SupplyChainChecker(db);
87
+ if (opts.refresh || opts.format !== "json") {
88
+ console.error(` ${import_ui.dim}Fetching supply-chain data from registries...${import_ui.reset}`);
89
+ }
90
+ const { results, errors } = await checker.checkAll();
91
+ if (errors.length > 0) {
92
+ console.error(` ${yellow}\u26A0${import_ui.reset} ${errors.length} error(s) during fetch`);
93
+ }
94
+ const thresholdOrder = RISK_ORDER[thresholdLevel] ?? 0;
95
+ const filtered = results.filter((r) => (RISK_ORDER[r.riskLevel] ?? 0) >= thresholdOrder);
96
+ filtered.sort((a, b) => (RISK_ORDER[b.riskLevel] ?? 0) - (RISK_ORDER[a.riskLevel] ?? 0));
97
+ if (opts.format === "json") {
98
+ console.log(JSON.stringify(filtered, null, 2));
99
+ cg.close();
100
+ return;
101
+ }
102
+ if (filtered.length === 0) {
103
+ console.log(`
104
+ ${import_ui.dim}No supply-chain risks found at or above threshold: ${thresholdLevel}.${import_ui.reset}`);
105
+ console.log(` ${import_ui.dim}Run with${import_ui.reset} ${import_ui.violet}${import_ui.bold}--refresh${import_ui.reset} ${import_ui.dim}to re-fetch from registries.${import_ui.reset}
106
+ `);
107
+ cg.close();
108
+ return;
109
+ }
110
+ console.log(`
111
+ ${import_ui.violet}${import_ui.bold}Supply-Chain Health${import_ui.reset}
112
+ `);
113
+ for (const r of filtered) {
114
+ const scoreStr = r.scorecardScore !== null ? r.scorecardScore.toFixed(1) : "n/a";
115
+ const maintStr = r.maintainerCount !== null ? String(r.maintainerCount) : "n/a";
116
+ const daysStr = r.daysSinceLastCommit !== null ? `${r.daysSinceLastCommit}d` : "n/a";
117
+ const color = riskColor(r.riskLevel);
118
+ console.log(` ${import_ui.violet}${import_ui.bold}${r.packageName}${import_ui.reset} ${import_ui.dim}(${r.ecosystem})${import_ui.reset}`);
119
+ console.log(` Scorecard: ${import_ui.dim}${scoreStr}/10${import_ui.reset} Maintainers: ${import_ui.dim}${maintStr}${import_ui.reset} Last activity: ${import_ui.dim}${daysStr}${import_ui.reset}`);
120
+ console.log(` Risk: ${color}${import_ui.bold}${r.riskLevel.toUpperCase()}${import_ui.reset}`);
121
+ if (r.riskReasons.length > 0) {
122
+ for (const reason of r.riskReasons) {
123
+ console.log(` ${import_ui.dim}\u2022${import_ui.reset} ${reason}`);
124
+ }
125
+ }
126
+ console.log();
127
+ }
128
+ const total = results.length;
129
+ console.log(` ${import_ui.bold}${filtered.length}${import_ui.reset} of ${import_ui.bold}${total}${import_ui.reset} ${import_ui.dim}packages flagged (threshold: ${thresholdLevel})${import_ui.reset}
130
+ `);
131
+ cg.close();
132
+ });
133
+ }
134
+ // Annotate the CommonJS export names for ESM import in node:
135
+ 0 && (module.exports = {
136
+ register
137
+ });
138
+ //# sourceMappingURL=supply-chain.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/supply-chain.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\ntype Threshold = 'critical' | 'high' | 'medium' | 'low';\n\nconst RISK_ORDER: Record<string, number> = {\n critical: 4,\n high: 3,\n medium: 2,\n low: 1,\n unknown: 0,\n};\n\nfunction riskColor(level: string): string {\n switch (level) {\n case 'critical': return red;\n case 'high': return yellow;\n case 'medium': return '\\x1b[33m';\n case 'low': return green;\n default: return dim;\n }\n}\n\nexport function register(program: Command): void {\n program\n .command('supply-chain [projectPath]')\n .description('Assess supply-chain health: OpenSSF Scorecard, maintainer count, package age, and risk level')\n .option('--threshold <level>', 'Show only at or above risk level: critical|high|medium|low (default: low)', 'low')\n .option('--refresh', 'Re-fetch data from registries and Scorecard API')\n .option('--format <fmt>', 'Output format: table | json (default: table)', 'table')\n .action(async (projectPath: string | undefined, opts: {\n threshold: string;\n refresh?: 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 thresholdLevel = opts.threshold as Threshold;\n if (!['critical', 'high', 'medium', 'low'].includes(thresholdLevel)) {\n console.error(` \u2716 --threshold must be one of: critical | high | medium | low`);\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 { SupplyChainChecker } = await Promise.resolve().then(() => require('../../security/supply-chain.js'));\n const checker = new SupplyChainChecker(db);\n\n if (opts.refresh || opts.format !== 'json') {\n console.error(` ${dim}Fetching supply-chain data from registries...${reset}`);\n }\n\n const { results, errors } = await checker.checkAll();\n\n if (errors.length > 0) {\n console.error(` ${yellow}\u26A0${reset} ${errors.length} error(s) during fetch`);\n }\n\n // Filter by threshold\n const thresholdOrder = RISK_ORDER[thresholdLevel] ?? 0;\n const filtered = results.filter(r => (RISK_ORDER[r.riskLevel] ?? 0) >= thresholdOrder);\n\n // Sort by risk descending\n filtered.sort((a, b) => (RISK_ORDER[b.riskLevel] ?? 0) - (RISK_ORDER[a.riskLevel] ?? 0));\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(filtered, null, 2));\n cg.close();\n return;\n }\n\n if (filtered.length === 0) {\n console.log(`\\n ${dim}No supply-chain risks found at or above threshold: ${thresholdLevel}.${reset}`);\n console.log(` ${dim}Run with${reset} ${violet}${bold}--refresh${reset} ${dim}to re-fetch from registries.${reset}\\n`);\n cg.close();\n return;\n }\n\n console.log(`\\n ${violet}${bold}Supply-Chain Health${reset}\\n`);\n\n for (const r of filtered) {\n const scoreStr = r.scorecardScore !== null ? r.scorecardScore.toFixed(1) : 'n/a';\n const maintStr = r.maintainerCount !== null ? String(r.maintainerCount) : 'n/a';\n const daysStr = r.daysSinceLastCommit !== null ? `${r.daysSinceLastCommit}d` : 'n/a';\n const color = riskColor(r.riskLevel);\n\n console.log(` ${violet}${bold}${r.packageName}${reset} ${dim}(${r.ecosystem})${reset}`);\n console.log(` Scorecard: ${dim}${scoreStr}/10${reset} Maintainers: ${dim}${maintStr}${reset} Last activity: ${dim}${daysStr}${reset}`);\n console.log(` Risk: ${color}${bold}${r.riskLevel.toUpperCase()}${reset}`);\n\n if (r.riskReasons.length > 0) {\n for (const reason of r.riskReasons) {\n console.log(` ${dim}\u2022${reset} ${reason}`);\n }\n }\n console.log();\n }\n\n const total = results.length;\n console.log(` ${bold}${filtered.length}${reset} of ${bold}${total}${reset} ${dim}packages flagged (threshold: ${thresholdLevel})${reset}\\n`);\n\n cg.close();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -38,6 +38,7 @@ var readline = __toESM(require("readline"));
38
38
  var import_banner = require("../banner");
39
39
  var import_ui = require("../ui");
40
40
  var import_prompts = require("../installer/prompts");
41
+ var import_targets = require("../installer/targets");
41
42
  const UNINIT_FAREWELLS = [
42
43
  "Oh. So it's come to this.",
43
44
  "We're sorry to see you go. (Are we? Yes. We are.)",
@@ -50,15 +51,104 @@ const UNINIT_FAREWELLS = [
50
51
  "574 embeddings. Gone. Just like that.",
51
52
  "See you on the other side of `kirograph install`."
52
53
  ];
53
- const UNINIT_TARGETS = ["kiro", "claude", "codex", "all"];
54
+ const ALL_TARGETS = [
55
+ "kiro",
56
+ "claude",
57
+ "codex",
58
+ "cursor",
59
+ "antigravity",
60
+ "opencode",
61
+ "windsurf",
62
+ "cline",
63
+ "copilot",
64
+ "junie",
65
+ "gemini-cli",
66
+ "continue",
67
+ "roo",
68
+ "warp",
69
+ "aider",
70
+ "trae",
71
+ "augment",
72
+ "kilo",
73
+ "amp",
74
+ "devin",
75
+ "replit",
76
+ "goose",
77
+ "openhands",
78
+ "tabnine",
79
+ "mistral-vibe",
80
+ "ibm-bob",
81
+ "crush",
82
+ "droid-factory",
83
+ "forgecode",
84
+ "iflow",
85
+ "qwen",
86
+ "rovo",
87
+ "qoder"
88
+ ];
89
+ function isValidTarget(t) {
90
+ return t === "all" || ALL_TARGETS.includes(t);
91
+ }
92
+ function uninitKiro(projectRoot) {
93
+ const kiroHooks = [
94
+ "kirograph-mark-dirty-on-save.kiro.hook",
95
+ "kirograph-mark-dirty-on-create.kiro.hook",
96
+ "kirograph-sync-on-delete.kiro.hook",
97
+ "kirograph-sync-if-dirty.kiro.hook",
98
+ "kirograph-compress-hint.kiro.hook",
99
+ "kirograph-mem-capture.kiro.hook",
100
+ // Legacy .json filenames
101
+ "kirograph-mark-dirty-on-save.json",
102
+ "kirograph-mark-dirty-on-create.json",
103
+ "kirograph-sync-on-delete.json",
104
+ "kirograph-sync-if-dirty.json",
105
+ "kirograph-sync-on-save.json",
106
+ "kirograph-sync-on-create.json",
107
+ "kirograph-compress-hint.json",
108
+ "kirograph-mem-capture.json"
109
+ ];
110
+ const hooksDir = path.join(projectRoot, ".kiro", "hooks");
111
+ let removedHooks = 0;
112
+ for (const hook of kiroHooks) {
113
+ const p = path.join(hooksDir, hook);
114
+ if (fs.existsSync(p)) {
115
+ fs.unlinkSync(p);
116
+ removedHooks++;
117
+ }
118
+ }
119
+ if (removedHooks > 0) console.log(` ${import_ui.green}\u2713${import_ui.reset} Removed ${removedHooks} hook(s) from .kiro/hooks/`);
120
+ const steeringDir = path.join(projectRoot, ".kiro", "steering");
121
+ let removedSteering = 0;
122
+ if (fs.existsSync(steeringDir)) {
123
+ for (const entry of fs.readdirSync(steeringDir)) {
124
+ if (entry.startsWith("kirograph") && entry.endsWith(".md")) {
125
+ fs.unlinkSync(path.join(steeringDir, entry));
126
+ removedSteering++;
127
+ }
128
+ }
129
+ }
130
+ if (removedSteering > 0) {
131
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} Removed ${removedSteering} steering file(s) from .kiro/steering/`);
132
+ }
133
+ const agentPath = path.join(projectRoot, ".kiro", "agents", "kirograph.json");
134
+ if (fs.existsSync(agentPath)) {
135
+ fs.unlinkSync(agentPath);
136
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} Removed .kiro/agents/kirograph.json`);
137
+ }
138
+ const { removeMcpServersConfig } = require("../installer/common");
139
+ const mcpPath = path.join(projectRoot, ".kiro", "settings", "mcp.json");
140
+ if (removeMcpServersConfig(mcpPath)) {
141
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} Removed kirograph from .kiro/settings/mcp.json`);
142
+ }
143
+ }
54
144
  async function runUninit(projectPath, opts) {
55
- const target = path.resolve(projectPath ?? process.cwd());
56
- const integration = (opts.target ?? "kiro").toLowerCase();
57
- if (!UNINIT_TARGETS.includes(integration)) {
58
- console.error(`Unknown uninit target: ${opts.target}. Choose from: kiro, claude, codex, all`);
145
+ const projectRoot = path.resolve(projectPath ?? process.cwd());
146
+ const targetName = (opts.target ?? "kiro").toLowerCase();
147
+ if (!isValidTarget(targetName)) {
148
+ console.error(`Unknown uninit target: ${opts.target}. Choose from: ${ALL_TARGETS.join(", ")}, all`);
59
149
  process.exit(1);
60
150
  }
61
- const dir = path.join(target, ".kirograph");
151
+ const dir = path.join(projectRoot, ".kirograph");
62
152
  if (!fs.existsSync(dir)) {
63
153
  console.log("Not initialized.");
64
154
  return;
@@ -70,10 +160,10 @@ async function runUninit(projectPath, opts) {
70
160
  const farewell = UNINIT_FAREWELLS[Math.floor(Math.random() * UNINIT_FAREWELLS.length)];
71
161
  console.log(` ${import_ui.violet}${import_ui.bold}${farewell}${import_ui.reset}`);
72
162
  console.log(`
73
- ${import_ui.dim}This can remove ${integration} integration files and, separately, the shared .kirograph/ data.${import_ui.reset}`);
163
+ ${import_ui.dim}This can remove ${targetName} integration files and, separately, the shared .kirograph/ data.${import_ui.reset}`);
74
164
  console.log(` ${import_ui.dim}Your source code is untouched.${import_ui.reset}`);
75
165
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
76
- removeIntegration = await (0, import_prompts.askToggle)(rl, `Remove ${integration} integration files?`, "Removes hooks, steering, MCP config, and agent instructions for this target.", false);
166
+ removeIntegration = await (0, import_prompts.askToggle)(rl, `Remove ${targetName} integration files?`, "Removes hooks, MCP config, rules, and agent instructions for this target.", false);
77
167
  removeGraph = await (0, import_prompts.askToggle)(rl, "Remove shared .kirograph/ data too?", "Deletes the graph database, snapshots, and all indexed data. Cannot be undone.", false);
78
168
  rl.close();
79
169
  if (!removeIntegration && !removeGraph) {
@@ -88,65 +178,24 @@ async function runUninit(projectPath, opts) {
88
178
  fs.rmSync(dir, { recursive: true, force: true });
89
179
  console.log(` ${import_ui.green}\u2713${import_ui.reset} Removed .kirograph/`);
90
180
  }
91
- if (removeIntegration && (integration === "kiro" || integration === "all")) {
92
- const kiroHooks = [
93
- "kirograph-mark-dirty-on-save.kiro.hook",
94
- "kirograph-mark-dirty-on-create.kiro.hook",
95
- "kirograph-sync-on-delete.kiro.hook",
96
- "kirograph-sync-if-dirty.kiro.hook",
97
- "kirograph-compress-hint.kiro.hook",
98
- "kirograph-mem-capture.kiro.hook",
99
- // Legacy .json filenames
100
- "kirograph-mark-dirty-on-save.json",
101
- "kirograph-mark-dirty-on-create.json",
102
- "kirograph-sync-on-delete.json",
103
- "kirograph-sync-if-dirty.json",
104
- "kirograph-sync-on-save.json",
105
- "kirograph-sync-on-create.json",
106
- "kirograph-compress-hint.json",
107
- "kirograph-mem-capture.json"
108
- ];
109
- const hooksDir = path.join(target, ".kiro", "hooks");
110
- let removedHooks = 0;
111
- for (const hook of kiroHooks) {
112
- const p = path.join(hooksDir, hook);
113
- if (fs.existsSync(p)) {
114
- fs.unlinkSync(p);
115
- removedHooks++;
181
+ if (removeIntegration) {
182
+ const targets = targetName === "all" ? [...ALL_TARGETS] : [targetName];
183
+ for (const t of targets) {
184
+ if (t === "kiro") {
185
+ uninitKiro(projectRoot);
186
+ } else {
187
+ const installer = (0, import_targets.getTargetInstaller)(t);
188
+ installer.uninit?.(projectRoot);
116
189
  }
117
190
  }
118
- if (removedHooks > 0) console.log(` ${import_ui.green}\u2713${import_ui.reset} Removed ${removedHooks} hook(s) from .kiro/hooks/`);
119
- const steeringPath = path.join(target, ".kiro", "steering", "kirograph.md");
120
- if (fs.existsSync(steeringPath)) {
121
- fs.unlinkSync(steeringPath);
122
- console.log(` ${import_ui.green}\u2713${import_ui.reset} Removed .kiro/steering/kirograph.md`);
123
- }
124
- const agentPath = path.join(target, ".kiro", "agents", "kirograph.json");
125
- if (fs.existsSync(agentPath)) {
126
- fs.unlinkSync(agentPath);
127
- console.log(` ${import_ui.green}\u2713${import_ui.reset} Removed .kiro/agents/kirograph.json`);
128
- }
129
- const { removeMcpServersConfig } = await Promise.resolve().then(() => require("../installer/common.js"));
130
- const mcpPath = path.join(target, ".kiro", "settings", "mcp.json");
131
- if (removeMcpServersConfig(mcpPath)) {
132
- console.log(` ${import_ui.green}\u2713${import_ui.reset} Removed kirograph from .kiro/settings/mcp.json`);
133
- }
134
- }
135
- if (removeIntegration && (integration === "claude" || integration === "all")) {
136
- const { uninitClaude } = await Promise.resolve().then(() => require("../installer/targets/claude.js"));
137
- uninitClaude(target);
138
- }
139
- if (removeIntegration && (integration === "codex" || integration === "all")) {
140
- const { uninitCodex } = await Promise.resolve().then(() => require("../installer/targets/codex.js"));
141
- uninitCodex(target);
142
191
  }
143
192
  console.log(`
144
- ${import_ui.dim}Done. Run ${import_ui.violet}kirograph install --target ${integration === "all" ? "kiro" : integration}${import_ui.reset}${import_ui.dim} to come back anytime.${import_ui.reset}
193
+ ${import_ui.dim}Done. Run ${import_ui.violet}kirograph install --target ${targetName === "all" ? "kiro" : targetName}${import_ui.reset}${import_ui.dim} to come back anytime.${import_ui.reset}
145
194
  `);
146
195
  }
147
196
  function register(program) {
148
- program.command("uninit [projectPath]").description("Remove KiroGraph from a project").option("--force", "Skip confirmation").option("--target <target>", "Integration target to clean up: kiro, claude, codex, or all", "kiro").action(runUninit);
149
- program.command("uninstall [projectPath]").description("Alias for uninit. Remove KiroGraph from a project").option("--force", "Skip confirmation").option("--target <target>", "Integration target to clean up: kiro, claude, codex, or all", "kiro").action(runUninit);
197
+ program.command("uninit [projectPath]").description("Remove KiroGraph from a project").option("--force", "Skip confirmation").option("--target <target>", `Integration target to clean up (or "all"): ${ALL_TARGETS.slice(0, 6).join(", ")}, ...`, "kiro").action(runUninit);
198
+ program.command("uninstall [projectPath]").description("Alias for uninit. Remove KiroGraph from a project").option("--force", "Skip confirmation").option("--target <target>", `Integration target to clean up (or "all"): ${ALL_TARGETS.slice(0, 6).join(", ")}, ...`, "kiro").action(runUninit);
150
199
  }
151
200
  // Annotate the CommonJS export names for ESM import in node:
152
201
  0 && (module.exports = {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/bin/commands/uninit.ts"],
4
- "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport * as readline from 'readline';\nimport { printBanner } from '../banner';\nimport { dim, reset, violet, bold, green } from '../ui';\nimport { askToggle } from '../installer/prompts';\n\nexport const UNINIT_FAREWELLS = [\n \"Oh. So it's come to this.\",\n \"We're sorry to see you go. (Are we? Yes. We are.)\",\n \"Deleting months of carefully indexed knowledge. Bold move.\",\n \"Fine. We'll just sit here in the dark.\",\n \"You can always come back. We won't mention this.\",\n \"The graph remembers everything. Except, soon, anything.\",\n \"Somewhere a tree-sitter is crying.\",\n \"Uninstalling... and pretending it doesn't hurt.\",\n \"574 embeddings. Gone. Just like that.\",\n \"See you on the other side of `kirograph install`.\",\n];\n\ntype UninitTarget = 'kiro' | 'claude' | 'codex' | 'all';\n\nconst UNINIT_TARGETS: UninitTarget[] = ['kiro', 'claude', 'codex', 'all'];\n\nasync function runUninit(projectPath: string | undefined, opts: { force?: boolean; target?: string }): Promise<void> {\n const target = path.resolve(projectPath ?? process.cwd());\n const integration = (opts.target ?? 'kiro').toLowerCase() as UninitTarget;\n if (!UNINIT_TARGETS.includes(integration)) {\n console.error(`Unknown uninit target: ${opts.target}. Choose from: kiro, claude, codex, all`);\n process.exit(1);\n }\n const dir = path.join(target, '.kirograph');\n if (!fs.existsSync(dir)) { console.log('Not initialized.'); return; }\n\n let removeIntegration = true;\n let removeGraph = opts.force === true;\n\n if (!opts.force) {\n printBanner();\n const farewell = UNINIT_FAREWELLS[Math.floor(Math.random() * UNINIT_FAREWELLS.length)]!;\n console.log(` ${violet}${bold}${farewell}${reset}`);\n console.log(`\\n ${dim}This can remove ${integration} integration files and, separately, the shared .kirograph/ data.${reset}`);\n console.log(` ${dim}Your source code is untouched.${reset}`);\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n\n removeIntegration = await askToggle(rl, `Remove ${integration} integration files?`, 'Removes hooks, steering, MCP config, and agent instructions for this target.', false);\n removeGraph = await askToggle(rl, 'Remove shared .kirograph/ data too?', 'Deletes the graph database, snapshots, and all indexed data. Cannot be undone.', false);\n\n rl.close();\n\n if (!removeIntegration && !removeGraph) {\n console.log(`\\n ${dim}Cancelled. Nothing removed.${reset}\\n`);\n return;\n }\n console.log();\n }\n\n if (removeGraph) {\n fs.rmSync(dir, { recursive: true, force: true });\n console.log(` ${green}\u2713${reset} Removed .kirograph/`);\n }\n\n if (removeIntegration && (integration === 'kiro' || integration === 'all')) {\n // Remove .kiro hooks created by kirograph\n const kiroHooks = [\n 'kirograph-mark-dirty-on-save.kiro.hook',\n 'kirograph-mark-dirty-on-create.kiro.hook',\n 'kirograph-sync-on-delete.kiro.hook',\n 'kirograph-sync-if-dirty.kiro.hook',\n 'kirograph-compress-hint.kiro.hook',\n 'kirograph-mem-capture.kiro.hook',\n // Legacy .json filenames\n 'kirograph-mark-dirty-on-save.json',\n 'kirograph-mark-dirty-on-create.json',\n 'kirograph-sync-on-delete.json',\n 'kirograph-sync-if-dirty.json',\n 'kirograph-sync-on-save.json',\n 'kirograph-sync-on-create.json',\n 'kirograph-compress-hint.json',\n 'kirograph-mem-capture.json',\n ];\n const hooksDir = path.join(target, '.kiro', 'hooks');\n let removedHooks = 0;\n for (const hook of kiroHooks) {\n const p = path.join(hooksDir, hook);\n if (fs.existsSync(p)) { fs.unlinkSync(p); removedHooks++; }\n }\n if (removedHooks > 0) console.log(` ${green}\u2713${reset} Removed ${removedHooks} hook(s) from .kiro/hooks/`);\n\n // Remove .kiro/steering/kirograph.md\n const steeringPath = path.join(target, '.kiro', 'steering', 'kirograph.md');\n if (fs.existsSync(steeringPath)) {\n fs.unlinkSync(steeringPath);\n console.log(` ${green}\u2713${reset} Removed .kiro/steering/kirograph.md`);\n }\n\n // Remove .kiro/agents/kirograph.json\n const agentPath = path.join(target, '.kiro', 'agents', 'kirograph.json');\n if (fs.existsSync(agentPath)) {\n fs.unlinkSync(agentPath);\n console.log(` ${green}\u2713${reset} Removed .kiro/agents/kirograph.json`);\n }\n\n // Remove kirograph server from .kiro/settings/mcp.json\n const { removeMcpServersConfig } = await Promise.resolve().then(() => require('../installer/common.js'));\n const mcpPath = path.join(target, '.kiro', 'settings', 'mcp.json');\n if (removeMcpServersConfig(mcpPath)) {\n console.log(` ${green}\u2713${reset} Removed kirograph from .kiro/settings/mcp.json`);\n }\n }\n\n if (removeIntegration && (integration === 'claude' || integration === 'all')) {\n const { uninitClaude } = await Promise.resolve().then(() => require('../installer/targets/claude.js'));\n uninitClaude(target);\n }\n\n if (removeIntegration && (integration === 'codex' || integration === 'all')) {\n const { uninitCodex } = await Promise.resolve().then(() => require('../installer/targets/codex.js'));\n uninitCodex(target);\n }\n\n console.log(`\\n ${dim}Done. Run ${violet}kirograph install --target ${integration === 'all' ? 'kiro' : integration}${reset}${dim} to come back anytime.${reset}\\n`);\n}\n\nexport function register(program: Command): void {\n program\n .command('uninit [projectPath]')\n .description('Remove KiroGraph from a project')\n .option('--force', 'Skip confirmation')\n .option('--target <target>', 'Integration target to clean up: kiro, claude, codex, or all', 'kiro')\n .action(runUninit);\n\n program\n .command('uninstall [projectPath]')\n .description('Alias for uninit. Remove KiroGraph from a project')\n .option('--force', 'Skip confirmation')\n .option('--target <target>', 'Integration target to clean up: kiro, claude, codex, or all', 'kiro')\n .action(runUninit);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport * as readline from 'readline';\nimport { printBanner } from '../banner';\nimport { dim, reset, violet, bold, green } from '../ui';\nimport { askToggle } from '../installer/prompts';\nimport type { InstallTarget } from '../installer/common';\nimport { getTargetInstaller } from '../installer/targets';\n\nexport const UNINIT_FAREWELLS = [\n \"Oh. So it's come to this.\",\n \"We're sorry to see you go. (Are we? Yes. We are.)\",\n \"Deleting months of carefully indexed knowledge. Bold move.\",\n \"Fine. We'll just sit here in the dark.\",\n \"You can always come back. We won't mention this.\",\n \"The graph remembers everything. Except, soon, anything.\",\n \"Somewhere a tree-sitter is crying.\",\n \"Uninstalling... and pretending it doesn't hurt.\",\n \"574 embeddings. Gone. Just like that.\",\n \"See you on the other side of `kirograph install`.\",\n];\n\nconst ALL_TARGETS: InstallTarget[] = [\n 'kiro', 'claude', 'codex', 'cursor', 'antigravity', 'opencode',\n 'windsurf', 'cline', 'copilot', 'junie', 'gemini-cli',\n 'continue', 'roo', 'warp', 'aider', 'trae',\n 'augment', 'kilo', 'amp', 'devin', 'replit', 'goose', 'openhands', 'tabnine',\n 'mistral-vibe', 'ibm-bob', 'crush', 'droid-factory', 'forgecode', 'iflow', 'qwen', 'rovo', 'qoder',\n];\n\nfunction isValidTarget(t: string): t is InstallTarget | 'all' {\n return t === 'all' || ALL_TARGETS.includes(t as InstallTarget);\n}\n\nfunction uninitKiro(projectRoot: string): void {\n // Remove .kiro hooks created by kirograph\n const kiroHooks = [\n 'kirograph-mark-dirty-on-save.kiro.hook',\n 'kirograph-mark-dirty-on-create.kiro.hook',\n 'kirograph-sync-on-delete.kiro.hook',\n 'kirograph-sync-if-dirty.kiro.hook',\n 'kirograph-compress-hint.kiro.hook',\n 'kirograph-mem-capture.kiro.hook',\n // Legacy .json filenames\n 'kirograph-mark-dirty-on-save.json',\n 'kirograph-mark-dirty-on-create.json',\n 'kirograph-sync-on-delete.json',\n 'kirograph-sync-if-dirty.json',\n 'kirograph-sync-on-save.json',\n 'kirograph-sync-on-create.json',\n 'kirograph-compress-hint.json',\n 'kirograph-mem-capture.json',\n ];\n const hooksDir = path.join(projectRoot, '.kiro', 'hooks');\n let removedHooks = 0;\n for (const hook of kiroHooks) {\n const p = path.join(hooksDir, hook);\n if (fs.existsSync(p)) { fs.unlinkSync(p); removedHooks++; }\n }\n if (removedHooks > 0) console.log(` ${green}\u2713${reset} Removed ${removedHooks} hook(s) from .kiro/hooks/`);\n\n // Remove .kiro/steering/kirograph*.md (main + all workflow files)\n const steeringDir = path.join(projectRoot, '.kiro', 'steering');\n let removedSteering = 0;\n if (fs.existsSync(steeringDir)) {\n for (const entry of fs.readdirSync(steeringDir)) {\n if (entry.startsWith('kirograph') && entry.endsWith('.md')) {\n fs.unlinkSync(path.join(steeringDir, entry));\n removedSteering++;\n }\n }\n }\n if (removedSteering > 0) {\n console.log(` ${green}\u2713${reset} Removed ${removedSteering} steering file(s) from .kiro/steering/`);\n }\n\n // Remove .kiro/agents/kirograph.json\n const agentPath = path.join(projectRoot, '.kiro', 'agents', 'kirograph.json');\n if (fs.existsSync(agentPath)) {\n fs.unlinkSync(agentPath);\n console.log(` ${green}\u2713${reset} Removed .kiro/agents/kirograph.json`);\n }\n\n // Remove kirograph server from .kiro/settings/mcp.json\n const { removeMcpServersConfig } = require('../installer/common');\n const mcpPath = path.join(projectRoot, '.kiro', 'settings', 'mcp.json');\n if (removeMcpServersConfig(mcpPath)) {\n console.log(` ${green}\u2713${reset} Removed kirograph from .kiro/settings/mcp.json`);\n }\n}\n\nasync function runUninit(projectPath: string | undefined, opts: { force?: boolean; target?: string }): Promise<void> {\n const projectRoot = path.resolve(projectPath ?? process.cwd());\n const targetName = (opts.target ?? 'kiro').toLowerCase();\n\n if (!isValidTarget(targetName)) {\n console.error(`Unknown uninit target: ${opts.target}. Choose from: ${ALL_TARGETS.join(', ')}, all`);\n process.exit(1);\n }\n\n const dir = path.join(projectRoot, '.kirograph');\n if (!fs.existsSync(dir)) { console.log('Not initialized.'); return; }\n\n let removeIntegration = true;\n let removeGraph = opts.force === true;\n\n if (!opts.force) {\n printBanner();\n const farewell = UNINIT_FAREWELLS[Math.floor(Math.random() * UNINIT_FAREWELLS.length)]!;\n console.log(` ${violet}${bold}${farewell}${reset}`);\n console.log(`\\n ${dim}This can remove ${targetName} integration files and, separately, the shared .kirograph/ data.${reset}`);\n console.log(` ${dim}Your source code is untouched.${reset}`);\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n\n removeIntegration = await askToggle(rl, `Remove ${targetName} integration files?`, 'Removes hooks, MCP config, rules, and agent instructions for this target.', false);\n removeGraph = await askToggle(rl, 'Remove shared .kirograph/ data too?', 'Deletes the graph database, snapshots, and all indexed data. Cannot be undone.', false);\n\n rl.close();\n\n if (!removeIntegration && !removeGraph) {\n console.log(`\\n ${dim}Cancelled. Nothing removed.${reset}\\n`);\n return;\n }\n console.log();\n }\n\n if (removeGraph) {\n fs.rmSync(dir, { recursive: true, force: true });\n console.log(` ${green}\u2713${reset} Removed .kirograph/`);\n }\n\n if (removeIntegration) {\n const targets: InstallTarget[] = targetName === 'all' ? [...ALL_TARGETS] : [targetName as InstallTarget];\n\n for (const t of targets) {\n if (t === 'kiro') {\n uninitKiro(projectRoot);\n } else {\n const installer = getTargetInstaller(t);\n installer.uninit?.(projectRoot);\n }\n }\n }\n\n console.log(`\\n ${dim}Done. Run ${violet}kirograph install --target ${targetName === 'all' ? 'kiro' : targetName}${reset}${dim} to come back anytime.${reset}\\n`);\n}\n\nexport function register(program: Command): void {\n program\n .command('uninit [projectPath]')\n .description('Remove KiroGraph from a project')\n .option('--force', 'Skip confirmation')\n .option('--target <target>', `Integration target to clean up (or \"all\"): ${ALL_TARGETS.slice(0, 6).join(', ')}, ...`, 'kiro')\n .action(runUninit);\n\n program\n .command('uninstall [projectPath]')\n .description('Alias for uninit. Remove KiroGraph from a project')\n .option('--force', 'Skip confirmation')\n .option('--target <target>', `Integration target to clean up (or \"all\"): ${ALL_TARGETS.slice(0, 6).join(', ')}, ...`, 'kiro')\n .action(runUninit);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,76 @@
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 vex_exports = {};
30
+ __export(vex_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(vex_exports);
34
+ var fs = __toESM(require("fs"));
35
+ var path = __toESM(require("path"));
36
+ var import_config = require("../../config");
37
+ var import_ui = require("../ui");
38
+ function register(program) {
39
+ program.command("vex [projectPath]").description("Export CycloneDX 1.5 VEX (Vulnerability Exploitability eXchange)").option("--output <file>", "Write VEX to file instead of stdout").action(async (projectPath, opts) => {
40
+ const target = path.resolve(projectPath ?? process.cwd());
41
+ const config = await (0, import_config.loadConfig)(target);
42
+ if (!config.enableSecurity) {
43
+ console.error(`
44
+ ${"\x1B[33m"}\u26A0 Security analysis is disabled.${import_ui.reset}`);
45
+ 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}`);
46
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
47
+ `);
48
+ process.exit(1);
49
+ }
50
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
51
+ if (!KiroGraph.isInitialized(target)) {
52
+ console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
53
+ process.exit(1);
54
+ }
55
+ const cg = await KiroGraph.open(target);
56
+ const db = cg.getDatabase();
57
+ db.applySecuritySchema();
58
+ const { VEXExporter } = await Promise.resolve().then(() => require("../../security/export/vex.js"));
59
+ const exporter = new VEXExporter(db, target);
60
+ const json = exporter.exportJSON();
61
+ if (opts.output) {
62
+ const outPath = path.resolve(opts.output);
63
+ fs.mkdirSync(path.dirname(outPath), { recursive: true });
64
+ fs.writeFileSync(outPath, json, "utf-8");
65
+ console.error(` ${import_ui.green}\u2713${import_ui.reset} VEX written to ${import_ui.violet}${import_ui.bold}${outPath}${import_ui.reset}`);
66
+ } else {
67
+ process.stdout.write(json + "\n");
68
+ }
69
+ cg.close();
70
+ });
71
+ }
72
+ // Annotate the CommonJS export names for ESM import in node:
73
+ 0 && (module.exports = {
74
+ register
75
+ });
76
+ //# sourceMappingURL=vex.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/vex.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, green } from '../ui';\n\nexport function register(program: Command): void {\n program\n .command('vex [projectPath]')\n .description('Export CycloneDX 1.5 VEX (Vulnerability Exploitability eXchange)')\n .option('--output <file>', 'Write VEX to file instead of stdout')\n .action(async (projectPath: string | undefined, opts: { output?: string }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const config = await loadConfig(target);\n\n if (!config.enableSecurity) {\n console.error(`\\n ${'\\x1b[33m'}\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 { VEXExporter } = await Promise.resolve().then(() => require('../../security/export/vex.js'));\n const exporter = new VEXExporter(db, target);\n const json = exporter.exportJSON();\n\n if (opts.output) {\n const outPath = path.resolve(opts.output);\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\n fs.writeFileSync(outPath, json, 'utf-8');\n console.error(` ${green}\u2713${reset} VEX written to ${violet}${bold}${outPath}${reset}`);\n } else {\n process.stdout.write(json + '\\n');\n }\n\n cg.close();\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,SAAoB;AACpB,WAAsB;AACtB,oBAA2B;AAC3B,gBAAgD;AAEzC,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,mBAAmB,EAC3B,YAAY,kEAAkE,EAC9E,OAAO,mBAAmB,qCAAqC,EAC/D,OAAO,OAAO,aAAiC,SAA8B;AAC5E,UAAM,SAAS,KAAK,QAAQ,eAAe,QAAQ,IAAI,CAAC;AACxD,UAAM,SAAS,UAAM,0BAAW,MAAM;AAEtC,QAAI,CAAC,OAAO,gBAAgB;AAC1B,cAAQ,MAAM;AAAA,IAAO,UAAU,wCAAmC,eAAK,EAAE;AACzE,cAAQ,MAAM,KAAK,aAAG,uCAAuC,eAAK,IAAI,gBAAM,GAAG,cAAI,yBAAyB,eAAK,EAAE;AACnH,cAAQ,MAAM,KAAK,aAAG,eAAe,eAAK,IAAI,gBAAM,GAAG,cAAI,kBAAkB,eAAK;AAAA,CAAI;AACtF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,QAAI,CAAC,UAAU,cAAc,MAAM,GAAG;AACpC,cAAQ,MAAM,yDAAoD;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AACtC,UAAM,KAAK,GAAG,YAAY;AAC1B,OAAG,oBAAoB;AAEvB,UAAM,EAAE,YAAY,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,8BAA8B,CAAC;AAClG,UAAM,WAAW,IAAI,YAAY,IAAI,MAAM;AAC3C,UAAM,OAAO,SAAS,WAAW;AAEjC,QAAI,KAAK,QAAQ;AACf,YAAM,UAAU,KAAK,QAAQ,KAAK,MAAM;AACxC,SAAG,UAAU,KAAK,QAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,SAAG,cAAc,SAAS,MAAM,OAAO;AACvC,cAAQ,MAAM,KAAK,eAAK,SAAI,eAAK,mBAAmB,gBAAM,GAAG,cAAI,GAAG,OAAO,GAAG,eAAK,EAAE;AAAA,IACvF,OAAO;AACL,cAAQ,OAAO,MAAM,OAAO,IAAI;AAAA,IAClC;AAEA,OAAG,MAAM;AAAA,EACX,CAAC;AACL;",
6
+ "names": []
7
+ }
@@ -0,0 +1,95 @@
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 vuln_suppress_exports = {};
30
+ __export(vuln_suppress_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(vuln_suppress_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_ui = require("../ui");
36
+ var import_suppressions = require("../../security/suppressions");
37
+ function register(program) {
38
+ const vulnCmd = program.command("vuln").description("CVE suppression management");
39
+ vulnCmd.command("suppress <cveId> [projectPath]").description("Mark a CVE as suppressed (false positive or accepted risk)").option("--reason <text>", "Reason for suppression").option("--expires <date>", "Expiry date in ISO format (e.g. 2026-12-31)").action(async (cveId, projectPath, opts) => {
40
+ const target = path.resolve(projectPath ?? process.cwd());
41
+ const manager = new import_suppressions.SuppressionManager(target);
42
+ manager.add(cveId, opts.reason, opts.expires);
43
+ const reasonNote = opts.reason ? ` ${import_ui.dim}(${opts.reason})${import_ui.reset}` : "";
44
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} ${import_ui.violet}${import_ui.bold}${cveId}${import_ui.reset} suppressed${reasonNote}`);
45
+ });
46
+ vulnCmd.command("unsuppress <cveId> [projectPath]").description("Remove a CVE suppression").action(async (cveId, projectPath) => {
47
+ const target = path.resolve(projectPath ?? process.cwd());
48
+ const manager = new import_suppressions.SuppressionManager(target);
49
+ const removed = manager.remove(cveId);
50
+ if (!removed) {
51
+ console.error(` \u2716 No suppression found for ${import_ui.violet}${import_ui.bold}${cveId}${import_ui.reset}`);
52
+ process.exit(1);
53
+ }
54
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} ${import_ui.violet}${import_ui.bold}${cveId}${import_ui.reset} unsuppressed`);
55
+ });
56
+ vulnCmd.command("suppressions [projectPath]").description("List all active CVE suppressions").option("--format <fmt>", "Output format: table | json", "table").action(async (projectPath, opts) => {
57
+ const target = path.resolve(projectPath ?? process.cwd());
58
+ const manager = new import_suppressions.SuppressionManager(target);
59
+ const suppressions = manager.getActive();
60
+ if (opts.format === "json") {
61
+ console.log(JSON.stringify(suppressions, null, 2));
62
+ return;
63
+ }
64
+ if (suppressions.length === 0) {
65
+ console.log(`
66
+ ${import_ui.dim}No active suppressions.${import_ui.reset}
67
+ `);
68
+ return;
69
+ }
70
+ const CVE_W = Math.max(6, ...suppressions.map((s) => s.cveId.length));
71
+ const DATE_W = 12;
72
+ const EXP_W = 12;
73
+ const header = ` ${import_ui.bold}${"CVE ID".padEnd(CVE_W)}${import_ui.reset} ${import_ui.bold}${"Suppressed At".padEnd(DATE_W)}${import_ui.reset} ${import_ui.bold}${"Expires".padEnd(EXP_W)}${import_ui.reset} ${import_ui.bold}Reason${import_ui.reset}`;
74
+ const separator = ` ${"\u2500".repeat(CVE_W)} ${"\u2500".repeat(DATE_W)} ${"\u2500".repeat(EXP_W)} ${"\u2500".repeat(20)}`;
75
+ console.log(`
76
+ ${import_ui.bold}Active Suppressions${import_ui.reset} (${suppressions.length})
77
+ `);
78
+ console.log(header);
79
+ console.log(separator);
80
+ for (const s of suppressions) {
81
+ const suppressedDate = s.suppressedAt.slice(0, 10);
82
+ const expiresStr = s.expiresAt ? s.expiresAt.slice(0, 10) : import_ui.dim + "\u2014" + import_ui.reset;
83
+ const reasonStr = s.reason ? `${import_ui.dim}${s.reason}${import_ui.reset}` : `${import_ui.dim}\u2014${import_ui.reset}`;
84
+ console.log(
85
+ ` ${import_ui.violet}${s.cveId.padEnd(CVE_W)}${import_ui.reset} ${suppressedDate.padEnd(DATE_W)} ${expiresStr.padEnd(EXP_W + (s.expiresAt ? 0 : (import_ui.dim + import_ui.reset).length))} ${reasonStr}`
86
+ );
87
+ }
88
+ console.log();
89
+ });
90
+ }
91
+ // Annotate the CommonJS export names for ESM import in node:
92
+ 0 && (module.exports = {
93
+ register
94
+ });
95
+ //# sourceMappingURL=vuln-suppress.js.map