kirograph 0.16.1 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +103 -1605
  3. package/dist/architecture/layers/dart.js +112 -0
  4. package/dist/architecture/layers/dart.js.map +7 -0
  5. package/dist/architecture/layers/index.js +3 -1
  6. package/dist/architecture/layers/index.js.map +2 -2
  7. package/dist/bin/banner.js +74 -6
  8. package/dist/bin/banner.js.map +2 -2
  9. package/dist/bin/commands/affected.js +40 -5
  10. package/dist/bin/commands/affected.js.map +2 -2
  11. package/dist/bin/commands/attack-surface.js +157 -0
  12. package/dist/bin/commands/attack-surface.js.map +7 -0
  13. package/dist/bin/commands/benchmark.js +206 -0
  14. package/dist/bin/commands/benchmark.js.map +7 -0
  15. package/dist/bin/commands/budget.js +70 -0
  16. package/dist/bin/commands/budget.js.map +7 -0
  17. package/dist/bin/commands/communities.js +77 -0
  18. package/dist/bin/commands/communities.js.map +7 -0
  19. package/dist/bin/commands/data.js +665 -0
  20. package/dist/bin/commands/data.js.map +7 -0
  21. package/dist/bin/commands/dep-confusion.js +119 -0
  22. package/dist/bin/commands/dep-confusion.js.map +7 -0
  23. package/dist/bin/commands/export.js +304 -10
  24. package/dist/bin/commands/export.js.map +2 -2
  25. package/dist/bin/commands/flows.js +97 -0
  26. package/dist/bin/commands/flows.js.map +7 -0
  27. package/dist/bin/commands/help.js +386 -100
  28. package/dist/bin/commands/help.js.map +2 -2
  29. package/dist/bin/commands/install.js +90 -8
  30. package/dist/bin/commands/install.js.map +2 -2
  31. package/dist/bin/commands/licenses.js +201 -0
  32. package/dist/bin/commands/licenses.js.map +7 -0
  33. package/dist/bin/commands/reachability.js +160 -0
  34. package/dist/bin/commands/reachability.js.map +7 -0
  35. package/dist/bin/commands/read.js +100 -0
  36. package/dist/bin/commands/read.js.map +7 -0
  37. package/dist/bin/commands/refactor.js +116 -0
  38. package/dist/bin/commands/refactor.js.map +7 -0
  39. package/dist/bin/commands/remediation.js +133 -0
  40. package/dist/bin/commands/remediation.js.map +7 -0
  41. package/dist/bin/commands/sbom.js +76 -0
  42. package/dist/bin/commands/sbom.js.map +7 -0
  43. package/dist/bin/commands/security-ci-report.js +267 -0
  44. package/dist/bin/commands/security-ci-report.js.map +7 -0
  45. package/dist/bin/commands/security-export.js +1349 -0
  46. package/dist/bin/commands/security-export.js.map +7 -0
  47. package/dist/bin/commands/security-flows.js +126 -0
  48. package/dist/bin/commands/security-flows.js.map +7 -0
  49. package/dist/bin/commands/security-secrets.js +170 -0
  50. package/dist/bin/commands/security-secrets.js.map +7 -0
  51. package/dist/bin/commands/security.js +193 -0
  52. package/dist/bin/commands/security.js.map +7 -0
  53. package/dist/bin/commands/staleness.js +144 -0
  54. package/dist/bin/commands/staleness.js.map +7 -0
  55. package/dist/bin/commands/status.js +102 -2
  56. package/dist/bin/commands/status.js.map +2 -2
  57. package/dist/bin/commands/supply-chain.js +138 -0
  58. package/dist/bin/commands/supply-chain.js.map +7 -0
  59. package/dist/bin/commands/uninit.js +109 -60
  60. package/dist/bin/commands/uninit.js.map +2 -2
  61. package/dist/bin/commands/vex.js +76 -0
  62. package/dist/bin/commands/vex.js.map +7 -0
  63. package/dist/bin/commands/vuln-suppress.js +95 -0
  64. package/dist/bin/commands/vuln-suppress.js.map +7 -0
  65. package/dist/bin/commands/vulns.js +382 -0
  66. package/dist/bin/commands/vulns.js.map +7 -0
  67. package/dist/bin/installer/auto-detect.js +125 -0
  68. package/dist/bin/installer/auto-detect.js.map +7 -0
  69. package/dist/bin/installer/cli-agent.js +28 -5
  70. package/dist/bin/installer/cli-agent.js.map +2 -2
  71. package/dist/bin/installer/common.js +47 -0
  72. package/dist/bin/installer/common.js.map +2 -2
  73. package/dist/bin/installer/config-prompt.js +39 -1
  74. package/dist/bin/installer/config-prompt.js.map +2 -2
  75. package/dist/bin/installer/detect.js +309 -0
  76. package/dist/bin/installer/detect.js.map +7 -0
  77. package/dist/bin/installer/index.js +36 -1
  78. package/dist/bin/installer/index.js.map +2 -2
  79. package/dist/bin/installer/instructions.js +195 -3
  80. package/dist/bin/installer/instructions.js.map +2 -2
  81. package/dist/bin/installer/steering.js +440 -0
  82. package/dist/bin/installer/steering.js.map +2 -2
  83. package/dist/bin/installer/targets/aider.js +3 -3
  84. package/dist/bin/installer/targets/aider.js.map +2 -2
  85. package/dist/bin/installer/targets/amp.js +3 -3
  86. package/dist/bin/installer/targets/amp.js.map +2 -2
  87. package/dist/bin/installer/targets/antigravity.js +35 -6
  88. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  89. package/dist/bin/installer/targets/augment.js +3 -3
  90. package/dist/bin/installer/targets/augment.js.map +2 -2
  91. package/dist/bin/installer/targets/claude.js +49 -5
  92. package/dist/bin/installer/targets/claude.js.map +2 -2
  93. package/dist/bin/installer/targets/cline.js +32 -6
  94. package/dist/bin/installer/targets/cline.js.map +2 -2
  95. package/dist/bin/installer/targets/codex.js +64 -12
  96. package/dist/bin/installer/targets/codex.js.map +2 -2
  97. package/dist/bin/installer/targets/continue.js +2 -2
  98. package/dist/bin/installer/targets/continue.js.map +2 -2
  99. package/dist/bin/installer/targets/copilot-cli.js +101 -0
  100. package/dist/bin/installer/targets/copilot-cli.js.map +7 -0
  101. package/dist/bin/installer/targets/copilot.js +31 -5
  102. package/dist/bin/installer/targets/copilot.js.map +2 -2
  103. package/dist/bin/installer/targets/cursor.js +4 -4
  104. package/dist/bin/installer/targets/cursor.js.map +2 -2
  105. package/dist/bin/installer/targets/devin.js +2 -2
  106. package/dist/bin/installer/targets/devin.js.map +2 -2
  107. package/dist/bin/installer/targets/gemini-cli.js +2 -2
  108. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  109. package/dist/bin/installer/targets/generic.js +2 -14
  110. package/dist/bin/installer/targets/generic.js.map +2 -2
  111. package/dist/bin/installer/targets/goose.js +3 -3
  112. package/dist/bin/installer/targets/goose.js.map +2 -2
  113. package/dist/bin/installer/targets/index.js +250 -0
  114. package/dist/bin/installer/targets/index.js.map +2 -2
  115. package/dist/bin/installer/targets/junie.js +2 -2
  116. package/dist/bin/installer/targets/junie.js.map +2 -2
  117. package/dist/bin/installer/targets/kilo.js +2 -2
  118. package/dist/bin/installer/targets/kilo.js.map +2 -2
  119. package/dist/bin/installer/targets/kiro.js +3 -3
  120. package/dist/bin/installer/targets/kiro.js.map +2 -2
  121. package/dist/bin/installer/targets/opencode.js +2 -2
  122. package/dist/bin/installer/targets/opencode.js.map +2 -2
  123. package/dist/bin/installer/targets/openhands.js +3 -3
  124. package/dist/bin/installer/targets/openhands.js.map +2 -2
  125. package/dist/bin/installer/targets/qoder.js +91 -0
  126. package/dist/bin/installer/targets/qoder.js.map +7 -0
  127. package/dist/bin/installer/targets/qwen.js +96 -0
  128. package/dist/bin/installer/targets/qwen.js.map +7 -0
  129. package/dist/bin/installer/targets/replit.js +3 -3
  130. package/dist/bin/installer/targets/replit.js.map +2 -2
  131. package/dist/bin/installer/targets/roo.js +2 -2
  132. package/dist/bin/installer/targets/roo.js.map +2 -2
  133. package/dist/bin/installer/targets/tabnine.js +3 -3
  134. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  135. package/dist/bin/installer/targets/trae.js +5 -5
  136. package/dist/bin/installer/targets/trae.js.map +2 -2
  137. package/dist/bin/installer/targets/warp.js +2 -2
  138. package/dist/bin/installer/targets/warp.js.map +2 -2
  139. package/dist/bin/installer/targets/windsurf.js +35 -6
  140. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  141. package/dist/bin/kirograph.js +74 -6
  142. package/dist/bin/kirograph.js.map +3 -3
  143. package/dist/bin/progress.js +30 -0
  144. package/dist/bin/progress.js.map +2 -2
  145. package/dist/compression/naive-cost.js +25 -0
  146. package/dist/compression/naive-cost.js.map +2 -2
  147. package/dist/compression/tracker.js +91 -2
  148. package/dist/compression/tracker.js.map +2 -2
  149. package/dist/compression/types.js.map +1 -1
  150. package/dist/config.js +126 -3
  151. package/dist/config.js.map +2 -2
  152. package/dist/core/pipeline.js +92 -4
  153. package/dist/core/pipeline.js.map +2 -2
  154. package/dist/data/filters.js +105 -0
  155. package/dist/data/filters.js.map +7 -0
  156. package/dist/data/indexer.js +225 -0
  157. package/dist/data/indexer.js.map +7 -0
  158. package/dist/data/linker.js +150 -0
  159. package/dist/data/linker.js.map +7 -0
  160. package/dist/data/lint.js +109 -0
  161. package/dist/data/lint.js.map +7 -0
  162. package/dist/data/parsers/csv.js +132 -0
  163. package/dist/data/parsers/csv.js.map +7 -0
  164. package/dist/data/parsers/excel.js +88 -0
  165. package/dist/data/parsers/excel.js.map +7 -0
  166. package/dist/data/parsers/index.js +79 -0
  167. package/dist/data/parsers/index.js.map +7 -0
  168. package/dist/data/parsers/json-array.js +89 -0
  169. package/dist/data/parsers/json-array.js.map +7 -0
  170. package/dist/data/parsers/jsonl.js +84 -0
  171. package/dist/data/parsers/jsonl.js.map +7 -0
  172. package/dist/data/parsers/parquet.js +95 -0
  173. package/dist/data/parsers/parquet.js.map +7 -0
  174. package/dist/data/profiler.js +182 -0
  175. package/dist/data/profiler.js.map +7 -0
  176. package/dist/data/queries.js +512 -0
  177. package/dist/data/queries.js.map +7 -0
  178. package/dist/data/types.js +17 -0
  179. package/dist/data/types.js.map +7 -0
  180. package/dist/db/data-schema.sql +61 -0
  181. package/dist/db/database.js +67 -5
  182. package/dist/db/database.js.map +2 -2
  183. package/dist/db/memory-schema.sql +5 -1
  184. package/dist/db/schema.sql +3 -1
  185. package/dist/db/security-schema.sql +72 -0
  186. package/dist/extraction/extractor.js +81 -0
  187. package/dist/extraction/extractor.js.map +2 -2
  188. package/dist/extraction/grammars.js +32 -8
  189. package/dist/extraction/grammars.js.map +2 -2
  190. package/dist/extraction/languages.js +43 -1
  191. package/dist/extraction/languages.js.map +2 -2
  192. package/dist/extraction/notebook.js +300 -0
  193. package/dist/extraction/notebook.js.map +7 -0
  194. package/dist/extraction/wasm/tree-sitter-astro.wasm +0 -0
  195. package/dist/extraction/wasm/tree-sitter-gdscript.wasm +0 -0
  196. package/dist/extraction/wasm/tree-sitter-julia.wasm +0 -0
  197. package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
  198. package/dist/extraction/wasm/tree-sitter-perl.wasm +0 -0
  199. package/dist/extraction/wasm/tree-sitter-powershell.wasm +0 -0
  200. package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
  201. package/dist/extraction/wasm/tree-sitter-sql.wasm +0 -0
  202. package/dist/extraction/wasm/tree-sitter-verilog.wasm +0 -0
  203. package/dist/frameworks/flutter.js +130 -0
  204. package/dist/frameworks/flutter.js.map +7 -0
  205. package/dist/frameworks/index.js +7 -1
  206. package/dist/frameworks/index.js.map +3 -3
  207. package/dist/graph/communities.js +317 -0
  208. package/dist/graph/communities.js.map +7 -0
  209. package/dist/graph/flows.js +138 -0
  210. package/dist/graph/flows.js.map +7 -0
  211. package/dist/graph/refactor.js +155 -0
  212. package/dist/graph/refactor.js.map +7 -0
  213. package/dist/index.js +1 -1
  214. package/dist/index.js.map +2 -2
  215. package/dist/mcp/cache.js +172 -0
  216. package/dist/mcp/cache.js.map +7 -0
  217. package/dist/mcp/read-modes.js +295 -0
  218. package/dist/mcp/read-modes.js.map +7 -0
  219. package/dist/mcp/server.js +2 -1
  220. package/dist/mcp/server.js.map +2 -2
  221. package/dist/mcp/tool-names.js +29 -1
  222. package/dist/mcp/tool-names.js.map +2 -2
  223. package/dist/mcp/tools.js +1588 -6
  224. package/dist/mcp/tools.js.map +3 -3
  225. package/dist/memory/database.js +32 -2
  226. package/dist/memory/database.js.map +2 -2
  227. package/dist/memory/types.js.map +1 -1
  228. package/dist/resolution/bridges/android-rn.js +298 -0
  229. package/dist/resolution/bridges/android-rn.js.map +7 -0
  230. package/dist/resolution/bridges/expo-modules.js +155 -0
  231. package/dist/resolution/bridges/expo-modules.js.map +7 -0
  232. package/dist/resolution/bridges/flutter-channel.js +385 -0
  233. package/dist/resolution/bridges/flutter-channel.js.map +7 -0
  234. package/dist/resolution/bridges/index.js +80 -0
  235. package/dist/resolution/bridges/index.js.map +7 -0
  236. package/dist/resolution/bridges/native-events.js +188 -0
  237. package/dist/resolution/bridges/native-events.js.map +7 -0
  238. package/dist/resolution/bridges/native-views.js +244 -0
  239. package/dist/resolution/bridges/native-views.js.map +7 -0
  240. package/dist/resolution/bridges/react-native.js +161 -0
  241. package/dist/resolution/bridges/react-native.js.map +7 -0
  242. package/dist/resolution/bridges/swift-objc.js +227 -0
  243. package/dist/resolution/bridges/swift-objc.js.map +7 -0
  244. package/dist/resolution/bridges/turbomodules.js +216 -0
  245. package/dist/resolution/bridges/turbomodules.js.map +7 -0
  246. package/dist/resolution/index.js +61 -2
  247. package/dist/resolution/index.js.map +2 -2
  248. package/dist/security/attack-surface.js +164 -0
  249. package/dist/security/attack-surface.js.map +7 -0
  250. package/dist/security/context-warnings.js +123 -0
  251. package/dist/security/context-warnings.js.map +7 -0
  252. package/dist/security/context-warnings.test.js +300 -0
  253. package/dist/security/context-warnings.test.js.map +7 -0
  254. package/dist/security/data-flows.js +228 -0
  255. package/dist/security/data-flows.js.map +7 -0
  256. package/dist/security/dep-confusion.js +255 -0
  257. package/dist/security/dep-confusion.js.map +7 -0
  258. package/dist/security/errors.js +51 -0
  259. package/dist/security/errors.js.map +7 -0
  260. package/dist/security/export/fix-suggestions.js +58 -0
  261. package/dist/security/export/fix-suggestions.js.map +7 -0
  262. package/dist/security/export/fix-suggestions.test.js +74 -0
  263. package/dist/security/export/fix-suggestions.test.js.map +7 -0
  264. package/dist/security/export/sbom.js +230 -0
  265. package/dist/security/export/sbom.js.map +7 -0
  266. package/dist/security/export/sbom.test.js +288 -0
  267. package/dist/security/export/sbom.test.js.map +7 -0
  268. package/dist/security/export/serialization.js +142 -0
  269. package/dist/security/export/serialization.js.map +7 -0
  270. package/dist/security/export/serialization.test.js +310 -0
  271. package/dist/security/export/serialization.test.js.map +7 -0
  272. package/dist/security/export/vex.js +220 -0
  273. package/dist/security/export/vex.js.map +7 -0
  274. package/dist/security/export/vex.test.js +278 -0
  275. package/dist/security/export/vex.test.js.map +7 -0
  276. package/dist/security/index.js +67 -0
  277. package/dist/security/index.js.map +7 -0
  278. package/dist/security/integrator-transitives.test.js +359 -0
  279. package/dist/security/integrator-transitives.test.js.map +7 -0
  280. package/dist/security/integrator.js +491 -0
  281. package/dist/security/integrator.js.map +7 -0
  282. package/dist/security/integrator.test.js +237 -0
  283. package/dist/security/integrator.test.js.map +7 -0
  284. package/dist/security/license.js +70 -0
  285. package/dist/security/license.js.map +7 -0
  286. package/dist/security/manifest/adapter.js +243 -0
  287. package/dist/security/manifest/adapter.js.map +7 -0
  288. package/dist/security/manifest/adapter.test.js +272 -0
  289. package/dist/security/manifest/adapter.test.js.map +7 -0
  290. package/dist/security/manifest/parser.js +376 -0
  291. package/dist/security/manifest/parser.js.map +7 -0
  292. package/dist/security/manifest/parser.test.js +110 -0
  293. package/dist/security/manifest/parser.test.js.map +7 -0
  294. package/dist/security/manifest/plugins/cargo.js +233 -0
  295. package/dist/security/manifest/plugins/cargo.js.map +7 -0
  296. package/dist/security/manifest/plugins/cargo.test.js +304 -0
  297. package/dist/security/manifest/plugins/cargo.test.js.map +7 -0
  298. package/dist/security/manifest/plugins/composer.js +152 -0
  299. package/dist/security/manifest/plugins/composer.js.map +7 -0
  300. package/dist/security/manifest/plugins/go.js +146 -0
  301. package/dist/security/manifest/plugins/go.js.map +7 -0
  302. package/dist/security/manifest/plugins/go.test.js +341 -0
  303. package/dist/security/manifest/plugins/go.test.js.map +7 -0
  304. package/dist/security/manifest/plugins/gradle.js +159 -0
  305. package/dist/security/manifest/plugins/gradle.js.map +7 -0
  306. package/dist/security/manifest/plugins/hex.js +159 -0
  307. package/dist/security/manifest/plugins/hex.js.map +7 -0
  308. package/dist/security/manifest/plugins/maven.js +128 -0
  309. package/dist/security/manifest/plugins/maven.js.map +7 -0
  310. package/dist/security/manifest/plugins/maven.test.js +389 -0
  311. package/dist/security/manifest/plugins/maven.test.js.map +7 -0
  312. package/dist/security/manifest/plugins/npm.js +284 -0
  313. package/dist/security/manifest/plugins/npm.js.map +7 -0
  314. package/dist/security/manifest/plugins/npm.test.js +298 -0
  315. package/dist/security/manifest/plugins/npm.test.js.map +7 -0
  316. package/dist/security/manifest/plugins/nuget.js +186 -0
  317. package/dist/security/manifest/plugins/nuget.js.map +7 -0
  318. package/dist/security/manifest/plugins/pip.js +123 -0
  319. package/dist/security/manifest/plugins/pip.js.map +7 -0
  320. package/dist/security/manifest/plugins/pip.test.js +208 -0
  321. package/dist/security/manifest/plugins/pip.test.js.map +7 -0
  322. package/dist/security/manifest/plugins/pubspec.js +212 -0
  323. package/dist/security/manifest/plugins/pubspec.js.map +7 -0
  324. package/dist/security/manifest/plugins/pyproject.js +261 -0
  325. package/dist/security/manifest/plugins/pyproject.js.map +7 -0
  326. package/dist/security/manifest/plugins/rubygems.js +185 -0
  327. package/dist/security/manifest/plugins/rubygems.js.map +7 -0
  328. package/dist/security/manifest/plugins/swift.js +200 -0
  329. package/dist/security/manifest/plugins/swift.js.map +7 -0
  330. package/dist/security/owasp.js +104 -0
  331. package/dist/security/owasp.js.map +7 -0
  332. package/dist/security/pipeline.js +125 -0
  333. package/dist/security/pipeline.js.map +7 -0
  334. package/dist/security/reachability.js +276 -0
  335. package/dist/security/reachability.js.map +7 -0
  336. package/dist/security/reachability.test.js +394 -0
  337. package/dist/security/reachability.test.js.map +7 -0
  338. package/dist/security/remediation.js +126 -0
  339. package/dist/security/remediation.js.map +7 -0
  340. package/dist/security/secrets.js +176 -0
  341. package/dist/security/secrets.js.map +7 -0
  342. package/dist/security/staleness.js +231 -0
  343. package/dist/security/staleness.js.map +7 -0
  344. package/dist/security/supply-chain.js +301 -0
  345. package/dist/security/supply-chain.js.map +7 -0
  346. package/dist/security/suppressions.js +106 -0
  347. package/dist/security/suppressions.js.map +7 -0
  348. package/dist/security/types.js +17 -0
  349. package/dist/security/types.js.map +7 -0
  350. package/dist/security/vuln/client.js +355 -0
  351. package/dist/security/vuln/client.js.map +7 -0
  352. package/dist/security/vuln/client.test.js +288 -0
  353. package/dist/security/vuln/client.test.js.map +7 -0
  354. package/dist/security/vuln/epss-client.js +95 -0
  355. package/dist/security/vuln/epss-client.js.map +7 -0
  356. package/dist/security/vuln/index.js +29 -0
  357. package/dist/security/vuln/index.js.map +7 -0
  358. package/dist/security/vuln/osv-adapter.js +321 -0
  359. package/dist/security/vuln/osv-adapter.js.map +7 -0
  360. package/dist/security/vuln/osv-adapter.test.js +391 -0
  361. package/dist/security/vuln/osv-adapter.test.js.map +7 -0
  362. package/dist/security/vuln/types.js +17 -0
  363. package/dist/security/vuln/types.js.map +7 -0
  364. package/dist/types.js.map +2 -2
  365. package/package.json +5 -2
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/data.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, green, value } from '../ui';\n\nexport function register(program: Command): void {\n const data = program\n .command('data')\n .description('Tabular data navigation (requires enableData: true)');\n\n // \u2500\u2500 list \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n data\n .command('list')\n .description('List all indexed datasets')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized. Run: kirograph init'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataQueries } = await Promise.resolve().then(() => require('../../data/queries.js'));\n const dq = new DataQueries(db.getRawDb());\n const datasets = dq.listDatasets();\n\n if (datasets.length === 0) {\n console.log(` ${dim}No datasets indexed.${reset} Run ${violet}${bold}kirograph index${reset} first.`);\n cg.close(); return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(datasets, null, 2));\n } else {\n console.log(`\\n ${bold}Indexed Datasets${reset} (${datasets.length})\\n`);\n for (const ds of datasets) {\n const sizeMb = (ds.fileSize / 1024 / 1024).toFixed(2);\n console.log(` ${green}${ds.id}${reset}`);\n console.log(` ${dim}File:${reset} ${ds.filePath} ${dim}Format:${reset} ${ds.format}`);\n console.log(` ${dim}Rows:${reset} ${ds.rowCount.toLocaleString()} ${dim}Columns:${reset} ${ds.columnCount} ${dim}Size:${reset} ${sizeMb} MB`);\n console.log();\n }\n }\n cg.close();\n });\n\n // \u2500\u2500 describe \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\u2500\u2500\u2500\u2500\u2500\u2500\n data\n .command('describe <dataset>')\n .description('Show schema and column profiles for a dataset')\n .option('--column <name>', 'Deep dive on a single column')\n .option('--json', 'Output as JSON')\n .action(async (dataset: string, opts: { column?: string; json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized.'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataQueries } = await Promise.resolve().then(() => require('../../data/queries.js'));\n const dq = new DataQueries(db.getRawDb());\n\n if (opts.column) {\n const col = dq.describeColumn(dataset, opts.column);\n if (!col) {\n console.error(` \u2716 Column \"${opts.column}\" not found in dataset \"${dataset}\".`);\n cg.close(); process.exit(1);\n }\n if (opts.json) {\n console.log(JSON.stringify(col, null, 2));\n } else {\n console.log(`\\n ${bold}${col.name}${reset} ${dim}(${col.inferredType})${reset}`);\n console.log(` ${dim}Position:${reset} ${col.position}`);\n console.log(` ${dim}Nullable:${reset} ${col.nullable ? 'yes' : 'no'} (${col.nullPct.toFixed(1)}% null, ${col.nullCount} nulls)`);\n console.log(` ${dim}Cardinality:${reset} ${col.cardinality}`);\n if (col.minValue != null) console.log(` ${dim}Min:${reset} ${col.minValue}`);\n if (col.maxValue != null) console.log(` ${dim}Max:${reset} ${col.maxValue}`);\n if (col.meanValue != null) console.log(` ${dim}Mean:${reset} ${col.meanValue.toFixed(4)}`);\n if (col.sampleValues.length > 0) console.log(` ${dim}Samples:${reset} ${col.sampleValues.join(', ')}`);\n console.log();\n }\n cg.close(); return;\n }\n\n const info = dq.describeDataset(dataset);\n if (!info) {\n console.error(` \u2716 Dataset \"${dataset}\" not found. Run ${violet}${bold}kirograph data list${reset} to see available datasets.`);\n cg.close(); process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(info, null, 2));\n } else {\n const ds = info.dataset;\n const sizeMb = (ds.fileSize / 1024 / 1024).toFixed(2);\n console.log(`\\n ${bold}${ds.id}${reset}`);\n console.log(` ${dim}File:${reset} ${ds.filePath} ${dim}Format:${reset} ${ds.format} ${dim}Size:${reset} ${sizeMb} MB`);\n console.log(` ${dim}Rows:${reset} ${ds.rowCount.toLocaleString()} ${dim}Columns:${reset} ${ds.columnCount}`);\n console.log(`\\n ${bold}Columns:${reset}\\n`);\n\n const maxNameLen = Math.max(...info.columns.map(c => c.name.length), 4);\n console.log(` ${'Name'.padEnd(maxNameLen)} ${'Type'.padEnd(8)} ${'Null%'.padEnd(6)} ${'Card'.padEnd(6)} Samples`);\n console.log(` ${'-'.repeat(maxNameLen)} ${'-'.repeat(8)} ${'-'.repeat(6)} ${'-'.repeat(6)} -------`);\n for (const col of info.columns) {\n const nullPct = col.nullPct > 0 ? `${col.nullPct.toFixed(1)}%` : '0%';\n const samples = col.sampleValues.slice(0, 3).join(', ');\n console.log(` ${col.name.padEnd(maxNameLen)} ${col.inferredType.padEnd(8)} ${nullPct.padEnd(6)} ${String(col.cardinality).padEnd(6)} ${dim}${samples}${reset}`);\n }\n console.log();\n }\n cg.close();\n });\n\n // \u2500\u2500 query \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n data\n .command('query <dataset>')\n .description('Query rows with filters')\n .option('--filter <expr...>', 'Filters in format column:op:value (e.g. age:gt:18)')\n .option('--columns <cols>', 'Comma-separated column names to project')\n .option('--limit <n>', 'Max rows to return', '20')\n .option('--offset <n>', 'Offset for pagination', '0')\n .option('--json', 'Output as JSON')\n .action(async (dataset: string, opts: { filter?: string[]; columns?: string; limit?: string; offset?: string; json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized.'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataQueries } = await Promise.resolve().then(() => require('../../data/queries.js'));\n const dq = new DataQueries(db.getRawDb());\n\n // Parse filters\n const filters = (opts.filter ?? []).map(f => {\n const parts = f.split(':');\n if (parts.length < 3) {\n console.error(` \u2716 Invalid filter format: \"${f}\". Expected column:op:value`);\n process.exit(1);\n }\n const column = parts[0]!;\n const op = parts[1]! as any;\n const val = parts.slice(2).join(':'); // value may contain colons\n return { column, op, value: val };\n });\n\n const columns = opts.columns ? opts.columns.split(',').map(c => c.trim()) : undefined;\n const limit = parseInt(opts.limit ?? '20', 10);\n const offset = parseInt(opts.offset ?? '0', 10);\n\n const result = dq.queryRows(dataset, { filters, columns, limit, offset });\n if (!result) {\n console.error(` \u2716 Dataset \"${dataset}\" not found.`);\n cg.close(); process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\\n ${dim}Showing ${result.rows.length} of ${result.totalMatching} matching rows${reset}\\n`);\n if (result.rows.length > 0) {\n // Simple table output\n const keys = Object.keys(result.rows[0]!).filter(k => k !== 'rowid');\n const widths = keys.map(k => Math.max(k.length, ...result.rows.map(r => String(r[k] ?? '').slice(0, 30).length)));\n // Header\n console.log(' ' + keys.map((k, i) => k.padEnd(widths[i]!)).join(' '));\n console.log(' ' + widths.map(w => '-'.repeat(w)).join(' '));\n // Rows\n for (const row of result.rows) {\n console.log(' ' + keys.map((k, i) => String(row[k] ?? '').slice(0, 30).padEnd(widths[i]!)).join(' '));\n }\n }\n console.log();\n }\n cg.close();\n });\n\n // \u2500\u2500 aggregate \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\u2500\u2500\u2500\u2500\u2500\n data\n .command('aggregate <dataset>')\n .description('Server-side aggregation (GROUP BY)')\n .requiredOption('--group-by <cols>', 'Comma-separated columns to group by')\n .requiredOption('--metric <expr...>', 'Metrics in format op:column (e.g. sum:amount, avg:price)')\n .option('--filter <expr...>', 'Filters in format column:op:value')\n .option('--json', 'Output as JSON')\n .action(async (dataset: string, opts: { groupBy: string; metric: string[]; filter?: string[]; json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized.'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataQueries } = await Promise.resolve().then(() => require('../../data/queries.js'));\n const dq = new DataQueries(db.getRawDb());\n\n const groupBy = opts.groupBy.split(',').map(c => c.trim());\n const metrics = opts.metric.map(m => {\n const [op, ...colParts] = m.split(':');\n const column = colParts.join(':');\n if (!op || !column) {\n console.error(` \u2716 Invalid metric format: \"${m}\". Expected op:column (e.g. sum:amount)`);\n process.exit(1);\n }\n return { op: op as any, column };\n });\n\n const filters = (opts.filter ?? []).map(f => {\n const parts = f.split(':');\n if (parts.length < 3) { console.error(` \u2716 Invalid filter: \"${f}\"`); process.exit(1); }\n return { column: parts[0]!, op: parts[1]! as any, value: parts.slice(2).join(':') };\n });\n\n const result = dq.aggregate(dataset, { groupBy, metrics, filters });\n if (!result) {\n console.error(` \u2716 Dataset \"${dataset}\" not found.`);\n cg.close(); process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\\n ${dim}${result.rows.length} groups${reset}\\n`);\n if (result.rows.length > 0) {\n const keys = Object.keys(result.rows[0]!);\n const widths = keys.map(k => Math.max(k.length, ...result.rows.map(r => String(r[k] ?? '').slice(0, 20).length)));\n console.log(' ' + keys.map((k, i) => k.padEnd(widths[i]!)).join(' '));\n console.log(' ' + widths.map(w => '-'.repeat(w)).join(' '));\n for (const row of result.rows) {\n console.log(' ' + keys.map((k, i) => String(row[k] ?? '').slice(0, 20).padEnd(widths[i]!)).join(' '));\n }\n }\n console.log();\n }\n cg.close();\n });\n\n // \u2500\u2500 search \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n data\n .command('search <dataset> <query>')\n .description('Search column names and sample values by keyword')\n .option('--json', 'Output as JSON')\n .action(async (dataset: string, query: string, opts: { json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized.'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataQueries } = await Promise.resolve().then(() => require('../../data/queries.js'));\n const dq = new DataQueries(db.getRawDb());\n const results = dq.searchColumns(dataset, query);\n\n if (results.length === 0) {\n console.log(` ${dim}No columns matching \"${query}\" in dataset \"${dataset}\".${reset}`);\n cg.close(); return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(results, null, 2));\n } else {\n console.log(`\\n ${bold}Columns matching \"${query}\"${reset} (${results.length})\\n`);\n for (const col of results) {\n const samples = col.sampleValues.slice(0, 5).join(', ');\n console.log(` ${green}${col.name}${reset} ${dim}(${col.inferredType})${reset}`);\n console.log(` ${dim}Cardinality:${reset} ${col.cardinality} ${dim}Null:${reset} ${col.nullPct.toFixed(1)}%`);\n if (samples) console.log(` ${dim}Samples:${reset} ${samples}`);\n console.log();\n }\n }\n cg.close();\n });\n\n // \u2500\u2500 index \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n data\n .command('index')\n .description('Index all data files (incremental)')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized. Run: kirograph init'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataIndexer } = await Promise.resolve().then(() => require('../../data/indexer.js'));\n const indexer = new DataIndexer(db.getRawDb(), config, cwd);\n const result = await indexer.indexAll({\n onProgress: (msg) => { if (!opts.json) console.log(` ${dim}${msg}${reset}`); },\n });\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\\n ${green}\u2713${reset} Indexed ${bold}${result.datasetsIndexed}${reset} datasets, ${result.rowsIndexed.toLocaleString()} rows, ${result.columnsProfiled} columns (${result.duration}ms)`);\n if (result.errors.length > 0) {\n console.log(` ${dim}Errors (${result.errors.length}):${reset}`);\n for (const err of result.errors.slice(0, 5)) {\n console.log(` \u2716 ${err}`);\n }\n }\n console.log();\n }\n cg.close();\n });\n\n // \u2500\u2500 reindex \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n data\n .command('reindex')\n .description('Force re-index all data files (ignores content hashes)')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized.'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataIndexer } = await Promise.resolve().then(() => require('../../data/indexer.js'));\n const indexer = new DataIndexer(db.getRawDb(), config, cwd);\n const result = await indexer.indexAll({\n force: true,\n onProgress: (msg) => { if (!opts.json) console.log(` ${dim}${msg}${reset}`); },\n });\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\\n ${green}\u2713${reset} Re-indexed ${bold}${result.datasetsIndexed}${reset} datasets, ${result.rowsIndexed.toLocaleString()} rows, ${result.columnsProfiled} columns (${result.duration}ms)`);\n if (result.errors.length > 0) {\n console.log(` ${dim}Errors (${result.errors.length}):${reset}`);\n for (const err of result.errors.slice(0, 5)) {\n console.log(` \u2716 ${err}`);\n }\n }\n console.log();\n }\n cg.close();\n });\n\n // \u2500\u2500 join \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n data\n .command('join <left> <right>')\n .description('SQL JOIN across two indexed datasets')\n .requiredOption('--left-col <col>', 'Join column from left dataset')\n .requiredOption('--right-col <col>', 'Join column from right dataset')\n .option('--type <type>', 'Join type: inner, left, right', 'inner')\n .option('--columns <cols>', 'Comma-separated column projection (prefix with dataset ID)')\n .option('--limit <n>', 'Max rows', '100')\n .option('--json', 'Output as JSON')\n .action(async (left: string, right: string, opts: { leftCol: string; rightCol: string; type?: string; columns?: string; limit?: string; json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized.'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataQueries } = await Promise.resolve().then(() => require('../../data/queries.js'));\n const dq = new DataQueries(db.getRawDb());\n\n try {\n const result = dq.join({\n left,\n right,\n leftColumn: opts.leftCol,\n rightColumn: opts.rightCol,\n type: (opts.type as any) ?? 'inner',\n columns: opts.columns ? opts.columns.split(',').map(c => c.trim()) : undefined,\n limit: parseInt(opts.limit ?? '100', 10),\n });\n\n if (!result) {\n console.error(` \u2716 One or both datasets not found. Run ${violet}${bold}kirograph data list${reset} to see available datasets.`);\n cg.close(); process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\\n ${dim}${opts.type?.toUpperCase() ?? 'INNER'} JOIN: ${left}.${opts.leftCol} = ${right}.${opts.rightCol}${reset}`);\n console.log(` ${dim}Showing ${result.rows.length} of ${result.totalMatching} matching rows${reset}\\n`);\n if (result.rows.length > 0) {\n const keys = Object.keys(result.rows[0]!);\n const widths = keys.map(k => Math.max(k.length, ...result.rows.map(r => String(r[k] ?? '').slice(0, 25).length)));\n console.log(' ' + keys.map((k, i) => k.padEnd(widths[i]!)).join(' '));\n console.log(' ' + widths.map(w => '-'.repeat(w)).join(' '));\n for (const row of result.rows) {\n console.log(' ' + keys.map((k, i) => String(row[k] ?? '').slice(0, 25).padEnd(widths[i]!)).join(' '));\n }\n }\n console.log();\n }\n } catch (err) {\n console.error(` \u2716 ${err instanceof Error ? err.message : String(err)}`);\n cg.close(); process.exit(1);\n }\n cg.close();\n });\n\n // \u2500\u2500 correlations \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\u2500\u2500\n data\n .command('correlations <dataset>')\n .description('Pairwise Pearson correlations between numeric columns')\n .option('--threshold <n>', 'Min absolute correlation to include', '0.3')\n .option('--json', 'Output as JSON')\n .action(async (dataset: string, opts: { threshold?: string; json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized.'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataQueries } = await Promise.resolve().then(() => require('../../data/queries.js'));\n const dq = new DataQueries(db.getRawDb());\n const threshold = parseFloat(opts.threshold ?? '0.3');\n const pairs = dq.correlations(dataset, threshold);\n\n if (pairs === null) {\n console.error(` \u2716 Dataset \"${dataset}\" not found.`);\n cg.close(); process.exit(1);\n }\n\n if (pairs.length === 0) {\n console.log(` ${dim}No correlations above threshold ${threshold}.${reset}`);\n cg.close(); return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(pairs, null, 2));\n } else {\n console.log(`\\n ${bold}Correlations${reset} (threshold: ${threshold}, ${pairs.length} pairs)\\n`);\n for (const p of pairs) {\n const sign = p.correlation > 0 ? '+' : '';\n const bar = '\u2588'.repeat(Math.round(Math.abs(p.correlation) * 10));\n const color = p.strength === 'strong' ? green : dim;\n console.log(` ${color}${bar}${reset} ${sign}${p.correlation.toFixed(4)} ${p.column1} \u2194 ${p.column2} ${dim}(${p.strength})${reset}`);\n }\n console.log();\n }\n cg.close();\n });\n\n // \u2500\u2500 quality \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n data\n .command('quality <dataset>')\n .description('Data quality triage: rank columns by risk')\n .option('--json', 'Output as JSON')\n .action(async (dataset: string, opts: { json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized.'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataQueries } = await Promise.resolve().then(() => require('../../data/queries.js'));\n const dq = new DataQueries(db.getRawDb());\n const quality = dq.quality(dataset);\n\n if (quality === null) {\n console.error(` \u2716 Dataset \"${dataset}\" not found.`);\n cg.close(); process.exit(1);\n }\n\n if (quality.length === 0) {\n console.log(` ${green}\u2713${reset} No quality issues detected. All columns look healthy.`);\n cg.close(); return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(quality, null, 2));\n } else {\n console.log(`\\n ${bold}Quality Report${reset} (${quality.length} columns with issues)\\n`);\n for (const q of quality) {\n const pct = (q.riskScore * 100).toFixed(0);\n const bar = '\u2588'.repeat(Math.round(q.riskScore * 10));\n console.log(` ${bar} ${pct}% ${bold}${q.column}${reset}`);\n for (const issue of q.issues) {\n console.log(` ${dim}\u2022 ${issue}${reset}`);\n }\n }\n console.log();\n }\n cg.close();\n });\n\n // \u2500\u2500 history \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n data\n .command('history <dataset>')\n .description('Show history of schema changes for a dataset')\n .option('--limit <n>', 'Max snapshots to show', '10')\n .option('--json', 'Output as JSON')\n .action(async (dataset: string, opts: { limit?: string; json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized.'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataQueries } = await Promise.resolve().then(() => require('../../data/queries.js'));\n const dq = new DataQueries(db.getRawDb());\n const limit = parseInt(opts.limit ?? '10', 10);\n const history = dq.getHistory(dataset, limit);\n\n if (history === null) {\n console.error(` \u2716 Dataset \"${dataset}\" not found.`);\n cg.close(); process.exit(1);\n }\n\n if (history.length === 0) {\n console.log(` ${dim}No history snapshots for \"${dataset}\".${reset}`);\n cg.close(); return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(history, null, 2));\n } else {\n console.log(`\\n ${bold}Schema History${reset} for ${green}${dataset}${reset} (${history.length} snapshots)\\n`);\n for (const snap of history) {\n const date = new Date(snap.snapshotAt).toISOString().replace('T', ' ').slice(0, 19);\n console.log(` ${bold}${date}${reset}`);\n console.log(` ${dim}Rows:${reset} ${snap.rowCount.toLocaleString()} ${dim}Columns:${reset} ${snap.columnCount} ${dim}Hash:${reset} ${snap.contentHash.slice(0, 12)}\u2026`);\n const colNames = snap.columns.map(c => c.name).join(', ');\n console.log(` ${dim}Schema:${reset} ${colNames}`);\n console.log();\n }\n }\n cg.close();\n });\n\n // \u2500\u2500 drift \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n data\n .command('drift <dataset>')\n .description('Show schema drift between last two indexes')\n .option('--json', 'Output as JSON')\n .action(async (dataset: string, opts: { json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized.'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataQueries } = await Promise.resolve().then(() => require('../../data/queries.js'));\n const dq = new DataQueries(db.getRawDb());\n const drift = dq.detectDrift(dataset);\n\n if (drift === null) {\n console.error(` \u2716 Dataset \"${dataset}\" not found.`);\n cg.close(); process.exit(1);\n }\n\n if (opts.json) {\n console.log(JSON.stringify(drift, null, 2));\n } else {\n if (!drift.hasDrift) {\n console.log(`\\n ${green}\u2713${reset} No schema drift detected for \"${dataset}\".`);\n if (drift.rowCountDelta !== 0) {\n const sign = drift.rowCountDelta > 0 ? '+' : '';\n console.log(` ${dim}Row count change:${reset} ${sign}${drift.rowCountDelta}`);\n }\n } else {\n console.log(`\\n ${bold}Schema Drift${reset} for ${green}${dataset}${reset}\\n`);\n if (drift.addedColumns.length > 0) {\n console.log(` ${green}+ Added columns:${reset} ${drift.addedColumns.join(', ')}`);\n }\n if (drift.removedColumns.length > 0) {\n console.log(` ${value}\u2212 Removed columns:${reset} ${drift.removedColumns.join(', ')}`);\n }\n if (drift.changedColumns.length > 0) {\n console.log(` ${bold}~ Changed columns:${reset}`);\n for (const col of drift.changedColumns) {\n console.log(` ${col.name}: ${col.changes.join(', ')}`);\n }\n }\n if (drift.rowCountDelta !== 0) {\n const sign = drift.rowCountDelta > 0 ? '+' : '';\n console.log(`\\n ${dim}Row count change:${reset} ${sign}${drift.rowCountDelta}`);\n }\n }\n console.log();\n }\n cg.close();\n });\n\n // \u2500\u2500 lint \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n data\n .command('lint')\n .description('Validate data index integrity')\n .option('--json', 'Output as JSON')\n .action(async (opts: { json?: boolean }) => {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n if (!config.enableData) {\n console.error(` \u2716 Data indexing is not enabled. Set ${violet}${bold}enableData: true${reset} in .kirograph/config.json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(cwd)) { console.error(' \u2716 KiroGraph not initialized.'); process.exit(1); }\n const cg = await KiroGraph.open(cwd);\n const db = cg.getDatabase();\n db.applyDataSchema();\n\n const { DataLinter } = await Promise.resolve().then(() => require('../../data/lint.js'));\n const linter = new DataLinter(db.getRawDb(), cwd);\n const result = linter.lint();\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`\\n ${bold}Data Lint${reset} \u2014 ${result.datasetsChecked} datasets checked, ${result.healthy} healthy\\n`);\n if (result.issues.length === 0) {\n console.log(` ${green}\u2713${reset} No issues found. Index is healthy.`);\n } else {\n for (const issue of result.issues) {\n const icon = issue.severity === 'error' ? '\u2716' : issue.severity === 'warning' ? '\u26A0' : '\u2139';\n const prefix = issue.dataset ? `[${issue.dataset}] ` : '';\n console.log(` ${icon} ${prefix}${issue.message}`);\n }\n }\n console.log();\n }\n cg.close();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,119 @@
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 dep_confusion_exports = {};
30
+ __export(dep_confusion_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(dep_confusion_exports);
34
+ var path = __toESM(require("path"));
35
+ var import_config = require("../../config");
36
+ var import_ui = require("../ui");
37
+ const red = "\x1B[31m";
38
+ const yellow = "\x1B[33m";
39
+ function riskColor(level) {
40
+ switch (level) {
41
+ case "critical":
42
+ return red;
43
+ case "high":
44
+ return yellow;
45
+ case "medium":
46
+ return "\x1B[33m";
47
+ default:
48
+ return import_ui.dim;
49
+ }
50
+ }
51
+ function register(program) {
52
+ program.command("dep-confusion [projectPath]").description("Detect dependency confusion: internal packages exposed in public registries, and typosquatting candidates").option("--format <fmt>", "Output format: table | json (default: table)", "table").action(async (projectPath, opts) => {
53
+ const target = path.resolve(projectPath ?? process.cwd());
54
+ const config = await (0, import_config.loadConfig)(target);
55
+ if (!config.enableSecurity) {
56
+ console.error(`
57
+ ${yellow}\u26A0 Security analysis is disabled.${import_ui.reset}`);
58
+ 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}`);
59
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}
60
+ `);
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
+ if (opts.format !== "json") {
72
+ console.error(` ${import_ui.dim}Checking for dependency confusion risks...${import_ui.reset}`);
73
+ }
74
+ const { DepConfusionChecker } = await Promise.resolve().then(() => require("../../security/dep-confusion.js"));
75
+ const checker = new DepConfusionChecker(db);
76
+ const findings = await checker.check();
77
+ if (opts.format === "json") {
78
+ console.log(JSON.stringify(findings, null, 2));
79
+ cg.close();
80
+ return;
81
+ }
82
+ if (findings.length === 0) {
83
+ console.log(`
84
+ ${import_ui.green}\u2713${import_ui.reset} No dependency confusion risks detected.
85
+ `);
86
+ cg.close();
87
+ return;
88
+ }
89
+ console.log(`
90
+ ${import_ui.violet}${import_ui.bold}Dependency Confusion Findings${import_ui.reset}
91
+ `);
92
+ for (const f of findings) {
93
+ const color = riskColor(f.riskLevel);
94
+ console.log(` ${import_ui.violet}${import_ui.bold}${f.packageName}${import_ui.reset} ${import_ui.dim}(${f.ecosystem})${import_ui.reset}`);
95
+ console.log(` Risk: ${color}${import_ui.bold}${f.riskLevel.toUpperCase()}${import_ui.reset} Source: ${import_ui.dim}${f.internalSource}${import_ui.reset}`);
96
+ if (f.publicExists) {
97
+ const ver = f.publicVersion ? ` v${f.publicVersion}` : "";
98
+ console.log(` Public package exists:${ver}`);
99
+ }
100
+ console.log(` ${import_ui.dim}${f.explanation}${import_ui.reset}`);
101
+ console.log();
102
+ }
103
+ const critical = findings.filter((f) => f.riskLevel === "critical").length;
104
+ const high = findings.filter((f) => f.riskLevel === "high").length;
105
+ const medium = findings.filter((f) => f.riskLevel === "medium").length;
106
+ const parts = [];
107
+ if (critical > 0) parts.push(`${red}${import_ui.bold}${critical} critical${import_ui.reset}`);
108
+ if (high > 0) parts.push(`${yellow}${import_ui.bold}${high} high${import_ui.reset}`);
109
+ if (medium > 0) parts.push(`${import_ui.dim}${medium} medium${import_ui.reset}`);
110
+ console.log(` ${import_ui.bold}${findings.length}${import_ui.reset} finding(s): ${parts.join(", ")}
111
+ `);
112
+ cg.close();
113
+ });
114
+ }
115
+ // Annotate the CommonJS export names for ESM import in node:
116
+ 0 && (module.exports = {
117
+ register
118
+ });
119
+ //# sourceMappingURL=dep-confusion.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/dep-confusion.ts"],
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, green } from '../ui';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[33m';\n\nfunction riskColor(level: string): string {\n switch (level) {\n case 'critical': return red;\n case 'high': return yellow;\n case 'medium': return '\\x1b[33m';\n default: return dim;\n }\n}\n\nexport function register(program: Command): void {\n program\n .command('dep-confusion [projectPath]')\n .description('Detect dependency confusion: internal packages exposed in public registries, and typosquatting candidates')\n .option('--format <fmt>', 'Output format: table | json (default: table)', 'table')\n .action(async (projectPath: string | undefined, opts: { format: string }) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const config = await loadConfig(target);\n\n if (!config.enableSecurity) {\n console.error(`\\n ${yellow}\u26A0 Security analysis is disabled.${reset}`);\n console.error(` ${dim}Enable it in .kirograph/config.json:${reset} ${violet}${bold}\"enableSecurity\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(target)) {\n console.error(' \u2716 KiroGraph not initialized. Run: kirograph init');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(target);\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n if (opts.format !== 'json') {\n console.error(` ${dim}Checking for dependency confusion risks...${reset}`);\n }\n\n const { DepConfusionChecker } = await Promise.resolve().then(() => require('../../security/dep-confusion.js'));\n const checker = new DepConfusionChecker(db);\n const findings = await checker.check();\n\n if (opts.format === 'json') {\n console.log(JSON.stringify(findings, null, 2));\n cg.close();\n return;\n }\n\n if (findings.length === 0) {\n console.log(`\\n ${green}\u2713${reset} No dependency confusion risks detected.\\n`);\n cg.close();\n return;\n }\n\n console.log(`\\n ${violet}${bold}Dependency Confusion Findings${reset}\\n`);\n\n for (const f of findings) {\n const color = riskColor(f.riskLevel);\n console.log(` ${violet}${bold}${f.packageName}${reset} ${dim}(${f.ecosystem})${reset}`);\n console.log(` Risk: ${color}${bold}${f.riskLevel.toUpperCase()}${reset} Source: ${dim}${f.internalSource}${reset}`);\n if (f.publicExists) {\n const ver = f.publicVersion ? ` v${f.publicVersion}` : '';\n console.log(` Public package exists:${ver}`);\n }\n console.log(` ${dim}${f.explanation}${reset}`);\n console.log();\n }\n\n const critical = findings.filter(f => f.riskLevel === 'critical').length;\n const high = findings.filter(f => f.riskLevel === 'high').length;\n const medium = findings.filter(f => f.riskLevel === 'medium').length;\n\n const parts: string[] = [];\n if (critical > 0) parts.push(`${red}${bold}${critical} critical${reset}`);\n if (high > 0) parts.push(`${yellow}${bold}${high} high${reset}`);\n if (medium > 0) parts.push(`${dim}${medium} medium${reset}`);\n console.log(` ${bold}${findings.length}${reset} finding(s): ${parts.join(', ')}\\n`);\n\n cg.close();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }