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,665 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var data_exports = {};
20
+ __export(data_exports, {
21
+ register: () => register
22
+ });
23
+ module.exports = __toCommonJS(data_exports);
24
+ var import_config = require("../../config");
25
+ var import_ui = require("../ui");
26
+ function register(program) {
27
+ const data = program.command("data").description("Tabular data navigation (requires enableData: true)");
28
+ data.command("list").description("List all indexed datasets").option("--json", "Output as JSON").action(async (opts) => {
29
+ const cwd = process.cwd();
30
+ const config = await (0, import_config.loadConfig)(cwd);
31
+ if (!config.enableData) {
32
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
33
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}`);
34
+ process.exit(1);
35
+ }
36
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
37
+ if (!KiroGraph.isInitialized(cwd)) {
38
+ console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
39
+ process.exit(1);
40
+ }
41
+ const cg = await KiroGraph.open(cwd);
42
+ const db = cg.getDatabase();
43
+ db.applyDataSchema();
44
+ const { DataQueries } = await Promise.resolve().then(() => require("../../data/queries.js"));
45
+ const dq = new DataQueries(db.getRawDb());
46
+ const datasets = dq.listDatasets();
47
+ if (datasets.length === 0) {
48
+ console.log(` ${import_ui.dim}No datasets indexed.${import_ui.reset} Run ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset} first.`);
49
+ cg.close();
50
+ return;
51
+ }
52
+ if (opts.json) {
53
+ console.log(JSON.stringify(datasets, null, 2));
54
+ } else {
55
+ console.log(`
56
+ ${import_ui.bold}Indexed Datasets${import_ui.reset} (${datasets.length})
57
+ `);
58
+ for (const ds of datasets) {
59
+ const sizeMb = (ds.fileSize / 1024 / 1024).toFixed(2);
60
+ console.log(` ${import_ui.green}${ds.id}${import_ui.reset}`);
61
+ console.log(` ${import_ui.dim}File:${import_ui.reset} ${ds.filePath} ${import_ui.dim}Format:${import_ui.reset} ${ds.format}`);
62
+ console.log(` ${import_ui.dim}Rows:${import_ui.reset} ${ds.rowCount.toLocaleString()} ${import_ui.dim}Columns:${import_ui.reset} ${ds.columnCount} ${import_ui.dim}Size:${import_ui.reset} ${sizeMb} MB`);
63
+ console.log();
64
+ }
65
+ }
66
+ cg.close();
67
+ });
68
+ data.command("describe <dataset>").description("Show schema and column profiles for a dataset").option("--column <name>", "Deep dive on a single column").option("--json", "Output as JSON").action(async (dataset, opts) => {
69
+ const cwd = process.cwd();
70
+ const config = await (0, import_config.loadConfig)(cwd);
71
+ if (!config.enableData) {
72
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
73
+ process.exit(1);
74
+ }
75
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
76
+ if (!KiroGraph.isInitialized(cwd)) {
77
+ console.error(" \u2716 KiroGraph not initialized.");
78
+ process.exit(1);
79
+ }
80
+ const cg = await KiroGraph.open(cwd);
81
+ const db = cg.getDatabase();
82
+ db.applyDataSchema();
83
+ const { DataQueries } = await Promise.resolve().then(() => require("../../data/queries.js"));
84
+ const dq = new DataQueries(db.getRawDb());
85
+ if (opts.column) {
86
+ const col = dq.describeColumn(dataset, opts.column);
87
+ if (!col) {
88
+ console.error(` \u2716 Column "${opts.column}" not found in dataset "${dataset}".`);
89
+ cg.close();
90
+ process.exit(1);
91
+ }
92
+ if (opts.json) {
93
+ console.log(JSON.stringify(col, null, 2));
94
+ } else {
95
+ console.log(`
96
+ ${import_ui.bold}${col.name}${import_ui.reset} ${import_ui.dim}(${col.inferredType})${import_ui.reset}`);
97
+ console.log(` ${import_ui.dim}Position:${import_ui.reset} ${col.position}`);
98
+ console.log(` ${import_ui.dim}Nullable:${import_ui.reset} ${col.nullable ? "yes" : "no"} (${col.nullPct.toFixed(1)}% null, ${col.nullCount} nulls)`);
99
+ console.log(` ${import_ui.dim}Cardinality:${import_ui.reset} ${col.cardinality}`);
100
+ if (col.minValue != null) console.log(` ${import_ui.dim}Min:${import_ui.reset} ${col.minValue}`);
101
+ if (col.maxValue != null) console.log(` ${import_ui.dim}Max:${import_ui.reset} ${col.maxValue}`);
102
+ if (col.meanValue != null) console.log(` ${import_ui.dim}Mean:${import_ui.reset} ${col.meanValue.toFixed(4)}`);
103
+ if (col.sampleValues.length > 0) console.log(` ${import_ui.dim}Samples:${import_ui.reset} ${col.sampleValues.join(", ")}`);
104
+ console.log();
105
+ }
106
+ cg.close();
107
+ return;
108
+ }
109
+ const info = dq.describeDataset(dataset);
110
+ if (!info) {
111
+ console.error(` \u2716 Dataset "${dataset}" not found. Run ${import_ui.violet}${import_ui.bold}kirograph data list${import_ui.reset} to see available datasets.`);
112
+ cg.close();
113
+ process.exit(1);
114
+ }
115
+ if (opts.json) {
116
+ console.log(JSON.stringify(info, null, 2));
117
+ } else {
118
+ const ds = info.dataset;
119
+ const sizeMb = (ds.fileSize / 1024 / 1024).toFixed(2);
120
+ console.log(`
121
+ ${import_ui.bold}${ds.id}${import_ui.reset}`);
122
+ console.log(` ${import_ui.dim}File:${import_ui.reset} ${ds.filePath} ${import_ui.dim}Format:${import_ui.reset} ${ds.format} ${import_ui.dim}Size:${import_ui.reset} ${sizeMb} MB`);
123
+ console.log(` ${import_ui.dim}Rows:${import_ui.reset} ${ds.rowCount.toLocaleString()} ${import_ui.dim}Columns:${import_ui.reset} ${ds.columnCount}`);
124
+ console.log(`
125
+ ${import_ui.bold}Columns:${import_ui.reset}
126
+ `);
127
+ const maxNameLen = Math.max(...info.columns.map((c) => c.name.length), 4);
128
+ console.log(` ${"Name".padEnd(maxNameLen)} ${"Type".padEnd(8)} ${"Null%".padEnd(6)} ${"Card".padEnd(6)} Samples`);
129
+ console.log(` ${"-".repeat(maxNameLen)} ${"-".repeat(8)} ${"-".repeat(6)} ${"-".repeat(6)} -------`);
130
+ for (const col of info.columns) {
131
+ const nullPct = col.nullPct > 0 ? `${col.nullPct.toFixed(1)}%` : "0%";
132
+ const samples = col.sampleValues.slice(0, 3).join(", ");
133
+ console.log(` ${col.name.padEnd(maxNameLen)} ${col.inferredType.padEnd(8)} ${nullPct.padEnd(6)} ${String(col.cardinality).padEnd(6)} ${import_ui.dim}${samples}${import_ui.reset}`);
134
+ }
135
+ console.log();
136
+ }
137
+ cg.close();
138
+ });
139
+ data.command("query <dataset>").description("Query rows with filters").option("--filter <expr...>", "Filters in format column:op:value (e.g. age:gt:18)").option("--columns <cols>", "Comma-separated column names to project").option("--limit <n>", "Max rows to return", "20").option("--offset <n>", "Offset for pagination", "0").option("--json", "Output as JSON").action(async (dataset, opts) => {
140
+ const cwd = process.cwd();
141
+ const config = await (0, import_config.loadConfig)(cwd);
142
+ if (!config.enableData) {
143
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
144
+ process.exit(1);
145
+ }
146
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
147
+ if (!KiroGraph.isInitialized(cwd)) {
148
+ console.error(" \u2716 KiroGraph not initialized.");
149
+ process.exit(1);
150
+ }
151
+ const cg = await KiroGraph.open(cwd);
152
+ const db = cg.getDatabase();
153
+ db.applyDataSchema();
154
+ const { DataQueries } = await Promise.resolve().then(() => require("../../data/queries.js"));
155
+ const dq = new DataQueries(db.getRawDb());
156
+ const filters = (opts.filter ?? []).map((f) => {
157
+ const parts = f.split(":");
158
+ if (parts.length < 3) {
159
+ console.error(` \u2716 Invalid filter format: "${f}". Expected column:op:value`);
160
+ process.exit(1);
161
+ }
162
+ const column = parts[0];
163
+ const op = parts[1];
164
+ const val = parts.slice(2).join(":");
165
+ return { column, op, value: val };
166
+ });
167
+ const columns = opts.columns ? opts.columns.split(",").map((c) => c.trim()) : void 0;
168
+ const limit = parseInt(opts.limit ?? "20", 10);
169
+ const offset = parseInt(opts.offset ?? "0", 10);
170
+ const result = dq.queryRows(dataset, { filters, columns, limit, offset });
171
+ if (!result) {
172
+ console.error(` \u2716 Dataset "${dataset}" not found.`);
173
+ cg.close();
174
+ process.exit(1);
175
+ }
176
+ if (opts.json) {
177
+ console.log(JSON.stringify(result, null, 2));
178
+ } else {
179
+ console.log(`
180
+ ${import_ui.dim}Showing ${result.rows.length} of ${result.totalMatching} matching rows${import_ui.reset}
181
+ `);
182
+ if (result.rows.length > 0) {
183
+ const keys = Object.keys(result.rows[0]).filter((k) => k !== "rowid");
184
+ const widths = keys.map((k) => Math.max(k.length, ...result.rows.map((r) => String(r[k] ?? "").slice(0, 30).length)));
185
+ console.log(" " + keys.map((k, i) => k.padEnd(widths[i])).join(" "));
186
+ console.log(" " + widths.map((w) => "-".repeat(w)).join(" "));
187
+ for (const row of result.rows) {
188
+ console.log(" " + keys.map((k, i) => String(row[k] ?? "").slice(0, 30).padEnd(widths[i])).join(" "));
189
+ }
190
+ }
191
+ console.log();
192
+ }
193
+ cg.close();
194
+ });
195
+ data.command("aggregate <dataset>").description("Server-side aggregation (GROUP BY)").requiredOption("--group-by <cols>", "Comma-separated columns to group by").requiredOption("--metric <expr...>", "Metrics in format op:column (e.g. sum:amount, avg:price)").option("--filter <expr...>", "Filters in format column:op:value").option("--json", "Output as JSON").action(async (dataset, opts) => {
196
+ const cwd = process.cwd();
197
+ const config = await (0, import_config.loadConfig)(cwd);
198
+ if (!config.enableData) {
199
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
200
+ process.exit(1);
201
+ }
202
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
203
+ if (!KiroGraph.isInitialized(cwd)) {
204
+ console.error(" \u2716 KiroGraph not initialized.");
205
+ process.exit(1);
206
+ }
207
+ const cg = await KiroGraph.open(cwd);
208
+ const db = cg.getDatabase();
209
+ db.applyDataSchema();
210
+ const { DataQueries } = await Promise.resolve().then(() => require("../../data/queries.js"));
211
+ const dq = new DataQueries(db.getRawDb());
212
+ const groupBy = opts.groupBy.split(",").map((c) => c.trim());
213
+ const metrics = opts.metric.map((m) => {
214
+ const [op, ...colParts] = m.split(":");
215
+ const column = colParts.join(":");
216
+ if (!op || !column) {
217
+ console.error(` \u2716 Invalid metric format: "${m}". Expected op:column (e.g. sum:amount)`);
218
+ process.exit(1);
219
+ }
220
+ return { op, column };
221
+ });
222
+ const filters = (opts.filter ?? []).map((f) => {
223
+ const parts = f.split(":");
224
+ if (parts.length < 3) {
225
+ console.error(` \u2716 Invalid filter: "${f}"`);
226
+ process.exit(1);
227
+ }
228
+ return { column: parts[0], op: parts[1], value: parts.slice(2).join(":") };
229
+ });
230
+ const result = dq.aggregate(dataset, { groupBy, metrics, filters });
231
+ if (!result) {
232
+ console.error(` \u2716 Dataset "${dataset}" not found.`);
233
+ cg.close();
234
+ process.exit(1);
235
+ }
236
+ if (opts.json) {
237
+ console.log(JSON.stringify(result, null, 2));
238
+ } else {
239
+ console.log(`
240
+ ${import_ui.dim}${result.rows.length} groups${import_ui.reset}
241
+ `);
242
+ if (result.rows.length > 0) {
243
+ const keys = Object.keys(result.rows[0]);
244
+ const widths = keys.map((k) => Math.max(k.length, ...result.rows.map((r) => String(r[k] ?? "").slice(0, 20).length)));
245
+ console.log(" " + keys.map((k, i) => k.padEnd(widths[i])).join(" "));
246
+ console.log(" " + widths.map((w) => "-".repeat(w)).join(" "));
247
+ for (const row of result.rows) {
248
+ console.log(" " + keys.map((k, i) => String(row[k] ?? "").slice(0, 20).padEnd(widths[i])).join(" "));
249
+ }
250
+ }
251
+ console.log();
252
+ }
253
+ cg.close();
254
+ });
255
+ data.command("search <dataset> <query>").description("Search column names and sample values by keyword").option("--json", "Output as JSON").action(async (dataset, query, opts) => {
256
+ const cwd = process.cwd();
257
+ const config = await (0, import_config.loadConfig)(cwd);
258
+ if (!config.enableData) {
259
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
260
+ process.exit(1);
261
+ }
262
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
263
+ if (!KiroGraph.isInitialized(cwd)) {
264
+ console.error(" \u2716 KiroGraph not initialized.");
265
+ process.exit(1);
266
+ }
267
+ const cg = await KiroGraph.open(cwd);
268
+ const db = cg.getDatabase();
269
+ db.applyDataSchema();
270
+ const { DataQueries } = await Promise.resolve().then(() => require("../../data/queries.js"));
271
+ const dq = new DataQueries(db.getRawDb());
272
+ const results = dq.searchColumns(dataset, query);
273
+ if (results.length === 0) {
274
+ console.log(` ${import_ui.dim}No columns matching "${query}" in dataset "${dataset}".${import_ui.reset}`);
275
+ cg.close();
276
+ return;
277
+ }
278
+ if (opts.json) {
279
+ console.log(JSON.stringify(results, null, 2));
280
+ } else {
281
+ console.log(`
282
+ ${import_ui.bold}Columns matching "${query}"${import_ui.reset} (${results.length})
283
+ `);
284
+ for (const col of results) {
285
+ const samples = col.sampleValues.slice(0, 5).join(", ");
286
+ console.log(` ${import_ui.green}${col.name}${import_ui.reset} ${import_ui.dim}(${col.inferredType})${import_ui.reset}`);
287
+ console.log(` ${import_ui.dim}Cardinality:${import_ui.reset} ${col.cardinality} ${import_ui.dim}Null:${import_ui.reset} ${col.nullPct.toFixed(1)}%`);
288
+ if (samples) console.log(` ${import_ui.dim}Samples:${import_ui.reset} ${samples}`);
289
+ console.log();
290
+ }
291
+ }
292
+ cg.close();
293
+ });
294
+ data.command("index").description("Index all data files (incremental)").option("--json", "Output as JSON").action(async (opts) => {
295
+ const cwd = process.cwd();
296
+ const config = await (0, import_config.loadConfig)(cwd);
297
+ if (!config.enableData) {
298
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
299
+ console.error(` ${import_ui.dim}Then re-run:${import_ui.reset} ${import_ui.violet}${import_ui.bold}kirograph index${import_ui.reset}`);
300
+ process.exit(1);
301
+ }
302
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
303
+ if (!KiroGraph.isInitialized(cwd)) {
304
+ console.error(" \u2716 KiroGraph not initialized. Run: kirograph init");
305
+ process.exit(1);
306
+ }
307
+ const cg = await KiroGraph.open(cwd);
308
+ const db = cg.getDatabase();
309
+ db.applyDataSchema();
310
+ const { DataIndexer } = await Promise.resolve().then(() => require("../../data/indexer.js"));
311
+ const indexer = new DataIndexer(db.getRawDb(), config, cwd);
312
+ const result = await indexer.indexAll({
313
+ onProgress: (msg) => {
314
+ if (!opts.json) console.log(` ${import_ui.dim}${msg}${import_ui.reset}`);
315
+ }
316
+ });
317
+ if (opts.json) {
318
+ console.log(JSON.stringify(result, null, 2));
319
+ } else {
320
+ console.log(`
321
+ ${import_ui.green}\u2713${import_ui.reset} Indexed ${import_ui.bold}${result.datasetsIndexed}${import_ui.reset} datasets, ${result.rowsIndexed.toLocaleString()} rows, ${result.columnsProfiled} columns (${result.duration}ms)`);
322
+ if (result.errors.length > 0) {
323
+ console.log(` ${import_ui.dim}Errors (${result.errors.length}):${import_ui.reset}`);
324
+ for (const err of result.errors.slice(0, 5)) {
325
+ console.log(` \u2716 ${err}`);
326
+ }
327
+ }
328
+ console.log();
329
+ }
330
+ cg.close();
331
+ });
332
+ data.command("reindex").description("Force re-index all data files (ignores content hashes)").option("--json", "Output as JSON").action(async (opts) => {
333
+ const cwd = process.cwd();
334
+ const config = await (0, import_config.loadConfig)(cwd);
335
+ if (!config.enableData) {
336
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
337
+ process.exit(1);
338
+ }
339
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
340
+ if (!KiroGraph.isInitialized(cwd)) {
341
+ console.error(" \u2716 KiroGraph not initialized.");
342
+ process.exit(1);
343
+ }
344
+ const cg = await KiroGraph.open(cwd);
345
+ const db = cg.getDatabase();
346
+ db.applyDataSchema();
347
+ const { DataIndexer } = await Promise.resolve().then(() => require("../../data/indexer.js"));
348
+ const indexer = new DataIndexer(db.getRawDb(), config, cwd);
349
+ const result = await indexer.indexAll({
350
+ force: true,
351
+ onProgress: (msg) => {
352
+ if (!opts.json) console.log(` ${import_ui.dim}${msg}${import_ui.reset}`);
353
+ }
354
+ });
355
+ if (opts.json) {
356
+ console.log(JSON.stringify(result, null, 2));
357
+ } else {
358
+ console.log(`
359
+ ${import_ui.green}\u2713${import_ui.reset} Re-indexed ${import_ui.bold}${result.datasetsIndexed}${import_ui.reset} datasets, ${result.rowsIndexed.toLocaleString()} rows, ${result.columnsProfiled} columns (${result.duration}ms)`);
360
+ if (result.errors.length > 0) {
361
+ console.log(` ${import_ui.dim}Errors (${result.errors.length}):${import_ui.reset}`);
362
+ for (const err of result.errors.slice(0, 5)) {
363
+ console.log(` \u2716 ${err}`);
364
+ }
365
+ }
366
+ console.log();
367
+ }
368
+ cg.close();
369
+ });
370
+ data.command("join <left> <right>").description("SQL JOIN across two indexed datasets").requiredOption("--left-col <col>", "Join column from left dataset").requiredOption("--right-col <col>", "Join column from right dataset").option("--type <type>", "Join type: inner, left, right", "inner").option("--columns <cols>", "Comma-separated column projection (prefix with dataset ID)").option("--limit <n>", "Max rows", "100").option("--json", "Output as JSON").action(async (left, right, opts) => {
371
+ const cwd = process.cwd();
372
+ const config = await (0, import_config.loadConfig)(cwd);
373
+ if (!config.enableData) {
374
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
375
+ process.exit(1);
376
+ }
377
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
378
+ if (!KiroGraph.isInitialized(cwd)) {
379
+ console.error(" \u2716 KiroGraph not initialized.");
380
+ process.exit(1);
381
+ }
382
+ const cg = await KiroGraph.open(cwd);
383
+ const db = cg.getDatabase();
384
+ db.applyDataSchema();
385
+ const { DataQueries } = await Promise.resolve().then(() => require("../../data/queries.js"));
386
+ const dq = new DataQueries(db.getRawDb());
387
+ try {
388
+ const result = dq.join({
389
+ left,
390
+ right,
391
+ leftColumn: opts.leftCol,
392
+ rightColumn: opts.rightCol,
393
+ type: opts.type ?? "inner",
394
+ columns: opts.columns ? opts.columns.split(",").map((c) => c.trim()) : void 0,
395
+ limit: parseInt(opts.limit ?? "100", 10)
396
+ });
397
+ if (!result) {
398
+ console.error(` \u2716 One or both datasets not found. Run ${import_ui.violet}${import_ui.bold}kirograph data list${import_ui.reset} to see available datasets.`);
399
+ cg.close();
400
+ process.exit(1);
401
+ }
402
+ if (opts.json) {
403
+ console.log(JSON.stringify(result, null, 2));
404
+ } else {
405
+ console.log(`
406
+ ${import_ui.dim}${opts.type?.toUpperCase() ?? "INNER"} JOIN: ${left}.${opts.leftCol} = ${right}.${opts.rightCol}${import_ui.reset}`);
407
+ console.log(` ${import_ui.dim}Showing ${result.rows.length} of ${result.totalMatching} matching rows${import_ui.reset}
408
+ `);
409
+ if (result.rows.length > 0) {
410
+ const keys = Object.keys(result.rows[0]);
411
+ const widths = keys.map((k) => Math.max(k.length, ...result.rows.map((r) => String(r[k] ?? "").slice(0, 25).length)));
412
+ console.log(" " + keys.map((k, i) => k.padEnd(widths[i])).join(" "));
413
+ console.log(" " + widths.map((w) => "-".repeat(w)).join(" "));
414
+ for (const row of result.rows) {
415
+ console.log(" " + keys.map((k, i) => String(row[k] ?? "").slice(0, 25).padEnd(widths[i])).join(" "));
416
+ }
417
+ }
418
+ console.log();
419
+ }
420
+ } catch (err) {
421
+ console.error(` \u2716 ${err instanceof Error ? err.message : String(err)}`);
422
+ cg.close();
423
+ process.exit(1);
424
+ }
425
+ cg.close();
426
+ });
427
+ data.command("correlations <dataset>").description("Pairwise Pearson correlations between numeric columns").option("--threshold <n>", "Min absolute correlation to include", "0.3").option("--json", "Output as JSON").action(async (dataset, opts) => {
428
+ const cwd = process.cwd();
429
+ const config = await (0, import_config.loadConfig)(cwd);
430
+ if (!config.enableData) {
431
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
432
+ process.exit(1);
433
+ }
434
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
435
+ if (!KiroGraph.isInitialized(cwd)) {
436
+ console.error(" \u2716 KiroGraph not initialized.");
437
+ process.exit(1);
438
+ }
439
+ const cg = await KiroGraph.open(cwd);
440
+ const db = cg.getDatabase();
441
+ db.applyDataSchema();
442
+ const { DataQueries } = await Promise.resolve().then(() => require("../../data/queries.js"));
443
+ const dq = new DataQueries(db.getRawDb());
444
+ const threshold = parseFloat(opts.threshold ?? "0.3");
445
+ const pairs = dq.correlations(dataset, threshold);
446
+ if (pairs === null) {
447
+ console.error(` \u2716 Dataset "${dataset}" not found.`);
448
+ cg.close();
449
+ process.exit(1);
450
+ }
451
+ if (pairs.length === 0) {
452
+ console.log(` ${import_ui.dim}No correlations above threshold ${threshold}.${import_ui.reset}`);
453
+ cg.close();
454
+ return;
455
+ }
456
+ if (opts.json) {
457
+ console.log(JSON.stringify(pairs, null, 2));
458
+ } else {
459
+ console.log(`
460
+ ${import_ui.bold}Correlations${import_ui.reset} (threshold: ${threshold}, ${pairs.length} pairs)
461
+ `);
462
+ for (const p of pairs) {
463
+ const sign = p.correlation > 0 ? "+" : "";
464
+ const bar = "\u2588".repeat(Math.round(Math.abs(p.correlation) * 10));
465
+ const color = p.strength === "strong" ? import_ui.green : import_ui.dim;
466
+ console.log(` ${color}${bar}${import_ui.reset} ${sign}${p.correlation.toFixed(4)} ${p.column1} \u2194 ${p.column2} ${import_ui.dim}(${p.strength})${import_ui.reset}`);
467
+ }
468
+ console.log();
469
+ }
470
+ cg.close();
471
+ });
472
+ data.command("quality <dataset>").description("Data quality triage: rank columns by risk").option("--json", "Output as JSON").action(async (dataset, opts) => {
473
+ const cwd = process.cwd();
474
+ const config = await (0, import_config.loadConfig)(cwd);
475
+ if (!config.enableData) {
476
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
477
+ process.exit(1);
478
+ }
479
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
480
+ if (!KiroGraph.isInitialized(cwd)) {
481
+ console.error(" \u2716 KiroGraph not initialized.");
482
+ process.exit(1);
483
+ }
484
+ const cg = await KiroGraph.open(cwd);
485
+ const db = cg.getDatabase();
486
+ db.applyDataSchema();
487
+ const { DataQueries } = await Promise.resolve().then(() => require("../../data/queries.js"));
488
+ const dq = new DataQueries(db.getRawDb());
489
+ const quality = dq.quality(dataset);
490
+ if (quality === null) {
491
+ console.error(` \u2716 Dataset "${dataset}" not found.`);
492
+ cg.close();
493
+ process.exit(1);
494
+ }
495
+ if (quality.length === 0) {
496
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} No quality issues detected. All columns look healthy.`);
497
+ cg.close();
498
+ return;
499
+ }
500
+ if (opts.json) {
501
+ console.log(JSON.stringify(quality, null, 2));
502
+ } else {
503
+ console.log(`
504
+ ${import_ui.bold}Quality Report${import_ui.reset} (${quality.length} columns with issues)
505
+ `);
506
+ for (const q of quality) {
507
+ const pct = (q.riskScore * 100).toFixed(0);
508
+ const bar = "\u2588".repeat(Math.round(q.riskScore * 10));
509
+ console.log(` ${bar} ${pct}% ${import_ui.bold}${q.column}${import_ui.reset}`);
510
+ for (const issue of q.issues) {
511
+ console.log(` ${import_ui.dim}\u2022 ${issue}${import_ui.reset}`);
512
+ }
513
+ }
514
+ console.log();
515
+ }
516
+ cg.close();
517
+ });
518
+ data.command("history <dataset>").description("Show history of schema changes for a dataset").option("--limit <n>", "Max snapshots to show", "10").option("--json", "Output as JSON").action(async (dataset, opts) => {
519
+ const cwd = process.cwd();
520
+ const config = await (0, import_config.loadConfig)(cwd);
521
+ if (!config.enableData) {
522
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
523
+ process.exit(1);
524
+ }
525
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
526
+ if (!KiroGraph.isInitialized(cwd)) {
527
+ console.error(" \u2716 KiroGraph not initialized.");
528
+ process.exit(1);
529
+ }
530
+ const cg = await KiroGraph.open(cwd);
531
+ const db = cg.getDatabase();
532
+ db.applyDataSchema();
533
+ const { DataQueries } = await Promise.resolve().then(() => require("../../data/queries.js"));
534
+ const dq = new DataQueries(db.getRawDb());
535
+ const limit = parseInt(opts.limit ?? "10", 10);
536
+ const history = dq.getHistory(dataset, limit);
537
+ if (history === null) {
538
+ console.error(` \u2716 Dataset "${dataset}" not found.`);
539
+ cg.close();
540
+ process.exit(1);
541
+ }
542
+ if (history.length === 0) {
543
+ console.log(` ${import_ui.dim}No history snapshots for "${dataset}".${import_ui.reset}`);
544
+ cg.close();
545
+ return;
546
+ }
547
+ if (opts.json) {
548
+ console.log(JSON.stringify(history, null, 2));
549
+ } else {
550
+ console.log(`
551
+ ${import_ui.bold}Schema History${import_ui.reset} for ${import_ui.green}${dataset}${import_ui.reset} (${history.length} snapshots)
552
+ `);
553
+ for (const snap of history) {
554
+ const date = new Date(snap.snapshotAt).toISOString().replace("T", " ").slice(0, 19);
555
+ console.log(` ${import_ui.bold}${date}${import_ui.reset}`);
556
+ console.log(` ${import_ui.dim}Rows:${import_ui.reset} ${snap.rowCount.toLocaleString()} ${import_ui.dim}Columns:${import_ui.reset} ${snap.columnCount} ${import_ui.dim}Hash:${import_ui.reset} ${snap.contentHash.slice(0, 12)}\u2026`);
557
+ const colNames = snap.columns.map((c) => c.name).join(", ");
558
+ console.log(` ${import_ui.dim}Schema:${import_ui.reset} ${colNames}`);
559
+ console.log();
560
+ }
561
+ }
562
+ cg.close();
563
+ });
564
+ data.command("drift <dataset>").description("Show schema drift between last two indexes").option("--json", "Output as JSON").action(async (dataset, opts) => {
565
+ const cwd = process.cwd();
566
+ const config = await (0, import_config.loadConfig)(cwd);
567
+ if (!config.enableData) {
568
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
569
+ process.exit(1);
570
+ }
571
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
572
+ if (!KiroGraph.isInitialized(cwd)) {
573
+ console.error(" \u2716 KiroGraph not initialized.");
574
+ process.exit(1);
575
+ }
576
+ const cg = await KiroGraph.open(cwd);
577
+ const db = cg.getDatabase();
578
+ db.applyDataSchema();
579
+ const { DataQueries } = await Promise.resolve().then(() => require("../../data/queries.js"));
580
+ const dq = new DataQueries(db.getRawDb());
581
+ const drift = dq.detectDrift(dataset);
582
+ if (drift === null) {
583
+ console.error(` \u2716 Dataset "${dataset}" not found.`);
584
+ cg.close();
585
+ process.exit(1);
586
+ }
587
+ if (opts.json) {
588
+ console.log(JSON.stringify(drift, null, 2));
589
+ } else {
590
+ if (!drift.hasDrift) {
591
+ console.log(`
592
+ ${import_ui.green}\u2713${import_ui.reset} No schema drift detected for "${dataset}".`);
593
+ if (drift.rowCountDelta !== 0) {
594
+ const sign = drift.rowCountDelta > 0 ? "+" : "";
595
+ console.log(` ${import_ui.dim}Row count change:${import_ui.reset} ${sign}${drift.rowCountDelta}`);
596
+ }
597
+ } else {
598
+ console.log(`
599
+ ${import_ui.bold}Schema Drift${import_ui.reset} for ${import_ui.green}${dataset}${import_ui.reset}
600
+ `);
601
+ if (drift.addedColumns.length > 0) {
602
+ console.log(` ${import_ui.green}+ Added columns:${import_ui.reset} ${drift.addedColumns.join(", ")}`);
603
+ }
604
+ if (drift.removedColumns.length > 0) {
605
+ console.log(` ${import_ui.value}\u2212 Removed columns:${import_ui.reset} ${drift.removedColumns.join(", ")}`);
606
+ }
607
+ if (drift.changedColumns.length > 0) {
608
+ console.log(` ${import_ui.bold}~ Changed columns:${import_ui.reset}`);
609
+ for (const col of drift.changedColumns) {
610
+ console.log(` ${col.name}: ${col.changes.join(", ")}`);
611
+ }
612
+ }
613
+ if (drift.rowCountDelta !== 0) {
614
+ const sign = drift.rowCountDelta > 0 ? "+" : "";
615
+ console.log(`
616
+ ${import_ui.dim}Row count change:${import_ui.reset} ${sign}${drift.rowCountDelta}`);
617
+ }
618
+ }
619
+ console.log();
620
+ }
621
+ cg.close();
622
+ });
623
+ data.command("lint").description("Validate data index integrity").option("--json", "Output as JSON").action(async (opts) => {
624
+ const cwd = process.cwd();
625
+ const config = await (0, import_config.loadConfig)(cwd);
626
+ if (!config.enableData) {
627
+ console.error(` \u2716 Data indexing is not enabled. Set ${import_ui.violet}${import_ui.bold}enableData: true${import_ui.reset} in .kirograph/config.json`);
628
+ process.exit(1);
629
+ }
630
+ const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
631
+ if (!KiroGraph.isInitialized(cwd)) {
632
+ console.error(" \u2716 KiroGraph not initialized.");
633
+ process.exit(1);
634
+ }
635
+ const cg = await KiroGraph.open(cwd);
636
+ const db = cg.getDatabase();
637
+ db.applyDataSchema();
638
+ const { DataLinter } = await Promise.resolve().then(() => require("../../data/lint.js"));
639
+ const linter = new DataLinter(db.getRawDb(), cwd);
640
+ const result = linter.lint();
641
+ if (opts.json) {
642
+ console.log(JSON.stringify(result, null, 2));
643
+ } else {
644
+ console.log(`
645
+ ${import_ui.bold}Data Lint${import_ui.reset} \u2014 ${result.datasetsChecked} datasets checked, ${result.healthy} healthy
646
+ `);
647
+ if (result.issues.length === 0) {
648
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} No issues found. Index is healthy.`);
649
+ } else {
650
+ for (const issue of result.issues) {
651
+ const icon = issue.severity === "error" ? "\u2716" : issue.severity === "warning" ? "\u26A0" : "\u2139";
652
+ const prefix = issue.dataset ? `[${issue.dataset}] ` : "";
653
+ console.log(` ${icon} ${prefix}${issue.message}`);
654
+ }
655
+ }
656
+ console.log();
657
+ }
658
+ cg.close();
659
+ });
660
+ }
661
+ // Annotate the CommonJS export names for ESM import in node:
662
+ 0 && (module.exports = {
663
+ register
664
+ });
665
+ //# sourceMappingURL=data.js.map