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,193 @@
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 security_exports = {};
30
+ __export(security_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(security_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_config = require("../../config");
36
+ var import_ui = require("../ui");
37
+ function register(program) {
38
+ const secCmd = program.command("security").description("Security analysis: overview, dashboard export, and vulnerability management").argument("[projectPath]", "Project root path (optional)").option("--refresh-staleness", "Fetch latest version info from registries and show stale dependency count").option("--fail-on <condition>", "Exit 1 if condition is met. Supported: affected").action(async (projectPath, opts) => {
39
+ const target = path.resolve(projectPath ?? process.cwd());
40
+ const config = await (0, import_config.loadConfig)(target);
41
+ if (!config.enableSecurity) {
42
+ console.error(`
43
+ ${"\x1B[33m"}\u26A0 Security analysis is disabled.${import_ui.reset}`);
44
+ 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}`);
45
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
46
+ `);
47
+ process.exit(1);
48
+ }
49
+ if (!config.enableArchitecture) {
50
+ console.error(`
51
+ ${"\x1B[33m"}\u26A0 Security requires Architecture analysis to be enabled.${import_ui.reset}`);
52
+ console.error(` ${import_ui.dim}Enable both in .kirograph/config.json:${import_ui.reset}`);
53
+ console.error(` ${import_ui.violet}${import_ui.bold}"enableArchitecture": true${import_ui.reset}`);
54
+ console.error(` ${import_ui.violet}${import_ui.bold}"enableSecurity": true${import_ui.reset}`);
55
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
56
+ `);
57
+ process.exit(1);
58
+ }
59
+ if (opts.failOn !== void 0 && opts.failOn !== "affected") {
60
+ console.error(` \u2716 Invalid --fail-on value: ${opts.failOn}. Supported: affected`);
61
+ process.exit(1);
62
+ }
63
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
64
+ if (!KiroGraph.isInitialized(target)) {
65
+ console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
66
+ process.exit(1);
67
+ }
68
+ const cg = await KiroGraph.open(target);
69
+ const db = cg.getDatabase();
70
+ db.applySecuritySchema();
71
+ const rawDb = db.getRawDb();
72
+ if (opts.refreshStaleness) {
73
+ console.error(` ${import_ui.dim}Fetching latest version info from package registries...${import_ui.reset}`);
74
+ const { StalenessChecker } = await Promise.resolve().then(() => require("../../security/staleness.js"));
75
+ const checker = new StalenessChecker(db);
76
+ const result = await checker.checkAll();
77
+ console.error(` ${import_ui.green}\u2713${import_ui.reset} Checked ${import_ui.bold}${result.checked}${import_ui.reset} packages, ${import_ui.bold}${result.stale}${import_ui.reset} stale`);
78
+ if (result.errors.length > 0) {
79
+ console.error(` ${"\x1B[33m"}\u26A0${import_ui.reset} ${result.errors.length} error(s) during registry fetch`);
80
+ }
81
+ console.error();
82
+ }
83
+ const depCount = rawDb.get(
84
+ `SELECT COUNT(*) as count FROM sec_dependencies`
85
+ ) ?? { count: 0 };
86
+ const vulnCount = rawDb.get(
87
+ `SELECT COUNT(*) as count FROM sec_vulnerabilities`
88
+ ) ?? { count: 0 };
89
+ const verdictRows = rawDb.all(
90
+ `SELECT verdict, COUNT(*) as count FROM sec_reachability GROUP BY verdict`
91
+ );
92
+ const verdicts = {};
93
+ for (const row of verdictRows) {
94
+ verdicts[row.verdict] = row.count;
95
+ }
96
+ const staleCount = rawDb.get(
97
+ `SELECT COUNT(*) as count FROM sec_dependencies WHERE vuln_data_stale = 1`
98
+ ) ?? { count: 0 };
99
+ console.log(`
100
+ ${(0, import_ui.section)("Security Overview")}
101
+ `);
102
+ console.log(` ${import_ui.dim}Dependencies:${import_ui.reset} ${import_ui.violet}${import_ui.bold}${depCount.count}${import_ui.reset}`);
103
+ console.log(` ${import_ui.dim}Vulnerabilities:${import_ui.reset} ${import_ui.violet}${import_ui.bold}${vulnCount.count}${import_ui.reset}`);
104
+ console.log();
105
+ if (vulnCount.count > 0) {
106
+ const topCVE = rawDb.get(
107
+ `SELECT v.cve_id, v.risk_score, d.package_name
108
+ FROM sec_vulnerabilities v
109
+ LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'
110
+ LEFT JOIN sec_dependencies d ON d.node_id = e.source
111
+ LEFT JOIN sec_reachability r ON r.vulnerability_node_id = v.node_id
112
+ WHERE r.verdict = 'affected' AND v.risk_score IS NOT NULL
113
+ ORDER BY v.risk_score DESC NULLS LAST
114
+ LIMIT 1`
115
+ );
116
+ if (topCVE && topCVE.risk_score != null) {
117
+ const riskColor = topCVE.risk_score >= 7 ? "\x1B[31m" : topCVE.risk_score >= 4 ? "\x1B[33m" : import_ui.dim;
118
+ const pkgLabel = topCVE.package_name ? ` in ${import_ui.dim}${topCVE.package_name}${import_ui.reset}` : "";
119
+ console.log(` ${riskColor}Top risk:${import_ui.reset} ${import_ui.violet}${import_ui.bold}${topCVE.cve_id}${import_ui.reset} ${riskColor}(Risk: ${topCVE.risk_score.toFixed(1)})${import_ui.reset}${pkgLabel}`);
120
+ console.log();
121
+ }
122
+ console.log(` ${(0, import_ui.section)("Reachability Verdicts")}
123
+ `);
124
+ const affected = verdicts["affected"] ?? 0;
125
+ const notAffected = verdicts["not_affected"] ?? 0;
126
+ const underInvestigation = verdicts["under_investigation"] ?? 0;
127
+ const noAnalysis = vulnCount.count - affected - notAffected - underInvestigation;
128
+ if (affected > 0) {
129
+ console.log(` ${"\x1B[31m"}\u25CF${import_ui.reset} Affected: ${import_ui.bold}${affected}${import_ui.reset}`);
130
+ }
131
+ if (notAffected > 0) {
132
+ console.log(` ${import_ui.green}\u25CF${import_ui.reset} Not affected: ${import_ui.bold}${notAffected}${import_ui.reset}`);
133
+ }
134
+ if (underInvestigation > 0) {
135
+ console.log(` ${"\x1B[33m"}\u25CF${import_ui.reset} Under investigation: ${import_ui.bold}${underInvestigation}${import_ui.reset}`);
136
+ }
137
+ if (noAnalysis > 0) {
138
+ console.log(` ${import_ui.dim}\u25CF${import_ui.reset} Pending analysis: ${import_ui.bold}${noAnalysis}${import_ui.reset}`);
139
+ }
140
+ console.log();
141
+ }
142
+ if (staleCount.count > 0) {
143
+ console.log(` ${"\x1B[33m"}\u26A0${import_ui.reset} ${import_ui.bold}${staleCount.count}${import_ui.reset} ${import_ui.dim}dependenc${staleCount.count === 1 ? "y has" : "ies have"} stale vulnerability data.${import_ui.reset}`);
144
+ console.log(` ${import_ui.dim}Run${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph vulns --refresh${import_ui.reset} ${import_ui.dim}to update.${import_ui.reset}
145
+ `);
146
+ }
147
+ const stalenessDataCount = rawDb.get(
148
+ `SELECT COUNT(*) as count FROM sec_dependencies WHERE staleness_score IS NOT NULL`
149
+ ) ?? { count: 0 };
150
+ if (stalenessDataCount.count > 0) {
151
+ const staleDepCount = rawDb.get(
152
+ `SELECT COUNT(*) as count FROM sec_dependencies WHERE staleness_score >= 0.3`
153
+ ) ?? { count: 0 };
154
+ console.log(` ${import_ui.dim}Stale dependencies:${import_ui.reset} ${staleDepCount.count > 0 ? `${"\x1B[33m"}${import_ui.bold}${staleDepCount.count}${import_ui.reset}` : `${import_ui.green}${import_ui.bold}0${import_ui.reset}`} ${import_ui.dim}of ${stalenessDataCount.count} scored${import_ui.reset}`);
155
+ if (staleDepCount.count > 0) {
156
+ console.log(` ${import_ui.dim}Run${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph staleness${import_ui.reset} ${import_ui.dim}for details.${import_ui.reset}`);
157
+ }
158
+ console.log();
159
+ } else if (!opts.refreshStaleness) {
160
+ console.log(` ${import_ui.dim}No staleness data.${import_ui.reset} ${import_ui.dim}Run${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph security --refresh-staleness${import_ui.reset} ${import_ui.dim}to score dependencies.${import_ui.reset}
161
+ `);
162
+ }
163
+ const lastCheck = rawDb.get(
164
+ `SELECT MIN(last_vuln_check) as oldest FROM sec_dependencies WHERE last_vuln_check IS NOT NULL`
165
+ )?.oldest;
166
+ if (lastCheck != null) {
167
+ const ageMs = Date.now() - lastCheck;
168
+ const ageDays = ageMs / (1e3 * 60 * 60 * 24);
169
+ const maxAge = config.securityEnrichMaxAgeDays ?? 7;
170
+ if (ageDays > maxAge) {
171
+ console.log(`
172
+ ${"\x1B[33m"}\u26A0 Vulnerability data is ${Math.floor(ageDays)} days old (max: ${maxAge}).${import_ui.reset}`);
173
+ console.log(` ${import_ui.dim}Run${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph vulns --refresh${import_ui.reset} ${import_ui.dim}to update.${import_ui.reset}`);
174
+ }
175
+ }
176
+ if (opts.failOn === "affected") {
177
+ const affectedCount = verdicts["affected"] ?? 0;
178
+ if (affectedCount > 0) {
179
+ console.log(`
180
+ \x1B[31m\u2716\x1B[0m --fail-on affected: ${affectedCount} affected vulnerabilit${affectedCount === 1 ? "y" : "ies"} found. Exiting with code 1.`);
181
+ cg.close();
182
+ process.exit(1);
183
+ }
184
+ }
185
+ cg.close();
186
+ });
187
+ return secCmd;
188
+ }
189
+ // Annotate the CommonJS export names for ESM import in node:
190
+ 0 && (module.exports = {
191
+ register
192
+ });
193
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/security.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, green, section } from '../ui';\n\nexport function register(program: Command): Command {\n const secCmd = program\n .command('security')\n .description('Security analysis: overview, dashboard export, and vulnerability management')\n .argument('[projectPath]', 'Project root path (optional)')\n .option('--refresh-staleness', 'Fetch latest version info from registries and show stale dependency count')\n .option('--fail-on <condition>', 'Exit 1 if condition is met. Supported: affected')\n .action(async (projectPath: string | undefined, opts: { refreshStaleness?: boolean; failOn?: 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 if (!config.enableArchitecture) {\n console.error(`\\n ${'\\x1b[33m'}\u26A0 Security requires Architecture analysis to be enabled.${reset}`);\n console.error(` ${dim}Enable both in .kirograph/config.json:${reset}`);\n console.error(` ${violet}${bold}\"enableArchitecture\": true${reset}`);\n console.error(` ${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 if (opts.failOn !== undefined && opts.failOn !== 'affected') {\n console.error(` \u2716 Invalid --fail-on value: ${opts.failOn}. Supported: affected`);\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 const rawDb = db.getRawDb();\n\n // Optionally refresh staleness data from registries\n if (opts.refreshStaleness) {\n console.error(` ${dim}Fetching latest version info from package registries...${reset}`);\n const { StalenessChecker } = await Promise.resolve().then(() => require('../../security/staleness.js'));\n const checker = new StalenessChecker(db);\n const result = await checker.checkAll();\n console.error(` ${green}\u2713${reset} Checked ${bold}${result.checked}${reset} packages, ${bold}${result.stale}${reset} stale`);\n if (result.errors.length > 0) {\n console.error(` ${'\\x1b[33m'}\u26A0${reset} ${result.errors.length} error(s) during registry fetch`);\n }\n console.error();\n }\n\n // Query dependency counts\n const depCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies`,\n ) ?? { count: 0 };\n\n // Query vulnerability counts\n const vulnCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_vulnerabilities`,\n ) ?? { count: 0 };\n\n // Query reachability verdict counts\n const verdictRows: Array<{ verdict: string; count: number }> = rawDb.all(\n `SELECT verdict, COUNT(*) as count FROM sec_reachability GROUP BY verdict`,\n );\n const verdicts: Record<string, number> = {};\n for (const row of verdictRows) {\n verdicts[row.verdict] = row.count;\n }\n\n // Check for stale data\n const staleCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies WHERE vuln_data_stale = 1`,\n ) ?? { count: 0 };\n\n // Display overview\n console.log(`\\n ${section('Security Overview')}\\n`);\n console.log(` ${dim}Dependencies:${reset} ${violet}${bold}${depCount.count}${reset}`);\n console.log(` ${dim}Vulnerabilities:${reset} ${violet}${bold}${vulnCount.count}${reset}`);\n console.log();\n\n if (vulnCount.count > 0) {\n // Show top-risk CVE when data is available\n const topCVE: { cve_id: string; risk_score: number | null; package_name: string | null } | undefined =\n rawDb.get(\n `SELECT v.cve_id, v.risk_score, d.package_name\n FROM sec_vulnerabilities v\n LEFT JOIN edges e ON e.target = v.node_id AND e.kind = 'has_vulnerability'\n LEFT JOIN sec_dependencies d ON d.node_id = e.source\n LEFT JOIN sec_reachability r ON r.vulnerability_node_id = v.node_id\n WHERE r.verdict = 'affected' AND v.risk_score IS NOT NULL\n ORDER BY v.risk_score DESC NULLS LAST\n LIMIT 1`,\n );\n if (topCVE && topCVE.risk_score != null) {\n const riskColor = topCVE.risk_score >= 7 ? '\\x1b[31m' : topCVE.risk_score >= 4 ? '\\x1b[33m' : dim;\n const pkgLabel = topCVE.package_name ? ` in ${dim}${topCVE.package_name}${reset}` : '';\n console.log(` ${riskColor}Top risk:${reset} ${violet}${bold}${topCVE.cve_id}${reset} ${riskColor}(Risk: ${topCVE.risk_score.toFixed(1)})${reset}${pkgLabel}`);\n console.log();\n }\n\n console.log(` ${section('Reachability Verdicts')}\\n`);\n const affected = verdicts['affected'] ?? 0;\n const notAffected = verdicts['not_affected'] ?? 0;\n const underInvestigation = verdicts['under_investigation'] ?? 0;\n const noAnalysis = vulnCount.count - affected - notAffected - underInvestigation;\n\n if (affected > 0) {\n console.log(` ${'\\x1b[31m'}\u25CF${reset} Affected: ${bold}${affected}${reset}`);\n }\n if (notAffected > 0) {\n console.log(` ${green}\u25CF${reset} Not affected: ${bold}${notAffected}${reset}`);\n }\n if (underInvestigation > 0) {\n console.log(` ${'\\x1b[33m'}\u25CF${reset} Under investigation: ${bold}${underInvestigation}${reset}`);\n }\n if (noAnalysis > 0) {\n console.log(` ${dim}\u25CF${reset} Pending analysis: ${bold}${noAnalysis}${reset}`);\n }\n console.log();\n }\n\n if (staleCount.count > 0) {\n console.log(` ${'\\x1b[33m'}\u26A0${reset} ${bold}${staleCount.count}${reset} ${dim}dependenc${staleCount.count === 1 ? 'y has' : 'ies have'} stale vulnerability data.${reset}`);\n console.log(` ${dim}Run${reset} ${violet}${bold}kirograph vulns --refresh${reset} ${dim}to update.${reset}\\n`);\n }\n\n // Show stale dependency count (version staleness) if data exists\n const stalenessDataCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies WHERE staleness_score IS NOT NULL`,\n ) ?? { count: 0 };\n\n if (stalenessDataCount.count > 0) {\n const staleDepCount: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies WHERE staleness_score >= 0.3`,\n ) ?? { count: 0 };\n console.log(` ${dim}Stale dependencies:${reset} ${staleDepCount.count > 0 ? `${'\\x1b[33m'}${bold}${staleDepCount.count}${reset}` : `${green}${bold}0${reset}`} ${dim}of ${stalenessDataCount.count} scored${reset}`);\n if (staleDepCount.count > 0) {\n console.log(` ${dim}Run${reset} ${violet}${bold}kirograph staleness${reset} ${dim}for details.${reset}`);\n }\n console.log();\n } else if (!opts.refreshStaleness) {\n console.log(` ${dim}No staleness data.${reset} ${dim}Run${reset} ${violet}${bold}kirograph security --refresh-staleness${reset} ${dim}to score dependencies.${reset}\\n`);\n }\n\n // Check if vulnerability data is stale\n const lastCheck = (rawDb.get(\n `SELECT MIN(last_vuln_check) as oldest FROM sec_dependencies WHERE last_vuln_check IS NOT NULL`,\n ) as { oldest: number | null } | undefined)?.oldest;\n if (lastCheck != null) {\n const ageMs = Date.now() - lastCheck;\n const ageDays = ageMs / (1000 * 60 * 60 * 24);\n const maxAge = config.securityEnrichMaxAgeDays ?? 7;\n if (ageDays > maxAge) {\n console.log(`\\n ${'\\x1b[33m'}\u26A0 Vulnerability data is ${Math.floor(ageDays)} days old (max: ${maxAge}).${reset}`);\n console.log(` ${dim}Run${reset} ${violet}${bold}kirograph vulns --refresh${reset} ${dim}to update.${reset}`);\n }\n }\n\n // --fail-on: exit 1 if condition is met (after all output)\n if (opts.failOn === 'affected') {\n const affectedCount = verdicts['affected'] ?? 0;\n if (affectedCount > 0) {\n console.log(`\\n \\x1b[31m\u2716\\x1b[0m --fail-on affected: ${affectedCount} affected vulnerabilit${affectedCount === 1 ? 'y' : 'ies'} found. Exiting with code 1.`);\n cg.close();\n process.exit(1);\n }\n }\n\n cg.close();\n });\n\n return secCmd;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,144 @@
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 staleness_exports = {};
30
+ __export(staleness_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(staleness_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_config = require("../../config");
36
+ var import_ui = require("../ui");
37
+ function stalenessBar(score) {
38
+ const filled = Math.round(score * 10);
39
+ return "\u2588".repeat(filled) + "\u2591".repeat(10 - filled);
40
+ }
41
+ function register(program) {
42
+ program.command("staleness [projectPath]").description("Check dependency freshness \u2014 identifies packages significantly behind their latest published version").option("--threshold <n>", "Show only packages with staleness_score >= n (default: 0.3)", "0.3").option("--format <fmt>", "Output format: table | json (default: table)", "table").option("--refresh", "Fetch latest version info from registries before listing").action(async (projectPath, opts) => {
43
+ const target = path.resolve(projectPath ?? process.cwd());
44
+ const config = await (0, import_config.loadConfig)(target);
45
+ if (!config.enableSecurity) {
46
+ console.error(`
47
+ ${"\x1B[33m"}\u26A0 Security analysis is disabled.${import_ui.reset}`);
48
+ 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}`);
49
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
50
+ `);
51
+ process.exit(1);
52
+ }
53
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
54
+ if (!KiroGraph.isInitialized(target)) {
55
+ console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
56
+ process.exit(1);
57
+ }
58
+ const cg = await KiroGraph.open(target);
59
+ const db = cg.getDatabase();
60
+ db.applySecuritySchema();
61
+ const rawDb = db.getRawDb();
62
+ const threshold = parseFloat(opts.threshold);
63
+ if (isNaN(threshold) || threshold < 0 || threshold > 1) {
64
+ console.error(` \u2716 --threshold must be a number between 0 and 1`);
65
+ cg.close();
66
+ process.exit(1);
67
+ }
68
+ if (opts.refresh) {
69
+ console.error(` ${import_ui.dim}Fetching latest version info from package registries...${import_ui.reset}`);
70
+ const { StalenessChecker } = await Promise.resolve().then(() => require("../../security/staleness.js"));
71
+ const checker = new StalenessChecker(db);
72
+ const result = await checker.checkAll();
73
+ console.error(` ${import_ui.green}\u2713${import_ui.reset} Checked ${import_ui.bold}${result.checked}${import_ui.reset} packages, ${import_ui.bold}${result.stale}${import_ui.reset} stale`);
74
+ if (result.errors.length > 0) {
75
+ console.error(` ${"\x1B[33m"}\u26A0${import_ui.reset} ${result.errors.length} error(s) during registry fetch`);
76
+ }
77
+ console.error();
78
+ }
79
+ const rows = rawDb.all(
80
+ `SELECT node_id, package_name, ecosystem, resolved_version, declared_constraint,
81
+ latest_version, latest_published, staleness_score
82
+ FROM sec_dependencies
83
+ WHERE staleness_score >= ?
84
+ ORDER BY staleness_score DESC`,
85
+ [threshold]
86
+ );
87
+ const totalDeps = rawDb.get(
88
+ `SELECT COUNT(*) as count FROM sec_dependencies`
89
+ ) ?? { count: 0 };
90
+ if (opts.format === "json") {
91
+ console.log(JSON.stringify(rows.map((r) => ({
92
+ packageName: r.package_name,
93
+ ecosystem: r.ecosystem,
94
+ resolvedVersion: r.resolved_version ?? r.declared_constraint,
95
+ latestVersion: r.latest_version,
96
+ latestPublished: r.latest_published,
97
+ stalenessScore: r.staleness_score
98
+ })), null, 2));
99
+ cg.close();
100
+ return;
101
+ }
102
+ if (rows.length === 0) {
103
+ console.log(`
104
+ ${import_ui.dim}No stale dependencies found (threshold: ${threshold}).${import_ui.reset}`);
105
+ if (!opts.refresh) {
106
+ console.log(` ${import_ui.dim}Run with${import_ui.reset} ${import_ui.violet}${import_ui.bold}--refresh${import_ui.reset} ${import_ui.dim}to fetch latest version data from registries.${import_ui.reset}`);
107
+ }
108
+ console.log();
109
+ cg.close();
110
+ return;
111
+ }
112
+ console.log(`
113
+ ${import_ui.bold}Stale Dependencies${import_ui.reset}
114
+ `);
115
+ for (const row of rows) {
116
+ const resolved = row.resolved_version ?? row.declared_constraint ?? "?";
117
+ const latest = row.latest_version ?? "?";
118
+ const score = row.staleness_score ?? 0;
119
+ const months = row.latest_published ? Math.round((Date.now() - row.latest_published) / (1e3 * 60 * 60 * 24 * 30)) : null;
120
+ const bar = stalenessBar(score);
121
+ const scoreStr = score.toFixed(2);
122
+ let barColor = import_ui.dim;
123
+ if (score >= 0.7) barColor = "\x1B[31m";
124
+ else if (score >= 0.4) barColor = "\x1B[33m";
125
+ const pkgLabel = `${import_ui.violet}${import_ui.bold}${row.package_name}${import_ui.reset} ${import_ui.dim}(${row.ecosystem})${import_ui.reset}`;
126
+ const versionLabel = `${resolved} \u2192 ${import_ui.green}${latest}${import_ui.reset}`;
127
+ const monthsLabel = months !== null ? `${months}mo since latest` : "publish date unknown";
128
+ console.log(` ${pkgLabel}`);
129
+ console.log(` ${versionLabel} ${import_ui.dim}${monthsLabel}${import_ui.reset}`);
130
+ console.log(` ${barColor}${bar}${import_ui.reset} ${import_ui.dim}${scoreStr}${import_ui.reset}`);
131
+ console.log();
132
+ }
133
+ const staleCount = rows.length;
134
+ const totalCount = totalDeps.count;
135
+ console.log(` ${import_ui.bold}${staleCount}${import_ui.reset} of ${import_ui.bold}${totalCount}${import_ui.reset} ${import_ui.dim}dependenc${staleCount === 1 ? "y is" : "ies are"} stale (score >= ${threshold})${import_ui.reset}
136
+ `);
137
+ cg.close();
138
+ });
139
+ }
140
+ // Annotate the CommonJS export names for ESM import in node:
141
+ 0 && (module.exports = {
142
+ register
143
+ });
144
+ //# sourceMappingURL=staleness.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/staleness.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\n// \u2500\u2500 Staleness bar (10-char proportional) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction stalenessBar(score: number): string {\n const filled = Math.round(score * 10);\n return '\u2588'.repeat(filled) + '\u2591'.repeat(10 - filled);\n}\n\n// \u2500\u2500 JSON output type \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface StalenessRow {\n node_id: string;\n package_name: string;\n ecosystem: string;\n resolved_version: string | null;\n declared_constraint: string;\n latest_version: string | null;\n latest_published: number | null;\n staleness_score: number | null;\n}\n\nexport function register(program: Command): void {\n program\n .command('staleness [projectPath]')\n .description('Check dependency freshness \u2014 identifies packages significantly behind their latest published version')\n .option('--threshold <n>', 'Show only packages with staleness_score >= n (default: 0.3)', '0.3')\n .option('--format <fmt>', 'Output format: table | json (default: table)', 'table')\n .option('--refresh', 'Fetch latest version info from registries before listing')\n .action(async (projectPath: string | undefined, opts: {\n threshold: string;\n format: string;\n refresh?: boolean;\n }) => {\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 const rawDb = db.getRawDb();\n\n const threshold = parseFloat(opts.threshold);\n if (isNaN(threshold) || threshold < 0 || threshold > 1) {\n console.error(` \u2716 --threshold must be a number between 0 and 1`);\n cg.close(); process.exit(1);\n }\n\n // Optionally refresh staleness data from registries\n if (opts.refresh) {\n console.error(` ${dim}Fetching latest version info from package registries...${reset}`);\n const { StalenessChecker } = await Promise.resolve().then(() => require('../../security/staleness.js'));\n const checker = new StalenessChecker(db);\n const result = await checker.checkAll();\n console.error(` ${green}\u2713${reset} Checked ${bold}${result.checked}${reset} packages, ${bold}${result.stale}${reset} stale`);\n if (result.errors.length > 0) {\n console.error(` ${'\\x1b[33m'}\u26A0${reset} ${result.errors.length} error(s) during registry fetch`);\n }\n console.error();\n }\n\n // Query dependencies with staleness data\n const rows: StalenessRow[] = rawDb.all(\n `SELECT node_id, package_name, ecosystem, resolved_version, declared_constraint,\n latest_version, latest_published, staleness_score\n FROM sec_dependencies\n WHERE staleness_score >= ?\n ORDER BY staleness_score DESC`,\n [threshold],\n );\n\n const totalDeps: { count: number } = rawDb.get(\n `SELECT COUNT(*) as count FROM sec_dependencies`,\n ) ?? { count: 0 };\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(rows.map(r => ({\n packageName: r.package_name,\n ecosystem: r.ecosystem,\n resolvedVersion: r.resolved_version ?? r.declared_constraint,\n latestVersion: r.latest_version,\n latestPublished: r.latest_published,\n stalenessScore: r.staleness_score,\n })), null, 2));\n cg.close();\n return;\n }\n\n // \u2500\u2500 Table output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n if (rows.length === 0) {\n console.log(`\\n ${dim}No stale dependencies found (threshold: ${threshold}).${reset}`);\n if (!opts.refresh) {\n console.log(` ${dim}Run with${reset} ${violet}${bold}--refresh${reset} ${dim}to fetch latest version data from registries.${reset}`);\n }\n console.log();\n cg.close();\n return;\n }\n\n console.log(`\\n ${bold}Stale Dependencies${reset}\\n`);\n\n for (const row of rows) {\n const resolved = row.resolved_version ?? row.declared_constraint ?? '?';\n const latest = row.latest_version ?? '?';\n const score = row.staleness_score ?? 0;\n const months = row.latest_published\n ? Math.round((Date.now() - row.latest_published) / (1000 * 60 * 60 * 24 * 30))\n : null;\n\n const bar = stalenessBar(score);\n const scoreStr = score.toFixed(2);\n\n // Colour the bar: red >= 0.7, yellow >= 0.4, dim otherwise\n let barColor = dim;\n if (score >= 0.7) barColor = '\\x1b[31m';\n else if (score >= 0.4) barColor = '\\x1b[33m';\n\n const pkgLabel = `${violet}${bold}${row.package_name}${reset} ${dim}(${row.ecosystem})${reset}`;\n const versionLabel = `${resolved} \u2192 ${green}${latest}${reset}`;\n const monthsLabel = months !== null ? `${months}mo since latest` : 'publish date unknown';\n\n console.log(` ${pkgLabel}`);\n console.log(` ${versionLabel} ${dim}${monthsLabel}${reset}`);\n console.log(` ${barColor}${bar}${reset} ${dim}${scoreStr}${reset}`);\n console.log();\n }\n\n const staleCount = rows.length;\n const totalCount = totalDeps.count;\n console.log(` ${bold}${staleCount}${reset} of ${bold}${totalCount}${reset} ${dim}dependenc${staleCount === 1 ? 'y is' : 'ies are'} stale (score >= ${threshold})${reset}\\n`);\n\n cg.close();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -33,10 +33,15 @@ __export(status_exports, {
33
33
  module.exports = __toCommonJS(status_exports);
34
34
  var path = __toESM(require("path"));
35
35
  var import_ui = require("../ui");
36
+ var import_config = require("../../config");
36
37
  function register(program) {
37
- program.command("status [projectPath]").description("Show index statistics").action(async (projectPath) => {
38
- const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
38
+ program.command("status [projectPath]").description("Show index statistics").option("--integrations", "Show detected and configured platforms").action(async (projectPath, opts) => {
39
39
  const target = path.resolve(projectPath ?? process.cwd());
40
+ if (opts.integrations) {
41
+ await showIntegrations(target);
42
+ return;
43
+ }
44
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
40
45
  const cg = await KiroGraph.open(target);
41
46
  const stats = await cg.getStats();
42
47
  console.log();
@@ -96,10 +101,105 @@ function register(program) {
96
101
  } else {
97
102
  console.log(` ${(0, import_ui.label)("Status")} ${import_ui.dim}disabled${import_ui.reset}`);
98
103
  }
104
+ try {
105
+ const config = await (0, import_config.loadConfig)(target);
106
+ if (config.enableSecurity) {
107
+ const db = cg.getDatabase();
108
+ db.applySecuritySchema();
109
+ const rawDb = db.getRawDb();
110
+ const depCount = rawDb.get("SELECT COUNT(*) as cnt FROM sec_dependencies")?.cnt ?? 0;
111
+ const vulnCount = rawDb.get("SELECT COUNT(*) as cnt FROM sec_vulnerabilities")?.cnt ?? 0;
112
+ const affectedCount = rawDb.get("SELECT COUNT(*) as cnt FROM sec_reachability WHERE verdict = 'affected'")?.cnt ?? 0;
113
+ const notAffectedCount = rawDb.get("SELECT COUNT(*) as cnt FROM sec_reachability WHERE verdict = 'not_affected'")?.cnt ?? 0;
114
+ const investigatingCount = rawDb.get("SELECT COUNT(*) as cnt FROM sec_reachability WHERE verdict = 'under_investigation'")?.cnt ?? 0;
115
+ const staleCount = rawDb.get("SELECT COUNT(*) as cnt FROM sec_dependencies WHERE vuln_data_stale = 1")?.cnt ?? 0;
116
+ console.log();
117
+ console.log((0, import_ui.section)(" \u{1F512} Security"));
118
+ console.log(` ${(0, import_ui.label)("Dependencies")} ${(0, import_ui.value)(String(depCount))}`);
119
+ console.log(` ${(0, import_ui.label)("Vulnerabilities")} ${(0, import_ui.value)(String(vulnCount))}`);
120
+ if (vulnCount > 0) {
121
+ const affectedLabel = affectedCount > 0 ? `${"\x1B[31m"}${affectedCount} affected${import_ui.reset}` : `${import_ui.dim}0 affected${import_ui.reset}`;
122
+ console.log(` ${(0, import_ui.label)("Affected")} ${affectedLabel}`);
123
+ console.log(` ${(0, import_ui.label)("Not Affected")} ${import_ui.dim}${notAffectedCount}${import_ui.reset}`);
124
+ console.log(` ${(0, import_ui.label)("Investigating")} ${import_ui.dim}${investigatingCount}${import_ui.reset}`);
125
+ }
126
+ if (staleCount > 0) {
127
+ console.log(` ${"\x1B[33m"}\u26A0 ${staleCount} dependenc${staleCount === 1 ? "y has" : "ies have"} stale vulnerability data. Run \`kirograph vulns --refresh\` to update.${import_ui.reset}`);
128
+ }
129
+ }
130
+ } catch {
131
+ }
99
132
  console.log();
100
133
  cg.close();
101
134
  });
102
135
  }
136
+ async function showIntegrations(projectRoot) {
137
+ const fs = await import("fs");
138
+ const { detectPlatforms } = await Promise.resolve().then(() => require("../installer/detect.js"));
139
+ const { readJson, KIROGRAPH_SERVER_NAME } = await Promise.resolve().then(() => require("../installer/common.js"));
140
+ const detected = detectPlatforms(projectRoot);
141
+ const home = process.env.HOME || process.env.USERPROFILE || "";
142
+ const configChecks = {
143
+ "kiro": { path: path.join(projectRoot, ".kiro", "settings", "mcp.json"), key: "mcpServers" },
144
+ "claude": { path: path.join(projectRoot, ".mcp.json"), key: "mcpServers" },
145
+ "cursor": { path: path.join(projectRoot, ".cursor", "mcp.json"), key: "mcpServers" },
146
+ "windsurf": { path: path.join(home, ".codeium", "windsurf", "mcp_config.json"), key: "mcpServers" },
147
+ "codex": { path: path.join(projectRoot, ".codex", "hooks.json"), key: "hooks" },
148
+ "copilot": { path: path.join(projectRoot, ".vscode", "mcp.json"), key: "servers" },
149
+ "copilot-cli": { path: path.join(home, ".copilot", "mcp-config.json"), key: "servers" },
150
+ "gemini-cli": { path: path.join(projectRoot, ".gemini", "settings.json"), key: "mcpServers" },
151
+ "continue": { path: path.join(projectRoot, ".continue", "mcpServers", "kirograph.json"), key: "mcpServers" },
152
+ "opencode": { path: path.join(projectRoot, ".opencode.json"), key: "mcp" },
153
+ "antigravity": { path: path.join(home, ".gemini", "antigravity", "mcp_config.json"), key: "mcpServers" },
154
+ "roo": { path: path.join(projectRoot, ".roo", "mcp.json"), key: "mcpServers" },
155
+ "warp": { path: path.join(projectRoot, ".warp", ".mcp.json"), key: "mcpServers" },
156
+ "trae": { path: path.join(projectRoot, ".trae", "mcp.json"), key: "mcpServers" },
157
+ "amp": { path: path.join(projectRoot, ".amp", "config.json"), key: "mcpServers" },
158
+ "cline": { path: path.join(projectRoot, ".cline", "mcp_settings.json"), key: "mcpServers" },
159
+ "qoder": { path: path.join(projectRoot, ".qoder", "mcp.json"), key: "mcpServers" },
160
+ "qwen": { path: path.join(home, ".qwen", "settings.json"), key: "mcpServers" }
161
+ };
162
+ function isConfigured(target) {
163
+ const check = configChecks[target];
164
+ if (!check) return false;
165
+ if (!fs.existsSync(check.path)) return false;
166
+ const config = readJson(check.path);
167
+ const container = config[check.key];
168
+ if (!container) return false;
169
+ if (typeof container === "object" && !Array.isArray(container)) {
170
+ return KIROGRAPH_SERVER_NAME in container;
171
+ }
172
+ return false;
173
+ }
174
+ const configured = detected.filter((d) => isConfigured(d.target));
175
+ const notConfigured = detected.filter((d) => !isConfigured(d.target));
176
+ console.log();
177
+ console.log((0, import_ui.section)(" Integrations"));
178
+ console.log();
179
+ if (configured.length > 0) {
180
+ console.log(` ${(0, import_ui.label)("Configured:")}`);
181
+ for (const d of configured) {
182
+ const check = configChecks[d.target];
183
+ const configPath = check ? check.path.replace(projectRoot, ".").replace(home, "~") : "";
184
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} ${d.label.padEnd(20)} ${import_ui.dim}${configPath}${import_ui.reset}`);
185
+ }
186
+ }
187
+ if (notConfigured.length > 0) {
188
+ if (configured.length > 0) console.log();
189
+ console.log(` ${(0, import_ui.label)("Detected but not configured:")}`);
190
+ for (const d of notConfigured) {
191
+ const check = configChecks[d.target];
192
+ const configPath = check ? check.path.replace(projectRoot, ".").replace(home, "~") : "";
193
+ console.log(` ${import_ui.dim}\u25CB${import_ui.reset} ${d.label.padEnd(20)} ${import_ui.dim}${configPath}${import_ui.reset}`);
194
+ }
195
+ console.log();
196
+ console.log(` ${import_ui.dim}Run \`kirograph install\` to configure detected platforms.${import_ui.reset}`);
197
+ }
198
+ if (detected.length === 0) {
199
+ console.log(` ${import_ui.dim}No AI coding platforms detected.${import_ui.reset}`);
200
+ }
201
+ console.log();
202
+ }
103
203
  // Annotate the CommonJS export names for ESM import in node:
104
204
  0 && (module.exports = {
105
205
  register
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/bin/commands/status.ts"],
4
- "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { dim, reset, violet, bold, green, label, value, section, renderTable } from '../ui';\n\nexport function register(program: Command): void {\n program\n .command('status [projectPath]')\n .description('Show index statistics')\n .action(async (projectPath: string | undefined) => {\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 stats = await cg.getStats();\n\n console.log();\n console.log(section(' Graph'));\n console.log(` ${label('Files')} ${value(String(stats.files))}`);\n console.log(` ${label('Symbols')} ${value(String(stats.nodes))}`);\n console.log(` ${label('Edges')} ${value(String(stats.edges))}`);\n\n if (stats.frameworks.length > 0) {\n console.log(` ${label('Frameworks')} ${value(stats.frameworks.join(', '))}`);\n }\n\n const kindEntries = Object.entries(stats.nodesByKind).sort((a, b) => b[1] - a[1]);\n if (kindEntries.length > 0) {\n console.log(`\\n ${label('By kind')}`);\n console.log(renderTable(kindEntries.map(([k, v]) => [k, String(v)])));\n }\n\n const langEntries = Object.entries(stats.filesByLanguage ?? {}).sort((a, b) => b[1] - a[1]);\n if (langEntries.length > 0) {\n console.log(`\\n ${label('By language')}`);\n console.log(renderTable(langEntries.map(([k, v]) => [k, String(v)])));\n }\n\n // Sync state\n const threshold = stats.syncWarningThreshold ?? 10;\n const pendingFiles: number = stats.pendingFiles ?? 0;\n const syncRunning: boolean = stats.syncRunning ?? false;\n console.log();\n console.log(section(' Sync'));\n if (syncRunning) {\n console.log(` ${'\\x1b[33m'}\u26A0 Sync is currently running in the background.${reset}`);\n } else {\n console.log(` ${label('Status')} ${dim}idle${reset}`);\n }\n if (pendingFiles > 0) {\n const warn = threshold > 0 && pendingFiles >= threshold;\n const pendingLabel = warn ? `${'\\x1b[33m'}${pendingFiles} files pending${reset}` : `${dim}${pendingFiles} files pending${reset}`;\n console.log(` ${label('Pending')} ${pendingLabel}`);\n if (warn) {\n console.log(` ${'\\x1b[33m'}\u26A0 Index may be stale. Run \\`kirograph sync\\` to update.${reset}`);\n }\n } else {\n console.log(` ${label('Pending')} ${green}up to date${reset}`);\n }\n\n console.log();\n console.log(section(' Semantic Search'));\n if (stats.embeddingsEnabled) {\n const engineLabel =\n stats.semanticEngine === 'sqlite-vec' ? `sqlite-vec ${dim}(${stats.vecIndexCount} entries in ANN index)${reset}` :\n stats.semanticEngine === 'orama' ? `orama ${dim}(hybrid \u2014 ${stats.vecIndexCount} docs in index)${reset}` :\n stats.semanticEngine === 'pglite' ? `pglite+pgvector ${dim}(hybrid \u2014 ${stats.vecIndexCount} rows in DB)${reset}` :\n stats.semanticEngine === 'lancedb' ? `lancedb ${dim}(${stats.vecIndexCount} entries in ANN index)${reset}` :\n stats.semanticEngine === 'qdrant' ? `qdrant ${dim}(${stats.vecIndexCount} points in collection)${reset}` :\n stats.semanticEngine === 'typesense' ? `typesense ${dim}(${stats.vecIndexCount} documents in collection)${reset}` :\n `in-process cosine`;\n const total = stats.embeddableNodeCount > 0 ? stats.embeddableNodeCount : stats.nodes;\n const displayed = Math.min(stats.embeddingCount, total);\n const coverage = total > 0 ? Math.min(100, Math.round((stats.embeddingCount / total) * 100)) : 0;\n console.log(` ${label('Status')} ${green}${bold}enabled${reset}`);\n console.log(` ${label('Model')} ${value(stats.embeddingModel)}`);\n console.log(` ${label('Engine')} ${violet}${engineLabel}${reset}`);\n if (stats.engineFallback) {\n console.log(` ${'\\x1b[33m'}\u26A0 engine fallback: ${stats.engineFallback}${reset}`);\n }\n console.log(` ${label('Indexed')} ${value(`${displayed} / ${total}`)} ${dim}(${coverage}%)${reset}`);\n } else {\n console.log(` ${label('Status')} ${dim}disabled${reset}`);\n }\n\n console.log();\n cg.close();\n });\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { dim, reset, violet, bold, green, label, value, section, renderTable } from '../ui';\nimport { loadConfig } from '../../config';\n\nexport function register(program: Command): void {\n program\n .command('status [projectPath]')\n .description('Show index statistics')\n .option('--integrations', 'Show detected and configured platforms')\n .action(async (projectPath: string | undefined, opts: { integrations?: boolean }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n\n if (opts.integrations) {\n await showIntegrations(target);\n return;\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const cg = await KiroGraph.open(target);\n const stats = await cg.getStats();\n\n console.log();\n console.log(section(' Graph'));\n console.log(` ${label('Files')} ${value(String(stats.files))}`);\n console.log(` ${label('Symbols')} ${value(String(stats.nodes))}`);\n console.log(` ${label('Edges')} ${value(String(stats.edges))}`);\n\n if (stats.frameworks.length > 0) {\n console.log(` ${label('Frameworks')} ${value(stats.frameworks.join(', '))}`);\n }\n\n const kindEntries = Object.entries(stats.nodesByKind).sort((a, b) => b[1] - a[1]);\n if (kindEntries.length > 0) {\n console.log(`\\n ${label('By kind')}`);\n console.log(renderTable(kindEntries.map(([k, v]) => [k, String(v)])));\n }\n\n const langEntries = Object.entries(stats.filesByLanguage ?? {}).sort((a, b) => b[1] - a[1]);\n if (langEntries.length > 0) {\n console.log(`\\n ${label('By language')}`);\n console.log(renderTable(langEntries.map(([k, v]) => [k, String(v)])));\n }\n\n // Sync state\n const threshold = stats.syncWarningThreshold ?? 10;\n const pendingFiles: number = stats.pendingFiles ?? 0;\n const syncRunning: boolean = stats.syncRunning ?? false;\n console.log();\n console.log(section(' Sync'));\n if (syncRunning) {\n console.log(` ${'\\x1b[33m'}\u26A0 Sync is currently running in the background.${reset}`);\n } else {\n console.log(` ${label('Status')} ${dim}idle${reset}`);\n }\n if (pendingFiles > 0) {\n const warn = threshold > 0 && pendingFiles >= threshold;\n const pendingLabel = warn ? `${'\\x1b[33m'}${pendingFiles} files pending${reset}` : `${dim}${pendingFiles} files pending${reset}`;\n console.log(` ${label('Pending')} ${pendingLabel}`);\n if (warn) {\n console.log(` ${'\\x1b[33m'}\u26A0 Index may be stale. Run \\`kirograph sync\\` to update.${reset}`);\n }\n } else {\n console.log(` ${label('Pending')} ${green}up to date${reset}`);\n }\n\n console.log();\n console.log(section(' Semantic Search'));\n if (stats.embeddingsEnabled) {\n const engineLabel =\n stats.semanticEngine === 'sqlite-vec' ? `sqlite-vec ${dim}(${stats.vecIndexCount} entries in ANN index)${reset}` :\n stats.semanticEngine === 'orama' ? `orama ${dim}(hybrid \u2014 ${stats.vecIndexCount} docs in index)${reset}` :\n stats.semanticEngine === 'pglite' ? `pglite+pgvector ${dim}(hybrid \u2014 ${stats.vecIndexCount} rows in DB)${reset}` :\n stats.semanticEngine === 'lancedb' ? `lancedb ${dim}(${stats.vecIndexCount} entries in ANN index)${reset}` :\n stats.semanticEngine === 'qdrant' ? `qdrant ${dim}(${stats.vecIndexCount} points in collection)${reset}` :\n stats.semanticEngine === 'typesense' ? `typesense ${dim}(${stats.vecIndexCount} documents in collection)${reset}` :\n `in-process cosine`;\n const total = stats.embeddableNodeCount > 0 ? stats.embeddableNodeCount : stats.nodes;\n const displayed = Math.min(stats.embeddingCount, total);\n const coverage = total > 0 ? Math.min(100, Math.round((stats.embeddingCount / total) * 100)) : 0;\n console.log(` ${label('Status')} ${green}${bold}enabled${reset}`);\n console.log(` ${label('Model')} ${value(stats.embeddingModel)}`);\n console.log(` ${label('Engine')} ${violet}${engineLabel}${reset}`);\n if (stats.engineFallback) {\n console.log(` ${'\\x1b[33m'}\u26A0 engine fallback: ${stats.engineFallback}${reset}`);\n }\n console.log(` ${label('Indexed')} ${value(`${displayed} / ${total}`)} ${dim}(${coverage}%)${reset}`);\n } else {\n console.log(` ${label('Status')} ${dim}disabled${reset}`);\n }\n\n // Security stats (conditional on enableSecurity)\n try {\n const config = await loadConfig(target);\n if (config.enableSecurity) {\n const db = cg.getDatabase();\n db.applySecuritySchema();\n const rawDb = db.getRawDb();\n\n const depCount: number = rawDb.get('SELECT COUNT(*) as cnt FROM sec_dependencies')?.cnt ?? 0;\n const vulnCount: number = rawDb.get('SELECT COUNT(*) as cnt FROM sec_vulnerabilities')?.cnt ?? 0;\n const affectedCount: number = rawDb.get(\"SELECT COUNT(*) as cnt FROM sec_reachability WHERE verdict = 'affected'\")?.cnt ?? 0;\n const notAffectedCount: number = rawDb.get(\"SELECT COUNT(*) as cnt FROM sec_reachability WHERE verdict = 'not_affected'\")?.cnt ?? 0;\n const investigatingCount: number = rawDb.get(\"SELECT COUNT(*) as cnt FROM sec_reachability WHERE verdict = 'under_investigation'\")?.cnt ?? 0;\n const staleCount: number = rawDb.get('SELECT COUNT(*) as cnt FROM sec_dependencies WHERE vuln_data_stale = 1')?.cnt ?? 0;\n\n console.log();\n console.log(section(' \uD83D\uDD12 Security'));\n console.log(` ${label('Dependencies')} ${value(String(depCount))}`);\n console.log(` ${label('Vulnerabilities')} ${value(String(vulnCount))}`);\n\n if (vulnCount > 0) {\n const affectedLabel = affectedCount > 0\n ? `${'\\x1b[31m'}${affectedCount} affected${reset}`\n : `${dim}0 affected${reset}`;\n console.log(` ${label('Affected')} ${affectedLabel}`);\n console.log(` ${label('Not Affected')} ${dim}${notAffectedCount}${reset}`);\n console.log(` ${label('Investigating')} ${dim}${investigatingCount}${reset}`);\n }\n\n if (staleCount > 0) {\n console.log(` ${'\\x1b[33m'}\u26A0 ${staleCount} dependenc${staleCount === 1 ? 'y has' : 'ies have'} stale vulnerability data. Run \\`kirograph vulns --refresh\\` to update.${reset}`);\n }\n }\n } catch { /* non-critical */ }\n\n console.log();\n cg.close();\n });\n}\n\nasync function showIntegrations(projectRoot: string): Promise<void> {\n const fs = await import('fs');\n const { detectPlatforms } = await Promise.resolve().then(() => require('../installer/detect.js'));\n const { readJson, KIROGRAPH_SERVER_NAME } = await Promise.resolve().then(() => require('../installer/common.js'));\n\n const detected = detectPlatforms(projectRoot);\n const home = process.env.HOME || process.env.USERPROFILE || '';\n\n // Map of target \u2192 config path to check if kirograph is configured\n const configChecks: Record<string, { path: string; key: string }> = {\n 'kiro': { path: path.join(projectRoot, '.kiro', 'settings', 'mcp.json'), key: 'mcpServers' },\n 'claude': { path: path.join(projectRoot, '.mcp.json'), key: 'mcpServers' },\n 'cursor': { path: path.join(projectRoot, '.cursor', 'mcp.json'), key: 'mcpServers' },\n 'windsurf': { path: path.join(home, '.codeium', 'windsurf', 'mcp_config.json'), key: 'mcpServers' },\n 'codex': { path: path.join(projectRoot, '.codex', 'hooks.json'), key: 'hooks' },\n 'copilot': { path: path.join(projectRoot, '.vscode', 'mcp.json'), key: 'servers' },\n 'copilot-cli': { path: path.join(home, '.copilot', 'mcp-config.json'), key: 'servers' },\n 'gemini-cli': { path: path.join(projectRoot, '.gemini', 'settings.json'), key: 'mcpServers' },\n 'continue': { path: path.join(projectRoot, '.continue', 'mcpServers', 'kirograph.json'), key: 'mcpServers' },\n 'opencode': { path: path.join(projectRoot, '.opencode.json'), key: 'mcp' },\n 'antigravity': { path: path.join(home, '.gemini', 'antigravity', 'mcp_config.json'), key: 'mcpServers' },\n 'roo': { path: path.join(projectRoot, '.roo', 'mcp.json'), key: 'mcpServers' },\n 'warp': { path: path.join(projectRoot, '.warp', '.mcp.json'), key: 'mcpServers' },\n 'trae': { path: path.join(projectRoot, '.trae', 'mcp.json'), key: 'mcpServers' },\n 'amp': { path: path.join(projectRoot, '.amp', 'config.json'), key: 'mcpServers' },\n 'cline': { path: path.join(projectRoot, '.cline', 'mcp_settings.json'), key: 'mcpServers' },\n 'qoder': { path: path.join(projectRoot, '.qoder', 'mcp.json'), key: 'mcpServers' },\n 'qwen': { path: path.join(home, '.qwen', 'settings.json'), key: 'mcpServers' },\n };\n\n function isConfigured(target: string): boolean {\n const check = configChecks[target];\n if (!check) return false;\n if (!fs.existsSync(check.path)) return false;\n const config = readJson(check.path);\n const container = config[check.key];\n if (!container) return false;\n if (typeof container === 'object' && !Array.isArray(container)) {\n return KIROGRAPH_SERVER_NAME in container;\n }\n return false;\n }\n\n const configured = detected.filter(d => isConfigured(d.target));\n const notConfigured = detected.filter(d => !isConfigured(d.target));\n\n console.log();\n console.log(section(' Integrations'));\n console.log();\n\n if (configured.length > 0) {\n console.log(` ${label('Configured:')}`);\n for (const d of configured) {\n const check = configChecks[d.target];\n const configPath = check ? check.path.replace(projectRoot, '.').replace(home, '~') : '';\n console.log(` ${green}\u2713${reset} ${d.label.padEnd(20)} ${dim}${configPath}${reset}`);\n }\n }\n\n if (notConfigured.length > 0) {\n if (configured.length > 0) console.log();\n console.log(` ${label('Detected but not configured:')}`);\n for (const d of notConfigured) {\n const check = configChecks[d.target];\n const configPath = check ? check.path.replace(projectRoot, '.').replace(home, '~') : '';\n console.log(` ${dim}\u25CB${reset} ${d.label.padEnd(20)} ${dim}${configPath}${reset}`);\n }\n console.log();\n console.log(` ${dim}Run \\`kirograph install\\` to configure detected platforms.${reset}`);\n }\n\n if (detected.length === 0) {\n console.log(` ${dim}No AI coding platforms detected.${reset}`);\n }\n\n console.log();\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }