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.
- package/LICENSE +1 -1
- package/README.md +103 -1605
- package/dist/architecture/layers/dart.js +112 -0
- package/dist/architecture/layers/dart.js.map +7 -0
- package/dist/architecture/layers/index.js +3 -1
- package/dist/architecture/layers/index.js.map +2 -2
- package/dist/bin/banner.js +74 -6
- package/dist/bin/banner.js.map +2 -2
- package/dist/bin/commands/affected.js +40 -5
- package/dist/bin/commands/affected.js.map +2 -2
- package/dist/bin/commands/attack-surface.js +157 -0
- package/dist/bin/commands/attack-surface.js.map +7 -0
- package/dist/bin/commands/benchmark.js +206 -0
- package/dist/bin/commands/benchmark.js.map +7 -0
- package/dist/bin/commands/budget.js +70 -0
- package/dist/bin/commands/budget.js.map +7 -0
- package/dist/bin/commands/communities.js +77 -0
- package/dist/bin/commands/communities.js.map +7 -0
- package/dist/bin/commands/data.js +665 -0
- package/dist/bin/commands/data.js.map +7 -0
- package/dist/bin/commands/dep-confusion.js +119 -0
- package/dist/bin/commands/dep-confusion.js.map +7 -0
- package/dist/bin/commands/export.js +304 -10
- package/dist/bin/commands/export.js.map +2 -2
- package/dist/bin/commands/flows.js +97 -0
- package/dist/bin/commands/flows.js.map +7 -0
- package/dist/bin/commands/help.js +386 -100
- package/dist/bin/commands/help.js.map +2 -2
- package/dist/bin/commands/install.js +90 -8
- package/dist/bin/commands/install.js.map +2 -2
- package/dist/bin/commands/licenses.js +201 -0
- package/dist/bin/commands/licenses.js.map +7 -0
- package/dist/bin/commands/reachability.js +160 -0
- package/dist/bin/commands/reachability.js.map +7 -0
- package/dist/bin/commands/read.js +100 -0
- package/dist/bin/commands/read.js.map +7 -0
- package/dist/bin/commands/refactor.js +116 -0
- package/dist/bin/commands/refactor.js.map +7 -0
- package/dist/bin/commands/remediation.js +133 -0
- package/dist/bin/commands/remediation.js.map +7 -0
- package/dist/bin/commands/sbom.js +76 -0
- package/dist/bin/commands/sbom.js.map +7 -0
- package/dist/bin/commands/security-ci-report.js +267 -0
- package/dist/bin/commands/security-ci-report.js.map +7 -0
- package/dist/bin/commands/security-export.js +1349 -0
- package/dist/bin/commands/security-export.js.map +7 -0
- package/dist/bin/commands/security-flows.js +126 -0
- package/dist/bin/commands/security-flows.js.map +7 -0
- package/dist/bin/commands/security-secrets.js +170 -0
- package/dist/bin/commands/security-secrets.js.map +7 -0
- package/dist/bin/commands/security.js +193 -0
- package/dist/bin/commands/security.js.map +7 -0
- package/dist/bin/commands/staleness.js +144 -0
- package/dist/bin/commands/staleness.js.map +7 -0
- package/dist/bin/commands/status.js +102 -2
- package/dist/bin/commands/status.js.map +2 -2
- package/dist/bin/commands/supply-chain.js +138 -0
- package/dist/bin/commands/supply-chain.js.map +7 -0
- package/dist/bin/commands/uninit.js +109 -60
- package/dist/bin/commands/uninit.js.map +2 -2
- package/dist/bin/commands/vex.js +76 -0
- package/dist/bin/commands/vex.js.map +7 -0
- package/dist/bin/commands/vuln-suppress.js +95 -0
- package/dist/bin/commands/vuln-suppress.js.map +7 -0
- package/dist/bin/commands/vulns.js +382 -0
- package/dist/bin/commands/vulns.js.map +7 -0
- package/dist/bin/installer/auto-detect.js +125 -0
- package/dist/bin/installer/auto-detect.js.map +7 -0
- package/dist/bin/installer/cli-agent.js +28 -5
- package/dist/bin/installer/cli-agent.js.map +2 -2
- package/dist/bin/installer/common.js +47 -0
- package/dist/bin/installer/common.js.map +2 -2
- package/dist/bin/installer/config-prompt.js +39 -1
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/detect.js +309 -0
- package/dist/bin/installer/detect.js.map +7 -0
- package/dist/bin/installer/index.js +36 -1
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/installer/instructions.js +195 -3
- package/dist/bin/installer/instructions.js.map +2 -2
- package/dist/bin/installer/steering.js +440 -0
- package/dist/bin/installer/steering.js.map +2 -2
- package/dist/bin/installer/targets/aider.js +3 -3
- package/dist/bin/installer/targets/aider.js.map +2 -2
- package/dist/bin/installer/targets/amp.js +3 -3
- package/dist/bin/installer/targets/amp.js.map +2 -2
- package/dist/bin/installer/targets/antigravity.js +35 -6
- package/dist/bin/installer/targets/antigravity.js.map +2 -2
- package/dist/bin/installer/targets/augment.js +3 -3
- package/dist/bin/installer/targets/augment.js.map +2 -2
- package/dist/bin/installer/targets/claude.js +49 -5
- package/dist/bin/installer/targets/claude.js.map +2 -2
- package/dist/bin/installer/targets/cline.js +32 -6
- package/dist/bin/installer/targets/cline.js.map +2 -2
- package/dist/bin/installer/targets/codex.js +64 -12
- package/dist/bin/installer/targets/codex.js.map +2 -2
- package/dist/bin/installer/targets/continue.js +2 -2
- package/dist/bin/installer/targets/continue.js.map +2 -2
- package/dist/bin/installer/targets/copilot-cli.js +101 -0
- package/dist/bin/installer/targets/copilot-cli.js.map +7 -0
- package/dist/bin/installer/targets/copilot.js +31 -5
- package/dist/bin/installer/targets/copilot.js.map +2 -2
- package/dist/bin/installer/targets/cursor.js +4 -4
- package/dist/bin/installer/targets/cursor.js.map +2 -2
- package/dist/bin/installer/targets/devin.js +2 -2
- package/dist/bin/installer/targets/devin.js.map +2 -2
- package/dist/bin/installer/targets/gemini-cli.js +2 -2
- package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
- package/dist/bin/installer/targets/generic.js +2 -14
- package/dist/bin/installer/targets/generic.js.map +2 -2
- package/dist/bin/installer/targets/goose.js +3 -3
- package/dist/bin/installer/targets/goose.js.map +2 -2
- package/dist/bin/installer/targets/index.js +250 -0
- package/dist/bin/installer/targets/index.js.map +2 -2
- package/dist/bin/installer/targets/junie.js +2 -2
- package/dist/bin/installer/targets/junie.js.map +2 -2
- package/dist/bin/installer/targets/kilo.js +2 -2
- package/dist/bin/installer/targets/kilo.js.map +2 -2
- package/dist/bin/installer/targets/kiro.js +3 -3
- package/dist/bin/installer/targets/kiro.js.map +2 -2
- package/dist/bin/installer/targets/opencode.js +2 -2
- package/dist/bin/installer/targets/opencode.js.map +2 -2
- package/dist/bin/installer/targets/openhands.js +3 -3
- package/dist/bin/installer/targets/openhands.js.map +2 -2
- package/dist/bin/installer/targets/qoder.js +91 -0
- package/dist/bin/installer/targets/qoder.js.map +7 -0
- package/dist/bin/installer/targets/qwen.js +96 -0
- package/dist/bin/installer/targets/qwen.js.map +7 -0
- package/dist/bin/installer/targets/replit.js +3 -3
- package/dist/bin/installer/targets/replit.js.map +2 -2
- package/dist/bin/installer/targets/roo.js +2 -2
- package/dist/bin/installer/targets/roo.js.map +2 -2
- package/dist/bin/installer/targets/tabnine.js +3 -3
- package/dist/bin/installer/targets/tabnine.js.map +2 -2
- package/dist/bin/installer/targets/trae.js +5 -5
- package/dist/bin/installer/targets/trae.js.map +2 -2
- package/dist/bin/installer/targets/warp.js +2 -2
- package/dist/bin/installer/targets/warp.js.map +2 -2
- package/dist/bin/installer/targets/windsurf.js +35 -6
- package/dist/bin/installer/targets/windsurf.js.map +2 -2
- package/dist/bin/kirograph.js +74 -6
- package/dist/bin/kirograph.js.map +3 -3
- package/dist/bin/progress.js +30 -0
- package/dist/bin/progress.js.map +2 -2
- package/dist/compression/naive-cost.js +25 -0
- package/dist/compression/naive-cost.js.map +2 -2
- package/dist/compression/tracker.js +91 -2
- package/dist/compression/tracker.js.map +2 -2
- package/dist/compression/types.js.map +1 -1
- package/dist/config.js +126 -3
- package/dist/config.js.map +2 -2
- package/dist/core/pipeline.js +92 -4
- package/dist/core/pipeline.js.map +2 -2
- package/dist/data/filters.js +105 -0
- package/dist/data/filters.js.map +7 -0
- package/dist/data/indexer.js +225 -0
- package/dist/data/indexer.js.map +7 -0
- package/dist/data/linker.js +150 -0
- package/dist/data/linker.js.map +7 -0
- package/dist/data/lint.js +109 -0
- package/dist/data/lint.js.map +7 -0
- package/dist/data/parsers/csv.js +132 -0
- package/dist/data/parsers/csv.js.map +7 -0
- package/dist/data/parsers/excel.js +88 -0
- package/dist/data/parsers/excel.js.map +7 -0
- package/dist/data/parsers/index.js +79 -0
- package/dist/data/parsers/index.js.map +7 -0
- package/dist/data/parsers/json-array.js +89 -0
- package/dist/data/parsers/json-array.js.map +7 -0
- package/dist/data/parsers/jsonl.js +84 -0
- package/dist/data/parsers/jsonl.js.map +7 -0
- package/dist/data/parsers/parquet.js +95 -0
- package/dist/data/parsers/parquet.js.map +7 -0
- package/dist/data/profiler.js +182 -0
- package/dist/data/profiler.js.map +7 -0
- package/dist/data/queries.js +512 -0
- package/dist/data/queries.js.map +7 -0
- package/dist/data/types.js +17 -0
- package/dist/data/types.js.map +7 -0
- package/dist/db/data-schema.sql +61 -0
- package/dist/db/database.js +67 -5
- package/dist/db/database.js.map +2 -2
- package/dist/db/memory-schema.sql +5 -1
- package/dist/db/schema.sql +3 -1
- package/dist/db/security-schema.sql +72 -0
- package/dist/extraction/extractor.js +81 -0
- package/dist/extraction/extractor.js.map +2 -2
- package/dist/extraction/grammars.js +32 -8
- package/dist/extraction/grammars.js.map +2 -2
- package/dist/extraction/languages.js +43 -1
- package/dist/extraction/languages.js.map +2 -2
- package/dist/extraction/notebook.js +300 -0
- package/dist/extraction/notebook.js.map +7 -0
- package/dist/extraction/wasm/tree-sitter-astro.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-gdscript.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-julia.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-perl.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-powershell.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-r.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-sql.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-verilog.wasm +0 -0
- package/dist/frameworks/flutter.js +130 -0
- package/dist/frameworks/flutter.js.map +7 -0
- package/dist/frameworks/index.js +7 -1
- package/dist/frameworks/index.js.map +3 -3
- package/dist/graph/communities.js +317 -0
- package/dist/graph/communities.js.map +7 -0
- package/dist/graph/flows.js +138 -0
- package/dist/graph/flows.js.map +7 -0
- package/dist/graph/refactor.js +155 -0
- package/dist/graph/refactor.js.map +7 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/mcp/cache.js +172 -0
- package/dist/mcp/cache.js.map +7 -0
- package/dist/mcp/read-modes.js +295 -0
- package/dist/mcp/read-modes.js.map +7 -0
- package/dist/mcp/server.js +2 -1
- package/dist/mcp/server.js.map +2 -2
- package/dist/mcp/tool-names.js +29 -1
- package/dist/mcp/tool-names.js.map +2 -2
- package/dist/mcp/tools.js +1588 -6
- package/dist/mcp/tools.js.map +3 -3
- package/dist/memory/database.js +32 -2
- package/dist/memory/database.js.map +2 -2
- package/dist/memory/types.js.map +1 -1
- package/dist/resolution/bridges/android-rn.js +298 -0
- package/dist/resolution/bridges/android-rn.js.map +7 -0
- package/dist/resolution/bridges/expo-modules.js +155 -0
- package/dist/resolution/bridges/expo-modules.js.map +7 -0
- package/dist/resolution/bridges/flutter-channel.js +385 -0
- package/dist/resolution/bridges/flutter-channel.js.map +7 -0
- package/dist/resolution/bridges/index.js +80 -0
- package/dist/resolution/bridges/index.js.map +7 -0
- package/dist/resolution/bridges/native-events.js +188 -0
- package/dist/resolution/bridges/native-events.js.map +7 -0
- package/dist/resolution/bridges/native-views.js +244 -0
- package/dist/resolution/bridges/native-views.js.map +7 -0
- package/dist/resolution/bridges/react-native.js +161 -0
- package/dist/resolution/bridges/react-native.js.map +7 -0
- package/dist/resolution/bridges/swift-objc.js +227 -0
- package/dist/resolution/bridges/swift-objc.js.map +7 -0
- package/dist/resolution/bridges/turbomodules.js +216 -0
- package/dist/resolution/bridges/turbomodules.js.map +7 -0
- package/dist/resolution/index.js +61 -2
- package/dist/resolution/index.js.map +2 -2
- package/dist/security/attack-surface.js +164 -0
- package/dist/security/attack-surface.js.map +7 -0
- package/dist/security/context-warnings.js +123 -0
- package/dist/security/context-warnings.js.map +7 -0
- package/dist/security/context-warnings.test.js +300 -0
- package/dist/security/context-warnings.test.js.map +7 -0
- package/dist/security/data-flows.js +228 -0
- package/dist/security/data-flows.js.map +7 -0
- package/dist/security/dep-confusion.js +255 -0
- package/dist/security/dep-confusion.js.map +7 -0
- package/dist/security/errors.js +51 -0
- package/dist/security/errors.js.map +7 -0
- package/dist/security/export/fix-suggestions.js +58 -0
- package/dist/security/export/fix-suggestions.js.map +7 -0
- package/dist/security/export/fix-suggestions.test.js +74 -0
- package/dist/security/export/fix-suggestions.test.js.map +7 -0
- package/dist/security/export/sbom.js +230 -0
- package/dist/security/export/sbom.js.map +7 -0
- package/dist/security/export/sbom.test.js +288 -0
- package/dist/security/export/sbom.test.js.map +7 -0
- package/dist/security/export/serialization.js +142 -0
- package/dist/security/export/serialization.js.map +7 -0
- package/dist/security/export/serialization.test.js +310 -0
- package/dist/security/export/serialization.test.js.map +7 -0
- package/dist/security/export/vex.js +220 -0
- package/dist/security/export/vex.js.map +7 -0
- package/dist/security/export/vex.test.js +278 -0
- package/dist/security/export/vex.test.js.map +7 -0
- package/dist/security/index.js +67 -0
- package/dist/security/index.js.map +7 -0
- package/dist/security/integrator-transitives.test.js +359 -0
- package/dist/security/integrator-transitives.test.js.map +7 -0
- package/dist/security/integrator.js +491 -0
- package/dist/security/integrator.js.map +7 -0
- package/dist/security/integrator.test.js +237 -0
- package/dist/security/integrator.test.js.map +7 -0
- package/dist/security/license.js +70 -0
- package/dist/security/license.js.map +7 -0
- package/dist/security/manifest/adapter.js +243 -0
- package/dist/security/manifest/adapter.js.map +7 -0
- package/dist/security/manifest/adapter.test.js +272 -0
- package/dist/security/manifest/adapter.test.js.map +7 -0
- package/dist/security/manifest/parser.js +376 -0
- package/dist/security/manifest/parser.js.map +7 -0
- package/dist/security/manifest/parser.test.js +110 -0
- package/dist/security/manifest/parser.test.js.map +7 -0
- package/dist/security/manifest/plugins/cargo.js +233 -0
- package/dist/security/manifest/plugins/cargo.js.map +7 -0
- package/dist/security/manifest/plugins/cargo.test.js +304 -0
- package/dist/security/manifest/plugins/cargo.test.js.map +7 -0
- package/dist/security/manifest/plugins/composer.js +152 -0
- package/dist/security/manifest/plugins/composer.js.map +7 -0
- package/dist/security/manifest/plugins/go.js +146 -0
- package/dist/security/manifest/plugins/go.js.map +7 -0
- package/dist/security/manifest/plugins/go.test.js +341 -0
- package/dist/security/manifest/plugins/go.test.js.map +7 -0
- package/dist/security/manifest/plugins/gradle.js +159 -0
- package/dist/security/manifest/plugins/gradle.js.map +7 -0
- package/dist/security/manifest/plugins/hex.js +159 -0
- package/dist/security/manifest/plugins/hex.js.map +7 -0
- package/dist/security/manifest/plugins/maven.js +128 -0
- package/dist/security/manifest/plugins/maven.js.map +7 -0
- package/dist/security/manifest/plugins/maven.test.js +389 -0
- package/dist/security/manifest/plugins/maven.test.js.map +7 -0
- package/dist/security/manifest/plugins/npm.js +284 -0
- package/dist/security/manifest/plugins/npm.js.map +7 -0
- package/dist/security/manifest/plugins/npm.test.js +298 -0
- package/dist/security/manifest/plugins/npm.test.js.map +7 -0
- package/dist/security/manifest/plugins/nuget.js +186 -0
- package/dist/security/manifest/plugins/nuget.js.map +7 -0
- package/dist/security/manifest/plugins/pip.js +123 -0
- package/dist/security/manifest/plugins/pip.js.map +7 -0
- package/dist/security/manifest/plugins/pip.test.js +208 -0
- package/dist/security/manifest/plugins/pip.test.js.map +7 -0
- package/dist/security/manifest/plugins/pubspec.js +212 -0
- package/dist/security/manifest/plugins/pubspec.js.map +7 -0
- package/dist/security/manifest/plugins/pyproject.js +261 -0
- package/dist/security/manifest/plugins/pyproject.js.map +7 -0
- package/dist/security/manifest/plugins/rubygems.js +185 -0
- package/dist/security/manifest/plugins/rubygems.js.map +7 -0
- package/dist/security/manifest/plugins/swift.js +200 -0
- package/dist/security/manifest/plugins/swift.js.map +7 -0
- package/dist/security/owasp.js +104 -0
- package/dist/security/owasp.js.map +7 -0
- package/dist/security/pipeline.js +125 -0
- package/dist/security/pipeline.js.map +7 -0
- package/dist/security/reachability.js +276 -0
- package/dist/security/reachability.js.map +7 -0
- package/dist/security/reachability.test.js +394 -0
- package/dist/security/reachability.test.js.map +7 -0
- package/dist/security/remediation.js +126 -0
- package/dist/security/remediation.js.map +7 -0
- package/dist/security/secrets.js +176 -0
- package/dist/security/secrets.js.map +7 -0
- package/dist/security/staleness.js +231 -0
- package/dist/security/staleness.js.map +7 -0
- package/dist/security/supply-chain.js +301 -0
- package/dist/security/supply-chain.js.map +7 -0
- package/dist/security/suppressions.js +106 -0
- package/dist/security/suppressions.js.map +7 -0
- package/dist/security/types.js +17 -0
- package/dist/security/types.js.map +7 -0
- package/dist/security/vuln/client.js +355 -0
- package/dist/security/vuln/client.js.map +7 -0
- package/dist/security/vuln/client.test.js +288 -0
- package/dist/security/vuln/client.test.js.map +7 -0
- package/dist/security/vuln/epss-client.js +95 -0
- package/dist/security/vuln/epss-client.js.map +7 -0
- package/dist/security/vuln/index.js +29 -0
- package/dist/security/vuln/index.js.map +7 -0
- package/dist/security/vuln/osv-adapter.js +321 -0
- package/dist/security/vuln/osv-adapter.js.map +7 -0
- package/dist/security/vuln/osv-adapter.test.js +391 -0
- package/dist/security/vuln/osv-adapter.test.js.map +7 -0
- package/dist/security/vuln/types.js +17 -0
- package/dist/security/vuln/types.js.map +7 -0
- package/dist/types.js.map +2 -2
- 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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,WAAsB;AACtB,oBAA2B;AAC3B,gBAAgD;AAEhD,MAAM,MAAS;AACf,MAAM,SAAS;AAEf,SAAS,UAAU,OAAuB;AACxC,UAAQ,OAAO;AAAA,IACb,KAAK;AAAY,aAAO;AAAA,IACxB,KAAK;AAAY,aAAO;AAAA,IACxB,KAAK;AAAY,aAAO;AAAA,IACxB;AAAiB,aAAO;AAAA,EAC1B;AACF;AAEO,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,6BAA6B,EACrC,YAAY,2GAA2G,EACvH,OAAO,kBAAkB,gDAAgD,OAAO,EAChF,OAAO,OAAO,aAAiC,SAA6B;AAC3E,UAAM,SAAS,KAAK,QAAQ,eAAe,QAAQ,IAAI,CAAC;AACxD,UAAM,SAAS,UAAM,0BAAW,MAAM;AAEtC,QAAI,CAAC,OAAO,gBAAgB;AAC1B,cAAQ,MAAM;AAAA,IAAO,MAAM,wCAAmC,eAAK,EAAE;AACrE,cAAQ,MAAM,KAAK,aAAG,uCAAuC,eAAK,IAAI,gBAAM,GAAG,cAAI,yBAAyB,eAAK,EAAE;AACnH,cAAQ,MAAM,KAAK,aAAG,eAAe,eAAK,IAAI,gBAAM,GAAG,cAAI,kBAAkB,eAAK;AAAA,CAAI;AACtF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,QAAI,CAAC,UAAU,cAAc,MAAM,GAAG;AACpC,cAAQ,MAAM,yDAAoD;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AACtC,UAAM,KAAK,GAAG,YAAY;AAC1B,OAAG,oBAAoB;AAEvB,QAAI,KAAK,WAAW,QAAQ;AAC1B,cAAQ,MAAM,KAAK,aAAG,6CAA6C,eAAK,EAAE;AAAA,IAC5E;AAEA,UAAM,EAAE,oBAAoB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,iCAAiC,CAAC;AAC7G,UAAM,UAAU,IAAI,oBAAoB,EAAE;AAC1C,UAAM,WAAW,MAAM,QAAQ,MAAM;AAErC,QAAI,KAAK,WAAW,QAAQ;AAC1B,cAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7C,SAAG,MAAM;AACT;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,cAAQ,IAAI;AAAA,IAAO,eAAK,SAAI,eAAK;AAAA,CAA4C;AAC7E,SAAG,MAAM;AACT;AAAA,IACF;AAEA,YAAQ,IAAI;AAAA,IAAO,gBAAM,GAAG,cAAI,gCAAgC,eAAK;AAAA,CAAI;AAEzE,eAAW,KAAK,UAAU;AACxB,YAAM,QAAQ,UAAU,EAAE,SAAS;AACnC,cAAQ,IAAI,KAAK,gBAAM,GAAG,cAAI,GAAG,EAAE,WAAW,GAAG,eAAK,IAAI,aAAG,IAAI,EAAE,SAAS,IAAI,eAAK,EAAE;AACvF,cAAQ,IAAI,aAAa,KAAK,GAAG,cAAI,GAAG,EAAE,UAAU,YAAY,CAAC,GAAG,eAAK,cAAc,aAAG,GAAG,EAAE,cAAc,GAAG,eAAK,EAAE;AACvH,UAAI,EAAE,cAAc;AAClB,cAAM,MAAM,EAAE,gBAAgB,KAAK,EAAE,aAAa,KAAK;AACvD,gBAAQ,IAAI,6BAA6B,GAAG,EAAE;AAAA,MAChD;AACA,cAAQ,IAAI,OAAO,aAAG,GAAG,EAAE,WAAW,GAAG,eAAK,EAAE;AAChD,cAAQ,IAAI;AAAA,IACd;AAEA,UAAM,WAAW,SAAS,OAAO,OAAK,EAAE,cAAc,UAAU,EAAE;AAClE,UAAM,OAAW,SAAS,OAAO,OAAK,EAAE,cAAc,MAAM,EAAE;AAC9D,UAAM,SAAW,SAAS,OAAO,OAAK,EAAE,cAAc,QAAQ,EAAE;AAEhE,UAAM,QAAkB,CAAC;AACzB,QAAI,WAAW,EAAG,OAAM,KAAK,GAAG,GAAG,GAAG,cAAI,GAAG,QAAQ,YAAY,eAAK,EAAE;AACxE,QAAI,OAAO,EAAO,OAAM,KAAK,GAAG,MAAM,GAAG,cAAI,GAAG,IAAI,QAAQ,eAAK,EAAE;AACnE,QAAI,SAAS,EAAK,OAAM,KAAK,GAAG,aAAG,GAAG,MAAM,UAAU,eAAK,EAAE;AAC7D,YAAQ,IAAI,KAAK,cAAI,GAAG,SAAS,MAAM,GAAG,eAAK,gBAAgB,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAEnF,OAAG,MAAM;AAAA,EACX,CAAC;AACL;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|